diff --git a/.circleci/config.yml b/.circleci/config.yml
index af5b1e2e..28c3749e 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -14,13 +14,13 @@ jobs:
- restore_cache:
name: Restore Yarn Package Cache
keys:
- - yarn-packages-{{ checksum "yarn.lock" }}
+ - yarn-packages-{{ checksum "cider-yarn.lock" }}
- run:
name: Install Dependencies
command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
- save_cache:
name: Save Yarn Package Cache
- key: yarn-packages-{{ checksum "yarn.lock" }}
+ key: yarn-packages-{{ checksum "cider-yarn.lock" }}
paths:
- ~/.cache/yarn
- run:
@@ -34,8 +34,9 @@ jobs:
sudo dpkg --add-architecture i386
sudo apt-get update -y
sudo apt-get install -y wine32
- - store_test_results:
- path: test-results
+ - run:
+ name: Append Commit BuildID to Version
+ command: yarn circle:append-bid
- run:
name: Generate Builds (Linux)
command: yarn dist -l -p never
@@ -46,6 +47,11 @@ jobs:
command: yarn dist -w --x64 -p never
post-steps:
- jira/notify
+ - run:
+ name: Generate Builds (Winget)
+ command: yarn winget -p never
+ post-steps:
+ - jira/notify
- run:
name: Move Build Files
command: |
@@ -55,9 +61,7 @@ jobs:
mv ~/Cider/dist/*.AppImage ~/Cider/dist/artifacts
mv ~/Cider/dist/*.snap ~/Cider/dist/artifacts
mv ~/Cider/dist/*.yml ~/Cider/dist/artifacts
+ mv ~/Cider/dist/*.blockmap ~/Cider/dist/artifacts
- store_artifacts:
path: ~/Cider/dist/artifacts
- post-steps:
- - jira/notify
-
diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml
new file mode 100644
index 00000000..f1befd57
--- /dev/null
+++ b/.github/workflows/build-macos.yml
@@ -0,0 +1,146 @@
+# For most projects, this workflow file will not need changing; you simply need
+# to commit it to your repository.
+#
+# You may wish to alter this file to override the set of languages analyzed,
+# or to provide custom queries or build logic.
+#
+# ******** NOTE ********
+# We have attempted to detect the languages in your repository. Please check
+# the `language` matrix defined below to confirm you have the correct set of
+# supported CodeQL languages.
+#
+name: "macOS build"
+
+on:
+ push:
+ branches: [ develop ]
+ paths-ignore:
+ - 'README.md'
+ - 'SECURITY.md'
+ - '.gitmodules'
+ - '.gitignore'
+ - 'LICENSE'
+ schedule:
+ - cron: '44 20 * * 1'
+
+jobs:
+ analyze:
+ name: macOS build
+ runs-on: macos-11
+ permissions:
+ actions: read
+ contents: write
+ security-events: write
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [ 'javascript' ]
+ # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
+ # Learn more:
+ # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
+
+ steps:
+ - uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: '12.4'
+
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ with:
+ submodules: true
+
+ # Initializes the CodeQL tools for scanning.
+# - name: Initialize CodeQL
+# uses: github/codeql-action/init@v1
+# with:
+# languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+ # queries: ./path/to/local/query, your-org/your-repo/queries@main
+
+ # âšī¸ Command-line programs to run using the OS shell.
+ # đ https://git.io/JvXDl
+
+ # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines
+ # and modify them (or add more) to build your code if your project
+ # uses a compiled language
+
+# - name : env
+# run: |
+# export EVS_ACCOUNT_NAME=${{ secrets.EVS_ACCOUNT_NAME}} && export EVS_PASSWD=${{ secrets.EVS_PASSWD }}
+# export CSC_LINK=${{ secrets.CSC_LINK }} && export CSC_KEY_PASSWORD=${{ secrets.CSC_KEY_PASSWORD }}
+# export APPLEID=${{ secrets.APPLEID }} && export APPLEIDPASS=${{ secrets.APPLEIDPASS }}
+
+ - name: Sign in to EVS
+ run: |
+ python3 -m pip install --upgrade castlabs-evs
+ python3 -m castlabs_evs.account refresh -A ${{ secrets.EVS_ACCOUNT_NAME }} -P ${{ secrets.EVS_PASSWD }}
+
+ - name : Build
+ env:
+ CSC_LINK: ${{ secrets.CSC_LINK }}
+ CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
+ APPLEID: ${{ secrets.APPLEID }}
+ APPLEIDPASS: ${{ secrets.APPLEIDPASS }}
+ APPLE_ID: ${{ secrets.APPLEID }}
+ APPLE_ID_PASSWORD: ${{ secrets.APPLEIDPASS }}
+ PSC_NAME: ${{ secrets.PSC_NAME }}
+ DEVELOPER_DIR: /Applications/Xcode_12.4.app/Contents/Developer
+ run: |
+ rm cider-yarn.lock || true
+ xcodebuild -version
+ yarn install
+ cp resources/verror-types node_modules/@types/verror/index.d.ts
+ cp resources/macPackager.js node_modules/app-builder-lib/out/macPackager.js
+ yarn dist:universalNotWorking -p never
+# - name: Perform CodeQL Analysis
+# uses: github/codeql-action/analyze@v1
+
+ - name: Add license to dmg
+ run: |
+ npx dmg-license resources/license.json dist/*.dmg
+
+ - name: Import
+ uses: apple-actions/import-codesign-certs@v1
+ with:
+ p12-file-base64: ${{ secrets.CSC_LINK }}
+ p12-password: ${{ secrets.CSC_KEY_PASSWORD }}
+
+ - name: Create PKG manually
+ env:
+ CSC_LINK: ${{ secrets.CSC_LINK }}
+ CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
+ APPLEID: ${{ secrets.APPLEID }}
+ APPLEIDPASS: ${{ secrets.APPLEIDPASS }}
+ run: |
+ pkgbuild --component dist/mac-universal/Cider.app --install-location /Applications dist/Cider.pkg --sign ${{ secrets.PSC_NAME }}
+ xcrun altool --notarize-app --primary-bundle-id com.ciderapp.cider -f dist/Cider.pkg --username ${{ secrets.APPLEID }} --password ${{ secrets.APPLEIDPASS }}
+ sleep 5m
+ xcrun stapler staple dist/Cider.pkg || true
+ mv dist/*.dmg dist/Cider.dmg
+
+ - name: Upload a Build Artifact
+ uses: actions/upload-artifact@v2.2.3
+ with:
+ # Artifact name
+ name: macOS
+ # A file, directory or wildcard pattern that describes what to upload
+ path: |
+ dist/*.dmg
+ dist/*.pkg
+ # The desired behavior if no files are found using the provided path.
+ - name: Release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: |
+ dist/Cider.dmg
+ dist/Cider.pkg
+ body: signed Develop MacOS Builds
+ name: macOS builds
+ tag_name: macos-beta
+ prerelease : true
+ generate_release_notes: true
+ append_body : false
+ fail_on_unmatched_files: false
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 475cb6f3..2e957229 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,8 @@
# Building
dist
build
+.flatpak*
+yarn-cache
# Misc
.idea
@@ -135,7 +137,6 @@ dist
.vscode-test
# yarn v2
-yarn.lock
.pnp.*
.yarn/*
.yarn/cache
@@ -316,3 +317,11 @@ src/renderer/workbox-962786f2.js.map
keys.sh
package-lock.json
+yarn.lock
+resources/b64.txt
+
+
+savedconfig/cider-config.json
+savedconfig/config.json
+savedconfig/session.json
+savedconfig/window-state.json
diff --git a/Assets/Install On Cider/install on cider.afdesign b/Assets/Install On Cider/install on cider.afdesign
new file mode 100644
index 00000000..5a621a62
Binary files /dev/null and b/Assets/Install On Cider/install on cider.afdesign differ
diff --git a/Assets/Install On Cider/install on cider.svg b/Assets/Install On Cider/install on cider.svg
new file mode 100644
index 00000000..7bf4d965
--- /dev/null
+++ b/Assets/Install On Cider/install on cider.svg
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README.md b/README.md
index 911736d6..68767fd9 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
-
-
+
-
+
+
diff --git a/cider-yarn.lock b/cider-yarn.lock
new file mode 100644
index 00000000..2dcab8bd
--- /dev/null
+++ b/cider-yarn.lock
@@ -0,0 +1,8685 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"7zip-bin@~5.1.1":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876"
+ integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==
+
+"7zip@0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30"
+ integrity sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA=
+
+"@ampproject/remapping@^2.1.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34"
+ integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.0"
+
+"@babel/code-frame@7.16.7", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
+ integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+ dependencies:
+ "@babel/highlight" "^7.16.7"
+
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34"
+ integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==
+
+"@babel/core@7.16.12":
+ version "7.16.12"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784"
+ integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.16.8"
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.16.7"
+ "@babel/helpers" "^7.16.7"
+ "@babel/parser" "^7.16.12"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.16.10"
+ "@babel/types" "^7.16.8"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.1.2"
+ semver "^6.3.0"
+ source-map "^0.5.0"
+
+"@babel/core@^7.9.0":
+ version "7.17.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225"
+ integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.3"
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.16.7"
+ "@babel/helpers" "^7.17.2"
+ "@babel/parser" "^7.17.3"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.1.2"
+ semver "^6.3.0"
+
+"@babel/generator@^7.16.8", "@babel/generator@^7.17.3":
+ version "7.17.3"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200"
+ integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==
+ dependencies:
+ "@babel/types" "^7.17.0"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862"
+ integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b"
+ integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b"
+ integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==
+ dependencies:
+ "@babel/compat-data" "^7.16.4"
+ "@babel/helper-validator-option" "^7.16.7"
+ browserslist "^4.17.5"
+ semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6":
+ version "7.17.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9"
+ integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/helper-member-expression-to-functions" "^7.16.7"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/helper-replace-supers" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+
+"@babel/helper-create-regexp-features-plugin@^7.16.7":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1"
+ integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ regexpu-core "^5.0.1"
+
+"@babel/helper-define-polyfill-provider@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665"
+ integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.13.0"
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/traverse" "^7.13.0"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+ semver "^6.1.2"
+
+"@babel/helper-environment-visitor@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
+ integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-explode-assignable-expression@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a"
+ integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-function-name@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f"
+ integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-get-function-arity@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419"
+ integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-hoist-variables@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
+ integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-member-expression-to-functions@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0"
+ integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-imports@7.0.0-beta.35":
+ version "7.0.0-beta.35"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.35.tgz#308e350e731752cdb4d0f058df1d704925c64e0a"
+ integrity sha512-vaC1KyIZSuyWb3Lj277fX0pxivyHwuDU4xZsofqgYAbkDxNieMg2vuhzP5AgMweMY7fCQUMTi+BgPqTLjkxXFg==
+ dependencies:
+ "@babel/types" "7.0.0-beta.35"
+ lodash "^4.2.0"
+
+"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
+ integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-transforms@^7.16.7":
+ version "7.17.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0"
+ integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-simple-access" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-optimise-call-expression@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2"
+ integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5"
+ integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
+
+"@babel/helper-remap-async-to-generator@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3"
+ integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-wrap-function" "^7.16.8"
+ "@babel/types" "^7.16.8"
+
+"@babel/helper-replace-supers@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1"
+ integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-member-expression-to-functions" "^7.16.7"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/traverse" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-simple-access@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7"
+ integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09"
+ integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==
+ dependencies:
+ "@babel/types" "^7.16.0"
+
+"@babel/helper-split-export-declaration@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
+ integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-validator-identifier@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
+ integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+
+"@babel/helper-validator-option@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
+ integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
+
+"@babel/helper-wrap-function@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200"
+ integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==
+ dependencies:
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.16.8"
+ "@babel/types" "^7.16.8"
+
+"@babel/helpers@^7.16.7", "@babel/helpers@^7.17.2":
+ version "7.17.2"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417"
+ integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.0"
+ "@babel/types" "^7.17.0"
+
+"@babel/highlight@^7.16.7":
+ version "7.16.10"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88"
+ integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3":
+ version "7.17.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0"
+ integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
+ version "7.16.7"
+ 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.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050"
+ integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9"
+ integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.16.7"
+
+"@babel/plugin-proposal-async-generator-functions@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8"
+ integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-remap-async-to-generator" "^7.16.8"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@7.16.7", "@babel/plugin-proposal-class-properties@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0"
+ integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-proposal-class-static-block@^7.16.7":
+ version "7.17.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c"
+ integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.17.6"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-proposal-dynamic-import@7.16.7", "@babel/plugin-proposal-dynamic-import@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2"
+ integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-namespace-from@7.16.7", "@babel/plugin-proposal-export-namespace-from@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163"
+ integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8"
+ integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@7.16.7", "@babel/plugin-proposal-logical-assignment-operators@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea"
+ integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@7.16.7", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99"
+ integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@7.16.7", "@babel/plugin-proposal-numeric-separator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9"
+ integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.16.7":
+ version "7.17.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390"
+ integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==
+ dependencies:
+ "@babel/compat-data" "^7.17.0"
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.16.7"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf"
+ integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@7.16.7", "@babel/plugin-proposal-optional-chaining@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a"
+ integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@7.16.11", "@babel/plugin-proposal-private-methods@^7.16.11":
+ version "7.16.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50"
+ integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.16.10"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-proposal-private-property-in-object@7.16.7", "@babel/plugin-proposal-private-property-in-object@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce"
+ integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@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.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2"
+ integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-syntax-async-generators@7.8.4", "@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", "@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-jsx@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665"
+ integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@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", "@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", "@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.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8"
+ integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-arrow-functions@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154"
+ integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-async-to-generator@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808"
+ integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-remap-async-to-generator" "^7.16.8"
+
+"@babel/plugin-transform-block-scoped-functions@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620"
+ integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-block-scoping@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87"
+ integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-classes@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00"
+ integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-replace-supers" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470"
+ integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-destructuring@^7.16.7":
+ version "7.17.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz#c445f75819641788a27a0a3a759d9df911df6abc"
+ integrity sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241"
+ integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-duplicate-keys@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9"
+ integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-exponentiation-operator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b"
+ integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-for-of@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c"
+ integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-function-name@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf"
+ integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1"
+ integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-member-expression-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384"
+ integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-modules-amd@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186"
+ integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@7.16.8", "@babel/plugin-transform-modules-commonjs@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe"
+ integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-simple-access" "^7.16.7"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7"
+ integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618"
+ integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252"
+ integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+
+"@babel/plugin-transform-new-target@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244"
+ integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-object-super@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94"
+ integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-replace-supers" "^7.16.7"
+
+"@babel/plugin-transform-parameters@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f"
+ integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-property-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55"
+ integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-react-jsx@7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4"
+ integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-jsx" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/plugin-transform-regenerator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb"
+ integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==
+ dependencies:
+ regenerator-transform "^0.14.2"
+
+"@babel/plugin-transform-reserved-words@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586"
+ integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-shorthand-properties@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a"
+ integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-spread@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44"
+ integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+
+"@babel/plugin-transform-sticky-regex@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660"
+ integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-template-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab"
+ integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-typeof-symbol@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e"
+ integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-typescript@^7.16.7":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0"
+ integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-typescript" "^7.16.7"
+
+"@babel/plugin-transform-unicode-escapes@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3"
+ integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-unicode-regex@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2"
+ integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/preset-env@^7.9.0":
+ version "7.16.11"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982"
+ integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==
+ dependencies:
+ "@babel/compat-data" "^7.16.8"
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@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.16.7"
+ "@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.16.7"
+ "@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.16.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.16.8"
+ "@babel/plugin-transform-modules-systemjs" "^7.16.7"
+ "@babel/plugin-transform-modules-umd" "^7.16.7"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8"
+ "@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.16.7"
+ "@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.16.8"
+ 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.20.2"
+ 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.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9"
+ integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-validator-option" "^7.16.7"
+ "@babel/plugin-transform-typescript" "^7.16.7"
+
+"@babel/runtime@^7.8.4":
+ version "7.17.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941"
+ integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
+ integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/parser" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3":
+ version "7.17.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57"
+ integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.3"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/parser" "^7.17.3"
+ "@babel/types" "^7.17.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@7.0.0-beta.35":
+ version "7.0.0-beta.35"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.35.tgz#cf933a9a9a38484ca724b335b88d83726d5ab960"
+ integrity sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.4.4":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
+ integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ to-fast-properties "^2.0.0"
+
+"@develar/schema-utils@~2.6.5":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6"
+ integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==
+ dependencies:
+ ajv "^6.12.0"
+ ajv-keywords "^3.4.1"
+
+"@electron/get@^1.13.0":
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.1.tgz#42a0aa62fd1189638bd966e23effaebb16108368"
+ integrity sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==
+ dependencies:
+ debug "^4.1.1"
+ env-paths "^2.2.0"
+ fs-extra "^8.1.0"
+ got "^9.6.0"
+ progress "^2.0.3"
+ semver "^6.2.0"
+ sumchecker "^3.0.1"
+ optionalDependencies:
+ global-agent "^3.0.0"
+ global-tunnel-ng "^2.7.1"
+
+"@electron/universal@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.5.tgz#b812340e4ef21da2b3ee77b2b4d35c9b86defe37"
+ integrity sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag==
+ dependencies:
+ "@malept/cross-spawn-promise" "^1.1.0"
+ asar "^3.0.3"
+ debug "^4.3.1"
+ dir-compare "^2.4.0"
+ fs-extra "^9.0.1"
+
+"@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==
+
+"@jest/types@^27.2.5", "@jest/types@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
+ integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^16.0.0"
+ chalk "^4.0.0"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
+ integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.11"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
+ integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
+
+"@jridgewell/trace-mapping@^0.3.0":
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3"
+ integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@malept/cross-spawn-promise@^1.1.0":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d"
+ integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==
+ dependencies:
+ cross-spawn "^7.0.1"
+
+"@malept/flatpak-bundler@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858"
+ integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==
+ dependencies:
+ debug "^4.1.1"
+ fs-extra "^9.0.0"
+ lodash "^4.17.15"
+ tmp-promise "^3.0.2"
+
+"@nornagon/put@0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@nornagon/put/-/put-0.0.8.tgz#9d497ec46c9364acc3f8b59aa3cf8ee4134ae337"
+ integrity sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==
+
+"@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"
+
+"@playwright/test@^1.19.2":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.19.2.tgz#429d1aa70f5e4cd521cdc8a5d9861ae4fcda3f7c"
+ integrity sha512-5oCmlYHjtOL662OxSkZBYGnoHWIQui7b4YHWNeSCYwhQjmjVcV5njRc8oBZlU8IwJgG7ZH2yhDk1haU96ygbWw==
+ dependencies:
+ "@babel/code-frame" "7.16.7"
+ "@babel/core" "7.16.12"
+ "@babel/plugin-proposal-class-properties" "7.16.7"
+ "@babel/plugin-proposal-dynamic-import" "7.16.7"
+ "@babel/plugin-proposal-export-namespace-from" "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-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-syntax-async-generators" "7.8.4"
+ "@babel/plugin-syntax-json-strings" "7.8.3"
+ "@babel/plugin-syntax-object-rest-spread" "7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "7.8.3"
+ "@babel/plugin-transform-modules-commonjs" "7.16.8"
+ "@babel/plugin-transform-react-jsx" "7.16.7"
+ "@babel/preset-typescript" "7.16.7"
+ babel-plugin-module-resolver "4.1.0"
+ colors "1.4.0"
+ commander "8.3.0"
+ debug "4.3.3"
+ expect "27.2.5"
+ jest-matcher-utils "27.2.5"
+ jpeg-js "0.4.3"
+ json5 "2.2.0"
+ mime "3.0.0"
+ minimatch "3.0.4"
+ ms "2.1.3"
+ open "8.4.0"
+ pirates "4.0.4"
+ pixelmatch "5.2.1"
+ playwright-core "1.19.2"
+ pngjs "6.0.0"
+ rimraf "3.0.2"
+ source-map-support "0.4.18"
+ stack-utils "2.0.5"
+ yazl "2.5.1"
+
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
+ integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78=
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
+ integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
+ integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
+ integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A=
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
+ integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
+ integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
+ integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
+ integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
+ integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
+ integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
+
+"@sentry/browser@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.17.2.tgz#8e794b846f43a341068c83420918d896683d903e"
+ integrity sha512-4Ow5z9GxK5dG9+stBNKb7s6NoxE4wgEcHRmO66QTK4gH2NNmzV4R/aaZ7iDoS/lD86sH0M86jm76dpg9uiJPmw==
+ dependencies:
+ "@sentry/core" "6.17.2"
+ "@sentry/types" "6.17.2"
+ "@sentry/utils" "6.17.2"
+ tslib "^1.9.3"
+
+"@sentry/core@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.17.2.tgz#f218920f269ccdbaee20a092bbc90a71a007cc88"
+ integrity sha512-Uew0CNMr+QvowrF4EJYjOUgHep/sZJ3l5zevPEELugIgqWBodd+ZDCV3fQFR7cr6KOqx1rMgVrgcKIkLl0l+RA==
+ dependencies:
+ "@sentry/hub" "6.17.2"
+ "@sentry/minimal" "6.17.2"
+ "@sentry/types" "6.17.2"
+ "@sentry/utils" "6.17.2"
+ tslib "^1.9.3"
+
+"@sentry/electron@^3.0.2":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@sentry/electron/-/electron-3.0.3.tgz#cfb8ba582753a9b34beb4f775cc48fd0a82096df"
+ integrity sha512-uDSFfl3eL29Dq8jYIJmWFWRHMQCSNk6pjL6gUmJiPhEhpu72hokZyezUJsJrSyipraqLgmSimY71u0ayARYqwg==
+ dependencies:
+ "@sentry/browser" "6.17.2"
+ "@sentry/core" "6.17.2"
+ "@sentry/node" "6.17.2"
+ "@sentry/types" "6.17.2"
+ "@sentry/utils" "6.17.2"
+ deepmerge "^4.2.2"
+ tslib "^2.3.1"
+
+"@sentry/hub@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.17.2.tgz#d92accada845fa21fff1b2b491d3c6964851693b"
+ integrity sha512-CMi6jU920bTwRTmGHjP4u8toOx4gm1dsx+rsxvp+FKzqRwpwoyi9mOw8oEYERVzaqaYceGdFylyRUrjdf0f77g==
+ dependencies:
+ "@sentry/types" "6.17.2"
+ "@sentry/utils" "6.17.2"
+ tslib "^1.9.3"
+
+"@sentry/integrations@^6.18.1":
+ version "6.18.1"
+ resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.18.1.tgz#c815eb9d104739805401b69d5559adec14876e33"
+ integrity sha512-Xzg9C0qPpauZGab2OLKnJjCwn/Lx7WsZK87Q53KaYcscdvXNV0LriNzNKcBIRH+Q+GEsaF3mjyGDLmuDABB59A==
+ dependencies:
+ "@sentry/types" "6.18.1"
+ "@sentry/utils" "6.18.1"
+ localforage "^1.8.1"
+ tslib "^1.9.3"
+
+"@sentry/minimal@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.17.2.tgz#3b482a0d76aa33b6c9441dd21acbcc3a113e5120"
+ integrity sha512-Cdh+iM6QhLKfxwUWWP4mk2K7+EsQj4tuF2dGQke4Zcbp7zQ7wbcMruUcZHiZfvg5kiSYxwNVkH7cXMzcO7AJsg==
+ dependencies:
+ "@sentry/hub" "6.17.2"
+ "@sentry/types" "6.17.2"
+ tslib "^1.9.3"
+
+"@sentry/node@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.17.2.tgz#32a5fa00b64a331073daf1e44f500c8c57184eb1"
+ integrity sha512-358z45WaejnsE8RZVpuLJJiFVCSEi0TRY7P60CljZuz8rnvniD3G0tuXChvu4djVty8NScWZHT/QoxvuJdTHgQ==
+ dependencies:
+ "@sentry/core" "6.17.2"
+ "@sentry/hub" "6.17.2"
+ "@sentry/tracing" "6.17.2"
+ "@sentry/types" "6.17.2"
+ "@sentry/utils" "6.17.2"
+ cookie "^0.4.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.2.tgz#437337071fdeffa319746905b3706518b099ec6b"
+ integrity sha512-oWY2Ga+5D5f90utvfF2Y0eQvme+eS768ZWjR+klRYgZWoY8r1v8uWwWsvroYU1g+h6X0G/xh3giFjsdOWtRENw==
+ dependencies:
+ "@sentry/hub" "6.17.2"
+ "@sentry/minimal" "6.17.2"
+ "@sentry/types" "6.17.2"
+ "@sentry/utils" "6.17.2"
+ tslib "^1.9.3"
+
+"@sentry/types@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.17.2.tgz#4dde3423db5953e798b19ed29618c28fc7bf2e30"
+ integrity sha512-UrFLRDz5mn253O8k/XftLxoldF+NyZdkqKLGIQmST5HEVr7ub9nQJ4Y5ZFA3zJYWpraaW8faIbuw+pgetC8hmQ==
+
+"@sentry/types@6.18.1":
+ version "6.18.1"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.18.1.tgz#e2de38dd0da8096a5d22f8effc6756c919266ede"
+ integrity sha512-wp741NoBKnXE/4T9L723sWJ8EcNMxeTIT1smgNJOfbPwrsDICoYmGEt6JFa05XHpWBGI66WuNvnDjoHVeh6zhA==
+
+"@sentry/utils@6.17.2":
+ version "6.17.2"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.17.2.tgz#e8044e753b47f86068053c8d79e4ae61a39b6732"
+ integrity sha512-ePWtO44KJQwUULOiU86fa1WU3Ird2TH0i39gqB2d3zNS3QyVp9qPlzSdPKSPJ9LdgadzBHw7ikEuE+GY8JTrhA==
+ dependencies:
+ "@sentry/types" "6.17.2"
+ tslib "^1.9.3"
+
+"@sentry/utils@6.18.1":
+ version "6.18.1"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.18.1.tgz#1aa819502b042540612f4db7bcb86c7b176f5a6b"
+ integrity sha512-IFZmuvA+c5lDGlZEri13JSyUP0BHelzY0S4dcKxAzskPW+BtBdQDgYGV90iED1y+IRMLawWb34GF7HyJSouN1Q==
+ dependencies:
+ "@sentry/types" "6.18.1"
+ tslib "^1.9.3"
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@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==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@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"
+
+"@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==
+
+"@tootallnate/once@2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
+
+"@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/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/debug@^4.1.6":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
+ integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
+ dependencies:
+ "@types/ms" "*"
+
+"@types/discord-rpc@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/discord-rpc/-/discord-rpc-4.0.0.tgz#29080812b9092996046af1a21138fb488d180f87"
+ integrity sha512-a5HiKOcBkB43g/lN6fBYw8FyGc6Ue9CYucxxHxXlELXpb1CxCa2NA2pGK2Ub88pi4uY5+HQeSFbYtH6DJtV3Qw==
+
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304"
+ integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*", "@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/express-serve-static-core@^4.17.18":
+ version "4.17.28"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8"
+ integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+
+"@types/express@^4.17.13":
+ version "4.17.13"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
+ integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.18"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/fs-extra@^9.0.11":
+ version "9.0.13"
+ resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45"
+ integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/glob@^7.1.1":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+ integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/html-minifier-terser@^5.0.0":
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57"
+ integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==
+
+"@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/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
+ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+ integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
+ integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
+ version "7.0.9"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
+ integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+
+"@types/keyv@*":
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41"
+ integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/long@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
+ integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
+
+"@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@*":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+
+"@types/ms@*":
+ version "0.7.31"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
+ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
+
+"@types/node@*", "@types/node@>=13.7.0":
+ version "17.0.21"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
+ integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
+
+"@types/node@^14.6.2":
+ version "14.18.12"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.12.tgz#0d4557fd3b94497d793efd4e7d92df2f83b4ef24"
+ integrity sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==
+
+"@types/plist@^3.0.1":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01"
+ integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==
+ dependencies:
+ "@types/node" "*"
+ xmlbuilder ">=11.0.1"
+
+"@types/qrcode-terminal@^0.12.0":
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/@types/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#cee13a96db9346e3240e2128290465db56799961"
+ integrity sha512-g0fQKl3IVnUePV8tLkiBTduxAVSZsXts444T2aMfjOEGxd7XoeSIs16/AmRe2NlcJLqbvsOBSXov7dKSo4wigA==
+
+"@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/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.6":
+ 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/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/source-list-map@*":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
+ integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
+ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+
+"@types/tapable@^1", "@types/tapable@^1.0.5":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310"
+ integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==
+
+"@types/uglify-js@*":
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea"
+ integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==
+ dependencies:
+ source-map "^0.6.1"
+
+"@types/verror@^1.10.3":
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1"
+ integrity sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw==
+
+"@types/webpack-env@^1.15.1":
+ version "1.16.3"
+ resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a"
+ integrity sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==
+
+"@types/webpack-sources@*":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b"
+ integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==
+ dependencies:
+ "@types/node" "*"
+ "@types/source-list-map" "*"
+ source-map "^0.7.3"
+
+"@types/webpack@^4.41.8":
+ version "4.41.32"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212"
+ integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==
+ dependencies:
+ "@types/node" "*"
+ "@types/tapable" "^1"
+ "@types/uglify-js" "*"
+ "@types/webpack-sources" "*"
+ anymatch "^3.0.0"
+ source-map "^0.6.0"
+
+"@types/ws@^8.5.1":
+ version "8.5.2"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.2.tgz#77e0c2e360e9579da930ffcfa53c5975ea3bdd26"
+ integrity sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/yargs-parser@*":
+ version "20.2.1"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129"
+ integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==
+
+"@types/yargs@^16.0.0":
+ version "16.0.4"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977"
+ integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@types/yargs@^17.0.1":
+ version "17.0.8"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.8.tgz#d23a3476fd3da8a0ea44b5494ca7fa677b9dad4c"
+ integrity sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@types/yauzl@^2.9.1":
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a"
+ integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==
+ dependencies:
+ "@types/node" "*"
+
+"@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/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/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-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-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-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-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/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/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/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/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-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-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-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/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"
+
+"@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==
+
+abstract-socket@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/abstract-socket/-/abstract-socket-2.1.1.tgz#243a7e6e6ff65bb9eab16a22fa90699b91e528f7"
+ integrity sha512-YZJizsvS1aBua5Gd01woe4zuyYBGgSMeqDOB6/ChwdTI904KP6QGtJswXl4hcqWxbz86hQBe++HWV0hF1aGUtA==
+ dependencies:
+ bindings "^1.2.1"
+ nan "^2.12.1"
+
+accepts@~1.3.4, accepts@~1.3.5, 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@^8.4.1, acorn@^8.5.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
+ integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+
+adm-zip@0.4.10:
+ version "0.4.10"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.10.tgz#6efb1090e78a12db377f3ba5f27b363f21988ac1"
+ integrity sha512-075E4f1zFxHbsnn6C4OI4jVzUT1zV+M68QdBxcVxmO/Yqk35CFnFFYLaepvth68gzlIlyQ/hkaI2JY99Nh3C5Q==
+
+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-errors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+ integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+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.1.0, ajv-keywords@^3.4.1, 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@^6.1.0, ajv@^6.10.0, ajv@^6.10.1, ajv@^6.12.0, 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.6.3:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d"
+ integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==
+ 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-align@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
+ integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==
+ dependencies:
+ string-width "^4.1.0"
+
+ansi-colors@^3.0.0:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
+ integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
+
+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@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+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-styles@^3.2.0, 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@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+anymatch@^3.0.0, 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"
+
+app-builder-bin@3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.7.1.tgz#cb0825c5e12efc85b196ac3ed9c89f076c61040e"
+ integrity sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==
+
+app-builder-lib@22.14.13:
+ version "22.14.13"
+ resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.14.13.tgz#c1f5b6afc86596357598bb90b69eef06c7c2eeb3"
+ integrity sha512-SufmrtxU+D0Tn948fjEwAOlCN9757UXLkzzTWXMwZKR/5hisvgqeeBepWfphMIE6OkDGz0fbzEhL1P2Pty4XMg==
+ dependencies:
+ "7zip-bin" "~5.1.1"
+ "@develar/schema-utils" "~2.6.5"
+ "@electron/universal" "1.0.5"
+ "@malept/flatpak-bundler" "^0.4.0"
+ async-exit-hook "^2.0.1"
+ bluebird-lst "^1.0.9"
+ builder-util "22.14.13"
+ builder-util-runtime "8.9.2"
+ chromium-pickle-js "^0.2.0"
+ debug "^4.3.2"
+ ejs "^3.1.6"
+ electron-osx-sign "^0.5.0"
+ electron-publish "22.14.13"
+ form-data "^4.0.0"
+ fs-extra "^10.0.0"
+ hosted-git-info "^4.0.2"
+ is-ci "^3.0.0"
+ isbinaryfile "^4.0.8"
+ js-yaml "^4.1.0"
+ lazy-val "^1.0.5"
+ minimatch "^3.0.4"
+ read-config-file "6.2.0"
+ sanitize-filename "^1.6.3"
+ semver "^7.3.5"
+ temp-file "^3.4.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==
+
+aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+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"
+
+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==
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-flatten@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+ integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asar@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473"
+ integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ==
+ dependencies:
+ chromium-pickle-js "^0.2.0"
+ commander "^5.0.0"
+ glob "^7.1.6"
+ minimatch "^3.0.4"
+ optionalDependencies:
+ "@types/glob" "^7.1.1"
+
+assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+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==
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async-exit-hook@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3"
+ integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@0.9.x:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+ integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
+
+async@^2.6.0, async@^2.6.2:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+atomically@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe"
+ integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==
+
+babel-loader@^8.1.0:
+ version "8.2.3"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d"
+ integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==
+ dependencies:
+ find-cache-dir "^3.3.1"
+ loader-utils "^1.4.0"
+ make-dir "^3.1.0"
+ schema-utils "^2.6.5"
+
+babel-plugin-component@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-component/-/babel-plugin-component-1.1.1.tgz#9b023a23ff5c9aae0fd56c5a18b9cab8c4d45eea"
+ integrity sha512-WUw887kJf2GH80Ng/ZMctKZ511iamHNqPhd9uKo14yzisvV7Wt1EckIrb8oq/uCz3B3PpAW7Xfl7AkTLDYT6ag==
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.35"
+
+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-module-resolver@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2"
+ integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==
+ dependencies:
+ find-babel-config "^1.2.0"
+ glob "^7.1.6"
+ pkg-up "^3.1.0"
+ reselect "^4.0.0"
+ resolve "^1.13.1"
+
+babel-plugin-polyfill-corejs2@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
+ integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
+ dependencies:
+ "@babel/compat-data" "^7.13.11"
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+ semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
+ integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+ 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"
+
+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==
+
+base64-js@^1.3.1, base64-js@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+batch@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+ integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
+
+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@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+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.2.1, bindings@^1.3.0, 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"
+
+bluebird-lst@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c"
+ integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==
+ dependencies:
+ bluebird "^3.5.5"
+
+bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.5, bluebird@^3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+body-parser@1.19.2:
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
+ integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "1.8.1"
+ iconv-lite "0.4.24"
+ on-finished "~2.3.0"
+ qs "6.9.7"
+ raw-body "2.4.3"
+ type-is "~1.6.18"
+
+bonjour@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
+ integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU=
+ dependencies:
+ array-flatten "^2.1.0"
+ deep-equal "^1.0.1"
+ dns-equal "^1.0.0"
+ dns-txt "^2.0.2"
+ multicast-dns "^6.0.1"
+ multicast-dns-service-types "^1.1.0"
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+boolean@^3.0.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
+ integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
+
+boxen@^5.0.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
+ integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==
+ dependencies:
+ ansi-align "^3.0.0"
+ camelcase "^6.2.0"
+ chalk "^4.1.0"
+ cli-boxes "^2.2.1"
+ string-width "^4.2.2"
+ type-fest "^0.20.2"
+ widest-line "^3.1.0"
+ wrap-ansi "^7.0.0"
+
+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"
+
+braces@^2.3.1, braces@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.19.1:
+ version "4.19.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383"
+ integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==
+ dependencies:
+ caniuse-lite "^1.0.30001312"
+ electron-to-chromium "^1.4.71"
+ escalade "^3.1.1"
+ node-releases "^2.0.2"
+ picocolors "^1.0.0"
+
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+
+buffer-equal@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+ integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
+
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
+
+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-indexof@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+ integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
+
+buffer@^5.1.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"
+
+builder-util-runtime@8.9.2:
+ version "8.9.2"
+ resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz#a9669ae5b5dcabfe411ded26678e7ae997246c28"
+ integrity sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==
+ dependencies:
+ debug "^4.3.2"
+ sax "^1.2.4"
+
+builder-util@22.14.13:
+ version "22.14.13"
+ resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.14.13.tgz#41b5b7b4ee53aff4e09cc007fb144522598f3ce6"
+ integrity sha512-oePC/qrrUuerhmH5iaCJzPRAKlSBylrhzuAJmRQClTyWnZUv6jbaHh+VoHMbEiE661wrj2S2aV7/bQh12cj1OA==
+ dependencies:
+ "7zip-bin" "~5.1.1"
+ "@types/debug" "^4.1.6"
+ "@types/fs-extra" "^9.0.11"
+ app-builder-bin "3.7.1"
+ bluebird-lst "^1.0.9"
+ builder-util-runtime "8.9.2"
+ chalk "^4.1.1"
+ cross-spawn "^7.0.3"
+ debug "^4.3.2"
+ fs-extra "^10.0.0"
+ http-proxy-agent "^5.0.0"
+ https-proxy-agent "^5.0.0"
+ is-ci "^3.0.0"
+ js-yaml "^4.1.0"
+ source-map-support "^0.5.19"
+ stat-mode "^1.0.0"
+ temp-file "^3.4.0"
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+ integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
+
+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@^13.0.1:
+ version "13.0.1"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c"
+ integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==
+ dependencies:
+ chownr "^1.1.2"
+ figgy-pudding "^3.5.1"
+ fs-minipass "^2.0.0"
+ glob "^7.1.4"
+ graceful-fs "^4.2.2"
+ infer-owner "^1.0.4"
+ lru-cache "^5.1.1"
+ minipass "^3.0.0"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.2"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ p-map "^3.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^2.7.1"
+ ssri "^7.0.0"
+ unique-filename "^1.1.1"
+
+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"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+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@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+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"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camel-case@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
+ integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
+ dependencies:
+ pascal-case "^3.1.2"
+ tslib "^2.0.3"
+
+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.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001312:
+ version "1.0.30001312"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f"
+ integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==
+
+castv2-client@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/castv2-client/-/castv2-client-1.2.0.tgz#a9193b1a5448b8cb9a0415bd021c8811ed7b0544"
+ integrity sha1-qRk7GlRIuMuaBBW9AhyIEe17BUQ=
+ dependencies:
+ castv2 "~0.1.4"
+ debug "^2.2.0"
+
+castv2@~0.1.4:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/castv2/-/castv2-0.1.10.tgz#d3df00124f1ba8a97691c69dd44221d3b5f93c56"
+ integrity sha512-3QWevHrjT22KdF08Y2a217IYCDQDP7vEJaY4n0lPBeC5UBYbMFMadDfVTsaQwq7wqsEgYUHElPGm3EO1ey+TNw==
+ dependencies:
+ debug "^4.1.1"
+ protobufjs "^6.8.8"
+
+chalk@^2.0.0, 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@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
+ 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"
+
+chokidar@^2.1.8:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+ integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.1"
+ braces "^2.3.2"
+ glob-parent "^3.1.0"
+ inherits "^2.0.3"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ normalize-path "^3.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.2.1"
+ upath "^1.1.1"
+ optionalDependencies:
+ fsevents "^1.2.7"
+
+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.2:
+ 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==
+
+chromium-pickle-js@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
+ integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+ci-info@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
+ integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+clean-css@^4.2.3:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178"
+ integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==
+ dependencies:
+ source-map "~0.6.0"
+
+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==
+
+cli-boxes@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
+ integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
+
+cli-truncate@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
+ integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
+ dependencies:
+ slice-ansi "^3.0.0"
+ string-width "^4.2.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+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-response@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+ integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ dependencies:
+ mimic-response "^1.0.0"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+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==
+
+colors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+ integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
+
+colors@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+ integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+commander@8.3.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
+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@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+commander@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+ integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+compare-version@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
+ integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+compressible@~2.0.16:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+ integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
+ dependencies:
+ mime-db ">= 1.43.0 < 2"
+
+compression@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+ integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+ dependencies:
+ accepts "~1.3.5"
+ bytes "3.0.0"
+ compressible "~2.0.16"
+ debug "2.6.9"
+ on-headers "~1.0.2"
+ safe-buffer "5.1.2"
+ vary "~1.1.2"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+conf@^10.0.3:
+ version "10.1.1"
+ resolved "https://registry.yarnpkg.com/conf/-/conf-10.1.1.tgz#ff08046d5aeeee0eaff55d57f5b4319193c3dfda"
+ integrity sha512-z2civwq/k8TMYtcn3SVP0Peso4otIWnHtcTuHhQ0zDZDdP4NTxqEc8owfkz4zBsdMYdn/LFcE+ZhbCeqkhtq3Q==
+ dependencies:
+ ajv "^8.6.3"
+ ajv-formats "^2.1.1"
+ atomically "^1.7.0"
+ debounce-fn "^4.0.0"
+ dot-prop "^6.0.1"
+ env-paths "^2.2.1"
+ json-schema-typed "^7.0.3"
+ onetime "^5.1.2"
+ pkg-up "^3.1.0"
+ semver "^7.3.5"
+
+config-chain@^1.1.11:
+ 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"
+
+configstore@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
+ integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
+ dependencies:
+ dot-prop "^5.2.0"
+ graceful-fs "^4.1.2"
+ make-dir "^3.0.0"
+ unique-string "^2.0.0"
+ write-file-atomic "^3.0.0"
+ xdg-basedir "^4.0.0"
+
+connect-history-api-fallback@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
+ integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+
+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 sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+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, 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==
+
+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 sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.2, 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-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js-compat@^3.20.2, core-js-compat@^3.21.0:
+ version "3.21.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82"
+ integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==
+ dependencies:
+ browserslist "^4.19.1"
+ semver "7.0.0"
+
+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 sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+crc@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
+ integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==
+ dependencies:
+ buffer "^5.1.0"
+
+crocket@^0.9.11:
+ version "0.9.11"
+ resolved "https://registry.yarnpkg.com/crocket/-/crocket-0.9.11.tgz#288fca11ef0d3dd239b62c488265f30c8edfb0c5"
+ integrity sha1-KI/KEe8NPdI5tixIgmXzDI7fsMU=
+ dependencies:
+ xpipe "*"
+
+cross-spawn@^6.0.0, 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.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"
+
+cross-unzip@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f"
+ integrity sha1-UYO8R6CVWb78+YzEZXlkmZNZNy8=
+
+crypto-random-string@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
+ integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+
+css-hot-loader@^1.4.4:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/css-hot-loader/-/css-hot-loader-1.4.4.tgz#ae784932cd8b7d092f7f15702af08b3ec9436052"
+ integrity sha512-J/qXHz+r7FOT92qMIJfxUk0LC9fecQNZVr0MswQ4FOpKLyOCBjofVMfc6R268bh/5ktkTShrweMr0wWqerC92g==
+ dependencies:
+ loader-utils "^1.1.0"
+ lodash "^4.17.5"
+ normalize-url "^1.9.1"
+
+css-loader@^3.4.2:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645"
+ integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==
+ dependencies:
+ camelcase "^5.3.1"
+ cssesc "^3.0.0"
+ icss-utils "^4.1.1"
+ loader-utils "^1.2.3"
+ normalize-path "^3.0.0"
+ postcss "^7.0.32"
+ postcss-modules-extract-imports "^2.0.0"
+ postcss-modules-local-by-default "^3.0.2"
+ postcss-modules-scope "^2.2.0"
+ postcss-modules-values "^3.0.0"
+ postcss-value-parser "^4.1.0"
+ schema-utils "^2.7.0"
+ semver "^6.3.0"
+
+css-select@^4.1.3:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd"
+ integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^5.1.0"
+ domhandler "^4.3.0"
+ domutils "^2.8.0"
+ nth-check "^2.0.1"
+
+css-what@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
+ integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==
+
+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==
+
+dbus-next@^0.9.2:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/dbus-next/-/dbus-next-0.9.2.tgz#d69a24ea5b54d90ab6bd543c7b81bcb965a99f93"
+ integrity sha512-tzQq/+wrTZ2yU+U5PoeXc97KABhX2v55C/T0finH3tSKYuI8H/SqppIFymBBrUHcK13LvEGY3vdj3ikPPenL5g==
+ dependencies:
+ "@nornagon/put" "0.0.8"
+ event-stream "3.3.4"
+ hexy "^0.2.10"
+ jsbi "^2.0.5"
+ long "^4.0.0"
+ safe-buffer "^5.1.1"
+ xml2js "^0.4.17"
+ optionalDependencies:
+ abstract-socket "^2.0.0"
+
+debounce-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7"
+ integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==
+ dependencies:
+ mimic-fn "^3.0.0"
+
+debug@2.6.9, debug@^2.1.0, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, 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.3.3, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.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"
+
+debug@^3.1.0, debug@^3.1.1, debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
+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-equal@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+ integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+ dependencies:
+ is-arguments "^1.0.4"
+ is-date-object "^1.0.1"
+ is-regex "^1.0.4"
+ object-is "^1.0.1"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.2.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==
+
+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-gateway@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
+ integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==
+ dependencies:
+ execa "^1.0.0"
+ ip-regex "^2.1.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+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-lazy-prop@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+ integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+del@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
+ integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ globby "^6.1.0"
+ is-path-cwd "^2.0.0"
+ is-path-in-cwd "^2.0.0"
+ p-map "^2.0.0"
+ pify "^4.0.1"
+ rimraf "^2.6.3"
+
+delay@^4.3.0:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/delay/-/delay-4.4.1.tgz#6e02d02946a1b6ab98b39262ced965acba2ac4d1"
+ integrity sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+depd@^1.1.2, depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detect-file@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+ integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
+
+detect-node@^2.0.4:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
+ integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
+dijkstrajs@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257"
+ integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==
+
+dir-compare@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631"
+ integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==
+ dependencies:
+ buffer-equal "1.0.0"
+ colors "1.0.3"
+ commander "2.9.0"
+ minimatch "3.0.4"
+
+discord-rpc@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/discord-rpc/-/discord-rpc-4.0.1.tgz#a89aa04a048aa83ad4f347d53fa0162501eae0d8"
+ integrity sha512-HOvHpbq5STRZJjQIBzwoKnQ0jHplbEWFWlPDwXXKm/bILh4nzjcg7mNqll0UY7RsjFoaXA7e/oYb/4lvpda2zA==
+ dependencies:
+ node-fetch "^2.6.1"
+ ws "^7.3.1"
+ optionalDependencies:
+ register-scheme "github:devsnek/node-register-scheme"
+
+dmg-builder@22.14.13:
+ version "22.14.13"
+ resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.14.13.tgz#cc613f3c18e889b8777d525991fd52f50a564f8c"
+ integrity sha512-xNOugB6AbIRETeU2uID15sUfjdZZcKdxK8xkFnwIggsM00PJ12JxpLNPTjcRoUnfwj3WrPjilrO64vRMwNItQg==
+ dependencies:
+ app-builder-lib "22.14.13"
+ builder-util "22.14.13"
+ builder-util-runtime "8.9.2"
+ fs-extra "^10.0.0"
+ iconv-lite "^0.6.2"
+ js-yaml "^4.1.0"
+ optionalDependencies:
+ dmg-license "^1.0.9"
+
+dmg-license@^1.0.9:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a"
+ integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==
+ dependencies:
+ "@types/plist" "^3.0.1"
+ "@types/verror" "^1.10.3"
+ ajv "^6.10.0"
+ crc "^3.8.0"
+ iconv-corefoundation "^1.1.7"
+ plist "^3.0.4"
+ smart-buffer "^4.0.2"
+ verror "^1.10.0"
+
+dns-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+ integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
+
+"dns-js@github:bitfocus/node-dns-js#v0.2.2":
+ version "0.2.2"
+ resolved "https://codeload.github.com/bitfocus/node-dns-js/tar.gz/e5f0c3da63653398005bf36f66ad0b77770dcad6"
+ dependencies:
+ debug "^2.1.0"
+ qap "^3.1.2"
+
+dns-packet@^1.3.1:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f"
+ integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==
+ dependencies:
+ ip "^1.1.0"
+ safe-buffer "^5.0.1"
+
+dns-txt@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+ integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
+ dependencies:
+ buffer-indexof "^1.0.0"
+
+dom-converter@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
+ integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+ dependencies:
+ utila "~0.4"
+
+dom-serializer@^1.0.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
+ integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.2.0"
+ entities "^2.0.0"
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
+ integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
+
+domhandler@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a"
+ integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==
+ dependencies:
+ domelementtype "^2.0.1"
+
+domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626"
+ integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==
+ dependencies:
+ domelementtype "^2.2.0"
+
+domutils@^2.0.0, domutils@^2.5.2, 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"
+
+dot-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
+ integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+dot-prop@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+ dependencies:
+ is-obj "^2.0.0"
+
+dot-prop@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083"
+ integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==
+ dependencies:
+ is-obj "^2.0.0"
+
+dotenv-expand@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
+ integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
+
+dotenv@^8.0.0, dotenv@^8.2.0:
+ version "8.6.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b"
+ integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
+
+dotenv@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05"
+ integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+duplexer@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+ejs@^3.1.6:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a"
+ integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==
+ dependencies:
+ jake "^10.6.1"
+
+electron-builder-notarize-pkg@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/electron-builder-notarize-pkg/-/electron-builder-notarize-pkg-1.2.0.tgz#c6f4b0027418be465b2ab41effc6eecc68110bcb"
+ integrity sha512-ibnOeZwXxEPIzPujHfsLoCG+x4BcRQndBQoRyvTEZEeCeO/D4uu3TSAPeNXZuKfoL3h2auaIBIhh4He5HgY1rw==
+ dependencies:
+ delay "^4.3.0"
+ execa "^4.0.0"
+
+electron-builder@^22.14.13:
+ version "22.14.13"
+ resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.14.13.tgz#fd40564685cf5422a8f8d667940af3d3776f4fb8"
+ integrity sha512-3fgLxqF2TXVKiUPeg74O4V3l0l3j7ERLazo8sUbRkApw0+4iVAf2BJkHsHMaXiigsgCoEzK/F4/rB5rne/VAnw==
+ dependencies:
+ "@types/yargs" "^17.0.1"
+ app-builder-lib "22.14.13"
+ builder-util "22.14.13"
+ builder-util-runtime "8.9.2"
+ chalk "^4.1.1"
+ dmg-builder "22.14.13"
+ fs-extra "^10.0.0"
+ is-ci "^3.0.0"
+ lazy-val "^1.0.5"
+ read-config-file "6.2.0"
+ update-notifier "^5.1.0"
+ yargs "^17.0.1"
+
+electron-devtools-installer@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz#261a50337e37121d338b966f07922eb4939a8763"
+ integrity sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA==
+ dependencies:
+ "7zip" "0.0.6"
+ cross-unzip "0.0.2"
+ rimraf "^2.5.2"
+ semver "^5.3.0"
+
+electron-fetch@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.4.tgz#af975ab92a14798bfaa025f88dcd2e54a7b0b769"
+ integrity sha512-+fBLXEy4CJWQ5bz8dyaeSG1hD6JJ15kBZyj3eh24pIVrd3hLM47H/umffrdQfS6GZ0falF0g9JT9f3Rs6AVUhw==
+ dependencies:
+ encoding "^0.1.13"
+
+electron-log@^4.4.6:
+ version "4.4.6"
+ resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.6.tgz#e7824fc725370384f6edaaac0480c423e570dc69"
+ integrity sha512-nirYgRdY+F+vclr8ijdwy2vW03IzFpDHTaKNWu76dEN21Y76+smcES5knS7cgHUUB0qNLOi8vZO36taakjbSXA==
+
+electron-notarize@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.1.1.tgz#3ed274b36158c1beb1dbef14e7faf5927e028629"
+ integrity sha512-kufsnqh86CTX89AYNG3NCPoboqnku/+32RxeJ2+7A4Rbm4bbOx0Nc7XTy3/gAlBfpj9xPAxHfhZLOHgfi6cJVw==
+ dependencies:
+ debug "^4.1.1"
+ fs-extra "^9.0.1"
+
+electron-osx-sign@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a"
+ integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==
+ dependencies:
+ bluebird "^3.5.0"
+ compare-version "^0.1.2"
+ debug "^2.6.8"
+ isbinaryfile "^3.0.2"
+ minimist "^1.2.0"
+ plist "^3.0.1"
+
+electron-publish@22.14.13:
+ version "22.14.13"
+ resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.14.13.tgz#8b71e6975af8cc6ac5b21f293ade23f8704047c7"
+ integrity sha512-0oP3QiNj3e8ewOaEpEJV/o6Zrmy2VarVvZ/bH7kyO/S/aJf9x8vQsKVWpsdmSiZ5DJEHgarFIXrnO0ZQf0P9iQ==
+ dependencies:
+ "@types/fs-extra" "^9.0.11"
+ builder-util "22.14.13"
+ builder-util-runtime "8.9.2"
+ chalk "^4.1.1"
+ fs-extra "^10.0.0"
+ lazy-val "^1.0.5"
+ mime "^2.5.2"
+
+electron-store@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.0.1.tgz#9b598c1d2edeffebee9d8c1cd957ad368c528925"
+ integrity sha512-ZyLvNywiqSpbwC/pp89O/AycVWY/UJIkmtyzF2Bd0Nm/rLmcFc0NTGuLdg6+LE8mS8qsiK5JMoe4PnrecLHH5w==
+ dependencies:
+ conf "^10.0.3"
+ type-fest "^1.0.2"
+
+electron-to-chromium@^1.4.71:
+ version "1.4.75"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz#d1ad9bb46f2f1bf432118c2be21d27ffeae82fdd"
+ integrity sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==
+
+electron-updater@^4.6.5:
+ version "4.6.5"
+ resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.5.tgz#e9a75458bbfd6bb41a58a829839e150ad2eb2d3d"
+ integrity sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==
+ dependencies:
+ "@types/semver" "^7.3.6"
+ builder-util-runtime "8.9.2"
+ fs-extra "^10.0.0"
+ js-yaml "^4.1.0"
+ lazy-val "^1.0.5"
+ lodash.escaperegexp "^4.1.2"
+ lodash.isequal "^4.5.0"
+ semver "^7.3.5"
+
+electron-webpack-js@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/electron-webpack-js/-/electron-webpack-js-2.4.1.tgz#5389cc22f34c71f6416d5ba1e043f9b0fd6130af"
+ integrity sha512-NPbcI4nnuclkLEKmwRI8sui2GNe37NKm0pCQR6KZA7YSV3KQdH4I7wOgIZ2AkeCpyeUHrBSMGQY+VqhPD7OtMA==
+ dependencies:
+ "@babel/core" "^7.9.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/preset-env" "^7.9.0"
+ babel-loader "^8.1.0"
+ babel-plugin-component "^1.1.1"
+
+electron-webpack@^2.8.2:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/electron-webpack/-/electron-webpack-2.8.2.tgz#5a0357ce8f7d147e5f559294a08bb072d1092b0a"
+ integrity sha512-rR7hxoOlZIcJf6R08mVl/4TBtFY+HW6sv4Z28TdMWETvcM4ZBIBdGNGylxF0gNwB8gkTgo8UkkDbXGX48K4Vow==
+ dependencies:
+ "@types/webpack-env" "^1.15.1"
+ async-exit-hook "^2.0.1"
+ bluebird "^3.7.2"
+ chalk "^4.0.0"
+ crocket "^0.9.11"
+ css-hot-loader "^1.4.4"
+ css-loader "^3.4.2"
+ debug "^4.1.1"
+ dotenv "^8.2.0"
+ dotenv-expand "^5.1.0"
+ electron-devtools-installer "^2.2.4"
+ electron-webpack-js "~2.4.1"
+ file-loader "^6.0.0"
+ fs-extra "^9.0.0"
+ html-loader "^1.1.0"
+ html-webpack-plugin "^4.0.4"
+ lazy-val "^1.0.4"
+ mini-css-extract-plugin "^0.9.0"
+ node-loader "^0.6.0"
+ read-config-file "~4.0.1"
+ semver "^7.1.3"
+ source-map-support "^0.5.16"
+ style-loader "^1.1.3"
+ terser-webpack-plugin "^2.3.5"
+ url-loader "^4.0.0"
+ webpack-cli "^3.3.11"
+ webpack-dev-server "^3.10.3"
+ webpack-merge "^4.2.2"
+ yargs "^15.3.1"
+
+electron-window-state@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/electron-window-state/-/electron-window-state-5.0.3.tgz#4f36d09e3f953d87aff103bf010f460056050aa8"
+ integrity sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==
+ dependencies:
+ jsonfile "^4.0.0"
+ mkdirp "^0.5.1"
+
+"electron@git+https://github.com/castlabs/electron-releases.git":
+ version "18.0.0-alpha.5"
+ resolved "git+https://github.com/castlabs/electron-releases.git#4f424eddd6ec2569c5f293778ba8056205805247"
+ dependencies:
+ "@electron/get" "^1.13.0"
+ "@types/node" "^14.6.2"
+ extract-zip "^1.0.3"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+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==
+
+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==
+
+encode-utf8@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
+ integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
+
+encodeurl@^1.0.2, encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+encoding@^0.1.12, encoding@^0.1.13:
+ 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:
+ 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"
+
+enhanced-resolve@^4.1.1:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec"
+ integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.5.0"
+ tapable "^1.0.0"
+
+enhanced-resolve@^5.8.3:
+ version "5.9.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.1.tgz#e898cea44d9199fd92137496cff5691b910fb43e"
+ integrity sha512-jdyZMwCQ5Oj4c5+BTnkxPgDZO/BJzh/ADDmKebayyzNwjVX1AFCeGkOfxNx0mHi2+8BKC5VxUYiw3TIvoT7vhw==
+ 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==
+
+env-paths@^2.2.0, env-paths@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+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==
+
+errno@^0.1.3:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+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.19.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
+ integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ get-symbol-description "^1.0.0"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ internal-slot "^1.0.3"
+ is-callable "^1.2.4"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.1"
+ is-string "^1.0.7"
+ is-weakref "^1.0.1"
+ object-inspect "^1.11.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+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-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.1.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==
+
+escape-goat@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
+ integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+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 sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+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==
+
+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"
+
+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==
+
+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.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+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 sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+event-stream@3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
+ integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=
+ dependencies:
+ duplexer "~0.1.1"
+ from "~0"
+ map-stream "~0.1.0"
+ pause-stream "0.0.11"
+ split "0.3"
+ stream-combiner "~0.0.4"
+ through "~2.3.1"
+
+eventemitter3@^4.0.0:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+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==
+
+eventsource@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf"
+ integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==
+ dependencies:
+ original "^1.0.0"
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+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"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+ integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
+ dependencies:
+ homedir-polyfill "^1.0.1"
+
+expect@27.2.5:
+ version "27.2.5"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-27.2.5.tgz#16154aaa60b4d9a5b0adacfea3e4d6178f4b93fd"
+ integrity sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==
+ dependencies:
+ "@jest/types" "^27.2.5"
+ ansi-styles "^5.0.0"
+ jest-get-type "^27.0.6"
+ jest-matcher-utils "^27.2.5"
+ jest-message-util "^27.2.5"
+ jest-regex-util "^27.0.6"
+
+express@^4.17.1, express@^4.17.3:
+ version "4.17.3"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1"
+ integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.19.2"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.4.2"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~1.1.2"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "~1.1.2"
+ fresh "0.5.2"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.7"
+ qs "6.9.7"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.17.2"
+ serve-static "1.14.2"
+ setprototypeof "1.2.0"
+ statuses "~1.5.0"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extract-zip@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
+ integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
+ dependencies:
+ debug "^4.1.1"
+ get-stream "^5.1.0"
+ yauzl "^2.10.0"
+ optionalDependencies:
+ "@types/yauzl" "^2.9.1"
+
+extract-zip@^1.0.3:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927"
+ integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==
+ dependencies:
+ concat-stream "^1.6.2"
+ debug "^2.6.9"
+ mkdirp "^0.5.4"
+ yauzl "^2.10.0"
+
+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:
+ 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-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-safe-stringify@^2.0.6:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
+ integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
+
+faye-websocket@^0.11.3, faye-websocket@^0.11.4:
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da"
+ integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
+ dependencies:
+ pend "~1.2.0"
+
+figgy-pudding@^3.5.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+ integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+
+file-loader@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
+ integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+file-type@16.5.3:
+ version "16.5.3"
+ resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz#474b7e88c74724046abb505e9b8ed4db30c4fc06"
+ integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==
+ 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==
+
+filelist@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b"
+ integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==
+ dependencies:
+ minimatch "^3.0.4"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ statuses "~1.5.0"
+ unpipe "~1.0.0"
+
+find-babel-config@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
+ integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
+ dependencies:
+ json5 "^0.5.1"
+ path-exists "^3.0.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@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.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"
+
+findup-sync@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
+ integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
+ dependencies:
+ detect-file "^1.0.0"
+ is-glob "^4.0.0"
+ micromatch "^3.0.4"
+ resolve-dir "^1.0.1"
+
+follow-redirects@^1.0.0:
+ version "1.14.9"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
+ integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+from@~0:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
+ integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
+
+fs-extra@^10.0.0:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8"
+ integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.0.0, fs-extra@^9.0.1:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ 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-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.2.7:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.12.1"
+
+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:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+gauge@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.2.tgz#c3777652f542b6ef62797246e8c7caddecb32cc7"
+ integrity sha512-aSPRm2CvA9R8QyU5eXMFPd+cYkyxLsXHd2l5/FOH2V/eml//M04G6KZOmTap07O1PvEwNcl2NndyLfK8g3QrKA==
+ dependencies:
+ ansi-regex "^5.0.1"
+ 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-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-port@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193"
+ integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==
+
+get-stream@^4.0.0, get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+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-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+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-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.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+ 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"
+
+global-agent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
+ integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==
+ dependencies:
+ boolean "^3.0.1"
+ es6-error "^4.1.1"
+ matcher "^3.0.0"
+ roarr "^2.15.3"
+ semver "^7.3.2"
+ serialize-error "^7.0.1"
+
+global-dirs@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686"
+ integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==
+ dependencies:
+ ini "2.0.0"
+
+global-modules@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+ integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
+ dependencies:
+ global-prefix "^1.0.1"
+ is-windows "^1.0.1"
+ resolve-dir "^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@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+ integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
+ dependencies:
+ expand-tilde "^2.0.2"
+ homedir-polyfill "^1.0.1"
+ ini "^1.3.4"
+ is-windows "^1.0.1"
+ which "^1.2.14"
+
+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"
+
+global-tunnel-ng@^2.7.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f"
+ integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==
+ dependencies:
+ encodeurl "^1.0.2"
+ lodash "^4.17.10"
+ npm-conf "^1.1.3"
+ tunnel "^0.0.6"
+
+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==
+
+globalthis@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b"
+ integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+ integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
+ dependencies:
+ array-union "^1.0.1"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+got@^11.8.3:
+ version "11.8.3"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770"
+ integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==
+ 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@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
+ version "4.2.9"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
+ integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+ integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
+
+handle-thing@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
+ integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+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-symbols@^1.0.1, has-symbols@^1.0.2:
+ 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:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has-unicode@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has-yarn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
+ integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+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==
+
+hexy@^0.2.10:
+ version "0.2.11"
+ resolved "https://registry.yarnpkg.com/hexy/-/hexy-0.2.11.tgz#9939c25cb6f86a91302f22b8a8a72573518e25b4"
+ integrity sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==
+
+homedir-polyfill@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
+ integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
+ dependencies:
+ parse-passwd "^1.0.0"
+
+hosted-git-info@^4.0.2:
+ 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"
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+ integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+html-entities@^1.3.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc"
+ integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==
+
+html-loader@^1.1.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.3.2.tgz#5a72ebba420d337083497c9aba7866c9e1aee340"
+ integrity sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==
+ dependencies:
+ html-minifier-terser "^5.1.1"
+ htmlparser2 "^4.1.0"
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054"
+ integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==
+ dependencies:
+ camel-case "^4.1.1"
+ clean-css "^4.2.3"
+ commander "^4.1.1"
+ he "^1.2.0"
+ param-case "^3.0.3"
+ relateurl "^0.2.7"
+ terser "^4.6.3"
+
+html-webpack-plugin@^4.0.4:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12"
+ integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==
+ dependencies:
+ "@types/html-minifier-terser" "^5.0.0"
+ "@types/tapable" "^1.0.5"
+ "@types/webpack" "^4.41.8"
+ html-minifier-terser "^5.0.1"
+ loader-utils "^1.2.3"
+ lodash "^4.17.20"
+ pretty-error "^2.1.1"
+ tapable "^1.1.3"
+ util.promisify "1.0.0"
+
+htmlparser2@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
+ integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+ domutils "^2.0.0"
+ entities "^2.0.0"
+
+htmlparser2@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
+ integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.0.0"
+ domutils "^2.5.2"
+ entities "^2.0.0"
+
+http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+ integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+ integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
+
+http-errors@1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
+ integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.1"
+
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+http-parser-js@>=0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5"
+ integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==
+
+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"
+
+http-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
+ integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+ dependencies:
+ "@tootallnate/once" "2"
+ agent-base "6"
+ debug "4"
+
+http-proxy-middleware@0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
+ integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
+ dependencies:
+ http-proxy "^1.17.0"
+ is-glob "^4.0.0"
+ lodash "^4.17.11"
+ micromatch "^3.1.10"
+
+http-proxy@^1.17.0:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+ integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+ dependencies:
+ eventemitter3 "^4.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+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"
+
+https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ 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==
+
+humanize-ms@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+ integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
+ dependencies:
+ ms "^2.0.0"
+
+iconv-corefoundation@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a"
+ integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==
+ dependencies:
+ cli-truncate "^2.1.0"
+ node-addon-api "^1.6.3"
+
+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.2:
+ 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@^4.0.0, icss-utils@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+ integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
+ dependencies:
+ postcss "^7.0.14"
+
+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==
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+ integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+
+immediate@~3.0.5:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+ integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+
+import-lazy@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
+ integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
+
+import-local@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+ integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+ dependencies:
+ pkg-dir "^3.0.0"
+ resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+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 sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ 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.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
+ integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
+
+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-ip@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
+ integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==
+ dependencies:
+ default-gateway "^4.2.0"
+ ipaddr.js "^1.9.0"
+
+internal-slot@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
+ integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
+ dependencies:
+ get-intrinsic "^1.1.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+interpret@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+ip-regex@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
+ integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
+
+ip@^1.1.0, ip@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+ integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
+ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
+ 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==
+
+is-absolute-url@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+ integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+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-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+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@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+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-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-callable@^1.1.4, is-callable@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
+ integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-ci@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867"
+ integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==
+ dependencies:
+ ci-info "^3.2.0"
+
+is-core-module@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+ integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+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-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-docker@^2.0.0, is-docker@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.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 sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+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-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, 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-installed-globally@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
+ integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
+ dependencies:
+ global-dirs "^3.0.0"
+ is-path-inside "^3.0.2"
+
+is-lambda@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
+ integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=
+
+is-negative-zero@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-npm@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8"
+ integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==
+
+is-number-object@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
+ integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+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-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-path-cwd@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
+ integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
+
+is-path-in-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
+ integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
+ dependencies:
+ is-path-inside "^2.1.0"
+
+is-path-inside@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
+ integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
+ dependencies:
+ path-is-inside "^1.0.2"
+
+is-path-inside@^3.0.2:
+ 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.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+
+is-plain-object@^2.0.3, 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-regex@^1.0.4, 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-shared-array-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
+ integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+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-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-weakref@^1.0.1:
+ 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.1, 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==
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+is-yarn-global@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
+ integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isbinaryfile@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
+ integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==
+ dependencies:
+ buffer-alloc "^1.2.0"
+
+isbinaryfile@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf"
+ integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+jake@^10.6.1:
+ version "10.8.2"
+ resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b"
+ integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==
+ dependencies:
+ async "0.9.x"
+ chalk "^2.4.2"
+ filelist "^1.0.1"
+ minimatch "^3.0.4"
+
+jest-diff@^27.2.5, jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-get-type@^27.0.6, jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-matcher-utils@27.2.5:
+ version "27.2.5"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz#4684faaa8eb32bf15e6edaead6834031897e2980"
+ integrity sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.2.5"
+ jest-get-type "^27.0.6"
+ pretty-format "^27.2.5"
+
+jest-matcher-utils@^27.2.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-message-util@^27.2.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
+ integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^27.5.1"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-regex-util@^27.0.6:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
+ integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==
+
+jest-worker@^25.4.0:
+ version "25.5.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1"
+ integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==
+ dependencies:
+ merge-stream "^2.0.0"
+ supports-color "^7.0.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"
+
+jpeg-js@0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b"
+ integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==
+
+"js-tokens@^3.0.0 || ^4.0.0", 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@^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"
+
+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"
+
+jsbi@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-2.0.5.tgz#82589011da87dc59b4b549d94dcef51a9155f6fe"
+ integrity sha512-TzO/62Hxeb26QMb4IGlI/5X+QLr9Uqp1FPkwp2+KOICW+Q+vSuFj61c8pkT6wAns4WcK56X7CmSHhJeDGWOqxQ==
+
+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 sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+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, json-parse-better-errors@^1.0.2:
+ 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-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-schema-typed@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9"
+ integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==
+
+json-stringify-safe@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@2.2.0, json5@^2.1.0, json5@^2.1.2, json5@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+ integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
+ dependencies:
+ minimist "^1.2.5"
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+jsonc@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/jsonc/-/jsonc-2.0.0.tgz#9e2a25100d164a9bb864c57517563717fa882551"
+ integrity sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==
+ dependencies:
+ fast-safe-stringify "^2.0.6"
+ graceful-fs "^4.1.15"
+ mkdirp "^0.5.1"
+ parse-json "^4.0.0"
+ strip-bom "^4.0.0"
+ strip-json-comments "^3.0.1"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+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"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+keyv@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.1.1.tgz#02c538bfdbd2a9308cc932d4096f05ae42bfa06a"
+ integrity sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==
+ dependencies:
+ json-buffer "3.0.1"
+
+killable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
+ integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ 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==
+
+lastfm@0.8.x:
+ version "0.8.4"
+ resolved "https://registry.yarnpkg.com/lastfm/-/lastfm-0.8.4.tgz#4dddf08297a6fa23f84d4827052a0d282fe99688"
+ integrity sha1-Td3wgpem+iP4TUgnBSoNKC/plog=
+ dependencies:
+ underscore ""
+
+lastfmapi@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/lastfmapi/-/lastfmapi-0.1.1.tgz#ce336dcf7cc81820c22dc40247c97b31133486fa"
+ integrity sha1-zjNtz3zIGCDCLcQCR8l7MRM0hvo=
+ dependencies:
+ lastfm "0.8.x"
+
+latest-version@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
+ integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
+ dependencies:
+ package-json "^6.3.0"
+
+lazy-val@^1.0.4, lazy-val@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
+ integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
+
+lie@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
+ integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=
+ dependencies:
+ immediate "~3.0.5"
+
+loader-runner@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
+ integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+
+loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
+ integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+localforage@^1.8.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4"
+ integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==
+ dependencies:
+ lie "3.1.1"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+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"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
+lodash.escaperegexp@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
+ integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
+
+lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.2.0:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loglevel@^1.6.8:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114"
+ integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==
+
+long@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+ integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
+loose-envify@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lower-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+ dependencies:
+ tslib "^2.0.3"
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+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@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+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"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
+
+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-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-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-stream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
+ integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+matcher@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
+ integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
+ dependencies:
+ escape-string-regexp "^4.0.0"
+
+"mdns-js@git+https://github.com/ciderapp/node-mdns-js.git":
+ version "1.0.7"
+ resolved "git+https://github.com/ciderapp/node-mdns-js.git#1af6b83ce91e5538012f977e1dcadbda5dc0d3b5"
+ dependencies:
+ debug "^4.1.1"
+ dns-js "github:bitfocus/node-dns-js#v0.2.2"
+ semver "^7.2.3"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+media-typer@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561"
+ integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==
+
+memory-fs@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+memory-fs@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+ integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+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==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+micromatch@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+mime-db@1.51.0:
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+
+"mime-db@>= 1.43.0 < 2":
+ 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.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ dependencies:
+ mime-db "1.51.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==
+
+mime@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7"
+ integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==
+
+mime@^2.4.4, mime@^2.5.2:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
+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-fn@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74"
+ integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ 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==
+
+mini-css-extract-plugin@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e"
+ integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==
+ dependencies:
+ loader-utils "^1.1.0"
+ normalize-url "1.9.1"
+ schema-utils "^1.0.0"
+ webpack-sources "^1.1.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@3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^3.0.4:
+ 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"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+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.1.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
+ integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
+ dependencies:
+ yallist "^4.0.0"
+
+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"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+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==
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+mpris-service@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/mpris-service/-/mpris-service-2.1.2.tgz#ed6db2574f48e1fc356413fd3fc8e857d93d2e7b"
+ integrity sha512-AC6WepCnFWwOME9OWplHZ8ps/BB+g9QrEpUKCv7wX82fDPzR3nPrypOFmL/Fm0JloEAu6QTWSfDLLc6mM/jinw==
+ dependencies:
+ dbus-next "^0.9.2"
+ deep-equal "^1.0.1"
+ source-map-support "^0.5.11"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+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, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multicast-dns-service-types@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+ integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
+
+multicast-dns@^6.0.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
+ integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
+ dependencies:
+ dns-packet "^1.3.1"
+ thunky "^1.0.2"
+
+music-metadata@^7.12.1:
+ version "7.12.2"
+ resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-7.12.2.tgz#13771b5d88285afd93659ed2496912c92e0558b6"
+ integrity sha512-KO1L6q30b6HfGlDQk1VAdrZqCKi4Gy7pN7eZOZ0YZQkhF/KCLHxKCjKKli9ao9kIBC/9s+uXHvjW3bDIBWuGew==
+ dependencies:
+ "@tokenizer/token" "^0.3.0"
+ content-type "^1.0.4"
+ debug "^4.3.3"
+ file-type "16.5.3"
+ media-typer "^1.1.0"
+ strtok3 "^6.2.4"
+ token-types "^4.2.0"
+
+musickit-typescript@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/musickit-typescript/-/musickit-typescript-1.2.4.tgz#d055117e2c897c4ebc570f0d969ad31649744837"
+ integrity sha512-3+/20Pi2zOVAHfUFf631LU2NwaC/qEHBBksM+YQzQ/fff4tIMPX5WJ6We/WXmwTHkAkHIOEitJW4cRPnvVAq+A==
+
+nan@^2.12.1:
+ version "2.15.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
+ integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+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==
+
+no-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
+ dependencies:
+ lower-case "^2.0.2"
+ tslib "^2.0.3"
+
+node-addon-api@^1.3.0, node-addon-api@^1.6.3:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d"
+ integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==
+
+node-fetch@^2.6.1:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-forge@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
+ integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
+
+node-gyp@^8.4.1:
+ 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-loader@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-0.6.0.tgz#c797ef51095ed5859902b157f6384f6361e05ae8"
+ integrity sha1-x5fvUQle1YWZArFX9jhPY2HgWug=
+
+node-releases@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
+ integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
+
+node-ssdp@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/node-ssdp/-/node-ssdp-4.0.1.tgz#ea5b2e9a287823b58b3ede348b22a08159cf718f"
+ integrity sha512-uJXkLZVuyaMg1qNbMbGQ6YzNzyOD+NLxYyxIJocPTKTVECPDokOiCZA686jTLXHMUnV34uY/lcUSJ+/5fhY43A==
+ dependencies:
+ async "^2.6.0"
+ bluebird "^3.5.1"
+ debug "^3.1.0"
+ extend "^3.0.1"
+ ip "^1.1.5"
+
+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"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.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-url@1.9.1, normalize-url@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+ integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
+ dependencies:
+ object-assign "^4.0.1"
+ prepend-http "^1.0.0"
+ query-string "^4.1.0"
+ sort-keys "^1.0.0"
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+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==
+
+npm-conf@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
+ integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
+ dependencies:
+ path-key "^2.0.0"
+
+npm-run-path@^4.0.0:
+ 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.1"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.1.tgz#06f1344a174c06e8de9c6c70834cfba2964bba17"
+ integrity sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==
+ dependencies:
+ are-we-there-yet "^3.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^4.0.0"
+ set-blocking "^2.0.0"
+
+nth-check@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
+ integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
+ dependencies:
+ boolbase "^1.0.0"
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@^1.11.0, object-inspect@^1.9.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
+ integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
+
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.0.12, 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-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@^4.1.0, object.assign@^4.1.2:
+ 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.getownpropertydescriptors@^2.0.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e"
+ integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+obuf@^1.0.0, obuf@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+ integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+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 sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ 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"
+
+open@8.4.0:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8"
+ integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==
+ dependencies:
+ define-lazy-prop "^2.0.0"
+ is-docker "^2.1.1"
+ is-wsl "^2.2.0"
+
+opn@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
+ integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
+ dependencies:
+ is-wsl "^1.1.0"
+
+original@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
+ integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
+ dependencies:
+ url-parse "^1.4.3"
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+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 sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.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-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.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-map@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+ integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
+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-retry@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
+ integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==
+ dependencies:
+ retry "^0.12.0"
+
+p-try@^2.0.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-json@^6.3.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
+ integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
+ dependencies:
+ got "^9.6.0"
+ registry-auth-token "^4.0.0"
+ registry-url "^5.0.0"
+ semver "^6.2.0"
+
+param-case@^3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
+ integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==
+ dependencies:
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse-passwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+ integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+
+parseurl@~1.3.2, 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==
+
+pascal-case@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
+ integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-is-inside@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+ integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
+
+path-key@^2.0.0, path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+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-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+pause-stream@0.0.11:
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
+ integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=
+ dependencies:
+ through "~2.3"
+
+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==
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
+
+picocolors@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
+ integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
+
+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==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
+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==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pirates@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6"
+ integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==
+
+pixelmatch@5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.2.1.tgz#9e4e4f4aa59648208a31310306a5bed5522b0d65"
+ integrity sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==
+ dependencies:
+ pngjs "^4.0.1"
+
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+ dependencies:
+ find-up "^3.0.0"
+
+pkg-dir@^4.1.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"
+
+pkg-up@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
+ integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
+ dependencies:
+ find-up "^3.0.0"
+
+playwright-core@1.19.2:
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.19.2.tgz#90b9209554f174c649abf495952fcb4335437218"
+ integrity sha512-OsL3sJZIo1UxKNWSP7zW7sk3FyUGG06YRHxHeBw51eIOxTCQRx5t+hXd0cvXashN2CHnd3hIZTs2aKa/im4hZQ==
+ dependencies:
+ commander "8.3.0"
+ debug "4.3.3"
+ extract-zip "2.0.1"
+ https-proxy-agent "5.0.0"
+ jpeg-js "0.4.3"
+ mime "3.0.0"
+ pngjs "6.0.0"
+ progress "2.0.3"
+ proper-lockfile "4.1.2"
+ proxy-from-env "1.1.0"
+ rimraf "3.0.2"
+ socks-proxy-agent "6.1.1"
+ stack-utils "2.0.5"
+ ws "8.4.2"
+ yauzl "2.10.0"
+ yazl "2.5.1"
+
+playwright@^1.19.2:
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.19.2.tgz#d9927ae8512482642356e50a286c5767dfb7a621"
+ integrity sha512-2JmGWr/Iw/Uu27bZULeHgjn8doNrRVxIYdhspMuMlfKNpzwAe/sfm7wH8uey6jiZxnPL4bC5V4ACQcF4dAGWnw==
+ dependencies:
+ playwright-core "1.19.2"
+
+plist@^3.0.1, plist@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe"
+ integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==
+ dependencies:
+ base64-js "^1.5.1"
+ xmlbuilder "^9.0.7"
+
+pngjs@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821"
+ integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==
+
+pngjs@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe"
+ integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==
+
+pngjs@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
+ integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
+
+portfinder@^1.0.26:
+ version "1.0.28"
+ resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
+ integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==
+ dependencies:
+ async "^2.6.2"
+ debug "^3.1.1"
+ mkdirp "^0.5.5"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postcss-modules-extract-imports@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+ integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
+ dependencies:
+ postcss "^7.0.5"
+
+postcss-modules-local-by-default@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0"
+ integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==
+ dependencies:
+ icss-utils "^4.1.1"
+ postcss "^7.0.32"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-scope@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
+ integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
+ dependencies:
+ postcss "^7.0.6"
+ postcss-selector-parser "^6.0.0"
+
+postcss-modules-values@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
+ integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
+ dependencies:
+ icss-utils "^4.0.0"
+ postcss "^7.0.6"
+
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
+ version "6.0.9"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f"
+ integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-value-parser@^4.1.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@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
+ version "7.0.39"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
+ integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
+ dependencies:
+ picocolors "^0.2.1"
+ source-map "^0.6.1"
+
+prepend-http@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+ integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+pretty-error@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6"
+ integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==
+ dependencies:
+ lodash "^4.17.20"
+ renderkid "^2.0.4"
+
+pretty-format@^27.2.5, pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@2.0.3, progress@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+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"
+
+proper-lockfile@4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f"
+ integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ retry "^0.12.0"
+ signal-exit "^3.0.2"
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
+
+protobufjs@^6.8.8:
+ version "6.11.2"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b"
+ integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/long" "^4.0.1"
+ "@types/node" ">=13.7.0"
+ long "^4.0.0"
+
+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"
+
+proxy-from-env@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+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@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+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==
+
+pupa@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62"
+ integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==
+ dependencies:
+ escape-goat "^2.0.0"
+
+qap@^3.1.2:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/qap/-/qap-3.3.1.tgz#11f9e8fa8890fe7cb99210c0f44d0613b7372cac"
+ integrity sha1-Efno+oiQ/ny5khDA9E0GE7c3LKw=
+
+qrcode@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.0.tgz#95abb8a91fdafd86f8190f2836abbfc500c72d1b"
+ integrity sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==
+ dependencies:
+ dijkstrajs "^1.0.1"
+ encode-utf8 "^1.0.3"
+ pngjs "^5.0.0"
+ yargs "^15.3.1"
+
+qs@6.9.7:
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe"
+ integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==
+
+query-string@^4.1.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+ integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
+ dependencies:
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+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.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c"
+ integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "1.8.1"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+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"
+
+react-dom@^17.0.2:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
+ integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ scheduler "^0.20.2"
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+react@^17.0.2:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
+ integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+read-config-file@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade"
+ integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==
+ dependencies:
+ dotenv "^9.0.2"
+ dotenv-expand "^5.1.0"
+ js-yaml "^4.1.0"
+ json5 "^2.2.0"
+ lazy-val "^1.0.4"
+
+read-config-file@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-4.0.1.tgz#ece5f6b1a5e6a46d0d93fdd0339f2f60ab892776"
+ integrity sha512-5caED3uo2IAZMPcbh/9hx/O29s2430RLxtnFDdzxpH/epEpawOrQnGBHueotIXUrGPPIgdNQN+S/CIp2WmiSfw==
+ dependencies:
+ ajv "^6.10.1"
+ ajv-keywords "^3.4.1"
+ dotenv "^8.0.0"
+ dotenv-expand "^5.1.0"
+ fs-extra "^8.1.0"
+ js-yaml "^3.13.1"
+ json5 "^2.1.0"
+ lazy-val "^1.0.4"
+
+"readable-stream@1 || 2", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.2.2:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.0.6, 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@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+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"
+
+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-transform@^0.14.2:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
+ integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307"
+ integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3"
+ integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==
+ 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"
+
+"register-scheme@github:devsnek/node-register-scheme":
+ version "0.0.2"
+ resolved "https://codeload.github.com/devsnek/node-register-scheme/tar.gz/e7cc9a63a1f512565da44cb57316d9fb10750e17"
+ dependencies:
+ bindings "^1.3.0"
+ node-addon-api "^1.3.0"
+
+registry-auth-token@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
+ integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==
+ 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"
+
+relateurl@^0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+ integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+renderkid@^2.0.4:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609"
+ integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==
+ dependencies:
+ css-select "^4.1.3"
+ dom-converter "^0.2.0"
+ htmlparser2 "^6.1.0"
+ lodash "^4.17.21"
+ strip-ansi "^3.0.1"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+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==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+
+reselect@^4.0.0:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6"
+ integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ==
+
+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@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
+ dependencies:
+ resolve-from "^3.0.0"
+
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+ integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
+ dependencies:
+ expand-tilde "^2.0.0"
+ global-modules "^1.0.0"
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.13.1, resolve@^1.14.2:
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
+ integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+ dependencies:
+ is-core-module "^2.8.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+responselike@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
+ integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
+ dependencies:
+ lowercase-keys "^2.0.0"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
+
+rimraf@3.0.2, 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"
+
+rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+roarr@^2.15.3:
+ version "2.15.4"
+ resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
+ integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
+ dependencies:
+ boolean "^3.0.1"
+ detect-node "^2.0.4"
+ globalthis "^1.0.1"
+ json-stringify-safe "^5.0.1"
+ semver-compare "^1.0.0"
+ sprintf-js "^1.1.2"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+ dependencies:
+ aproba "^1.1.1"
+
+run-script-os@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/run-script-os/-/run-script-os-1.1.6.tgz#8b0177fb1b54c99a670f95c7fdc54f18b9c72347"
+ integrity sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, 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-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, 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-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sanitize-filename@^1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
+ integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
+ dependencies:
+ truncate-utf8-bytes "^1.0.0"
+
+sax@>=0.6.0, sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+scheduler@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
+ integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+schema-utils@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+ integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-errors "^1.0.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0:
+ 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.0.0, 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"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+ integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
+
+selfsigned@^1.10.8:
+ version "1.10.14"
+ resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574"
+ integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==
+ dependencies:
+ node-forge "^0.10.0"
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
+
+semver-diff@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
+ integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
+ dependencies:
+ semver "^6.3.0"
+
+semver@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^5.3.0, 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@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, 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.1.3, semver@^7.2.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+ dependencies:
+ lru-cache "^6.0.0"
+
+send@0.17.2:
+ version "0.17.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
+ integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "1.8.1"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
+serialize-error@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
+ integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
+ dependencies:
+ type-fest "^0.13.1"
+
+serialize-javascript@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+ integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+ dependencies:
+ randombytes "^2.1.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"
+
+serve-index@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+ integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
+ dependencies:
+ accepts "~1.3.4"
+ batch "0.6.1"
+ debug "2.6.9"
+ escape-html "~1.0.3"
+ http-errors "~1.6.2"
+ mime-types "~2.1.17"
+ parseurl "~1.3.2"
+
+serve-static@1.14.2:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa"
+ integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.2"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ 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 sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+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==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2, 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==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
+ integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+smart-buffer@^4.0.2, 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==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+sockjs-client@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.0.tgz#e0277b8974558edcb557eafc7d3027ef6128d865"
+ integrity sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ==
+ dependencies:
+ debug "^3.2.7"
+ eventsource "^1.1.0"
+ faye-websocket "^0.11.4"
+ inherits "^2.0.4"
+ url-parse "^1.5.10"
+
+sockjs@^0.3.21:
+ version "0.3.24"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce"
+ integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==
+ dependencies:
+ faye-websocket "^0.11.3"
+ uuid "^8.3.2"
+ websocket-driver "^0.7.4"
+
+socks-proxy-agent@6.1.1, socks-proxy-agent@^6.0.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87"
+ integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==
+ dependencies:
+ agent-base "^6.0.2"
+ debug "^4.3.1"
+ socks "^2.6.1"
+
+socks@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a"
+ integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==
+ dependencies:
+ ip "^1.1.5"
+ smart-buffer "^4.2.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@0.4.18:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.11, source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@^0.5.21, source-map-support@~0.5.12, 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-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.0, source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, 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==
+
+source-map@^0.7.3, source-map@~0.7.2:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+spdy-transport@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+ integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
+ dependencies:
+ debug "^4.1.0"
+ detect-node "^2.0.4"
+ hpack.js "^2.1.6"
+ obuf "^1.1.2"
+ readable-stream "^3.0.6"
+ wbuf "^1.7.3"
+
+spdy@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
+ integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
+ dependencies:
+ debug "^4.1.0"
+ handle-thing "^2.0.0"
+ http-deceiver "^1.2.7"
+ select-hose "^2.0.0"
+ spdy-transport "^3.0.0"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+split@0.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
+ integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=
+ dependencies:
+ through "2"
+
+sprintf-js@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+ integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+ssri@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f"
+ integrity sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==
+ dependencies:
+ figgy-pudding "^3.5.1"
+ minipass "^3.1.1"
+
+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"
+
+stack-utils@2.0.5, stack-utils@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
+ integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+stat-mode@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465"
+ integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stream-combiner@~0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+ integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=
+ dependencies:
+ duplexer "~0.1.1"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, 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@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+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"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+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-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-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+
+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-json-comments@^3.0.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 sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+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-loader@^1.1.3:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e"
+ integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^2.7.0"
+
+sumchecker@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
+ integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
+ dependencies:
+ debug "^4.1.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@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.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-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-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==
+
+tapable@^1.0.0, tapable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tapable@^2.1.1, tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+tar@^6.0.2, 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"
+
+temp-file@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7"
+ integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==
+ dependencies:
+ async-exit-hook "^2.0.1"
+ fs-extra "^10.0.0"
+
+terser-webpack-plugin@^2.3.5:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724"
+ integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==
+ dependencies:
+ cacache "^13.0.1"
+ find-cache-dir "^3.3.1"
+ jest-worker "^25.4.0"
+ p-limit "^2.3.0"
+ schema-utils "^2.6.6"
+ serialize-javascript "^4.0.0"
+ source-map "^0.6.1"
+ terser "^4.6.12"
+ webpack-sources "^1.4.3"
+
+terser-webpack-plugin@^5.1.3:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
+ integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==
+ dependencies:
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
+ source-map "^0.6.1"
+ terser "^5.7.2"
+
+terser@^4.6.12, terser@^4.6.3:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+ integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+terser@^5.7.2:
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.0.tgz#728c6bff05f7d1dcb687d8eace0644802a9dae8a"
+ integrity sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==
+ dependencies:
+ acorn "^8.5.0"
+ commander "^2.20.0"
+ source-map "~0.7.2"
+ source-map-support "~0.5.20"
+
+through@2, through@~2.3, through@~2.3.1:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+thunky@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
+ integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
+
+tmp-promise@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
+ integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==
+ dependencies:
+ tmp "^0.2.0"
+
+tmp@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+ integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
+ dependencies:
+ rimraf "^3.0.0"
+
+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 sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+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"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.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, token-types@^4.2.0:
+ 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"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+truncate-utf8-bytes@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+ integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys=
+ dependencies:
+ utf8-byte-length "^1.0.1"
+
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.0.3, tslib@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+ integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
+tunnel@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
+ integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
+
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+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@^1.0.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1"
+ integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
+
+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"
+
+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"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+typescript@^4.5.5:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4"
+ integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+underscore@:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.2.tgz#276cea1e8b9722a8dbed0100a407dda572125881"
+ integrity sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==
+
+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==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+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"
+
+unique-string@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
+ integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
+ dependencies:
+ crypto-random-string "^2.0.0"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+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 sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+update-notifier@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9"
+ integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==
+ dependencies:
+ boxen "^5.0.0"
+ chalk "^4.1.0"
+ configstore "^5.0.1"
+ has-yarn "^2.1.0"
+ import-lazy "^2.1.0"
+ is-ci "^2.0.0"
+ is-installed-globally "^0.4.0"
+ is-npm "^5.0.0"
+ is-yarn-global "^0.3.0"
+ latest-version "^5.1.0"
+ pupa "^2.1.1"
+ semver "^7.3.4"
+ semver-diff "^3.1.1"
+ xdg-basedir "^4.0.0"
+
+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"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-loader@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2"
+ integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==
+ dependencies:
+ loader-utils "^2.0.0"
+ mime-types "^2.1.27"
+ schema-utils "^3.0.0"
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
+url-parse@^1.4.3, url-parse@^1.5.10:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf8-byte-length@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+ integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+ integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+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@^2.1.1, 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==
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@^1.10.0:
+ 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-devtools@^5.1.4:
+ version "5.1.4"
+ resolved "https://registry.yarnpkg.com/vue-devtools/-/vue-devtools-5.1.4.tgz#265a7458ade2affb291739176964256b597fa302"
+ integrity sha512-EBAEXvAHUinsPzoSiElps0JgtLXUnJXKIJbP6nfdz/R63VdKBMfJ34/rFip+4iT7iMbVS5lA4W6N1jq4Hj4LCg==
+
+watchpack@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
+ integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+wbuf@^1.1.0, wbuf@^1.7.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+ integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+webpack-cli@^3.3.11:
+ version "3.3.12"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a"
+ integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==
+ dependencies:
+ chalk "^2.4.2"
+ cross-spawn "^6.0.5"
+ enhanced-resolve "^4.1.1"
+ findup-sync "^3.0.0"
+ global-modules "^2.0.0"
+ import-local "^2.0.0"
+ interpret "^1.4.0"
+ loader-utils "^1.4.0"
+ supports-color "^6.1.0"
+ v8-compile-cache "^2.1.1"
+ yargs "^13.3.2"
+
+webpack-dev-middleware@^3.7.2:
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5"
+ integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==
+ dependencies:
+ memory-fs "^0.4.1"
+ mime "^2.4.4"
+ mkdirp "^0.5.1"
+ range-parser "^1.2.1"
+ webpack-log "^2.0.0"
+
+webpack-dev-server@^3.10.3:
+ version "3.11.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3"
+ integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==
+ dependencies:
+ ansi-html-community "0.0.8"
+ bonjour "^3.5.0"
+ chokidar "^2.1.8"
+ compression "^1.7.4"
+ connect-history-api-fallback "^1.6.0"
+ debug "^4.1.1"
+ del "^4.1.1"
+ express "^4.17.1"
+ html-entities "^1.3.1"
+ http-proxy-middleware "0.19.1"
+ import-local "^2.0.0"
+ internal-ip "^4.3.0"
+ ip "^1.1.5"
+ is-absolute-url "^3.0.3"
+ killable "^1.0.1"
+ loglevel "^1.6.8"
+ opn "^5.5.0"
+ p-retry "^3.0.1"
+ portfinder "^1.0.26"
+ schema-utils "^1.0.0"
+ selfsigned "^1.10.8"
+ semver "^6.3.0"
+ serve-index "^1.9.1"
+ sockjs "^0.3.21"
+ sockjs-client "^1.5.0"
+ spdy "^4.0.2"
+ strip-ansi "^3.0.1"
+ supports-color "^6.1.0"
+ url "^0.11.0"
+ webpack-dev-middleware "^3.7.2"
+ webpack-log "^2.0.0"
+ ws "^6.2.1"
+ yargs "^13.3.2"
+
+webpack-log@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
+ integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
+ dependencies:
+ ansi-colors "^3.0.0"
+ uuid "^3.3.2"
+
+webpack-merge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
+ integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
+ dependencies:
+ lodash "^4.17.15"
+
+webpack-sources@^1.1.0, webpack-sources@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+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.69.1:
+ version "5.69.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.69.1.tgz#8cfd92c192c6a52c99ab00529b5a0d33aa848dc5"
+ integrity sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A==
+ 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.8.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-better-errors "^1.0.2"
+ 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"
+
+websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
+ integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
+ dependencies:
+ http-parser-js ">=0.5.1"
+ safe-buffer ">=5.1.0"
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+ integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+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 sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@^1.2.14, 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"
+
+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"
+
+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"
+
+widest-line@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
+ integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
+ dependencies:
+ string-width "^4.0.0"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.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"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+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"
+
+ws@8.4.2:
+ version "8.4.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b"
+ integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==
+
+ws@^6.2.1:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"
+ integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==
+ dependencies:
+ async-limiter "~1.0.0"
+
+ws@^7.3.1:
+ version "7.5.7"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
+ integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
+
+ws@^8.5.0:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
+ integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
+
+xdg-basedir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
+ integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+
+xml2js@^0.4.17, xml2js@^0.4.23:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
+ integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@>=11.0.1:
+ version "15.1.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"
+ integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
+
+xmlbuilder@^9.0.7:
+ version "9.0.7"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
+ integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+xpipe@*:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf"
+ integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=
+
+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@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+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==
+
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+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@^21.0.0:
+ version "21.0.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35"
+ integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==
+
+yargs@^13.3.2:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
+
+yargs@^15.3.1:
+ 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"
+
+yargs@^17.0.1:
+ version "17.3.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9"
+ integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.0.0"
+
+yauzl@2.10.0, yauzl@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
+yazl@2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
+ integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+
+youtube-search-without-api-key@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/youtube-search-without-api-key/-/youtube-search-without-api-key-1.0.7.tgz#39b348d6416318731430a9316da7900c3744bf4f"
+ integrity sha512-PjwejF6YApZDqTFo46/4q6IQlztUtQsP/8ygcHYyakPHqijIKn36+yUQVPTC92/+IZtqyZBhpTKP1bG6uZKP/Q==
+ dependencies:
+ got "^11.8.3"
diff --git a/crowdin.yml b/crowdin.yml
new file mode 100644
index 00000000..9ac8d3ef
--- /dev/null
+++ b/crowdin.yml
@@ -0,0 +1,3 @@
+files:
+ - source: /src/i18n/source/
+ translation: /src/i18n/%locale_with_underscore%.json
diff --git a/license.txt b/license.txt
new file mode 100644
index 00000000..0ad25db4
--- /dev/null
+++ b/license.txt
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+ .
diff --git a/package.json b/package.json
index 7b288392..0f94d1bc 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "cider",
"applicationId": "Cider",
"productName": "Cider",
- "version": "1.1.0",
+ "version": "1.3.0",
"description": "A new look into listening and enjoying music in style and performance.",
"license": "AGPL-3.0",
"main": "./build/index.js",
@@ -21,56 +21,70 @@
"start:win32": "yarn build && set ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers",
"start:linux": "yarn build && ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers",
"start:darwin": "yarn build && ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers",
+ "start-renderer": "run-script-os",
+ "start-renderer:win32": "set ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers",
+ "start-renderer:linux": "ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers",
+ "start-renderer:darwin": "ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers",
"pack": "electron-builder --dir",
"dist": "yarn build && electron-builder",
+ "dist:macarm": "yarn build && electron-builder --mac --arm64",
+ "dist:universalNotWorking": "yarn build && electron-builder --mac --universal",
"dist:all": "yarn build && electron-builder -mwl",
+ "winget": "yarn build && electron-builder --win -c winget.json",
"msft": "yarn build && electron-builder -c msft-package.json",
- "postinstall": "electron-builder install-app-deps"
+ "postinstall": "electron-builder install-app-deps",
+ "circle:append-bid": "node resources/appendCommitToVersion"
},
"dependencies": {
- "@sentry/electron": "^2.5.4",
+ "@sentry/electron": "^3.0.2",
+ "@sentry/integrations": "^6.18.1",
+ "adm-zip": "0.4.10",
+
+ "castv2-client": "^1.2.0",
+ "chokidar": "^3.5.3",
"discord-rpc": "^4.0.1",
"ejs": "^3.1.6",
"electron-fetch": "^1.7.4",
- "electron-log": "^4.4.4",
+ "electron-log": "^4.4.6",
"electron-notarize": "^1.1.1",
- "electron-packager": "^15.4.0",
"electron-store": "^8.0.1",
- "electron-updater": "^4.6.1",
+ "electron-updater": "^4.6.5",
+
"electron-window-state": "^5.0.3",
- "express": "^4.17.2",
+ "express": "^4.17.3",
"get-port": "^5.1.1",
"jsonc": "^2.0.0",
"lastfmapi": "^0.1.1",
- "mdns-js": "git+https://github.com/bitfocus/node-mdns-js.git",
+ "mdns-js": "git+https://github.com/ciderapp/node-mdns-js.git",
"mpris-service": "^2.1.2",
- "music-metadata": "^7.11.4",
+ "music-metadata": "^7.12.1",
"node-gyp": "^8.4.1",
+ "node-ssdp": "^4.0.1",
"qrcode": "^1.5.0",
- "qrcode-terminal": "^0.12.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"run-script-os": "^1.1.6",
"source-map-support": "^0.5.21",
"typescript": "^4.5.5",
"v8-compile-cache": "^2.3.0",
- "ws": "^8.4.2",
+ "ws": "^8.5.0",
"xml2js": "^0.4.23",
"youtube-search-without-api-key": "^1.0.7"
},
"devDependencies": {
- "@playwright/test": "^1.18.1",
+ "@playwright/test": "^1.19.2",
"@types/discord-rpc": "^4.0.0",
"@types/express": "^4.17.13",
"@types/qrcode-terminal": "^0.12.0",
- "@types/ws": "^8.2.2",
+ "@types/ws": "^8.5.1",
"electron": "git+https://github.com/castlabs/electron-releases.git",
- "electron-builder": "^22.14.5",
+ "electron-builder": "^22.14.13",
+ "electron-builder-notarize-pkg": "^1.2.0",
"electron-webpack": "^2.8.2",
"musickit-typescript": "^1.2.4",
- "playwright": "^1.18.1",
+ "playwright": "^1.19.2",
"vue-devtools": "^5.1.4",
- "webpack": "~5.65.0"
+ "webpack": "~5.69.1"
},
"fileAssociations": [
{
@@ -95,9 +109,9 @@
}
],
"build": {
- "electronVersion": "16.0.7",
+ "electronVersion": "17.1.0",
"electronDownload": {
- "version": "16.0.7+wvcus",
+ "version": "18.0.0-alpha.5+wvcus",
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
},
"appId": "cider",
@@ -119,8 +133,8 @@
"extends": null,
"files": [
"./build/**/*",
- "./resources/icons/icon.*",
- "./src/**/*"
+ "./src/**/*",
+ "./resources/icons/**/*"
],
"linux": {
"target": [
@@ -146,7 +160,31 @@
"perMachine": false,
"allowToChangeInstallationDirectory": true,
"license": "LICENSE",
- "deleteAppDataOnUninstall": true
+ "deleteAppDataOnUninstall": true,
+ "artifactName": "${productName}-Setup-${version}.${ext}"
+ },
+ "pkg": {
+ "installLocation": "/Applications",
+ "background": {
+ "file": "./resources/bg.png",
+ "alignment": "bottomleft",
+ "scaling": "tofit"
+ },
+ "allowAnywhere": true,
+ "allowCurrentUserHome": true,
+ "allowRootDirectory": true,
+ "license": "./resources/license.txt",
+ "isVersionChecked": false,
+ "isRelocatable": false,
+ "overwriteAction": "upgrade"
+ },
+ "dmg": {
+ "background": "./resources/bg.png",
+ "icon": "resources/icons/icon.ico"
+ },
+ "mas": {
+ "entitlements": "./resources/entitlements.mac.plist",
+ "entitlementsInherit": "./resources/entitlements.mac.plist"
},
"win": {
"target": [
@@ -169,7 +207,6 @@
"target": [
"dmg"
]
- },
- "artifactName": "${productName}.${ext}"
+ }
}
}
diff --git a/resources/afterPack.js b/resources/afterPack.js
index 6c677c49..55dcbc91 100644
--- a/resources/afterPack.js
+++ b/resources/afterPack.js
@@ -1,18 +1,31 @@
exports.default = function(context) {
const { execSync } = require('child_process')
+ const fs = require('fs')
if (process.platform !== 'darwin')
return
-
+
+ if (fs.existsSync('dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Electron Framework.sig'))
+ fs.unlinkSync('dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Electron Framework.sig')
+ if (fs.existsSync('dist/mac-universal--arm64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Electron Framework.sig'))
+ fs.unlinkSync('dist/mac-universal--arm64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Electron Framework.sig')
console.log('Castlabs-evs update start')
execSync('python3 -m pip install --upgrade castlabs-evs')
console.log('Castlabs-evs update complete')
-
+ // xcode 13
+ if (fs.existsSync('dist/mac-universal--x64') && fs.existsSync('dist/mac-universal--arm64'))
+ execSync("cp 'dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib' 'dist/mac-universal--arm64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib'",{stdio: 'inherit'})
console.log('VMP signing start')
-
+ if (fs.existsSync('dist/mac-universal'))
+ execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac-universal',{stdio: 'inherit'})
+ if (fs.existsSync('dist/mac'))
execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac',{stdio: 'inherit'})
+ if (fs.existsSync('dist/mac-arm64'))
+ execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac-arm64 -z',{stdio: 'inherit'})
+ if (fs.existsSync('dist/mac-x64'))
+ execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac-x64',{stdio: 'inherit'})
console.log('VMP signing complete')
}
\ No newline at end of file
diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js
new file mode 100644
index 00000000..ef40f330
--- /dev/null
+++ b/resources/appendCommitToVersion.js
@@ -0,0 +1,21 @@
+if (!process.env['CIRCLECI']) {
+ console.log(`[CIRCLECI SCRIPT] CircleCI not found... Aborting script`)
+ return
+}
+
+let fs = require('fs')
+
+var data = fs.readFileSync('package.json');
+var package = JSON.parse(data);
+
+pvers = package.version.match(/\d+\./g)
+
+// https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables
+package.version = `${pvers[0]}${pvers[1]}${process.env['CIRCLE_BUILD_NUM']}`
+
+
+fs.writeFile('package.json', JSON.stringify(package), err => {
+ // error checking
+ if(err) throw err;
+ console.log("VERSION CHANGED");
+});
diff --git a/resources/bg.png b/resources/bg.png
new file mode 100644
index 00000000..049f0b16
Binary files /dev/null and b/resources/bg.png differ
diff --git a/resources/icons/icon.icns b/resources/icons/icon.icns
index 2325c333..4276a463 100644
Binary files a/resources/icons/icon.icns and b/resources/icons/icon.icns differ
diff --git a/resources/license.json b/resources/license.json
new file mode 100644
index 00000000..0451b856
--- /dev/null
+++ b/resources/license.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://github.com/argv-minus-one/dmg-license/raw/master/schema.json",
+ "body": [
+ {
+ "file": "license.txt",
+ "lang": ["en-US"]
+ }
+ ]
+
+
+}
\ No newline at end of file
diff --git a/resources/license.txt b/resources/license.txt
new file mode 100644
index 00000000..0ad25db4
--- /dev/null
+++ b/resources/license.txt
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+ .
diff --git a/resources/macPackager.js b/resources/macPackager.js
new file mode 100644
index 00000000..24d56d81
--- /dev/null
+++ b/resources/macPackager.js
@@ -0,0 +1,399 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const bluebird_lst_1 = require("bluebird-lst");
+const builder_util_1 = require("builder-util");
+const electron_osx_sign_1 = require("electron-osx-sign");
+const promises_1 = require("fs/promises");
+const lazy_val_1 = require("lazy-val");
+const path = require("path");
+const fs_1 = require("builder-util/out/fs");
+const promise_1 = require("builder-util/out/promise");
+const appInfo_1 = require("./appInfo");
+const macCodeSign_1 = require("./codeSign/macCodeSign");
+const core_1 = require("./core");
+const platformPackager_1 = require("./platformPackager");
+const ArchiveTarget_1 = require("./targets/ArchiveTarget");
+const pkg_1 = require("./targets/pkg");
+const targetFactory_1 = require("./targets/targetFactory");
+const macosVersion_1 = require("./util/macosVersion");
+const pathManager_1 = require("./util/pathManager");
+const fs = require("fs/promises");
+class MacPackager extends platformPackager_1.PlatformPackager {
+ constructor(info) {
+ super(info, core_1.Platform.MAC);
+ this.codeSigningInfo = new lazy_val_1.Lazy(() => {
+ const cscLink = this.getCscLink();
+ if (cscLink == null || process.platform !== "darwin") {
+ return Promise.resolve({ keychainFile: process.env.CSC_KEYCHAIN || null });
+ }
+ return macCodeSign_1.createKeychain({
+ tmpDir: this.info.tempDirManager,
+ cscLink,
+ cscKeyPassword: this.getCscPassword(),
+ cscILink: platformPackager_1.chooseNotNull(this.platformSpecificBuildOptions.cscInstallerLink, process.env.CSC_INSTALLER_LINK),
+ cscIKeyPassword: platformPackager_1.chooseNotNull(this.platformSpecificBuildOptions.cscInstallerKeyPassword, process.env.CSC_INSTALLER_KEY_PASSWORD),
+ currentDir: this.projectDir,
+ }).then(result => {
+ const keychainFile = result.keychainFile;
+ if (keychainFile != null) {
+ this.info.disposeOnBuildFinish(() => macCodeSign_1.removeKeychain(keychainFile));
+ }
+ return result;
+ });
+ });
+ this._iconPath = new lazy_val_1.Lazy(() => this.getOrConvertIcon("icns"));
+ }
+ get defaultTarget() {
+ return this.info.framework.macOsDefaultTargets;
+ }
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ prepareAppInfo(appInfo) {
+ return new appInfo_1.AppInfo(this.info, this.platformSpecificBuildOptions.bundleVersion, this.platformSpecificBuildOptions);
+ }
+ async getIconPath() {
+ return this._iconPath.value;
+ }
+ createTargets(targets, mapper) {
+ for (const name of targets) {
+ switch (name) {
+ case core_1.DIR_TARGET:
+ break;
+ case "dmg": {
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ const { DmgTarget } = require("dmg-builder");
+ mapper(name, outDir => new DmgTarget(this, outDir));
+ break;
+ }
+ case "zip":
+ // https://github.com/electron-userland/electron-builder/issues/2313
+ mapper(name, outDir => new ArchiveTarget_1.ArchiveTarget(name, outDir, this, true));
+ break;
+ case "pkg":
+ mapper(name, outDir => new pkg_1.PkgTarget(this, outDir));
+ break;
+ default:
+ mapper(name, outDir => (name === "mas" || name === "mas-dev" ? new targetFactory_1.NoOpTarget(name) : targetFactory_1.createCommonTarget(name, outDir, this)));
+ break;
+ }
+ }
+ }
+ async doPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets) {
+ switch (arch) {
+ default: {
+ return super.doPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets);
+ }
+ case builder_util_1.Arch.universal: {
+ const x64Arch = builder_util_1.Arch.x64;
+ const x64AppOutDir = appOutDir + "--" + builder_util_1.Arch[x64Arch];
+ await super.doPack(outDir, x64AppOutDir, platformName, x64Arch, platformSpecificBuildOptions, targets, false, true);
+ const arm64Arch = builder_util_1.Arch.arm64;
+ const arm64AppOutPath = appOutDir + "--" + builder_util_1.Arch[arm64Arch];
+ await super.doPack(outDir, arm64AppOutPath, platformName, arm64Arch, platformSpecificBuildOptions, targets, false, true);
+ const framework = this.info.framework;
+ builder_util_1.log.info({
+ platform: platformName,
+ arch: builder_util_1.Arch[arch],
+ [`${framework.name}`]: framework.version,
+ appOutDir: builder_util_1.log.filePath(appOutDir),
+ }, `packaging`);
+ const appFile = `${this.appInfo.productFilename}.app`;
+ const { makeUniversalApp } = require("@electron/universal");
+ await makeUniversalApp({
+ x64AppPath: path.join(x64AppOutDir, appFile),
+ arm64AppPath: path.join(arm64AppOutPath, appFile),
+ outAppPath: path.join(appOutDir, appFile),
+ force: true,
+ });
+ await fs.rm(x64AppOutDir, { recursive: true, force: true });
+ await fs.rm(arm64AppOutPath, { recursive: true, force: true });
+ const packContext = {
+ appOutDir,
+ outDir,
+ arch,
+ targets,
+ packager: this,
+ electronPlatformName: platformName,
+ }
+ await this.info.afterPack(packContext)
+ if (framework.afterPack != null) {
+ await framework.afterPack(packContext)
+ }
+ await this.doSignAfterPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets);
+ break;
+ }
+ }
+ }
+ async pack(outDir, arch, targets, taskManager) {
+ let nonMasPromise = null;
+ const hasMas = targets.length !== 0 && targets.some(it => it.name === "mas" || it.name === "mas-dev");
+ const prepackaged = this.packagerOptions.prepackaged;
+ if (!hasMas || targets.length > 1) {
+ const appPath = prepackaged == null ? path.join(this.computeAppOutDir(outDir, arch), `${this.appInfo.productFilename}.app`) : prepackaged;
+ nonMasPromise = (prepackaged
+ ? Promise.resolve()
+ : this.doPack(outDir, path.dirname(appPath), this.platform.nodeName, arch, this.platformSpecificBuildOptions, targets)).then(() => this.packageInDistributableFormat(appPath, arch, targets, taskManager));
+ }
+ for (const target of targets) {
+ const targetName = target.name;
+ if (!(targetName === "mas" || targetName === "mas-dev")) {
+ continue;
+ }
+ const masBuildOptions = builder_util_1.deepAssign({}, this.platformSpecificBuildOptions, this.config.mas);
+ if (targetName === "mas-dev") {
+ builder_util_1.deepAssign(masBuildOptions, this.config.masDev, {
+ type: "development",
+ });
+ }
+ const targetOutDir = path.join(outDir, `${targetName}${builder_util_1.getArchSuffix(arch)}`);
+ if (prepackaged == null) {
+ await this.doPack(outDir, targetOutDir, "mas", arch, masBuildOptions, [target]);
+ await this.sign(path.join(targetOutDir, `${this.appInfo.productFilename}.app`), targetOutDir, masBuildOptions, arch);
+ }
+ else {
+ await this.sign(prepackaged, targetOutDir, masBuildOptions, arch);
+ }
+ }
+ if (nonMasPromise != null) {
+ await nonMasPromise;
+ }
+ }
+ async sign(appPath, outDir, masOptions, arch) {
+ if (!macCodeSign_1.isSignAllowed()) {
+ return;
+ }
+ const isMas = masOptions != null;
+ const options = masOptions == null ? this.platformSpecificBuildOptions : masOptions;
+ const qualifier = options.identity;
+ if (!isMas && qualifier === null) {
+ if (this.forceCodeSigning) {
+ throw new builder_util_1.InvalidConfigurationError("identity explicitly is set to null, but forceCodeSigning is set to true");
+ }
+ builder_util_1.log.info({ reason: "identity explicitly is set to null" }, "skipped macOS code signing");
+ return;
+ }
+ const keychainFile = (await this.codeSigningInfo.value).keychainFile;
+ const explicitType = options.type;
+ const type = explicitType || "distribution";
+ const isDevelopment = type === "development";
+ const certificateTypes = getCertificateTypes(isMas, isDevelopment);
+ let identity = null;
+ for (const certificateType of certificateTypes) {
+ identity = await macCodeSign_1.findIdentity(certificateType, qualifier, keychainFile);
+ if (identity != null) {
+ break;
+ }
+ }
+ if (identity == null) {
+ if (!isMas && !isDevelopment && explicitType !== "distribution") {
+ identity = await macCodeSign_1.findIdentity("Mac Developer", qualifier, keychainFile);
+ if (identity != null) {
+ builder_util_1.log.warn("Mac Developer is used to sign app â it is only for development and testing, not for production");
+ }
+ }
+ if (identity == null) {
+ await macCodeSign_1.reportError(isMas, certificateTypes, qualifier, keychainFile, this.forceCodeSigning);
+ return;
+ }
+ }
+ if (!macosVersion_1.isMacOsHighSierra()) {
+ throw new builder_util_1.InvalidConfigurationError("macOS High Sierra 10.13.6 is required to sign");
+ }
+ let filter = options.signIgnore;
+ if (Array.isArray(filter)) {
+ if (filter.length == 0) {
+ filter = null;
+ }
+ }
+ else if (filter != null) {
+ filter = filter.length === 0 ? null : [filter];
+ }
+ const filterRe = filter == null ? null : filter.map(it => new RegExp(it));
+ let binaries = options.binaries || undefined;
+ if (binaries) {
+ // Accept absolute paths for external binaries, else resolve relative paths from the artifact's app Contents path.
+ const userDefinedBinaries = await Promise.all(binaries.map(async (destination) => {
+ if (await fs_1.statOrNull(destination)) {
+ return destination;
+ }
+ return path.resolve(appPath, destination);
+ }));
+ // Insert at front to prioritize signing. We still sort by depth next
+ binaries = userDefinedBinaries.concat(binaries);
+ builder_util_1.log.info("Signing addtional user-defined binaries: " + JSON.stringify(userDefinedBinaries, null, 1));
+ }
+ const signOptions = {
+ "identity-validation": false,
+ // https://github.com/electron-userland/electron-builder/issues/1699
+ // kext are signed by the chipset manufacturers. You need a special certificate (only available on request) from Apple to be able to sign kext.
+ ignore: (file) => {
+ if (filterRe != null) {
+ for (const regExp of filterRe) {
+ if (regExp.test(file)) {
+ return true;
+ }
+ }
+ }
+ return (file.endsWith(".kext") ||
+ file.startsWith("/Contents/PlugIns", appPath.length) ||
+ file.includes("/node_modules/puppeteer/.local-chromium") ||
+ file.includes("/node_modules/playwright-firefox/.local-browsers") ||
+ file.includes("/node_modules/playwright/.local-browsers"));
+ /* Those are browser automating modules, browser (chromium, nightly) cannot be signed
+ https://github.com/electron-userland/electron-builder/issues/2010
+ https://github.com/electron-userland/electron-builder/issues/5383
+ */
+ },
+ identity: identity,
+ type,
+ platform: isMas ? "mas" : "darwin",
+ version: this.config.electronVersion,
+ app: appPath,
+ keychain: keychainFile || undefined,
+ binaries,
+ timestamp: isMas ? masOptions === null || masOptions === void 0 ? void 0 : masOptions.timestamp : options.timestamp,
+ requirements: isMas || this.platformSpecificBuildOptions.requirements == null ? undefined : await this.getResource(this.platformSpecificBuildOptions.requirements),
+ // https://github.com/electron-userland/electron-osx-sign/issues/196
+ // will fail on 10.14.5+ because a signed but unnotarized app is also rejected.
+ "gatekeeper-assess": options.gatekeeperAssess === true,
+ // https://github.com/electron-userland/electron-builder/issues/1480
+ "strict-verify": options.strictVerify,
+ hardenedRuntime: isMas ? masOptions && masOptions.hardenedRuntime === true : options.hardenedRuntime !== false,
+ };
+ await this.adjustSignOptions(signOptions, masOptions);
+ builder_util_1.log.info({
+ file: builder_util_1.log.filePath(appPath),
+ identityName: identity.name,
+ identityHash: identity.hash,
+ provisioningProfile: signOptions["provisioning-profile"] || "none",
+ }, "signing");
+ await this.doSign(signOptions);
+ // https://github.com/electron-userland/electron-builder/issues/1196#issuecomment-312310209
+ if (masOptions != null && !isDevelopment) {
+ const certType = isDevelopment ? "Mac Developer" : "3rd Party Mac Developer Installer";
+ const masInstallerIdentity = await macCodeSign_1.findIdentity(certType, masOptions.identity, keychainFile);
+ if (masInstallerIdentity == null) {
+ throw new builder_util_1.InvalidConfigurationError(`Cannot find valid "${certType}" identity to sign MAS installer, please see https://electron.build/code-signing`);
+ }
+ // mas uploaded to AppStore, so, use "-" instead of space for name
+ const artifactName = this.expandArtifactNamePattern(masOptions, "pkg", arch);
+ const artifactPath = path.join(outDir, artifactName);
+ await this.doFlat(appPath, artifactPath, masInstallerIdentity, keychainFile);
+ await this.dispatchArtifactCreated(artifactPath, null, builder_util_1.Arch.x64, this.computeSafeArtifactName(artifactName, "pkg", arch, true, this.platformSpecificBuildOptions.defaultArch));
+ }
+ }
+ async adjustSignOptions(signOptions, masOptions) {
+ const resourceList = await this.resourceList;
+ const customSignOptions = masOptions || this.platformSpecificBuildOptions;
+ const entitlementsSuffix = masOptions == null ? "mac" : "mas";
+ let entitlements = customSignOptions.entitlements;
+ if (entitlements == null) {
+ const p = `entitlements.${entitlementsSuffix}.plist`;
+ if (resourceList.includes(p)) {
+ entitlements = path.join(this.info.buildResourcesDir, p);
+ }
+ else {
+ entitlements = pathManager_1.getTemplatePath("entitlements.mac.plist");
+ }
+ }
+ signOptions.entitlements = entitlements;
+ let entitlementsInherit = customSignOptions.entitlementsInherit;
+ if (entitlementsInherit == null) {
+ const p = `entitlements.${entitlementsSuffix}.inherit.plist`;
+ if (resourceList.includes(p)) {
+ entitlementsInherit = path.join(this.info.buildResourcesDir, p);
+ }
+ else {
+ entitlementsInherit = pathManager_1.getTemplatePath("entitlements.mac.plist");
+ }
+ }
+ signOptions["entitlements-inherit"] = entitlementsInherit;
+ if (customSignOptions.provisioningProfile != null) {
+ signOptions["provisioning-profile"] = customSignOptions.provisioningProfile;
+ }
+ signOptions["entitlements-loginhelper"] = customSignOptions.entitlementsLoginHelper;
+ }
+ //noinspection JSMethodCanBeStatic
+ async doSign(opts) {
+ return electron_osx_sign_1.signAsync(opts);
+ }
+ //noinspection JSMethodCanBeStatic
+ async doFlat(appPath, outFile, identity, keychain) {
+ // productbuild doesn't created directory for out file
+ await promises_1.mkdir(path.dirname(outFile), { recursive: true });
+ const args = pkg_1.prepareProductBuildArgs(identity, keychain);
+ args.push("--component", appPath, "/Applications");
+ args.push(outFile);
+ return await builder_util_1.exec("productbuild", args);
+ }
+ getElectronSrcDir(dist) {
+ return path.resolve(this.projectDir, dist, this.info.framework.distMacOsAppName);
+ }
+ getElectronDestinationDir(appOutDir) {
+ return path.join(appOutDir, this.info.framework.distMacOsAppName);
+ }
+ // todo fileAssociations
+ async applyCommonInfo(appPlist, contentsPath) {
+ const appInfo = this.appInfo;
+ const appFilename = appInfo.productFilename;
+ // https://github.com/electron-userland/electron-builder/issues/1278
+ appPlist.CFBundleExecutable = appFilename.endsWith(" Helper") ? appFilename.substring(0, appFilename.length - " Helper".length) : appFilename;
+ const icon = await this.getIconPath();
+ if (icon != null) {
+ const oldIcon = appPlist.CFBundleIconFile;
+ const resourcesPath = path.join(contentsPath, "Resources");
+ if (oldIcon != null) {
+ await fs_1.unlinkIfExists(path.join(resourcesPath, oldIcon));
+ }
+ const iconFileName = "icon.icns";
+ appPlist.CFBundleIconFile = iconFileName;
+ await fs_1.copyFile(icon, path.join(resourcesPath, iconFileName));
+ }
+ appPlist.CFBundleName = appInfo.productName;
+ appPlist.CFBundleDisplayName = appInfo.productName;
+ const minimumSystemVersion = this.platformSpecificBuildOptions.minimumSystemVersion;
+ if (minimumSystemVersion != null) {
+ appPlist.LSMinimumSystemVersion = minimumSystemVersion;
+ }
+ appPlist.CFBundleIdentifier = appInfo.macBundleIdentifier;
+ appPlist.CFBundleShortVersionString = this.platformSpecificBuildOptions.bundleShortVersion || appInfo.version;
+ appPlist.CFBundleVersion = appInfo.buildVersion;
+ builder_util_1.use(this.platformSpecificBuildOptions.category || this.config.category, it => (appPlist.LSApplicationCategoryType = it));
+ appPlist.NSHumanReadableCopyright = appInfo.copyright;
+ if (this.platformSpecificBuildOptions.darkModeSupport) {
+ appPlist.NSRequiresAquaSystemAppearance = false;
+ }
+ const extendInfo = this.platformSpecificBuildOptions.extendInfo;
+ if (extendInfo != null) {
+ Object.assign(appPlist, extendInfo);
+ }
+ }
+ async signApp(packContext, isAsar) {
+ const appFileName = `${this.appInfo.productFilename}.app`;
+ await bluebird_lst_1.default.map(promises_1.readdir(packContext.appOutDir), (file) => {
+ if (file === appFileName) {
+ return this.sign(path.join(packContext.appOutDir, file), null, null, null);
+ }
+ return null;
+ });
+ if (!isAsar) {
+ return;
+ }
+ const outResourcesDir = path.join(packContext.appOutDir, "resources", "app.asar.unpacked");
+ await bluebird_lst_1.default.map(promise_1.orIfFileNotExist(promises_1.readdir(outResourcesDir), []), (file) => {
+ if (file.endsWith(".app")) {
+ return this.sign(path.join(outResourcesDir, file), null, null, null);
+ }
+ else {
+ return null;
+ }
+ });
+ }
+}
+exports.default = MacPackager;
+function getCertificateTypes(isMas, isDevelopment) {
+ if (isDevelopment) {
+ return isMas ? ["Mac Developer", "Apple Development"] : ["Developer ID Application"];
+ }
+ return isMas ? ["Apple Distribution"] : ["Developer ID Application"];
+}
+//# sourceMappingURL=macPackager.js.map
\ No newline at end of file
diff --git a/resources/verror-types b/resources/verror-types
new file mode 100644
index 00000000..07cfb21d
--- /dev/null
+++ b/resources/verror-types
@@ -0,0 +1,77 @@
+// Type definitions for verror 1.10
+// Project: https://github.com/davepacheco/node-verror
+// Definitions by: Sven Reglitzki , Maxime Toumi-M
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+/*
+ * VError([cause], fmt[, arg...]): Like JavaScript's built-in Error class, but
+ * supports a "cause" argument (another error) and a printf-style message. The
+ * cause argument can be null or omitted entirely.
+ *
+ * Examples:
+ *
+ * CODE MESSAGE
+ * new VError('something bad happened') "something bad happened"
+ * new VError('missing file: "%s"', file) "missing file: "/etc/passwd"
+ * with file = '/etc/passwd'
+ * new VError(err, 'open failed') "open failed: file not found"
+ * with err.message = 'file not found'
+ */
+declare class VError extends Error {
+ static VError: typeof VError;
+
+ static cause(err: Error): Error | null;
+ static info(err: Error): VError.Info;
+ static fullStack(err: Error): string;
+ static findCauseByName(err: Error, name: string): Error | null;
+ static hasCauseWithName(err: Error, name: string): boolean;
+ static errorFromList(errors: T[]): null | T | VError.MultiError;
+ static errorForEach(err: Error, func: (err: Error) => void): void;
+
+ //@ts-ignore
+ cause(): Error | undefined;
+ constructor(options: VError.Options | Error, message: string, ...params: any[]);
+ constructor(message?: string, ...params: any[]);
+}
+
+declare namespace VError {
+ interface Info {
+ [key: string]: any;
+ }
+
+ interface Options {
+ cause?: Error | null | undefined;
+ name?: string | undefined;
+ strict?: boolean | undefined;
+ constructorOpt?(...args: any[]): void;
+ info?: Info | undefined;
+ }
+
+ /*
+ * SError is like VError, but stricter about types. You cannot pass "null" or
+ * "undefined" as string arguments to the formatter. Since SError is only a
+ * different function, not really a different class, we don't set
+ * SError.prototype.name.
+ */
+ class SError extends VError {}
+
+ /*
+ * Represents a collection of errors for the purpose of consumers that generally
+ * only deal with one error. Callers can extract the individual errors
+ * contained in this object, but may also just treat it as a normal single
+ * error, in which case a summary message will be printed.
+ */
+ class MultiError extends VError {
+ constructor(errors: Error[]);
+ errors(): Error[];
+ }
+
+ /*
+ * Like JavaScript's built-in Error class, but supports a "cause" argument which
+ * is wrapped, not "folded in" as with VError. Accepts a printf-style message.
+ * The cause argument can be null.
+ */
+ class WError extends VError {}
+}
+
+export = VError;
\ No newline at end of file
diff --git a/src/i18n/README.md b/src/i18n/README.md
index cdbba71d..525e6f46 100644
--- a/src/i18n/README.md
+++ b/src/i18n/README.md
@@ -1,4 +1,4 @@
-# Cider i18n
+# Cider i18n Notices & Changelog
Some notes about Cider's i18n support.
@@ -9,6 +9,26 @@ Some notes about Cider's i18n support.
- Most of the strings in the content area are provided and translated by Apple themselves, and do not need to be translated.
- The language Apple Music uses are dependent on the storefront region.
+# Multiple Plural Forms
+
+Multiple plural forms can be supported as below:
+
+The keys and its meanings are here : https://github.com/prantlf/fast-plural-rules/blob/master/docs/languages.md#supported-languages
+
+For example , English is in Plural rule #1 and has 2 keys ```one``` and ```other```
+
+Russian is in Plural rule #7 (3 forms) : ```one```, ```few``` and ```other```
+
+How it is implemented for English:
+
+```
+ "term.track": {
+ "one" : "track",
+ "other" : "tracks"
+ },
+```
+
+
## Localization Notices
@@ -16,4 +36,155 @@ Several changes have been made to configuration options and will be listed below
been modified, the ones not mentioned in the list need modifying.
* `settings.option.experimental.closeButtonBehaviour`: Changed to `close_button_hide` - Should be "Close Button Should Hide the Application". `.quit`, `.minimizeTaskbar` and `.minimizeTray` have been removed. Translations done for en_US.
-* `action.update`: Added for `en_US`.
\ No newline at end of file
+* `action.update`: Added for `en_US`.
+* `term.topResult`: "Top Result" - Added for `en_US`.
+* `term.sharedPlaylists`: "Shared Playlists" - Added for `en_US`.
+* `term.people`: "People" - Added for `en_US`.
+
+Update 02/02/2022 17:16 UTC
+
+* `term.newpreset.name`: Added for `en_US`.
+* `term.addedpreset`: Added for `en_US`.
+* `term.deletepreset.warn`: Added for `en_US`.
+* `term.deletedpreset`: Added for `en_US`.
+* `term.musicVideos`: Added for `en_US`.
+* `term.stations`: Added for `en_US`.
+* `term.curators`: Added for `en_US`.
+* `term.appleCurators`: Added for `en_US`.
+* `term.radioShows`: Added for `en_US`.
+* `term.recordLabels`: Added for `en_US`.
+* `term.videoExtras`: Added for `en_US`.
+* `term.top`: Added for `en_US`.
+* `action.newpreset`: Added for `en_US`.
+* `action.deletepreset`: Added for `en_US`.
+
+Update 04/02/2022 10:00 UTC
+
+* `term.history`: Added for `en_US`.
+* `action.copy`: Added for `en_US`.
+* `settings.header.visual.theme`: Added for `en_US`.
+* `settings.option.visual.theme.default`: Added for `en_US`.
+* `settings.option.visual.theme.dark`: Added for `en_US`.
+* `settings.option.experimental.copy_log`: Added for `en_US`.
+* `settings.option.experimental.inline_playlists`: Added for `en_US`.
+
+Update 05/02/2022 09:00 UTC
+
+* `settings.header.audio.quality.hireslossless`: Added for `en_US`.
+* `settings.header.audio.quality.hireslossless.description`: Added for `en_US`.
+* `settings.header.audio.quality.lossless`: Added for `en_US`.
+* `settings.header.audio.quality.lossless.description`: Added for `en_US`.
+* `settings.option.audio.enableAdvancedFunctionality.ciderPPE`: Added for `en_US`.
+* `settings.option.audio.enableAdvancedFunctionality.ciderPPE.description`: Added for `en_US`.
+
+Update 06/02/2022 10:35 UTC
+
+* `settings.header.audio.quality.hireslossless.description`: Brackets removed, handled in renderer.
+* `settings.header.audio.quality.lossless.description`: Brackets removed, handled in renderer.
+* `settings.header.audio.quality.high.description`: Added for `en_US`.
+* `settings.header.audio.quality.auto`: Removed as default for MusicKit is 256.
+* `settings.header.audio.quality.standard`: Replaced `settings.header.audio.quality.low` to match MusicKit naming.
+* `settings.header.audio.quality.standard.description`: Added for `en_US`.
+
+Update 08/02/2022 10:20 UTC
+
+* `settings.option.general.updateCider`: Added for `en_US`.
+* `settings.option.general.updateCider.branch`: Added for `en_US`.
+* `settings.option.general.updateCider.branch.description`: Added for `en_US`.
+* `settings.option.general.updateCider.branch.main`: Added for `en_US`.
+* `settings.option.general.updateCider.branch.develop`: Added for `en_US`.
+* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength`: Added for `en_US`.
+* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description`: Added for `en_US`.
+* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard`: Added for `en_US`.
+* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive`: Added for `en_US`.
+* `settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility`: Added for `en_US`.
+* `settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility`: Added for `en_US`.
+* `term.requestError`: Added for `en_US`.
+* `term.song.link.generate`: Added for `en_US`.
+
+Update 10/02/2022 05:58 UTC
+
+* `term.sortBy.dateAdded`: Added for `en_US`.
+
+Update 12/02/2022 12:00 UTC
+
+* Added support for multiple plural forms. [Details](#multiple-plural-forms)
+* `term.version`: Added for `en_US`.
+* `settings.option.visual.theme.github.download`: Added for `en_US`.
+* `settings.prompt.visual.theme.github.URL`: Added for `en_US`.
+* `settings.notyf.visual.theme.install.success`: Added for `en_US`.
+* `settings.notyf.visual.theme.install.error`: Added for `en_US`.
+* `term.defaultPresets`: Added for `en_US`.
+* `term.userPresets`: Added for `en_US`.
+
+Update 16/02/2022 21:45 UTC
+
+* `term.audioControls`: Added for `en_US`.
+* `settings.option.audio.volumeStep`: Added for `en_US`.
+* `settings.option.audio.maxVolume`: Added for `en_US`.`
+
+Update 17/02/2022 10:00 UTC
+
++ `settings.header.debug`: Added for `en_US`.
++ `settings.option.debug.copy_log`: Replaces `settings.option.experimental.copy_log`.
++ `settings.option.debug.openAppData`: Added for `en_US`
++ `action.open`: Added for `en_US`
+
+Update 19/2/2022 21:00 UTC
+
+* `term.noVideos`: Added for `en_US`
+* `term.plugin`: Added for `en_US`
+* `term.pluginMenu`: Added for `en_US`
+* `term.replay`: Added for `en_US`
+* `term.uniqueAlbums`: Added for `en_US`
+* `term.uniqueArtists`: Added for `en_US`
+* `term.uniqueSongs`: Added for `en_US`
+* `term.topArtists`: Added for `en_US`
+* `term.listenedTo`: Added for `en_US`
+* `term.times`: Added for `en_US`
+* `term.topAlbums`: Added for `en_US`
+* `term.plays`: Added for `en_US`
+* `term.topGenres`: Added for `en_US`
+* `action.install`: Added for `en_US`
+* `settings.option.general.resumebehavior`: Added for `en_US`
+* `settings.option.general.resumebehavior.description`: Added for `en_US`
+* `settings.option.general.resumebehavior.locally`: Added for `en_US`
+* `settings.option.general.resumebehavior.locally.description`: Added for `en_US`
+* `settings.option.general.resumebehavior.history`: Added for `en_US`
+* `settings.option.general.resumebehavior.history.description`: Added for `en_US`
+* `settings.option.audio.audioLab`: Added for `en_US`
+* `settings.option.audio.audioLab.description`: Added for `en_US`
+* `settings.warn.audioLab.withoutAF`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.analogWarmth`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.analogWarmth.description`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard`: Added for `en_US`
+* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile`: Added for `en_US`
+* `settings.header.visual.theme.github.page`: Added for `en_US`
+* `settings.option.visual.theme.github.explore`: Added for `en_US`
+* `settings.option.visual.theme.github.install.confirm`: Added for `en_US`
+* `settings.option.experimental.unknownPlugin`: Added for `en_US`
+* `settings.option.experimental.unknownPlugin.description`: Added for `en_US`
+
+Update 25/02/2022 15:30 UTC
+
+* `action.moveToTop`: Changed to `Move out of Folder` instead of `Move to top`
+
+Update 27/02/2022 18:30 UTC
+
+* `settings.notyf.updateCider.update-not-available`: Added for `en_US`
+* `settings.notyf.updateCider.update-timeout`: Added for `en_US`
+* `settings.notyf.updateCider.update-downloaded`: Added for `en_US`
+* `settings.notyf.updateCider.update-error`: Added for `en_US`
+
+Update 28/02/2022 13:00 UTC
+
+* `term.time.days`: Added for `en_US`
+* `term.time.day`: Added for `en_US`
\ No newline at end of file
diff --git a/src/i18n/cz_CZ.json b/src/i18n/cz_CZ.json
new file mode 100644
index 00000000..147c6297
--- /dev/null
+++ b/src/i18n/cz_CZ.json
@@ -0,0 +1,309 @@
+{
+ "i18n.languageName": "ÄeÅĄtina (CZ)",
+ "i18n.languageNameEnglish": "Czech (CZ)",
+ "i18n.category": "main",
+ "i18n.authors": "@matuskoOk",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "ZruÅĄit",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Aktualizace skladeb v knihovnÄ...",
+ "notification.updatingLibraryAlbums": "Aktualizace alb knihovny...",
+ "notification.updatingLibraryArtists": "Aktualizace umÄlců knihovny...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "ZjistÄte vÃce",
+ "term.accountSettings": "Nastavenà ÃēÄtu",
+ "term.logout": "OdhlÃĄsit se",
+ "term.login": "PÅihlÃĄsit se",
+ "term.about": "About",
+ "term.privateSession": "SoukromÃĄ relace",
+ "term.queue": "Fronta",
+ "term.history": "Historie",
+ "term.search": "VyhledÃĄvÃĄnÃ",
+ "term.library": "Knihovna",
+ "term.listenNow": "Poslouchejte hned",
+ "term.browse": "ProchÃĄzet",
+ "term.radio": "RÃĄdio",
+ "term.recentlyAdded": "NedÃĄvno pÅidanÊ",
+ "term.songs": "PÃsnÄ",
+ "term.albums": "Alba",
+ "term.artists": "UmÄlci",
+ "term.podcasts": "Podcasty",
+ "term.playlists": "Playlists",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "NovÃŊ seznam playlistu",
+ "term.newPlaylistFolder": "NovÃĄ sloÅžka playlistov",
+ "term.createNewPlaylist": "VytvoÅit novÃŊ seznam playlistov",
+ "term.createNewPlaylistFolder": "VytvoÅit novÃŊ seznam playlist sloÅžka",
+ "term.deletePlaylist": "Opravdu chcete tento playlist smazat?",
+ "term.play": "Play",
+ "term.pause": "Pause",
+ "term.previous": "PÅedchozÃ",
+ "term.next": "DalÅĄÃ",
+ "term.shuffle": "ZamÃchat",
+ "term.repeat": "Repeat",
+ "term.volume": "HlasitosÅĨ",
+ "term.mute": "Mute",
+ "term.unmute": "Ztlumit",
+ "term.share": "ZdÃlet",
+ "term.share.success": "ZkopÃrovÃĄno do clipboard",
+ "term.settings": "NastavenÃ",
+ "term.seeAll": "VidÄt vÅĄe",
+ "term.sortBy": "SeÅazeno podle",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "UmÄlec",
+ "term.sortBy.name": "NÃĄzev",
+ "term.sortBy.genre": "ÅŊÃĄnr",
+ "term.sortBy.releaseDate": "Datum vydÃĄnÃ",
+ "term.sortBy.duration": "Doba trvÃĄnÃ",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "VzestupnÄ",
+ "term.sortOrder.descending": "KlesajÃcÃ",
+ "term.viewAs": "Zobrazit jako",
+ "term.viewAs.coverArt": "ObÃĄlka Art",
+ "term.viewAs.list": "Seznam",
+ "term.size": "Velikost",
+ "term.size.normal": "NormÃĄlnÃ",
+ "term.size.compact": "KompaktnÃ",
+ "term.enable": "Zapnout",
+ "term.disable": "Vypnout",
+ "term.enabled": "Zapnuto",
+ "term.disabled": "Vypnuto",
+ "term.connect": "PÅipojit",
+ "term.connecting": "PÅipojovÃĄnÃ",
+ "term.disconnect": "Odpojit",
+ "term.authed": "OvÄÅeno",
+ "term.confirm": "Potvrdit?",
+ "term.more": "VÃce",
+ "term.less": "MÊnÄ",
+ "term.showMore": "Zobrazit vÃce",
+ "term.showLess": "UkaÅž mÊnÄ",
+ "term.topSongs": "NejlepÅĄÃ skladby",
+ "term.latestReleases": "NejnovÄjÅĄÃ verze",
+ "term.time.added": "PÅidanÊ",
+ "term.time.released": "VydÃĄno",
+ "term.time.updated": "AktualizovÃĄno",
+ "term.time.hours": "hodin",
+ "term.time.hour": "hodina",
+ "term.time.minutes": "minut",
+ "term.time.minute": "minuta",
+ "term.time.seconds": "sekundy",
+ "term.time.second": "sekunda",
+ "term.fullscreenView": "Zobrazenà na celou obrazovku",
+ "term.defaultView": "VÃŊchozà zobrazenÃ",
+ "term.audioSettings": "Nastavenà zvuku",
+ "term.clearAll": "Vymazat vÅĄe",
+ "term.recentStations": "NedÃĄvnÊ stanice",
+ "term.language": "Jazyk",
+ "term.funLanguages": "ZÃĄbava",
+ "term.noLyrics": "NaÄÃtÃĄnÃ... / Text nenalezen./ InstrumentÃĄlnÃ.",
+ "term.copyright": "AutorskÃĄ prÃĄva",
+ "term.rightsReserved": "VÅĄechna prÃĄva vyhrazena.",
+ "term.sponsor": "Sponzorujte tento projekt",
+ "term.ciderTeam": "Cider TÃŊm",
+ "term.developer": "VÃŊvojÃĄÅ",
+ "term.socialTeam": "SociÃĄlnà tÃŊm",
+ "term.socials": "Socials",
+ "term.contributors": "PÅispÄvatelÊ",
+ "term.equalizer": "EkvalizÊr",
+ "term.reset": "Resetovat",
+ "term.tracks": "tracks",
+ "term.videos": "Videa",
+ "term.menu": "Menu",
+ "term.check": "Zkontrolovat",
+ "term.aboutArtist": "O {{artistName}}",
+ "term.topResult": "NejlepÅĄÃ vÃŊsledek",
+ "term.sharedPlaylists": "SdÃlenÃŊ Playlists",
+ "term.people": "LidÊ",
+ "term.newpreset.name": "NÃĄzev novÊ pÅedvolby EQ",
+ "term.addedpreset": "PÅidÃĄna pÅedvolba",
+ "term.deletepreset.warn": "Opravdu chcete tuto pÅedvolbu smazat?",
+ "term.deletedpreset": "PÅedvolba byla odstranÄna",
+ "term.musicVideos": "Hudebnà videa",
+ "term.stations": "Stanice",
+ "term.curators": "KurÃĄtoÅi",
+ "term.appleCurators": "Apple Curators",
+ "term.radioShows": "RozhlasovÊ poÅady",
+ "term.recordLabels": "NahrÃĄvacÃ ÅĄtÃtky",
+ "term.videoExtras": "Video Extra",
+ "term.top": "Top",
+ "home.title": "Domů",
+ "home.recentlyPlayed": "NedÃĄvno hranÊ",
+ "home.recentlyAdded": "NedÃĄvno pÅidanÊ",
+ "home.artistsFeed": "VÃĄÅĄ kanÃĄl umÄlců",
+ "home.artistsFeed.noArtist": "Nejprve sledujte nÄkterÊ umÄlce a jejich nejnovÄjÅĄÃ verze budou zde",
+ "home.madeForYou": "UdÄlÃĄno pro tebe",
+ "home.friendsListeningTo": "PÅÃĄtelÊ PoslouchajÃ",
+ "home.followedArtists": "SledovanÊ umÄlce",
+ "error.appleMusicSubRequired": "Apple Music vyÅžaduje pÅedplatnÊ.",
+ "error.connectionError": "DoÅĄlo k problÊmu s pÅipojenÃm k Apple Music.",
+ "error.noResults": "ÅŊÃĄdnÊ vÃŊsledky.",
+ "error.noResults.description": "Zkuste novÊ vyhledÃĄvÃĄnÃ.",
+ "podcast.followOnCider": "Sledujte Na Cider",
+ "podcast.followedOnCider": "Sledujete Na Cider",
+ "podcast.subscribeOnItunes": "PÅedplatit na iTunes",
+ "podcast.subscribedOnItunes": "PÅedplaceno na iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Epizody",
+ "podcast.playEpisode": "PÅehrÃĄt epizodu",
+ "podcast.website": "WebovÃĄ strÃĄnka podcastun ",
+ "action.addToLibrary": "PÅidat do knihovny",
+ "action.addToLibrary.success": "PÅidÃĄno do knihovny",
+ "action.addToLibrary.error": "Chyba pÅi pÅidÃĄvÃĄnà do knihovny",
+ "action.removeFromLibrary": "Odebrat z knihovny",
+ "action.removeFromLibrary.success": "OdebrÃĄno z knihovny",
+ "action.addToQueue": "PÅidat do fronty",
+ "action.addToQueue.success": "PÅidÃĄno do fronty",
+ "action.addToQueue.error": "Chyba pÅi pÅidÃĄvÃĄnà do fronty",
+ "action.removeFromQueue": "Odebrat z fronty",
+ "action.removeFromQueue.success": "OdebrÃĄno z fronty",
+ "action.removeFromQueue.error": "Chyba pÅi odstraÅovÃĄnà z fronty",
+ "action.createPlaylist": "VytvoÅ novÃŊ Playlist",
+ "action.addToPlaylist": "PÅidat do Playlist",
+ "action.removeFromPlaylist": "Odstranit z Playlist",
+ "action.addToFavorites": "PÅidat k oblÃbenÃŊm",
+ "action.follow": "Sledovat",
+ "action.follow.success": "SledujeÅĄ",
+ "action.follow.error": "Chyba sledovÃĄnÃ",
+ "action.unfollow": "PÅestat sledovat",
+ "action.unfollow.success": "NesledovÃĄno",
+ "action.unfollow.error": "Chyba pÅi zruÅĄenà sledovÃĄnÃ",
+ "action.playNext": "Play DalÅĄÃ",
+ "action.playLater": "Play PozdÄji",
+ "action.startRadio": "Start RÃĄdio",
+ "action.goToArtist": "PÅejÃt na UmÄlec",
+ "action.goToAlbum": "PÅejdÄte do alba",
+ "action.moveToTop": "PÅesunout nahoru",
+ "action.share": "SdÃlet",
+ "action.rename": "PÅejmenovat",
+ "action.love": "Milovat",
+ "action.unlove": "Nemilovat",
+ "action.dislike": "Dislike",
+ "action.undoDislike": "Undo dislike",
+ "action.showWebRemoteQR": "Web Remote",
+ "action.playTracksNext": "Play ${app.selectedMediaItems.length} tracks next",
+ "action.playTracksLater": "Play ${app.selectedMediaItems.length} tracks later",
+ "action.removeTracks": "Odstranit ${self.selectedItems.length} tracks from queue",
+ "action.import": "ImportovaÅĨ",
+ "action.export": "ExportovaÅĨ",
+ "action.showAlbum": "Zobrazit kompletnà album",
+ "action.tray.minimize": "Minimalizovat do liÅĄty",
+ "action.tray.quit": "PÅestat",
+ "action.tray.show": "UkÃĄzat",
+ "action.update": "Aktualizace",
+ "action.copy": "kopÃrovat",
+ "action.newpreset": "NovÃĄ pÅedvolba...",
+ "action.deletepreset": "Smazat pÅedvolbu",
+ "settings.header.general": "VÅĄeobecnÊ",
+ "settings.header.general.description": "Upravte obecnÃĄ nastavenà pro Cider.",
+ "settings.option.general.language": "Jazyk",
+ "settings.option.general.language.main": "Jazyky",
+ "settings.option.general.language.fun": "ZÃĄbavnÊ jazyky",
+ "settings.option.general.language.unsorted": "NeÅazeno",
+ "settings.option.general.updateCider": "Aktualizujte Cider",
+ "settings.option.general.updateCider.branch": "PoboÄka aktualizace cideru",
+ "settings.option.general.updateCider.branch.description": "Vyberte poboÄku, do kterÊ chcete Cider aktualizovat",
+ "settings.option.general.updateCider.branch.main": "StabilnÃ",
+ "settings.option.general.updateCider.branch.develop": "Rozvoj",
+ "settings.header.audio": "Zvuk",
+ "settings.header.audio.description": "Upravte nastavenà zvuku pro Cider.",
+ "settings.option.audio.quality": "Kvalita zvuku",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "aÅž 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "aÅž 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "VysokÊ",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standard",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "PlynulÃŊ pÅechod zvuku",
+ "settings.option.audio.enableAdvancedFunctionality": "Povolit pokroÄilÊ funkce",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Povolenà funkce AudioContext umoÅžnà rozÅĄÃÅenÊ zvukovÊ funkce, jako je normalizace zvuku, ekvalizÊry a vizualizÊry, ale na nÄkterÃŊch systÊmech to můŞe způsobit zadrhÃĄvÃĄnà ve zvukovÃŊch stopÃĄch.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "PsychoakustickÃĄ vylepÅĄenÃ, dÃky nimÅž vÅĄe znà bohatÄji a ÅživÄji | Navrhl Maikiwi.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "SÃla CAP",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "ZmÄnà sÃlu zpracovÃĄnà zvuku. (Agresivita můŞe vÊst k neÅžÃĄdoucÃm vÃŊsledkům)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "AgresivnÃ",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizace zvuku",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizuje ÅĄpiÄkovou hlasitost pro jednotlivÊ stopy a vytvÃĄÅà jednotnÄjÅĄÃ zÃĄÅžitek z poslechu.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Prostorovost zvuku",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ProstorovÄ upravte zvuk a udÄlejte zvuk vÃce 3-rozmÄrnÃŊ (poznÃĄmka: Toto nenà Dolby Atmos)",
+ "settings.header.visual": "VizuÃĄlnÃ",
+ "settings.header.visual.description": "Upravte vizuÃĄlnà nastavenà pro Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Styl pozadà okna",
+ "settings.header.visual.windowBackgroundStyle.none": "ÅŊÃĄdnÃŊ",
+ "settings.header.visual.windowBackgroundStyle.artwork": "UmÄleckÊ dÃlo",
+ "settings.header.visual.windowBackgroundStyle.image": "obraz",
+ "settings.option.visual.animatedArtwork": "AnimovanÊ umÄleckÊ dÃlo",
+ "settings.header.visual.animatedArtwork.always": "VÅždy",
+ "settings.header.visual.animatedArtwork.limited": "Omezeno na strÃĄnky a speciÃĄlnà poloÅžky",
+ "settings.header.visual.animatedArtwork.disable": "ZakÃĄzat vÅĄude",
+ "settings.option.visual.animatedArtworkQuality": "Kvalita animovanÊho umÄleckÊho dÃla",
+ "settings.header.visual.animatedArtworkQuality.low": "NÃzkÃŊ",
+ "settings.header.visual.animatedArtworkQuality.medium": "StÅednÃ",
+ "settings.header.visual.animatedArtworkQuality.high": "VysokÃŊ",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Velmi vysokÃŊ",
+ "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÊmnÃ",
+ "settings.option.visual.animatedWindowBackground": "AnimovanÊ pozadà okna",
+ "settings.option.visual.hardwareAcceleration": "HardwarovÃĄ akcelerace",
+ "settings.option.visual.hardwareAcceleration.description": "VyÅžaduje opÄtovnÊ spuÅĄtÄnÃ",
+ "settings.header.visual.hardwareAcceleration.default": "VÃŊchozÃ",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "TÊma",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "TemnÃŊ",
+ "settings.option.visual.showPersonalInfo": "Zobrazit osobnà Ãēdaje",
+ "settings.header.lyrics": "Text",
+ "settings.header.lyrics.description": "Upravte nastavenà textů pro Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Povolit texty Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Povolit reÅžim karaoke (pouze Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "PreferovanÃŊ jazyk pÅekladu Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "Povolit texty YouTube pro hudebnà videa",
+ "settings.header.connectivity": "Konektivita",
+ "settings.header.connectivity.description": "Upravte nastavenà pÅipojenà pro Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "OznÃĄmenà o pÅehrÃĄvÃĄnÃ",
+ "settings.header.connectivity.discordRPC.cider": "Zobrazit jako 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Zobrazit jako 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Vymazat Discord Rich Presence on Pause",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Povolit Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Odebrat z nÃĄzvu pÃsnÄ vystupujÃcà interprety (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "FiltrovanÃĄ stopa ve smyÄce (Last.fm)",
+ "settings.header.experimental": "ExperimentÃĄlnÃ",
+ "settings.header.experimental.description": "Upravte experimentÃĄlnà nastavenà pro Cider.",
+ "settings.option.experimental.compactUI": "Kompaktnà uÅživatelskÊ rozhranÃ",
+ "settings.option.experimental.close_button_hide": "TlaÄÃtko ZavÅÃt by mÄlo aplikaci skrÃŊt",
+ "settings.option.experimental.copy_log": "ZkopÃrujte protokoly do clipboard",
+ "settings.option.experimental.inline_playlists": "VloŞenÊ seznamy skladeb a alba",
+ "spatial.notTurnedOn": "ProstorovÃĄ funkce zvuku je zakÃĄzÃĄna. Chcete-li jej pouÅžÃvat, nejprve jej povolte.",
+ "spatial.spatialProperties": "ProstorovÊ vlastnosti",
+ "spatial.width": "Å ÃÅka",
+ "spatial.height": "VÃŊÅĄka",
+ "spatial.depth": "Hloubka",
+ "spatial.gain": "ZÃskat",
+ "spatial.roomMaterials": "MateriÃĄly mÃstnosti",
+ "spatial.roomDimensions": "RozmÄry mÃstnosti",
+ "spatial.roomPositions": "Pozice mÃstnostÃ",
+ "spatial.setDimensions": "Nastavit rozmÄry",
+ "spatial.setPositions": "Nastavenà pozici",
+ "spatial.up": "Nahoru",
+ "spatial.front": "PÅednÃ",
+ "spatial.left": "Vlevo",
+ "spatial.right": "Pravo",
+ "spatial.back": "ZadnÃ",
+ "spatial.down": "Dolů",
+ "spatial.listener": "PosluchaÄ",
+ "spatial.audioSource": "Zdroj zvuku",
+ "settings.header.unfinished": "NedokonÄenÃŊ",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "Naskenujte QR kÃŗd a spÃĄrujte svůj telefon s touto instancà Cider",
+ "about.thanks": "VelkÊ podÄkovÃĄnà patÅà tÃŊmu Cider Collective Team a vÅĄem naÅĄim pÅispÄvatelům."
+}
\ No newline at end of file
diff --git a/src/i18n/de_DE.jsonc b/src/i18n/de_DE.json
similarity index 73%
rename from src/i18n/de_DE.jsonc
rename to src/i18n/de_DE.json
index fa62c1a2..587de0c9 100644
--- a/src/i18n/de_DE.jsonc
+++ b/src/i18n/de_DE.json
@@ -1,25 +1,15 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "Deutsch", // name of language in native language
- "i18n.languageNameEnglish": "German", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@motz0815 @n0chteil", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+{
+ "i18n.languageName": "Deutsch",
+ "i18n.languageNameEnglish": "German",
+ "i18n.category": "main",
+ "i18n.authors": "@motz0815 @n0chteil",
"app.name": "Cider",
-
"date.format": "${d}.${m}.${y}",
-
- // Dialogs
"dialog.cancel": "Abbrechen",
"dialog.ok": "OK",
-
- // Notification
"notification.updatingLibrarySongs": "Aktualisiere Songs...",
"notification.updatingLibraryAlbums": "Aktualisiere Alben...",
"notification.updatingLibraryArtists": "Aktualisiere KÃŧnstler...",
- // Terms
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
@@ -33,6 +23,7 @@
"term.about": "Ãber",
"term.privateSession": "Private Sitzung",
"term.queue": "Warteschlange",
+ "term.history": "Verlauf",
"term.search": "Suche",
"term.library": "Mediathek",
"term.listenNow": "Jetzt HÃļren",
@@ -60,6 +51,7 @@
"term.mute": "Stummschalten",
"term.unmute": "Stummschaltung aufheben",
"term.share": "Teilen",
+ "term.share.success": "In die Zwischenablage kopiert",
"term.settings": "Einstellungen",
"term.seeAll": "Alle Sehen",
"term.sortBy": "Sortieren nach",
@@ -69,6 +61,7 @@
"term.sortBy.genre": "Genre",
"term.sortBy.releaseDate": "VerÃļffentlichungsdatum",
"term.sortBy.duration": "Länge",
+ "term.sortBy.dateAdded": "HinzugefÃŧgt am",
"term.sortOrder": "A-Z",
"term.sortOrder.ascending": "Aufsteigend",
"term.sortOrder.descending": "Absteigend",
@@ -94,7 +87,7 @@
"term.topSongs": "Top Songs",
"term.latestReleases": "Letzte VerÃļffentlichungen",
"term.time.added": "HinzugefÃŧgt",
- "term.time.released": "VerÃļffentlicht",
+ "term.time.released": "VerÃļffentlicht",
"term.time.updated": "Aktualisiert",
"term.time.hours": "Stunden",
"term.time.hour": "Stunde",
@@ -121,14 +114,31 @@
"term.contributors": "Mithelfer",
"term.equalizer": "Equalizer",
"term.reset": "ZurÃŧcksetzen",
- "term.tracks": "Lieder", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "Videos",
+ "term.tracks": "Lieder",
+ "term.videos": "Videos",
"term.menu": "MenÃŧ",
"term.check": "Nach Updates suchen",
- "term.aboutArtist": "Ãber {{artistName}}", // e.g. 'About Doja Cat'
- "term.updateCider": "Cider aktualisieren",
-
- // Home
+ "term.aboutArtist": "Ãber {{artistName}}",
+ "term.topResult": "Bestes Ergebnis",
+ "term.sharedPlaylists": "Geteilte Playlists",
+ "term.people": "Personen",
+ "term.newpreset.name": "Neuer EQ-Preset Name",
+ "term.addedpreset": "Preset erstellt",
+ "term.deletepreset.warn": "Bist du sicher, dass du dieses Preset lÃļschen willst?",
+ "term.deletedpreset": "Preset gelÃļscht",
+ "term.defaultPresets": "Standard-Presets",
+ "term.userPresets": "Nutzer-Presets",
+ "term.requestError": "Es gab ein Problem bei der Anfrage.",
+ "term.song.link.generate": "song.link URL wird gesucht...",
+ "term.musicVideos": "Musikvideos",
+ "term.stations": "Radiosender",
+ "term.curators": "Kuratoren",
+ "term.appleCurators": "Apple-Kuratoren",
+ "term.radioShows": "Radiosendungen",
+ "term.recordLabels": "Plattenfirma",
+ "term.videoExtras": "Video-Extras",
+ "term.top": "Beste",
+ "term.version": "Version",
"home.title": "Home",
"home.recentlyPlayed": "Zuletzt gespielt",
"home.recentlyAdded": "Zuletzt hinzugefÃŧgt",
@@ -137,13 +147,10 @@
"home.madeForYou": "FÃŧr dich gemacht",
"home.friendsListeningTo": "Freunde hÃļren",
"home.followedArtists": "Gefolgte KÃŧnstler",
- // Errors
"error.appleMusicSubRequired": "Apple Music benÃļtigt ein Abonnement.",
"error.connectionError": "Es gab ein Problem beim Verbinden mit Apple Music.",
"error.noResults": "Keine Ergebnisse.",
"error.noResults.description": "Versuche einen anderen Suchbegriff.",
-
- //Podcasts
"podcast.followOnCider": "Folge auf Cider",
"podcast.followedOnCider": "Gefolgt auf Cider",
"podcast.subscribeOnItunes": "Folge auf iTunes",
@@ -152,8 +159,6 @@
"podcast.episodes": "Episoden",
"podcast.playEpisode": "Spiele Episode",
"podcast.website": "Podcast Webseite",
-
- // Actions
"action.addToLibrary": "Zur Mediathek hinzufÃŧgen",
"action.addToLibrary.success": "Zur Mediathek hinzugefÃŧgt",
"action.addToLibrary.error": "Fehler beim HinzufÃŧgen zur Mediathek",
@@ -198,88 +203,97 @@
"action.tray.quit": "Beenden",
"action.tray.show": "{appName} anzeigen",
"action.update": "Update",
-
- // Settings - General
+ "action.copy": "Kopieren",
+ "action.newpreset": "Neues Preset",
+ "action.deletepreset": "Preset lÃļschen",
"settings.header.general": "Allgemein",
"settings.header.general.description": "Passe die allgemeinen Einstellungen fÃŧr Cider an.",
"settings.option.general.language": "Sprache",
-
- // Language optgroups
"settings.option.general.language.main": "Sprachen",
"settings.option.general.language.fun": "Lustige Sprachen",
"settings.option.general.language.unsorted": "Unsortiert",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "Cider updaten",
+ "settings.option.general.updateCider.branch": "Update-Branch",
+ "settings.option.general.updateCider.branch.description": "Der Branch, von welchem Cider geupdatet werden soll",
+ "settings.option.general.updateCider.branch.main": "Stabil",
+ "settings.option.general.updateCider.branch.develop": "Entwicklung",
"settings.header.audio": "Audio",
"settings.header.audio.description": "Passe die Audio-Einstellungen fÃŧr Cider an.",
- "settings.option.audio.quality": "Audioqualität", // Dropdown
+ "settings.option.audio.quality": "Audioqualität",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "bis zu 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "bis zu 24-bit/48 kHz",
"settings.header.audio.quality.high": "Hoch",
- "settings.header.audio.quality.low": "Niedrig",
- "settings.header.audio.quality.auto": "Auto",
- "settings.option.audio.seamlessTransition": "Nahtloser AudioÃŧbergang", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Akiviere erweiterte Funktionalität", // Toggle
+ "settings.header.audio.quality.standard": "Standard",
+ "settings.option.audio.seamlessTransition": "Nahtloser AudioÃŧbergang",
+ "settings.option.audio.enableAdvancedFunctionality": "Akiviere erweiterte Funktionalität",
"settings.option.audio.enableAdvancedFunctionality.description": "Das Aktivieren der erweiterten Funktionalität ermÃļglicht spezielle Features wie Audio-Normalisierung, Equalizer und Visualizer, jedoch kÃļnnte dies auf einigen Systemen zu Aussetzern in der Musik fÃŧhren.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio-Normalisierung", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoakustische Verbesserungen die die Musik lebensechter erscheinen lassen | Designed by Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP ist nicht mit räumlichem Audio kompatibel. Bitte deaktiviere räumliches Audio zuerst.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP-Stärke",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Ãndert die Stärke der Nachbearbeitung. (Aggressiv kÃļnnte zu ungewÃŧnschten Ãnderungen fÃŧhren)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressiv",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio-Normalisierung",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalisiert die Lautstärke aller Lieder, um die HÃļrerfahrung einheitlicher zu machen.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Räumliches Audio", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Räumliches Audio",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Macht die Musik räumlicher (3D-Effekt) (Beachte: Dies ist kein Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visuell",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Räumliches Audio ist nicht mit CAP kompatibel. Bitte deaktiviere CAP zuerst.",
+ "settings.header.visual": "Visuell",
"settings.header.visual.description": "Passe die visuellen Einstellungen fÃŧr Cider an.",
- "settings.option.visual.windowBackgroundStyle": "Fensterhintergrund-Stil", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "Fensterhintergrund-Stil",
"settings.header.visual.windowBackgroundStyle.none": "Keiner",
"settings.header.visual.windowBackgroundStyle.artwork": "Coverbild",
"settings.header.visual.windowBackgroundStyle.image": "Bild",
- "settings.option.visual.animatedArtwork": "Animiertes Coverbild", // Dropdown
+ "settings.option.visual.animatedArtwork": "Animiertes Coverbild",
"settings.header.visual.animatedArtwork.always": "Immer",
"settings.header.visual.animatedArtwork.limited": "Beschränkt auf Seiten und Spezialeinträge",
"settings.header.visual.animatedArtwork.disable": "Ãberall deaktivieren",
- "settings.option.visual.animatedArtworkQuality": "Qualität des Animierten Coverbilds", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "Qualität des Animierten Coverbilds",
"settings.header.visual.animatedArtworkQuality.low": "Niedrig",
"settings.header.visual.animatedArtworkQuality.medium": "Mittel",
"settings.header.visual.animatedArtworkQuality.high": "Hoch",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Sehr hoch",
"settings.header.visual.animatedArtworkQuality.extreme": "Extrem",
- "settings.option.visual.animatedWindowBackground": "Animierter Fensterhintergrund", // Toggle
- "settings.option.visual.hardwareAcceleration": "Hardware-Beschleunigung", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "Animierter Fensterhintergrund",
+ "settings.option.visual.hardwareAcceleration": "Hardware-Beschleunigung",
"settings.option.visual.hardwareAcceleration.description": "Erfordert Neustart der Anwendung",
- "settings.header.visual.hardwareAcceleration.default": "Normal",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "PersÃļnliche Daten anzeigen", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "Normal",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Theme",
+ "settings.option.visual.theme.github.download": "Von GitHub URL installieren",
+ "settings.prompt.visual.theme.github.URL": "Gib die URL des Themes ein, welches du installieren mÃļchtest",
+ "settings.notyf.visual.theme.install.success": "Theme erfolgreich installiert",
+ "settings.notyf.visual.theme.install.error": "Theme-Installation fehlgeschlagen",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Dunkel",
+ "settings.option.visual.showPersonalInfo": "PersÃļnliche Daten anzeigen",
"settings.header.lyrics": "Liedtext",
"settings.header.lyrics.description": "Passe die Liedtext-Einstellungen fÃŧr Cider an.",
- "settings.option.lyrics.enableMusixmatch": "Aktiviere Musixmatch-Liedtexte", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Aktiviere Karaoke-Modus (nur mit Musixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Bevorzugte Sprache fÃŧr Musixmatch-Ãbersetzung", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Aktiviere YouTube-Liedtexte fÃŧr Musikvideos", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "Aktiviere Musixmatch-Liedtexte",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Aktiviere Karaoke-Modus (nur mit Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Bevorzugte Sprache fÃŧr Musixmatch-Ãbersetzung",
+ "settings.option.lyrics.enableYoutubeLyrics": "Aktiviere YouTube-Liedtexte fÃŧr Musikvideos",
"settings.header.connectivity": "Konnektivität",
"settings.header.connectivity.description": "Passe die Konnektivitäts-Einstellungen fÃŧr Cider an.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "Wiedergabe-Benachrichtigungen", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Wiedergabe-Benachrichtigungen",
"settings.header.connectivity.discordRPC.cider": "'Cider' anzeigen",
"settings.header.connectivity.discordRPC.appleMusic": "'Apple Music' anzeigen",
- "settings.option.connectivity.discordRPC.clearOnPause": "Leere Discord Rich Presence wenn pausiert", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktiviere LastFM Jetzt spielend",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Entferne KÃŧnstler-Featuring von Liedtitel (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtere gelooptes Lied (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "Leere Discord Rich Presence wenn pausiert",
+ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktiviere LastFM Jetzt spielend",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Entferne KÃŧnstler-Featuring von Liedtitel (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtere gelooptes Lied (LastFM)",
"settings.header.experimental": "Experimentell",
"settings.header.experimental.description": "Passe die experimentellen Einstellungen fÃŧr Cider an.",
- "settings.option.experimental.compactUI": "Kompaktes UI", // Toggle
- "settings.option.experimental.close_button_hide": "SchlieÃ-Taste soll die App verbergen",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
+ "settings.option.experimental.compactUI": "Kompaktes UI",
+ "settings.option.experimental.close_button_hide": "SchlieÃtaste soll die App verbergen",
+ "settings.option.experimental.copy_log": "Kopiere Logs in die Zwischenablage",
+ "settings.option.experimental.inline_playlists": "Inline Playlists und Alben",
"spatial.notTurnedOn": "Die Audio-Spatialisierung ist deaktiviert. Um sie zu verwenden, musst du diese zuerst aktivieren.",
"spatial.spatialProperties": "Räumliche Einstellungen",
"spatial.width": "Breite",
@@ -299,14 +313,8 @@
"spatial.down": "Unten",
"spatial.listener": "HÃļrer*in",
"spatial.audioSource": "Audioquelle",
-
- // Settings - Unfinished
"settings.header.unfinished": "Unvollendet",
-
- // Web Remote
"remote.web.title": "Cider Remote",
"remote.web.description": "Scanne den QR-Code um dein Handy mit dieser Cider-Instanz zu verbinden",
-
- // About
"about.thanks": "Vielen lieben Dank an das Cider Collective Team und an alle Mithelfer."
-}
+}
\ No newline at end of file
diff --git a/src/i18n/el_GR.jsonc b/src/i18n/el_GR.json
similarity index 56%
rename from src/i18n/el_GR.jsonc
rename to src/i18n/el_GR.json
index ca100520..be52a686 100644
--- a/src/i18n/el_GR.jsonc
+++ b/src/i18n/el_GR.json
@@ -1,299 +1,365 @@
-{
-
- // i18n Info
- "i18n.languageName": "ÎÎģÎģΡÎŊΚÎēÎŦ",
- "i18n.languageNameEnglish": "Greek",
- "i18n.category": "main",
- "i18n.authors": "@down-bad",
-
- // App info
- "app.name": "Cider",
-
- "date.format": "${d} ${m}, ${y}",
-
- // Dialogs
- "dialog.cancel": "ÎÎēĪĪĪĪΡ",
- "dialog.ok": "ÎÎ",
-
- // Notification
- "notification.updatingLibrarySongs": "ÎÎŊΡÎŧÎĪĪĪΡ βΚβÎģΚÎŋθΎÎēÎˇĪ ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ...",
- "notification.updatingLibraryAlbums": "ÎÎŊΡÎŧÎĪĪĪΡ βΚβÎģΚÎŋθΎÎēÎˇĪ ÎŦÎģÎŧĪÎŋĪ
Îŧ...",
- "notification.updatingLibraryArtists": "ÎÎŊΡÎŧÎĪĪĪΡ βΚβÎģΚÎŋθΎÎēÎˇĪ ÎēÎąÎģÎģΚĪÎĩĪÎŊĪÎŊ...",
- // Terms
- "term.appleInc": "Apple Inc.",
- "term.appleMusic": "Apple Music",
- "term.applePodcasts": "Apple Podcasts",
- "term.itunes": "iTunes",
- "term.github": "GitHub",
- "term.discord": "Discord",
- "term.learnMore": "ÎÎŦθÎĩĪÎĩ ĪÎĩĪΚĪĪĪĪÎĩĪÎą",
- "term.accountSettings": "ÎĄĪ
θÎŧίĪÎĩÎšĪ ÎģÎŋÎŗÎąĪΚιĪÎŧÎŋĪ",
- "term.logout": "ÎĪÎŋĪĪÎŊδÎĩĪΡ",
- "term.login": "ÎŖĪÎŊδÎĩĪΡ",
- "term.about": "ÎŖĪÎĩĪΚÎēÎŦ ÎŧÎĩ",
- "term.privateSession": "ÎδΚĪĪΚÎēÎŽ ĪÎĩĪίÎŋδÎŋĪ ÎģÎĩΚĪÎŋĪ
ĪÎŗÎ¯ÎąĪ",
- "term.queue": "ÎĪ
ĪÎŦ",
- "term.search": "ÎĪĪÎĩĪΡ",
- "term.library": "ÎΚβÎģΚÎŋθΎÎēΡ",
- "term.listenNow": "ÎÎēĪĪÎąĪΡ",
- "term.browse": "Î ÎĩĪÎšÎŽÎŗÎˇĪΡ",
- "term.radio": "ÎĄÎŦδΚÎŋ",
- "term.recentlyAdded": "Î ĪĪĪĪÎąĪÎĩĪ ĪĪÎŋĪθΎÎēÎĩĪ",
- "term.songs": "ΤĪÎąÎŗÎŋĪδΚι",
- "term.albums": "ÎÎģÎŧĪÎŋĪ
Îŧ",
- "term.artists": "ÎÎąÎģÎģΚĪÎĪÎŊÎĩĪ",
- "term.podcasts": "Podcast",
- "term.playlists": "ÎίĪĪÎĩĪ ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
- "term.playlist": "ÎίĪĪÎą ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
- "term.play": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ",
- "term.pause": "Î ÎąĪĪΡ",
- "term.previous": "Î ĪÎŋÎˇÎŗÎŋĪÎŧÎĩÎŊÎŋ",
- "term.next": "ÎĪĪÎŧÎĩÎŊÎŋ",
- "term.shuffle": "ΤĪ
ĪÎąÎ¯Îą ĪÎĩΚĪÎŦ",
- "term.repeat": "ÎĪÎąÎŊÎŦÎģΡĪΡ",
- "term.volume": "ÎÎŊĪÎąĪΡ",
- "term.mute": "ÎŖÎ¯ÎŗÎąĪΡ",
- "term.unmute": "ÎÎąĪÎŦĪÎŗÎˇĪΡ ĪÎ¯ÎŗÎąĪΡĪ",
- "term.share": "ÎÎŋΚÎŊÎŽ ΧĪÎŽĪΡ",
- "term.settings": "ÎĄĪ
θÎŧίĪÎĩΚĪ",
- "term.seeAll": "Î ĪÎŋβÎŋÎģÎŽ ĪÎģĪÎŊ",
- "term.sortBy": "ΤιΞΚÎŊĪÎŧΡĪΡ ÎēÎąĪÎŦ",
- "term.sortBy.album": "ÎÎģÎŧĪÎŋĪ
Îŧ",
- "term.sortBy.artist": "ÎÎąÎģÎģΚĪÎĪÎŊΡ",
- "term.sortBy.name": "ÎÎŊÎŋÎŧÎą",
- "term.sortBy.genre": "ÎίδÎŋĪ",
- "term.sortBy.releaseDate": "ÎÎŧÎĩĪÎŋÎŧΡÎŊÎ¯Îą ÎēĪ
ÎēÎģÎŋĪÎŋĪÎ¯ÎąĪ",
- "term.sortBy.duration": "ÎΚÎŦĪÎēÎĩΚι",
- "term.sortOrder": "Î-Ί",
- "term.sortOrder.ascending": "ÎĪΞÎŋĪ
ĪÎą",
- "term.sortOrder.descending": "ÎĻθίÎŊÎŋĪ
ĪÎą",
- "term.viewAs": "Î ĪÎŋβÎŋÎģÎŽ ĪĪ",
- "term.viewAs.coverArt": "ÎΞĪĪĪ
ÎģÎģÎŋ",
- "term.viewAs.list": "ÎίĪĪÎą",
- "term.size": "ÎÎÎŗÎĩθÎŋĪ",
- "term.size.normal": "ÎÎąÎŊÎŋÎŊΚÎēĪ",
- "term.size.compact": "ÎŖĪ
ÎŧĪÎąÎŗÎŽ",
- "term.enable": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ",
- "term.disable": "ÎĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ",
- "term.enabled": "ÎÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊÎŋ",
- "term.disabled": "ÎĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊÎŋ",
- "term.connect": "ÎŖĪÎŊδÎĩĪΡ",
- "term.connecting": "ÎίÎŊÎĩĪιΚ ĪĪÎŊδÎĩĪΡ",
- "term.disconnect": "ÎĪÎŋĪĪÎŊδÎĩĪΡ",
- "term.authed": "ÎĪΚÎēĪ
ĪĪÎŧÎÎŊÎŋ",
- "term.confirm": "ÎŖÎ¯ÎŗÎŋĪ
ĪÎą;",
- "term.more": "Î ÎĩĪΚĪĪĪĪÎĩĪÎą",
- "term.less": "ÎÎšÎŗĪĪÎĩĪÎą",
- "term.showMore": "ÎÎŧĪÎŦÎŊΚĪΡ ĪÎĩĪΚĪĪĪĪÎĩĪĪÎŊ",
- "term.showLess": "ÎÎŧĪÎŦÎŊΚĪΡ ÎģÎšÎŗĪĪÎĩĪĪÎŊ",
- "term.topSongs" : "ÎÎŋĪĪ
ĪÎąÎ¯Îą ĪĪÎąÎŗÎŋĪδΚι",
- "term.latestReleases": "ΤÎĩÎģÎĩĪ
ĪÎąÎ¯ÎĩĪ ÎēĪ
ÎēÎģÎŋĪÎŋĪίÎĩĪ",
- "term.time.added": "Î ĪÎŋĪĪÎθΡÎēÎĩ",
- "term.time.released": "ÎĪ
ÎēÎģÎŋĪĪĪΡĪÎĩ",
- "term.time.updated": "ÎÎŊΡÎŧÎĩĪĪθΡÎēÎĩ",
- "term.time.hours": "ĪĪÎĩĪ",
- "term.time.hour": "ĪĪÎą",
- "term.time.minutes": "ÎģÎĩĪĪÎŦ",
- "term.time.minute": "ÎģÎĩĪĪĪ",
- "term.time.seconds": "δÎĩĪ
ĪÎĩĪĪÎģÎĩĪĪÎą",
- "term.time.second": "δÎĩĪ
ĪÎĩĪĪÎģÎĩĪĪÎŋ",
- "term.fullscreenView": "Î ÎģÎŽĪÎˇĪ ÎŋθĪÎŊΡ",
- "term.defaultView": "ÎÎąÎŊÎŋÎŊΚÎēÎŽ ÎŋθĪÎŊΡ",
- "term.spacializedAudioSetting": "ΧĪĪΚÎēÎŽ ĪĪθÎŧΚĪΡ ÎŽĪÎŋĪ
",
- "term.clearAll": "ÎÎēÎēιθÎŦĪΚĪΡ ĪÎģĪÎŊ",
- "term.recentStations": "Î ĪĪĪĪÎąĪÎŋΚ ĪĪιθÎŧÎŋί",
- "term.language": "ÎÎģĪĪĪÎą",
- "term.funLanguages": "ÎΚι ĪÎģÎŦÎēÎą",
- "term.noLyrics": "ÎĻĪĪĪĪĪΡ... / ÎÎĩÎŊ βĪÎθΡÎēÎąÎŊ ĪĪίĪÎŋΚ. / ÎĪĪΡĪĪΚÎēĪ.",
- "term.copyright": "Copyright",
- "term.rightsReserved": "ÎÎģÎą ĪÎą δΚÎēιΚĪÎŧÎąĪÎą δΚιĪΡĪÎŋĪÎŊĪιΚ.",
- "term.sponsor": "ΧÎŋĪÎŽÎŗÎˇĪÎĩ ÎąĪ
ĪĪ ĪÎŋ ÎĪÎŗÎŋ",
- "term.ciderTeam": "ÎÎŧÎŦδι Cider",
- "term.developer": "Î ĪÎŋÎŗĪÎąÎŧÎŧÎąĪΚĪĪÎŽĪ",
- "term.socialTeam": "ÎÎŋΚÎŊĪÎŊΚÎēÎŽ ÎÎŧÎŦδι",
- "term.contributors": "ÎŖĪ
ÎŊÎĩΚĪĪÎĪÎŋÎŊĪÎĩĪ",
- "term.equalizer": "ÎĪÎŋĪĪιθÎŧΚĪĪÎŽĪ",
- "term.reset": "ÎĪÎąÎŊÎąĪÎŋĪÎŦ",
- "term.tracks": "ĪĪÎąÎŗÎŋĪδΚι", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "ÎίÎŊĪÎĩÎŋ",
- "term.menu": "ÎÎĩÎŊÎŋĪ",
- "action.showAlbum": "ÎÎŧĪÎŦÎŊΚĪΡ ÎŋÎģĪÎēÎģΡĪÎŋĪ
ÎŦÎģÎŧĪÎŋĪ
Îŧ",
-
- // Home
- "home.title": "ÎĪĪΚÎēÎŽ",
- "home.recentlyPlayed": "ÎĪιΚΞιÎŊ ĪĪĪĪĪÎąĪÎą",
- "home.recentlyAdded": "Î ĪĪĪĪÎąĪÎĩĪ ĪĪÎŋĪθΎÎēÎĩĪ",
- "home.artistsFeed": "ÎĄÎŋÎŽ ĪĪÎŊ ÎēÎąÎģÎģΚĪÎĩĪÎŊĪÎŊ ĪÎŋĪ
",
- "home.artistsFeed.noArtist": "ÎÎēÎŋÎģÎŋĪθΡĪÎĩ ÎŧÎĩĪΚÎēÎŋĪĪ ÎēÎąÎģÎģΚĪÎĪÎŊÎĩĪ ĪĪĪĪÎą ÎēιΚ ÎŋΚ ĪÎĩÎģÎĩĪ
ĪÎąÎ¯ÎĩĪ ÎēĪ
ÎēÎģÎŋĪÎŋĪίÎĩĪ ĪÎŋĪ
Ī Î¸Îą ÎĩÎŧĪÎąÎŊίÎļÎŋÎŊĪιΚ ÎĩδĪ",
- "home.madeForYou": "ÎΡÎŧΚÎŋĪ
ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎŗÎšÎą ÎĩĪÎŦĪ",
- "home.friendsListeningTo": "ÎΚ ĪίÎģÎŋΚ ĪÎŋĪ
ÎąÎēÎŋĪÎŊ",
- "home.followedArtists": "ÎÎąÎģÎģΚĪÎĪÎŊÎĩĪ ĪÎŋĪ
ÎąÎēÎŋÎģÎŋĪ
θÎĩίĪÎĩ",
- // Errors
- "error.appleMusicSubRequired": "ΤÎŋ Apple Music ÎąĪιΚĪÎĩί ÎŧΚι ĪĪ
ÎŊδĪÎŋÎŧÎŽ.",
- "error.connectionError": "ÎÎĩÎŊ ÎĩίÎŊιΚ δĪ
ÎŊÎąĪÎŽ Ρ ĪĪÎŊδÎĩĪΡ ÎŧÎĩ ĪÎŋ Apple Music.",
- "error.noResults": "ÎÎąÎŊÎÎŊÎą ÎąĪÎŋĪÎÎģÎĩĪÎŧÎą.",
- "error.noResults.description": "ÎÎŋÎēΚÎŧÎŦĪĪÎĩ ÎŧΚι ÎŊÎÎą ÎąÎŊÎąÎļÎŽĪΡĪΡ.",
-
- //Podcasts
- "podcast.followOnCider": "ÎÎēÎŋÎģÎŋĪθΡĪΡ ĪĪÎŋ Cider",
- "podcast.followedOnCider": "ÎÎēÎŋÎģÎŋĪ
θÎĩίĪÎĩ ĪĪÎŋ Cider",
- "podcast.subscribeOnItunes": "ÎŖĪ
ÎŊδĪÎŋÎŧÎŽ ĪĪÎŋ iTunes",
- "podcast.subscribedOnItunes": "ÎŖĪ
ÎŊδĪÎŋÎŧΡĪÎŽĪ ĪĪÎŋ iTunes",
- "podcast.itunesStore": "iTunes Store",
- "podcast.episodes": "ÎĪÎĩΚĪĪδΚι",
- "podcast.playEpisode": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ÎĩĪÎĩΚĪÎŋδίÎŋĪ
",
- "podcast.website": "ÎĪĪĪĪÎŋĪÎŋĪ Podcast",
-
- // Actions
- "action.addToLibrary": "Î ĪÎŋĪθΎÎēΡ ĪĪΡ βΚβÎģΚÎŋθΎÎēΡ",
- "action.addToLibrary.success": "Î ĪÎŋĪĪÎθΡÎēÎĩ ĪĪΡ βΚβÎģΚÎŋθΎÎēΡ",
- "action.addToLibrary.error": "ÎŖĪÎŦÎģÎŧÎą Î ĪÎŋĪθΎÎēÎˇĪ ĪĪΡ βΚβÎģΚÎŋθΎÎēΡĪ",
- "action.removeFromLibrary": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎąĪĪ ĪΡ βΚβÎģΚÎŋθΎÎēΡ",
- "action.removeFromLibrary.success": "ÎĪιΚĪÎθΡÎēÎĩ ÎąĪĪ ĪΡ βΚβÎģΚÎŋθΎÎēΡ",
- "action.addToQueue": "Î ĪÎŋĪθΎÎēΡ ĪĪΡÎŊ ÎŋĪ
ĪÎŦ",
- "action.addToQueue.success": "Î ĪÎŋĪĪÎθΡÎēÎĩ ĪĪΡÎŊ ÎŋĪ
ĪÎŦ",
- "action.addToQueue.error": "Î ĪÎŋĪĪÎθΡÎēÎĩ ĪĪΡÎŊ ÎŋĪ
ĪÎŦ",
- "action.removeFromQueue": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
- "action.removeFromQueue.success": "ÎĪιΚĪÎθΡÎēÎĩ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
- "action.removeFromQueue.error": "ÎŖĪÎŦÎģÎŧÎą ÎĪÎąÎ¯ĪÎĩĪÎˇĪ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
- "action.addToPlaylist": "Î ĪÎŋĪθΎÎēΡ ĪÎĩ ÎģίĪĪÎą",
- "action.removeFromPlaylist": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎąĪĪ ÎģίĪĪÎą",
- "action.addToFavorites": "Î ĪÎŋĪθΎÎēΡ ĪĪÎą ÎąÎŗÎąĪΡÎŧÎÎŊÎą",
- "action.follow": "ÎÎēÎŋÎģÎŋĪθΡĪΡ",
- "action.follow.success": "ÎÎēÎŋÎģÎŋĪ
θΎθΡÎēÎĩ",
- "action.follow.error": "ÎŖĪÎŦÎģÎŧÎą ÎąÎēÎŋÎģÎŋĪθΡĪΡĪ",
- "action.unfollow": "ÎΚιÎēÎŋĪÎŽ ÎąÎēÎŋÎģÎŋĪθΡĪΡĪ",
- "action.unfollow.success": "ÎÎŗÎšÎŊÎĩ δΚιÎēÎŋĪÎŽ ÎąÎēÎŋÎģÎŋĪθΡĪΡĪ",
- "action.unfollow.error": "ÎŖĪÎŦÎģÎŧÎą δΚιÎēÎŋĪÎŽĪ ÎąÎēÎŋÎģÎŋĪθΡĪÎˇĪ ",
- "action.playNext": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ĪĪ ÎĩĪĪÎŧÎĩÎŊÎŋĪ
",
- "action.playLater": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ÎąĪÎŗĪĪÎĩĪÎą",
- "action.startRadio": "ÎÎŊÎąĪΞΡ ĪιδΚÎŋĪĪÎŊÎŋĪ
",
- "action.goToArtist": "ÎÎĩĪÎŦβιĪΡ ĪÎĩ ÎēÎąÎģÎģΚĪÎĪÎŊΡ",
- "action.goToAlbum": "ÎÎĩĪÎŦβιĪΡ ĪÎĩ ÎŦÎģÎŧĪÎŋĪ
Îŧ",
- "action.moveToTop": "ÎÎĩĪÎąÎēίÎŊΡĪΡ ĪĪΡ ÎēÎŋĪĪ
ĪÎŽ",
- "action.share": "ÎÎŋΚÎŊÎŽ ĪĪÎŽĪΡ",
- "action.rename": "ÎÎĩĪÎŋÎŊÎŋÎŧÎąĪÎ¯Îą",
- "action.love": "ÎÎŋĪ
ÎąĪÎĪÎĩΚ ĪÎŋÎģĪ",
- "action.unlove": "ÎÎŊÎąÎ¯ĪÎĩĪΡ \"ÎÎŋĪ
ÎąĪÎĪÎĩΚ\"",
- "action.dislike": "ÎÎĩÎŊ ÎŧÎŋĪ
ÎąĪÎĪÎĩΚ",
- "action.undoDislike": "ÎÎŊÎąÎ¯ĪÎĩĪΡ \"ÎÎĩÎŊ ÎŧÎŋĪ
ÎąĪÎĪÎĩΚ\"",
- "action.showWebRemoteQR": "ÎÎŧĪÎŦÎŊΚĪΡ Web Remote QR",
- "action.playTracksNext": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ${app.selectedMediaItems.length} ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ ĪĪ ÎĩĪĪÎŧÎĩÎŊĪÎŊ",
- "action.playTracksLater": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ${app.selectedMediaItems.length} ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ ÎąĪÎŗĪĪÎĩĪÎą",
- "action.removeTracks": "ÎĪÎąÎ¯ĪÎĩĪΡ ${self.selectedItems.length} ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
- "action.import": "ÎΚĪÎąÎŗĪÎŗÎŽ",
- "action.export": "ÎÎžÎąÎŗĪÎŗÎŽ",
-
- // Settings - General
- "settings.header.general": "ÎÎĩÎŊΚÎēÎŦ",
- "settings.header.general.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ÎŗÎĩÎŊΚÎēĪÎŊ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
- "settings.option.general.language": "ÎÎģĪĪĪÎą",
-
- // Language optgroups
- "settings.option.general.language.main": "ÎÎģĪĪĪÎĩĪ",
- "settings.option.general.language.fun": "ÎÎģĪĪĪÎĩĪ ÎŗÎšÎą ĪÎģÎŦÎēÎą",
- "settings.option.general.language.unsorted": "ÎĪιΞΚÎŊĪÎŧΡĪÎĩĪ",
-
- // Settings - Audio
- "settings.header.audio": "ÎĪÎŋĪ",
- "settings.header.audio.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŽĪÎŋĪ
ÎŗÎšÎą ĪÎŋ Cider.",
- "settings.option.audio.quality": "Î ÎŋΚĪĪΡĪÎą ÎĪÎŋĪ
", // Dropdown
- "settings.header.audio.quality.high": "ÎĨĪΡÎģÎŽ",
- "settings.header.audio.quality.low": "ΧιÎŧΡÎģÎŽ",
- "settings.header.audio.quality.auto": "ÎĪ
ĪĪÎŧÎąĪΡ",
- "settings.option.audio.seamlessTransition": "ÎδΚÎŦÎēÎŋĪΡ ÎÎĩĪÎŦβιĪΡ ÎĪÎŋĪ
", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ Î ĪÎŋÎˇÎŗÎŧÎÎŊÎˇĪ ÎÎĩΚĪÎŋĪ
ĪÎŗÎšÎēĪĪΡĪÎąĪ", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "ÎÎŊÎĩĪÎŗÎŋĪÎŋΚĪÎŊĪÎąĪ ĪΡ ÎģÎĩΚĪÎŋĪ
ĪÎŗÎšÎēĪĪΡĪÎą AudioContext θι ÎĩĪΚĪĪÎĪÎĩΚ ĪÎĩ ÎĩĪÎĩÎēĪÎąÎŧÎÎŊÎĩĪ Î´Ī
ÎŊÎąĪĪĪΡĪÎĩĪ ÎŽĪÎŋĪ
ĪĪĪĪ ÎÎąÎŊÎŋÎŊΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎÎŊĪÎąĪÎˇĪ ÎĪÎŋĪ
, ÎĪÎŋĪĪιθÎŧΚĪĪÎĪ ÎēιΚ ÎĪĪΚÎēÎŋĪÎŋΚΡĪÎĪ, ĪĪĪĪĪÎŋ ĪÎĩ ÎēÎŦĪÎŋΚι ĪĪ
ĪĪÎŽÎŧÎąĪÎą ÎŧĪÎŋĪÎĩί ÎŊÎą ĪĪÎŋÎēÎąÎģÎĪÎĩΚ ĪĪÎąĪÎģΚĪÎŧÎą ÎŽĪÎŋĪ
.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ÎÎąÎŊÎŋÎŊΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎÎŊĪÎąĪÎˇĪ ÎĪÎŋĪ
", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "ÎÎąÎŊÎŋÎŊΚÎēÎŋĪÎŋΚÎĩί ĪΡÎŊ ÎÎŊĪÎąĪΡ ÎŗÎšÎą ÎŧÎĩÎŧÎŋÎŊĪÎŧÎÎŊÎą ÎēÎŋÎŧÎŧÎŦĪΚι ÎŗÎšÎą ÎŧΚι ĪΚÎŋ ÎŋÎŧÎŋΚĪÎŧÎŋĪĪΡ ÎĩÎŧĪÎĩΚĪÎ¯Îą ÎąÎēĪĪÎąĪΡĪ.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎĪÎŋĪ
", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ΠΚÎŋ ĪĪΚĪδΚÎŦĪĪÎąĪÎŋĪ ÎēιΚ ĪĪĪΚÎēÎŋĪÎŋΚΡÎŧÎÎŊÎŋĪ ÎŽĪÎŋĪ (ĪΡÎŧÎĩίĪĪΡ: ÎĪ
ĪĪ Î´ÎĩÎŊ ÎĩίÎŊιΚ Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "ÎĪĪΚÎēÎŦ",
- "settings.header.visual.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ÎŋĪĪΚÎēĪÎŊ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
- "settings.option.visual.windowBackgroundStyle": "ÎŖĪĪ
Îģ ÎĻĪÎŊĪÎŋĪ
Î ÎąĪιθĪĪÎŋĪ
", // Toggle
- "settings.header.visual.windowBackgroundStyle.none": "ÎÎąÎŊÎÎŊÎą",
- "settings.header.visual.windowBackgroundStyle.artwork": "ÎΞĪĪĪ
ÎģÎģÎŋ",
- "settings.header.visual.windowBackgroundStyle.image": "ÎΚÎēĪÎŊÎą",
- "settings.option.visual.animatedArtwork": "ÎΚÎŊÎŋĪÎŧÎĩÎŊÎŋ ÎΞĪĪĪ
ÎģÎģÎŋ", // Dropdown
- "settings.header.visual.animatedArtwork.always": "Î ÎŦÎŊĪÎą",
- "settings.header.visual.animatedArtwork.limited": "Î ÎĩĪΚÎŋĪΚĪÎŧĪĪ ĪÎĩ ĪÎĩÎģίδÎĩĪ ÎēιΚ ÎĩΚδΚÎēÎĪ ÎēÎąĪÎąĪĪĪÎŽĪÎĩΚĪ",
- "settings.header.visual.animatedArtwork.disable": "ÎĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊÎŋ ĪÎąÎŊĪÎŋĪ",
- "settings.option.visual.animatedArtworkQuality": "Î ÎŋΚĪĪΡĪÎą ÎΚÎŊÎŋĪÎŧÎĩÎŊÎŋĪ
ÎΞĪĪĪÎģÎģÎŋĪ
", // Dropdown
- "settings.header.visual.animatedArtworkQuality.low": "ΧιÎŧΡÎģÎŽ",
- "settings.header.visual.animatedArtworkQuality.medium": "ÎÎĪĪΚι",
- "settings.header.visual.animatedArtworkQuality.high": "ÎĨĪΡÎģÎŽ",
- "settings.header.visual.animatedArtworkQuality.veryHigh": "Î ÎŋÎģĪ ÎĨĪΡÎģÎŽ",
- "settings.header.visual.animatedArtworkQuality.extreme": "ÎÎēĪÎąÎ¯Îą",
- "settings.option.visual.animatedWindowBackground": "ÎΚÎŊÎŋĪÎŧÎĩÎŊÎŋ ÎĻĪÎŊĪÎŋ Î ÎąĪιθĪĪÎŋĪ
", // Toggle
- "settings.option.visual.hardwareAcceleration": "ÎĪΚĪÎŦĪĪ
ÎŊĪΡ ÎĨÎģΚÎēÎŋĪ", // Dropdown
- "settings.option.visual.hardwareAcceleration.description": "ÎĪιΚĪÎĩί ÎĩĪÎąÎŊÎĩÎēÎēίÎŊΡĪΡ",
- "settings.header.visual.hardwareAcceleration.default": "Î ĪÎŋÎĩĪΚÎģÎŋÎŗÎŽ",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "ÎÎŧĪÎŦÎŊΚĪΡ ĪĪÎŋĪĪĪΚÎēĪÎŊ ĪĪÎŋΚĪÎĩίĪÎŊ", // Toggle
-
- // Settings - Lyrics
- "settings.header.lyrics": "ÎŖĪίĪÎŋΚ",
- "settings.header.lyrics.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪĪ
θÎŧίĪÎĩĪÎŊ ĪĪίĪĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
- "settings.option.lyrics.enableMusixmatch": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ÎŖĪίĪĪÎŊ Musixmatch", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ÎÎĩΚĪÎŋĪ
ĪÎŗÎ¯ÎąĪ ÎÎąĪÎąĪÎēÎĩ (Musixmatch ÎŧĪÎŊÎŋ)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Î ĪÎŋĪΚÎŧĪÎŧÎĩÎŊΡ ÎÎģĪĪĪÎą ÎÎĩĪÎŦĪĪÎąĪÎˇĪ Musixmatch", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ÎŖĪίĪĪÎŊ Youtube ÎŗÎšÎą ÎÎŋĪ
ĪΚÎēÎŦ ÎίÎŊĪÎĩÎŋ", // Toggle
-
- // Settings - Connectivity
- "settings.header.connectivity": "ÎŖĪÎŊδÎĩĪΡ",
- "settings.header.connectivity.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪĪ
θÎŧίĪÎĩĪÎŊ ĪĪÎŊδÎĩĪÎˇĪ ÎŗÎšÎą ĪÎŋ Cider.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "ÎΚδÎŋĪÎŋΚΎĪÎĩÎšĪ ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "ÎÎŧĪÎŦÎŊΚĪΡ ĪĪ 'Cider'",
- "settings.header.connectivity.discordRPC.appleMusic": "ÎÎŧĪÎŦÎŊΚĪΡ ĪĪ 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "ÎÎēÎēιθÎŦĪΚĪΡ ĪÎŋĪ
Discord Rich Presence ĪĪΡÎŊ Î ÎąĪĪΡ", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "ÎιθĪ
ĪĪÎĪΡĪΡ LastFM Scrobble (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ LastFM \"Now Playing\"",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎēÎąÎģÎģΚĪÎĩĪÎŊĪÎŊ feature ÎąĪĪ ĪÎŋÎŊ ĪίĪÎģÎŋ ĪÎŋĪ
ĪĪÎąÎŗÎŋĪ
δΚÎŋĪ (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "ÎĻΚÎģĪĪÎŦĪΚĪÎŧÎą ÎĩĪÎąÎŊÎĩΚÎģΡÎŧÎŧÎÎŊÎŋĪ
ĪĪÎąÎŗÎŋĪ
δΚÎŋĪ (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
- "settings.header.experimental": "Î ÎĩΚĪÎąÎŧÎąĪΚÎēÎĪ",
- "settings.header.experimental.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪÎĩΚĪÎąÎŧÎąĪΚÎēĪÎŊ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
- "settings.option.experimental.compactUI": "ÎŖĪ
ÎŧĪÎąÎŗÎŽĪ ÎΚÎĩĪÎąĪÎŽ", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "ÎŖĪ
ÎŧĪÎĩĪΚĪÎŋĪÎŦ ÎÎŋĪ
ÎŧĪΚÎŋĪ ÎΞĪδÎŋĪ
",
- "settings.option.experimental.closeButtonBehaviour.quit": "ÎΞÎŋδÎŋĪ ĪÎŋĪ
Cider",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "ÎÎģÎąĪΚĪĪÎŋĪÎŋÎ¯ÎˇĪΡ ĪĪΡ ÎŗĪÎąÎŧÎŧÎŽ ÎĩĪÎŗÎąĪΚĪÎŊ",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "ÎÎģÎąĪΚĪĪÎŋĪÎŋÎ¯ÎˇĪΡ ĪĪΡ ÎŗĪÎŊÎ¯Îą ÎŗĪÎąÎŧÎŧÎŽĪ ÎĩĪÎŗÎąĪΚĪÎŊ",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.spatialProperties" : "ΧĪĪΚÎēÎĪ ÎδΚĪĪΡĪÎĩĪ",
- "spatial.width" : "Î ÎģÎŦĪÎŋĪ",
- "spatial.height" : "ÎĪÎŋĪ",
- "spatial.depth" : "ÎÎŦθÎŋĪ",
- "spatial.gain" : "ÎĪÎŋÎģιβΎ",
- "spatial.roomMaterials" : "ÎĨÎģΚÎēÎŦ ÎĪÎŧÎąĪίÎŋĪ
",
- "spatial.roomDimensions" : "ÎΚιĪĪÎŦĪÎĩÎšĪ ÎĪÎŧÎąĪίÎŋĪ
",
- "spatial.roomPositions" : "ÎÎĪÎĩÎšĪ ÎĪÎŧÎąĪίÎŋĪ
",
- "spatial.setDimensions" : "ÎĪΚĪÎŧĪĪ ÎΚιĪĪÎŦĪÎĩĪÎŊ",
- "spatial.setPositions" : "ÎĪΚĪÎŧĪĪ ÎÎĪÎĩĪÎŊ",
- "spatial.up" : "Î ÎŦÎŊĪ",
- "spatial.front" : "Î ĪĪĪÎŋĪΡ",
- "spatial.left" : "ÎĪΚĪĪÎĩĪÎŦ",
- "spatial.right" : "ÎÎĩΞΚÎŦ",
- "spatial.back" : "ΠίĪĪ ÎĪΡ",
- "spatial.down" : "ÎÎŦĪĪ",
- "spatial.listener" : "ÎÎēĪÎŋÎąĪÎŽĪ",
- "spatial.audioSource" : "Î ÎˇÎŗÎŽ ÎĪÎŋĪ
",
-
- // Settings - Unfinished
- "settings.header.unfinished": "ÎÎŧΚĪÎĩÎģÎŽĪ",
-
- // Web Remote
- "remote.web.title": "Cider Remote",
- "remote.web.description": "ÎŖÎąĪĪĪĪÎĩ ĪÎŋÎŊ ÎēĪδΚÎēĪ QR ÎŗÎšÎą ĪĪÎļÎĩĪ
ΞΡ ĪÎŋĪ
Cider ÎŧÎĩ ĪÎŋ ÎēΚÎŊΡĪĪ ĪÎąĪ",
-
- //About
- "about.thanks": "ÎÎĩÎŗÎŦÎģÎą ÎĩĪ
ĪÎąĪΚĪĪĪ ĪĪΡÎŊ ÎÎŧÎŦδι Cider Collective ÎēιΚ ĪÎĩ ĪÎģÎŋĪ
Ī ĪÎŋĪ
Ī ĪĪ
ÎŊÎĩΚĪĪÎĪÎŋÎŊĪÎĪ ÎŧÎąĪ."
+{
+ "i18n.languageName": "ÎÎģÎģΡÎŊΚÎēÎŦ",
+ "i18n.languageNameEnglish": "Greek",
+ "i18n.category": "main",
+ "i18n.authors": "@down-bad",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "ÎÎēĪĪĪĪΡ",
+ "dialog.ok": "ÎÎ",
+ "notification.updatingLibrarySongs": "ÎÎŊΡÎŧÎĪĪĪΡ βΚβÎģΚÎŋθΎÎēÎˇĪ ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ...",
+ "notification.updatingLibraryAlbums": "ÎÎŊΡÎŧÎĪĪĪΡ βΚβÎģΚÎŋθΎÎēÎˇĪ ÎŦÎģÎŧĪÎŋĪ
Îŧ...",
+ "notification.updatingLibraryArtists": "ÎÎŊΡÎŧÎĪĪĪΡ βΚβÎģΚÎŋθΎÎēÎˇĪ ÎēÎąÎģÎģΚĪÎĩĪÎŊĪÎŊ...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "ÎÎŦθÎĩĪÎĩ ĪÎĩĪΚĪĪĪĪÎĩĪÎą",
+ "term.accountSettings": "ÎĄĪ
θÎŧίĪÎĩÎšĪ ÎģÎŋÎŗÎąĪΚιĪÎŧÎŋĪ",
+ "term.logout": "ÎĪÎŋĪĪÎŊδÎĩĪΡ",
+ "term.login": "ÎŖĪÎŊδÎĩĪΡ",
+ "term.about": "ÎŖĪÎĩĪΚÎēÎŦ ÎŧÎĩ",
+ "term.privateSession": "ÎδΚĪĪΚÎēÎŽ ĪÎĩĪίÎŋδÎŋĪ ÎģÎĩΚĪÎŋĪ
ĪÎŗÎ¯ÎąĪ",
+ "term.queue": "ÎĪ
ĪÎŦ",
+ "term.history": "ÎĪĪÎŋĪΚÎēĪ",
+ "term.search": "ÎĪĪÎĩĪΡ",
+ "term.library": "ÎΚβÎģΚÎŋθΎÎēΡ",
+ "term.listenNow": "ÎÎēĪĪÎąĪΡ",
+ "term.browse": "Î ÎĩĪÎšÎŽÎŗÎˇĪΡ",
+ "term.radio": "ÎĄÎŦδΚÎŋ",
+ "term.recentlyAdded": "Î ĪĪĪĪÎąĪÎĩĪ ĪĪÎŋĪθΎÎēÎĩĪ",
+ "term.songs": "ΤĪÎąÎŗÎŋĪδΚι",
+ "term.albums": "ÎÎģÎŧĪÎŋĪ
Îŧ",
+ "term.artists": "ÎÎąÎģÎģΚĪÎĪÎŊÎĩĪ",
+ "term.podcasts": "Podcast",
+ "term.playlists": "ÎίĪĪÎĩĪ ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
+ "term.playlist": "ÎίĪĪÎą ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
+ "term.newPlaylist": "ÎÎÎą ÎģίĪĪÎą ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
+ "term.newPlaylistFolder": "ÎÎÎŋĪ ĪÎŦÎēÎĩÎģÎŋĪ ÎģίĪĪÎąĪ",
+ "term.createNewPlaylist": "ÎΡÎŧΚÎŋĪ
ĪÎŗÎ¯Îą ÎŊÎÎąĪ ÎģίĪĪÎąĪ ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
+ "term.createNewPlaylistFolder": "ÎΡÎŧΚÎŋĪ
ĪÎŗÎ¯Îą ÎŊÎÎŋĪ
ĪÎąÎēÎÎģÎŋĪ
ÎģίĪĪÎąĪ",
+ "term.deletePlaylist": "ÎÎÎģÎĩĪÎĩ ĪÎ¯ÎŗÎŋĪ
ĪÎą ÎŊÎą Î´ÎšÎąÎŗĪÎŦĪÎĩĪÎĩ ÎąĪ
ĪÎŽ ĪΡ ÎģίĪĪÎą ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ;",
+ "term.play": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ",
+ "term.pause": "Î ÎąĪĪΡ",
+ "term.previous": "Î ĪÎŋÎˇÎŗÎŋĪÎŧÎĩÎŊÎŋ",
+ "term.next": "ÎĪĪÎŧÎĩÎŊÎŋ",
+ "term.shuffle": "ΤĪ
ĪÎąÎ¯Îą ĪÎĩΚĪÎŦ",
+ "term.repeat": "ÎĪÎąÎŊÎŦÎģΡĪΡ",
+ "term.volume": "ÎÎŊĪÎąĪΡ",
+ "term.mute": "ÎŖÎ¯ÎŗÎąĪΡ",
+ "term.unmute": "ÎÎąĪÎŦĪÎŗÎˇĪΡ ĪÎ¯ÎŗÎąĪΡĪ",
+ "term.share": "ÎÎŋΚÎŊÎŽ ΧĪÎŽĪΡ",
+ "term.share.success": "ÎÎŊĪÎšÎŗĪÎŦĪΡÎēÎĩ ĪĪÎŋ ĪĪĪĪÎĩΚĪÎŋ",
+ "term.settings": "ÎĄĪ
θÎŧίĪÎĩΚĪ",
+ "term.seeAll": "Î ĪÎŋβÎŋÎģÎŽ ĪÎģĪÎŊ",
+ "term.sortBy": "ΤιΞΚÎŊĪÎŧΡĪΡ ÎēÎąĪÎŦ",
+ "term.sortBy.album": "ÎÎģÎŧĪÎŋĪ
Îŧ",
+ "term.sortBy.artist": "ÎÎąÎģÎģΚĪÎĪÎŊΡ",
+ "term.sortBy.name": "ÎÎŊÎŋÎŧÎą",
+ "term.sortBy.genre": "ÎίδÎŋĪ",
+ "term.sortBy.releaseDate": "ÎÎŧÎĩĪÎŋÎŧΡÎŊÎ¯Îą ÎēĪ
ÎēÎģÎŋĪÎŋĪÎ¯ÎąĪ",
+ "term.sortBy.duration": "ÎΚÎŦĪÎēÎĩΚι",
+ "term.sortBy.dateAdded": "ÎÎŧÎĩĪÎŋÎŧΡÎŊÎ¯Îą ĪĪÎŋĪθΎÎēΡĪ",
+ "term.sortOrder": "Î-Ί",
+ "term.sortOrder.ascending": "ÎĪΞÎŋĪ
ĪÎą",
+ "term.sortOrder.descending": "ÎĻθίÎŊÎŋĪ
ĪÎą",
+ "term.viewAs": "Î ĪÎŋβÎŋÎģÎŽ ĪĪ",
+ "term.viewAs.coverArt": "ÎΞĪĪĪ
ÎģÎģÎŋ",
+ "term.viewAs.list": "ÎίĪĪÎą",
+ "term.size": "ÎÎÎŗÎĩθÎŋĪ",
+ "term.size.normal": "ÎÎąÎŊÎŋÎŊΚÎēĪ",
+ "term.size.compact": "ÎŖĪ
ÎŧĪÎąÎŗÎŽ",
+ "term.enable": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ",
+ "term.disable": "ÎĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ",
+ "term.enabled": "ÎÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊÎŋ",
+ "term.disabled": "ÎĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊÎŋ",
+ "term.connect": "ÎŖĪÎŊδÎĩĪΡ",
+ "term.connecting": "ÎίÎŊÎĩĪιΚ ĪĪÎŊδÎĩĪΡ",
+ "term.disconnect": "ÎĪÎŋĪĪÎŊδÎĩĪΡ",
+ "term.authed": "ÎĪΚÎēĪ
ĪĪÎŧÎÎŊÎŋ",
+ "term.confirm": "ÎŖÎ¯ÎŗÎŋĪ
ĪÎą;",
+ "term.more": "Î ÎĩĪΚĪĪĪĪÎĩĪÎą",
+ "term.less": "ÎÎšÎŗĪĪÎĩĪÎą",
+ "term.showMore": "ÎÎŧĪÎŦÎŊΚĪΡ ĪÎĩĪΚĪĪĪĪÎĩĪĪÎŊ",
+ "term.showLess": "ÎÎŧĪÎŦÎŊΚĪΡ ÎģÎšÎŗĪĪÎĩĪĪÎŊ",
+ "term.topSongs": "ÎÎŋĪĪ
ĪÎąÎ¯Îą ĪĪÎąÎŗÎŋĪδΚι",
+ "term.latestReleases": "ΤÎĩÎģÎĩĪ
ĪÎąÎ¯ÎĩĪ ÎēĪ
ÎēÎģÎŋĪÎŋĪίÎĩĪ",
+ "term.time.added": "Î ĪÎŋĪĪÎθΡÎēÎĩ",
+ "term.time.released": "ÎĪ
ÎēÎģÎŋĪĪĪΡĪÎĩ",
+ "term.time.updated": "ÎÎŊΡÎŧÎĩĪĪθΡÎēÎĩ",
+ "term.time.hours": "ĪĪÎĩĪ",
+ "term.time.hour": "ĪĪÎą",
+ "term.time.minutes": "ÎģÎĩĪĪÎŦ",
+ "term.time.minute": "ÎģÎĩĪĪĪ",
+ "term.time.seconds": "δÎĩĪ
ĪÎĩĪĪÎģÎĩĪĪÎą",
+ "term.time.second": "δÎĩĪ
ĪÎĩĪĪÎģÎĩĪĪÎŋ",
+ "term.fullscreenView": "Î ÎģÎŽĪÎˇĪ ÎŋθĪÎŊΡ",
+ "term.defaultView": "ÎÎąÎŊÎŋÎŊΚÎēÎŽ ÎŋθĪÎŊΡ",
+ "term.audioSettings": "ÎĄĪ
θÎŧίĪÎĩÎšĪ ÎŽĪÎŋĪ
",
+ "term.audioControls": "ÎÎģÎĩÎŗĪÎŋĪ ÎŽĪÎŋĪ
",
+ "term.clearAll": "ÎÎēÎēιθÎŦĪΚĪΡ ĪÎģĪÎŊ",
+ "term.recentStations": "Î ĪĪĪĪÎąĪÎŋΚ ĪĪιθÎŧÎŋί",
+ "term.language": "ÎÎģĪĪĪÎą",
+ "term.funLanguages": "ÎΚι ĪÎģÎŦÎēÎą",
+ "term.noLyrics": "ÎĻĪĪĪĪĪΡ... / ÎÎĩÎŊ βĪÎθΡÎēÎąÎŊ ĪĪίĪÎŋΚ. / ÎĪĪΡĪĪΚÎēĪ.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "ÎÎģÎą ĪÎą δΚÎēιΚĪÎŧÎąĪÎą δΚιĪΡĪÎŋĪÎŊĪιΚ.",
+ "term.sponsor": "ΧÎŋĪÎŽÎŗÎˇĪÎĩ ÎąĪ
ĪĪ ĪÎŋ ÎĪÎŗÎŋ",
+ "term.ciderTeam": "ÎÎŧÎŦδι Cider",
+ "term.developer": "Î ĪÎŋÎŗĪÎąÎŧÎŧÎąĪΚĪĪÎŽĪ",
+ "term.socialTeam": "ÎÎŋΚÎŊĪÎŊΚÎēÎŽ ÎÎŧÎŦδι",
+ "term.socials": "ÎÎŋΚÎŊĪÎŊΚÎēÎŦ ÎÎĪÎą",
+ "term.contributors": "ÎŖĪ
ÎŊÎĩΚĪĪÎĪÎŋÎŊĪÎĩĪ",
+ "term.equalizer": "ÎĪÎŋĪĪιθÎŧΚĪĪÎŽĪ",
+ "term.reset": "ÎĪÎąÎŊÎąĪÎŋĪÎŦ",
+ "term.tracks": {
+ "one": "ĪĪÎąÎŗÎŋĪδΚ",
+ "other": "ĪĪÎąÎŗÎŋĪδΚι"
+ },
+ "term.videos": "ÎίÎŊĪÎĩÎŋ",
+ "term.menu": "ÎÎĩÎŊÎŋĪ",
+ "term.check": "ÎÎģÎĩÎŗĪÎŋĪ",
+ "term.aboutArtist": "ÎŖĪÎĩĪΚÎēÎŦ ÎŧÎĩ {{artistName}}",
+ "term.topResult": "ÎÎŋĪĪ
ĪÎąÎ¯Îŋ ÎąĪÎŋĪÎÎģÎĩĪÎŧÎą",
+ "term.sharedPlaylists": "ÎÎŋΚÎŊĪĪĪΡĪĪÎĩĪ ÎģίĪĪÎĩĪ ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
+ "term.people": "ÎĪÎŋÎŧÎą",
+ "term.newpreset.name": "ÎÎÎŋ ĪÎŊÎŋÎŧÎą ĪĪÎŋĪĪθÎŧΚĪÎˇĪ EQ",
+ "term.addedpreset": "Î ĪĪÎŋĪĪθÎŧΚĪΡ ĪĪÎŋĪĪÎθΡÎēÎĩ",
+ "term.deletepreset.warn": "ÎÎÎģÎĩĪÎĩ ĪÎ¯ÎŗÎŋĪ
ĪÎą ÎŊÎą Î´ÎšÎąÎŗĪÎŦĪÎĩĪÎĩ ÎąĪ
ĪÎŽ ĪΡ ĪĪÎŋĪĪθÎŧΚĪΡ;",
+ "term.deletedpreset": "Î ĪĪÎŋĪĪθÎŧΚĪΡ ÎąĪιΚĪÎθΡÎēÎĩ",
+ "term.defaultPresets": "Î ĪÎŋÎēιθÎŋĪΚĪÎŧÎÎŊÎĩĪ ĪĪÎŋĪĪ
θÎŧίĪÎĩΚĪ",
+ "term.userPresets": "Î ĪÎŋĪĪ
θÎŧίĪÎĩÎšĪ ĪĪÎŽĪĪΡ",
+ "term.requestError": "Î ÎąĪÎŋĪ
ĪΚÎŦĪĪΡÎēÎĩ ÎēÎŦĪÎŋΚÎŋ ĪĪĪβÎģΡÎŧÎą ÎŧÎĩ ĪÎŋ ÎąÎ¯ĪΡÎŧÎŦ ĪÎŋĪ
.",
+ "term.song.link.generate": "ÎίÎŊÎĩĪιΚ ÎģÎŽĪΡ ĪĪ
ÎŊδÎĪÎŧÎŋĪ
song.link...",
+ "term.musicVideos": "ÎÎŋĪ
ĪΚÎēÎŦ Î˛Î¯ÎŊĪÎĩÎŋ",
+ "term.stations": "ÎŖĪιθÎŧÎŋί",
+ "term.curators": "ÎĪΚÎŧÎĩÎģΡĪÎĪ",
+ "term.appleCurators": "ÎĪΚÎŧÎĩÎģΡĪÎĪ Apple",
+ "term.radioShows": "ΥιδΚÎŋĪĪÎŊΚÎēÎĪ ÎĩÎēĪÎŋÎŧĪÎĪ",
+ "term.recordLabels": "ÎΚĪÎēÎŋÎŗĪÎąĪΚÎēÎĪ ÎĩĪιΚĪίÎĩĪ",
+ "term.videoExtras": "Î ĪĪĪθÎĩĪÎŋ Ī
ÎģΚÎēĪ Î˛Î¯ÎŊĪÎĩÎŋ",
+ "term.top": "ÎÎŋĪĪ
ĪÎąÎ¯Îą",
+ "term.version": "ÎÎēδÎŋĪΡ",
+ "term.noVideos": "ÎÎĩÎŊ βĪÎθΡÎēÎąÎŊ Î˛Î¯ÎŊĪÎĩÎŋ",
+ "term.plugin": "Î ĪĪĪθÎĩĪÎą",
+ "term.pluginMenu": "ÎÎĩÎŊÎŋĪ ĪĪĪĪθÎĩĪĪÎŊ",
+ "term.replay": "Replay",
+ "term.uniqueAlbums": "ÎÎŋÎŊιδΚÎēÎŦ ÎŦÎģÎŧĪÎŋĪ
Îŧ",
+ "term.uniqueArtists": "ÎÎŋÎŊιδΚÎēÎŋί ÎēÎąÎģÎģΚĪÎĪÎŊÎĩĪ",
+ "term.uniqueSongs": "ÎÎŋÎŊιδΚÎēÎŦ ĪĪÎąÎŗÎŋĪδΚι",
+ "term.topArtists": "ÎÎŋĪĪ
ĪÎąÎ¯ÎŋΚ ÎēÎąÎģÎģΚĪÎĪÎŊÎĩĪ",
+ "term.listenedTo": "ÎÎēÎŋĪ
ĪÎĩĪ:",
+ "term.times": "ĪÎŋĪÎĪ",
+ "term.topAlbums": "ÎÎŋĪĪ
ĪÎąÎ¯Îą ÎŦÎģÎŧĪÎŋĪ
Îŧ",
+ "term.plays": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎĪ",
+ "term.topGenres": "ÎÎŋĪĪ
ĪÎąÎ¯Îą ÎĩÎ¯Î´Îˇ",
+ "term.confirmLogout": "ÎÎÎģÎĩĪÎĩ ĪÎ¯ÎŗÎŋĪ
ĪÎą ÎŊÎą ÎąĪÎŋĪĪ
ÎŊδÎĩθÎĩίĪÎĩ;",
+ "home.title": "ÎĪĪΚÎēÎŽ",
+ "home.recentlyPlayed": "ÎĪιΚΞιÎŊ ĪĪĪĪĪÎąĪÎą",
+ "home.recentlyAdded": "Î ĪĪĪĪÎąĪÎĩĪ ĪĪÎŋĪθΎÎēÎĩĪ",
+ "home.artistsFeed": "ÎĄÎŋÎŽ ĪĪÎŊ ÎēÎąÎģÎģΚĪÎĩĪÎŊĪÎŊ ĪÎŋĪ
",
+ "home.artistsFeed.noArtist": "ÎÎēÎŋÎģÎŋĪθΡĪÎĩ ÎŧÎĩĪΚÎēÎŋĪĪ ÎēÎąÎģÎģΚĪÎĪÎŊÎĩĪ ĪĪĪĪÎą ÎēιΚ ÎŋΚ ĪÎĩÎģÎĩĪ
ĪÎąÎ¯ÎĩĪ ÎēĪ
ÎēÎģÎŋĪÎŋĪίÎĩĪ ĪÎŋĪ
Ī Î¸Îą ÎĩÎŧĪÎąÎŊίÎļÎŋÎŊĪιΚ ÎĩδĪ",
+ "home.madeForYou": "ÎΡÎŧΚÎŋĪ
ĪÎŗÎŽÎ¸ÎˇÎēÎĩ ÎŗÎšÎą ÎĩĪÎŦĪ",
+ "home.friendsListeningTo": "ÎΚ ĪίÎģÎŋΚ ĪÎŋĪ
ÎąÎēÎŋĪÎŊ",
+ "home.followedArtists": "ÎÎąÎģÎģΚĪÎĪÎŊÎĩĪ ĪÎŋĪ
ÎąÎēÎŋÎģÎŋĪ
θÎĩίĪÎĩ",
+ "error.appleMusicSubRequired": "ΤÎŋ Apple Music ÎąĪιΚĪÎĩί ÎŧΚι ĪĪ
ÎŊδĪÎŋÎŧÎŽ.",
+ "error.connectionError": "ÎÎĩÎŊ ÎĩίÎŊιΚ δĪ
ÎŊÎąĪÎŽ Ρ ĪĪÎŊδÎĩĪΡ ÎŧÎĩ ĪÎŋ Apple Music.",
+ "error.noResults": "ÎÎąÎŊÎÎŊÎą ÎąĪÎŋĪÎÎģÎĩĪÎŧÎą.",
+ "error.noResults.description": "ÎÎŋÎēΚÎŧÎŦĪĪÎĩ ÎŧΚι ÎŊÎÎą ÎąÎŊÎąÎļÎŽĪΡĪΡ.",
+ "podcast.followOnCider": "ÎÎēÎŋÎģÎŋĪθΡĪΡ ĪĪÎŋ Cider",
+ "podcast.followedOnCider": "ÎÎēÎŋÎģÎŋĪ
θÎĩίĪÎĩ ĪĪÎŋ Cider",
+ "podcast.subscribeOnItunes": "ÎŖĪ
ÎŊδĪÎŋÎŧÎŽ ĪĪÎŋ iTunes",
+ "podcast.subscribedOnItunes": "ÎŖĪ
ÎŊδĪÎŋÎŧΡĪÎŽĪ ĪĪÎŋ iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "ÎĪÎĩΚĪĪδΚι",
+ "podcast.playEpisode": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ÎĩĪÎĩΚĪÎŋδίÎŋĪ
",
+ "podcast.website": "ÎĪĪĪĪÎŋĪÎŋĪ Podcast",
+ "action.addToLibrary": "Î ĪÎŋĪθΎÎēΡ ĪĪΡ βΚβÎģΚÎŋθΎÎēΡ",
+ "action.addToLibrary.success": "Î ĪÎŋĪĪÎθΡÎēÎĩ ĪĪΡ βΚβÎģΚÎŋθΎÎēΡ",
+ "action.addToLibrary.error": "ÎŖĪÎŦÎģÎŧÎą Î ĪÎŋĪθΎÎēÎˇĪ ĪĪΡ βΚβÎģΚÎŋθΎÎēΡĪ",
+ "action.removeFromLibrary": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎąĪĪ ĪΡ βΚβÎģΚÎŋθΎÎēΡ",
+ "action.removeFromLibrary.success": "ÎĪιΚĪÎθΡÎēÎĩ ÎąĪĪ ĪΡ βΚβÎģΚÎŋθΎÎēΡ",
+ "action.addToQueue": "Î ĪÎŋĪθΎÎēΡ ĪĪΡÎŊ ÎŋĪ
ĪÎŦ",
+ "action.addToQueue.success": "Î ĪÎŋĪĪÎθΡÎēÎĩ ĪĪΡÎŊ ÎŋĪ
ĪÎŦ",
+ "action.addToQueue.error": "Î ĪÎŋĪĪÎθΡÎēÎĩ ĪĪΡÎŊ ÎŋĪ
ĪÎŦ",
+ "action.removeFromQueue": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
+ "action.removeFromQueue.success": "ÎĪιΚĪÎθΡÎēÎĩ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
+ "action.removeFromQueue.error": "ÎŖĪÎŦÎģÎŧÎą ÎĪÎąÎ¯ĪÎĩĪÎˇĪ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
+ "action.createPlaylist": "ÎΡÎŧΚÎŋĪ
ĪÎŗÎ¯Îą ÎŊÎÎąĪ ÎģίĪĪÎąĪ ÎąÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
+ "action.addToPlaylist": "Î ĪÎŋĪθΎÎēΡ ĪÎĩ ÎģίĪĪÎą",
+ "action.removeFromPlaylist": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎąĪĪ ÎģίĪĪÎą",
+ "action.addToFavorites": "Î ĪÎŋĪθΎÎēΡ ĪĪÎą ÎąÎŗÎąĪΡÎŧÎÎŊÎą",
+ "action.follow": "ÎÎēÎŋÎģÎŋĪθΡĪΡ",
+ "action.follow.success": "ÎÎēÎŋÎģÎŋĪ
θΎθΡÎēÎĩ",
+ "action.follow.error": "ÎŖĪÎŦÎģÎŧÎą ÎąÎēÎŋÎģÎŋĪθΡĪΡĪ",
+ "action.unfollow": "ÎΚιÎēÎŋĪÎŽ ÎąÎēÎŋÎģÎŋĪθΡĪΡĪ",
+ "action.unfollow.success": "ÎÎŗÎšÎŊÎĩ δΚιÎēÎŋĪÎŽ ÎąÎēÎŋÎģÎŋĪθΡĪΡĪ",
+ "action.unfollow.error": "ÎŖĪÎŦÎģÎŧÎą δΚιÎēÎŋĪÎŽĪ ÎąÎēÎŋÎģÎŋĪθΡĪÎˇĪ ",
+ "action.playNext": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ĪĪ ÎĩĪĪÎŧÎĩÎŊÎŋĪ
",
+ "action.playLater": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ÎąĪÎŗĪĪÎĩĪÎą",
+ "action.startRadio": "ÎÎŊÎąĪΞΡ ĪιδΚÎŋĪĪÎŊÎŋĪ
",
+ "action.goToArtist": "ÎÎĩĪÎŦβιĪΡ ĪÎĩ ÎēÎąÎģÎģΚĪÎĪÎŊΡ",
+ "action.goToAlbum": "ÎÎĩĪÎŦβιĪΡ ĪÎĩ ÎŦÎģÎŧĪÎŋĪ
Îŧ",
+ "action.moveToTop": "ÎÎĩĪÎąÎēίÎŊΡĪΡ ĪĪΡ ÎēÎŋĪĪ
ĪÎŽ",
+ "action.share": "ÎÎŋΚÎŊÎŽ ĪĪÎŽĪΡ",
+ "action.rename": "ÎÎĩĪÎŋÎŊÎŋÎŧÎąĪÎ¯Îą",
+ "action.love": "ÎÎŋĪ
ÎąĪÎĪÎĩΚ ĪÎŋÎģĪ",
+ "action.unlove": "ÎÎŊÎąÎ¯ĪÎĩĪΡ \"ÎÎŋĪ
ÎąĪÎĪÎĩΚ\"",
+ "action.dislike": "ÎÎĩÎŊ ÎŧÎŋĪ
ÎąĪÎĪÎĩΚ",
+ "action.undoDislike": "ÎÎŊÎąÎ¯ĪÎĩĪΡ \"ÎÎĩÎŊ ÎŧÎŋĪ
ÎąĪÎĪÎĩΚ\"",
+ "action.showWebRemoteQR": "ÎÎŧĪÎŦÎŊΚĪΡ Web Remote QR",
+ "action.playTracksNext": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ${app.selectedMediaItems.length} ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ ĪĪ ÎĩĪĪÎŧÎĩÎŊĪÎŊ",
+ "action.playTracksLater": "ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽ ${app.selectedMediaItems.length} ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ ÎąĪÎŗĪĪÎĩĪÎą",
+ "action.removeTracks": "ÎĪÎąÎ¯ĪÎĩĪΡ ${self.selectedItems.length} ĪĪÎąÎŗÎŋĪ
δΚĪÎŊ ÎąĪĪ ĪΡÎŊ ÎŋĪ
ĪÎŦ",
+ "action.import": "ÎΚĪÎąÎŗĪÎŗÎŽ",
+ "action.export": "ÎÎžÎąÎŗĪÎŗÎŽ",
+ "action.showAlbum": "ÎÎŧĪÎŦÎŊΚĪΡ ÎŋÎģĪÎēÎģΡĪÎŋĪ
ÎŦÎģÎŧĪÎŋĪ
Îŧ",
+ "action.tray.minimize": "ÎÎģÎąĪΚĪĪÎŋĪÎŋÎ¯ÎˇĪΡ ĪĪΡ ÎŗĪÎŊÎ¯Îą ÎŗĪÎąÎŧÎŧÎŽĪ ÎĩĪÎŗÎąĪΚĪÎŊ",
+ "action.tray.quit": "ÎΞÎŋδÎŋĪ",
+ "action.tray.show": "ÎÎŧĪÎŦÎŊΚĪΡ",
+ "action.update": "ÎÎŊΡÎŧÎĪĪĪΡ",
+ "action.install": "ÎÎŗÎēÎąĪÎŦĪĪÎąĪΡ",
+ "action.copy": "ÎÎŊĪÎšÎŗĪÎąĪÎŽ",
+ "action.newpreset": "ÎÎÎą ĪĪÎŋĪĪθÎŧΚĪΡ...",
+ "action.deletepreset": "ÎÎšÎąÎŗĪÎąĪÎŽ ĪĪÎŋĪĪθÎŧΚĪΡĪ",
+ "action.open": "ÎÎŊÎŋÎšÎŗÎŧÎą",
+ "settings.header.general": "ÎÎĩÎŊΚÎēÎŦ",
+ "settings.header.general.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ÎŗÎĩÎŊΚÎēĪÎŊ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
+ "settings.option.general.language": "ÎÎģĪĪĪÎą",
+ "settings.option.general.resumebehavior": "ÎŖĪ
ÎŧĪÎĩĪΚĪÎŋĪÎŦ ĪĪ
ÎŊÎĪΚĪΡĪ",
+ "settings.option.general.resumebehavior.description": "Î ĪĪ
ÎŧĪÎĩĪΚĪÎŋĪÎŦ ĪĪ
ÎŊÎĪΚĪÎˇĪ ÎĩĪΡĪÎĩÎŦÎļÎĩΚ ĪÎŋÎŊ ĪĪĪĪÎŋ ÎŧÎĩ ĪÎŋÎŊ ÎŋĪÎŋίÎŋ ĪÎŋ Cider θι ĪĪ
ÎŊÎĩĪίĪÎĩΚ ĪΡ ĪĪ
ÎŊÎĩδĪÎ¯Îą ĪÎąĪ ĪĪÎąÎŊ ÎĩĪΚĪĪĪÎĪÎĩĪÎĩ ĪĪΡÎŊ ÎĩĪÎąĪÎŧÎŋÎŗÎŽ.",
+ "settings.option.general.resumebehavior.locally": "ΤÎŋĪΚÎēĪ",
+ "settings.option.general.resumebehavior.locally.description": "ΤÎŋ Cider θι ĪĪ
ÎŊÎĩĪίĪÎĩΚ ĪΡÎŊ ĪÎĩÎģÎĩĪ
ĪÎąÎ¯Îą ĪĪ
ÎŊÎĩδĪÎ¯Îą ĪÎąĪ ÎąĪ
ĪÎŽĪ ĪÎˇĪ ĪĪ
ĪÎēÎĩĪ
ÎŽĪ.",
+ "settings.option.general.resumebehavior.history": "ÎĪĪÎŋĪΚÎēĪ",
+ "settings.option.general.resumebehavior.history.description": "ΤÎŋ Cider θι βÎŦÎģÎĩΚ ĪĪΡÎŊ ÎŋĪ
ĪÎŦ ĪÎŋ ĪÎĩÎģÎĩĪ
ĪÎąÎ¯Îŋ ĪĪÎąÎŗÎŋĪδΚ ÎąĪĪ ĪÎŋ ĪĪ
ÎŊÎŋÎģΚÎēĪ ÎšĪĪÎŋĪΚÎēĪ Apple Music, ĪÎģĪÎŊ ĪĪÎŊ ĪĪ
ĪÎēÎĩĪ
ĪÎŊ ĪÎąĪ.",
+ "settings.option.general.language.main": "ÎÎģĪĪĪÎĩĪ",
+ "settings.option.general.language.fun": "ÎÎģĪĪĪÎĩĪ ÎŗÎšÎą ĪÎģÎŦÎēÎą",
+ "settings.option.general.language.unsorted": "ÎĪιΞΚÎŊĪÎŧΡĪÎĩĪ",
+ "settings.option.general.updateCider": "ÎÎŊΡÎŧÎĪĪĪΡ Cider",
+ "settings.option.general.updateCider.branch": "ÎÎģÎŦδÎŋĪ ÎĩÎŊΡÎŧÎĪĪĪÎˇĪ Cider",
+ "settings.option.general.updateCider.branch.description": "ÎĪΚÎģÎΞĪÎĩ ĪÎŋÎŊ ÎēÎģÎŦδÎŋ ĪĪÎŋÎŊ ÎŋĪÎŋίÎŋ θι ÎŗÎ¯ÎŊÎĩĪιΚ Ρ ÎĩÎŊΡÎŧÎĪĪĪΡ ĪÎŋĪ
Cider",
+ "settings.option.general.updateCider.branch.main": "ÎŖĪιθÎĩĪĪ",
+ "settings.option.general.updateCider.branch.develop": "ÎÎŊÎąĪĪĪ
ΞΚιÎēĪ",
+ "settings.header.audio": "ÎĪÎŋĪ",
+ "settings.header.audio.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŽĪÎŋĪ
ÎŗÎšÎą ĪÎŋ Cider.",
+ "settings.option.audio.volumeStep": "ÎÎŽÎŧÎąĪÎą ÎÎŊĪÎąĪΡĪ",
+ "settings.option.audio.maxVolume": "ÎÎÎŗÎšĪĪΡ ÎÎŊĪÎąĪΡ",
+ "settings.option.audio.quality": "Î ÎŋΚĪĪΡĪÎą ÎŽĪÎŋĪ
",
+ "settings.header.audio.quality.hireslossless": "Lossless Ī
ĪΡÎģÎŽĪ ÎąÎŊÎŦÎģĪ
ĪΡĪ",
+ "settings.header.audio.quality.hireslossless.description": "ÎĪĪ ÎēιΚ 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "ÎĪĪ ÎēιΚ 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "ÎĨĪΡÎģÎŽ",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "ÎÎąÎŊÎŋÎŊΚÎēÎŽ",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "ÎδΚÎŦÎēÎŋĪΡ ÎŧÎĩĪÎŦβιĪΡ ÎŽĪÎŋĪ
",
+ "settings.option.audio.enableAdvancedFunctionality": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ĪĪÎŋÎˇÎŗÎŧÎÎŊÎˇĪ ÎģÎĩΚĪÎŋĪ
ĪÎŗÎšÎēĪĪΡĪÎąĪ",
+ "settings.option.audio.enableAdvancedFunctionality.description": "ÎÎŊÎĩĪÎŗÎŋĪÎŋΚĪÎŊĪÎąĪ ĪΡ ÎģÎĩΚĪÎŋĪ
ĪÎŗÎšÎēĪĪΡĪÎą AudioContext θι ÎĩĪΚĪĪÎĪÎĩΚ ĪÎĩ ÎĩĪÎĩÎēĪÎąÎŧÎÎŊÎĩĪ Î´Ī
ÎŊÎąĪĪĪΡĪÎĩĪ ÎŽĪÎŋĪ
ĪĪĪĪ ÎÎąÎŊÎŋÎŊΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎÎŊĪÎąĪÎˇĪ ÎĪÎŋĪ
, ÎĪÎŋĪĪιθÎŧΚĪĪÎĪ ÎēιΚ ÎĪĪΚÎēÎŋĪÎŋΚΡĪÎĪ, ĪĪĪĪĪÎŋ ĪÎĩ ÎēÎŦĪÎŋΚι ĪĪ
ĪĪÎŽÎŧÎąĪÎą ÎŧĪÎŋĪÎĩί ÎŊÎą ĪĪÎŋÎēÎąÎģÎĪÎĩΚ ĪĪÎąĪÎģΚĪÎŧÎą ÎŽĪÎŋĪ
.",
+ "settings.option.audio.audioLab": "Cider Audio Lab",
+ "settings.option.audio.audioLab.description": "Î ÎĩĪΚÎĪÎĩΚ ÎŧΚι ĪÎŋΚÎēΚÎģÎ¯Îą ÎąĪĪ ĪĪÎŋĪÎŋĪÎŋΚΎĪÎĩÎšĪ ÎŽĪÎŋĪ
ĪÎŋĪ
ÎÎŗÎšÎŊÎąÎŊ ÎąĪĪ ĪΡÎŊ ÎŋÎŧÎŦδι ĪĪÎŋÎŗĪÎąÎŧÎŧÎąĪΚĪĪĪÎŊ ĪÎŋĪ
Cider",
+ "settings.warn.audioLab.withoutAF": "ΤÎŋ AudioContext (ĪĪÎŋÎˇÎŗÎŧÎÎŊΡ ÎģÎĩΚĪÎŋĪ
ĪÎŗÎšÎēĪĪΡĪÎą) ÎąĪιΚĪÎĩίĪιΚ ÎŗÎšÎą ĪΡÎŊ ÎĩÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ĪÎŋĪ
Cider Audio Laboratory.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "ÎÎŊĪÎąĪΡ Analog Warmth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "ÎÎģÎģÎŦÎļÎĩΚ ĪΡÎŊ ÎÎŊĪÎąĪΡ ĪÎˇĪ ÎĩĪÎĩΞÎĩĪÎŗÎąĪÎ¯ÎąĪ ĪÎŋĪ
Analog Warmth Module.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "ΤÎŋ CAP δÎĩÎŊ ÎĩίÎŊιΚ ĪĪ
ÎŧβιĪĪ ÎŧÎĩ ĪΡ ΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎĪÎŋĪ
. Î ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ÎąĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΎĪĪÎĩ ĪΡ ΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎĪÎŋĪ
ÎŗÎšÎą ÎŊÎą ĪĪ
ÎŊÎĩĪίĪÎĩĪÎĩ.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "ÎÎŊĪÎąĪΡ CAP",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "ÎÎģÎģÎŦÎļÎĩΚ ĪΡÎŊ ÎÎŊĪÎąĪΡ ĪÎˇĪ ÎĩĪÎĩΞÎĩĪÎŗÎąĪÎ¯ÎąĪ ĪÎŋĪ
ÎŽĪÎŋĪ
. (Î ÎĩĪΚθÎĩĪΚÎēÎŽ ÎĩĪÎĩΞÎĩĪÎŗÎąĪÎ¯Îą ÎŧĪÎŋĪÎĩί ÎŊÎą ÎąĪÎŋĪÎĪÎĩΚ ÎąÎŊÎĩĪΚθĪÎŧΡĪÎą ÎąĪÎŋĪÎĩÎģÎĪÎŧÎąĪÎą)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "ÎÎąÎŊÎŋÎŊΚÎēÎŽ",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "ÎĪΚθÎĩĪΚÎēÎŽ",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ÎÎąÎŊÎŋÎŊΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎÎŊĪÎąĪÎˇĪ ÎĪÎŋĪ
",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "ÎÎąÎŊÎŋÎŊΚÎēÎŋĪÎŋΚÎĩί ĪΡÎŊ ÎÎŊĪÎąĪΡ ÎŗÎšÎą ÎŧÎĩÎŧÎŋÎŊĪÎŧÎÎŊÎą ÎēÎŋÎŧÎŧÎŦĪΚι ÎŗÎšÎą ÎŧΚι ĪΚÎŋ ÎŋÎŧÎŋΚĪÎŧÎŋĪĪΡ ÎĩÎŧĪÎĩΚĪÎ¯Îą ÎąÎēĪĪÎąĪΡĪ.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎĪÎŋĪ
",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ΠΚÎŋ ĪĪΚĪδΚÎŦĪĪÎąĪÎŋĪ ÎēιΚ ĪĪĪΚÎēÎŋĪÎŋΚΡÎŧÎÎŊÎŋĪ ÎŽĪÎŋĪ (ĪΡÎŧÎĩίĪĪΡ: ÎĪ
ĪĪ Î´ÎĩÎŊ ÎĩίÎŊιΚ Dolby Atmos)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "ΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ Cider",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned ÎĪΠΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡĪ, ÎąĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚÎĩί ĪÎšĪ ĪĪÎŋĪÎąĪÎŧĪĪΚÎŧÎĩĪ ĪĪ
θÎŧίĪÎĩÎšĪ ĪÎˇĪ Î§ĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪÎˇĪ ÎĪÎŋĪ
. ΠΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎĪÎŋĪ
ĪĪÎĪÎĩΚ ÎŊÎą ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊΡ.",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Î ĪÎŋĪίÎģ ΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪÎˇĪ Cider",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "ÎÎģÎģÎŦÎļÎĩΚ ĪÎŋ ĪĪÎŋĪίÎģ ĪÎˇĪ Î§ĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡĪ. (ÎĪιΚĪÎĩί ÎĩĪÎąÎŊÎĩÎēÎēίÎŊΡĪΡ)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "ÎÎąÎŊÎŋÎŊΚÎēĪ",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "ÎÎēÎŋĪ
ĪĪΚÎģÎŋĪ",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "ΠΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ δÎĩÎŊ ÎĩίÎŊιΚ ĪĪ
ÎŧβιĪÎŽ ÎŧÎĩ ĪÎŋ CAP. Î ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ÎąĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΎĪĪÎĩ ĪÎŋ CAP ÎŗÎšÎą ÎŊÎą ĪĪ
ÎŊÎĩĪίĪÎĩĪÎĩ.",
+ "settings.header.visual": "ÎĪĪΚÎēÎŦ",
+ "settings.header.visual.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ÎŋĪĪΚÎēĪÎŊ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
+ "settings.option.visual.windowBackgroundStyle": "ÎŖĪĪ
Îģ ÎĻĪÎŊĪÎŋĪ
Î ÎąĪιθĪĪÎŋĪ
",
+ "settings.header.visual.windowBackgroundStyle.none": "ÎÎąÎŊÎÎŊÎą",
+ "settings.header.visual.windowBackgroundStyle.artwork": "ÎΞĪĪĪ
ÎģÎģÎŋ",
+ "settings.header.visual.windowBackgroundStyle.image": "ÎΚÎēĪÎŊÎą",
+ "settings.option.visual.animatedArtwork": "ÎΚÎŊÎŋĪÎŧÎĩÎŊÎŋ ÎΞĪĪĪ
ÎģÎģÎŋ",
+ "settings.header.visual.animatedArtwork.always": "Î ÎŦÎŊĪÎą",
+ "settings.header.visual.animatedArtwork.limited": "Î ÎĩĪΚÎŋĪΚĪÎŧĪĪ ĪÎĩ ĪÎĩÎģίδÎĩĪ ÎēιΚ ÎĩΚδΚÎēÎĪ ÎēÎąĪÎąĪĪĪÎŽĪÎĩΚĪ",
+ "settings.header.visual.animatedArtwork.disable": "ÎĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊÎŋ ĪÎąÎŊĪÎŋĪ",
+ "settings.option.visual.animatedArtworkQuality": "Î ÎŋΚĪĪΡĪÎą ÎΚÎŊÎŋĪÎŧÎĩÎŊÎŋĪ
ÎΞĪĪĪÎģÎģÎŋĪ
",
+ "settings.header.visual.animatedArtworkQuality.low": "ΧιÎŧΡÎģÎŽ",
+ "settings.header.visual.animatedArtworkQuality.medium": "ÎÎĪĪΚι",
+ "settings.header.visual.animatedArtworkQuality.high": "ÎĨĪΡÎģÎŽ",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Î ÎŋÎģĪ ÎĨĪΡÎģÎŽ",
+ "settings.header.visual.animatedArtworkQuality.extreme": "ÎÎēĪÎąÎ¯Îą",
+ "settings.option.visual.animatedWindowBackground": "ÎΚÎŊÎŋĪÎŧÎĩÎŊÎŋ ÎĻĪÎŊĪÎŋ Î ÎąĪιθĪĪÎŋĪ
",
+ "settings.option.visual.hardwareAcceleration": "ÎĪΚĪÎŦĪĪ
ÎŊĪΡ ÎĨÎģΚÎēÎŋĪ",
+ "settings.option.visual.hardwareAcceleration.description": "ÎĪιΚĪÎĩί ÎĩĪÎąÎŊÎĩÎēÎēίÎŊΡĪΡ",
+ "settings.header.visual.hardwareAcceleration.default": "Î ĪÎŋÎĩĪΚÎģÎŋÎŗÎŽ",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "ÎÎÎŧÎą",
+ "settings.option.visual.theme.github.download": "ÎÎŗÎēÎąĪÎŦĪĪÎąĪΡ ÎąĪĪ ĪĪÎŊδÎĩĪÎŧÎŋ GitHub",
+ "settings.option.visual.theme.github.explore": "ÎΞÎĩĪÎĩĪÎŊΡĪΡ θÎĩÎŧÎŦĪĪÎŊ GitHub",
+ "settings.header.visual.theme.github.page": "ÎÎÎŧÎąĪÎą ÎąĪĪ ĪÎŋ GitHub",
+ "settings.option.visual.theme.github.install.confirm": "ÎÎÎģÎĩĪÎĩ ĪÎ¯ÎŗÎŋĪ
ĪÎą ÎŊÎą ÎĩÎŗÎēÎąĪÎąĪĪÎŽĪÎĩĪÎĩ ĪÎŋ θÎÎŧÎą {{ repo }};",
+ "settings.prompt.visual.theme.github.URL": "ÎΚĪÎŦÎŗÎĩĪÎĩ ĪÎŋÎŊ ĪĪÎŊδÎĩĪÎŧÎŋ ĪÎŋĪ
θÎÎŧÎąĪÎŋĪ ĪÎŋĪ
θÎÎģÎĩĪÎĩ ÎŊÎą ÎĩÎŗÎēÎąĪÎąĪĪÎŽĪÎĩĪÎĩ",
+ "settings.notyf.visual.theme.install.success": "ΤÎŋ θÎÎŧÎą ÎĩÎŗÎēÎąĪÎąĪĪÎŦθΡÎēÎĩ ÎŧÎĩ ÎĩĪΚĪĪ
ĪÎ¯Îą",
+ "settings.notyf.visual.theme.install.error": "ÎĪÎŋĪĪ
ĪÎ¯Îą ÎĩÎŗÎēÎąĪÎŦĪĪÎąĪÎˇĪ ĪÎŋĪ
θÎÎŧÎąĪÎŋĪ",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "ÎŖÎēÎŋĪÎĩΚÎŊĪ",
+ "settings.option.visual.showPersonalInfo": "ÎÎŧĪÎŦÎŊΚĪΡ ĪĪÎŋĪĪĪΚÎēĪÎŊ ĪĪÎŋΚĪÎĩίĪÎŊ",
+ "settings.header.lyrics": "ÎŖĪίĪÎŋΚ",
+ "settings.header.lyrics.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪĪ
θÎŧίĪÎĩĪÎŊ ĪĪίĪĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
+ "settings.option.lyrics.enableMusixmatch": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ÎŖĪίĪĪÎŊ Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ÎÎĩΚĪÎŋĪ
ĪÎŗÎ¯ÎąĪ ÎÎąĪÎąĪÎēÎĩ (Musixmatch ÎŧĪÎŊÎŋ)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Î ĪÎŋĪΚÎŧĪÎŧÎĩÎŊΡ ÎÎģĪĪĪÎą ÎÎĩĪÎŦĪĪÎąĪÎˇĪ Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ ÎŖĪίĪĪÎŊ Youtube ÎŗÎšÎą ÎÎŋĪ
ĪΚÎēÎŦ ÎίÎŊĪÎĩÎŋ",
+ "settings.header.connectivity": "ÎŖĪÎŊδÎĩĪΡ",
+ "settings.header.connectivity.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪĪ
θÎŧίĪÎĩĪÎŊ ĪĪÎŊδÎĩĪÎˇĪ ÎŗÎšÎą ĪÎŋ Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "ÎΚδÎŋĪÎŋΚΎĪÎĩÎšĪ ÎÎŊÎąĪÎąĪÎąÎŗĪÎŗÎŽĪ",
+ "settings.header.connectivity.discordRPC.cider": "ÎÎŧĪÎŦÎŊΚĪΡ ĪĪ 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "ÎÎŧĪÎŦÎŊΚĪΡ ĪĪ 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "ÎÎēÎēιθÎŦĪΚĪΡ ĪÎŋĪ
Discord Rich Presence ĪĪΡÎŊ Î ÎąĪĪΡ",
+ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "ÎιθĪ
ĪĪÎĪΡĪΡ LastFM Scrobble (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "ÎÎŊÎĩĪÎŗÎŋĪÎŋÎ¯ÎˇĪΡ LastFM \"Now Playing\"",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "ÎĪÎąÎ¯ĪÎĩĪΡ ÎēÎąÎģÎģΚĪÎĩĪÎŊĪÎŊ feature ÎąĪĪ ĪÎŋÎŊ ĪίĪÎģÎŋ ĪÎŋĪ
ĪĪÎąÎŗÎŋĪ
δΚÎŋĪ (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "ÎĻΚÎģĪĪÎŦĪΚĪÎŧÎą ÎĩĪÎąÎŊÎĩΚÎģΡÎŧÎŧÎÎŊÎŋĪ
ĪĪÎąÎŗÎŋĪ
δΚÎŋĪ (LastFM)",
+ "settings.header.debug": "ÎĪÎŋĪĪÎąÎģÎŧÎŦĪĪĪΡ",
+ "settings.option.debug.copy_log": "ÎÎŊĪÎšÎŗĪÎąĪÎŽ ÎąĪĪÎĩίĪÎŊ ÎēÎąĪÎąÎŗĪÎąĪÎŽĪ ĪĪÎŋ ĪĪĪĪÎĩΚĪÎŋ",
+ "settings.option.debug.openAppData": "ÎÎŊÎŋÎšÎŗÎŧÎą ĪÎŋĪ
ĪÎąÎēÎÎģÎŋĪ
Cider",
+ "settings.header.experimental": "Î ÎĩΚĪÎąÎŧÎąĪΚÎēÎĪ",
+ "settings.header.experimental.description": "Î ĪÎŋĪÎąĪÎŧÎŋÎŗÎŽ ĪÎĩΚĪÎąÎŧÎąĪΚÎēĪÎŊ ĪĪ
θÎŧίĪÎĩĪÎŊ ÎŗÎšÎą ĪÎŋ Cider.",
+ "settings.option.experimental.compactUI": "ÎŖĪ
ÎŧĪÎąÎŗÎŽĪ ÎΚÎĩĪÎąĪÎŽ",
+ "settings.option.experimental.closeButtonBehaviour": "ÎŖĪ
ÎŧĪÎĩĪΚĪÎŋĪÎŦ ÎÎŋĪ
ÎŧĪΚÎŋĪ ÎΞĪδÎŋĪ
",
+ "settings.option.experimental.closeButtonBehaviour.quit": "ÎΞÎŋδÎŋĪ ĪÎŋĪ
Cider",
+ "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "ÎÎģÎąĪΚĪĪÎŋĪÎŋÎ¯ÎˇĪΡ ĪĪΡ ÎŗĪÎąÎŧÎŧÎŽ ÎĩĪÎŗÎąĪΚĪÎŊ",
+ "settings.option.experimental.closeButtonBehaviour.minimizeTray": "ÎÎģÎąĪΚĪĪÎŋĪÎŋÎ¯ÎˇĪΡ ĪĪΡ ÎŗĪÎŊÎ¯Îą ÎŗĪÎąÎŧÎŧÎŽĪ ÎĩĪÎŗÎąĪΚĪÎŊ",
+ "spatial.notTurnedOn": "ΠΧĪĪΚÎēÎŋĪÎŋÎ¯ÎˇĪΡ ÎĪÎŋĪ
ÎĩίÎŊιΚ ÎąĪÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΡÎŧÎÎŊΡ. ÎΚι ĪĪÎŽĪΡ, ĪÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ÎĩÎŊÎĩĪÎŗÎŋĪÎŋΚΎĪĪÎĩ ĪΡÎŊ ĪĪĪĪÎą.",
+ "spatial.spatialProperties": "ΧĪĪΚÎēÎĪ ÎδΚĪĪΡĪÎĩĪ",
+ "spatial.width": "Î ÎģÎŦĪÎŋĪ",
+ "spatial.height": "ÎĪÎŋĪ",
+ "spatial.depth": "ÎÎŦθÎŋĪ",
+ "spatial.gain": "ÎĪÎŋÎģιβΎ",
+ "spatial.roomMaterials": "ÎĨÎģΚÎēÎŦ ÎĪÎŧÎąĪίÎŋĪ
",
+ "spatial.roomDimensions": "ÎΚιĪĪÎŦĪÎĩÎšĪ ÎĪÎŧÎąĪίÎŋĪ
",
+ "spatial.roomPositions": "ÎÎĪÎĩÎšĪ ÎĪÎŧÎąĪίÎŋĪ
",
+ "spatial.setDimensions": "ÎĪΚĪÎŧĪĪ ÎΚιĪĪÎŦĪÎĩĪÎŊ",
+ "spatial.setPositions": "ÎĪΚĪÎŧĪĪ ÎÎĪÎĩĪÎŊ",
+ "spatial.up": "Î ÎŦÎŊĪ",
+ "spatial.front": "Î ĪĪĪÎŋĪΡ",
+ "spatial.left": "ÎĪΚĪĪÎĩĪÎŦ",
+ "spatial.right": "ÎÎĩΞΚÎŦ",
+ "spatial.back": "ΠίĪĪ ÎĪΡ",
+ "spatial.down": "ÎÎŦĪĪ",
+ "spatial.listener": "ÎÎēĪÎŋÎąĪÎŽĪ",
+ "spatial.audioSource": "Î ÎˇÎŗÎŽ ÎĪÎŋĪ
",
+ "settings.header.unfinished": "ÎÎŧΚĪÎĩÎģÎŽĪ",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "ÎŖÎąĪĪĪĪÎĩ ĪÎŋÎŊ ÎēĪδΚÎēĪ QR ÎŗÎšÎą ĪĪÎļÎĩĪ
ΞΡ ĪÎŋĪ
Cider ÎŧÎĩ ĪÎŋ ÎēΚÎŊΡĪĪ ĪÎąĪ",
+ "about.thanks": "ÎÎĩÎŗÎŦÎģÎą ÎĩĪ
ĪÎąĪΚĪĪĪ ĪĪΡÎŊ ÎÎŧÎŦδι Cider Collective ÎēιΚ ĪÎĩ ĪÎģÎŋĪ
Ī ĪÎŋĪ
Ī ĪĪ
ÎŊÎĩΚĪĪÎĪÎŋÎŊĪÎĪ ÎŧÎąĪ."
}
\ No newline at end of file
diff --git a/src/i18n/en_GB.jsonc b/src/i18n/en_GB.json
similarity index 54%
rename from src/i18n/en_GB.jsonc
rename to src/i18n/en_GB.json
index bf6030b1..4ce16049 100644
--- a/src/i18n/en_GB.jsonc
+++ b/src/i18n/en_GB.json
@@ -1,16 +1,15 @@
{
- // i18n Info
- "i18n.languageName": "English (UK)", // name of language in native language
- "i18n.languageNameEnglish": "English (UK)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "Core, inalone", // Authors, if you contribute to this file feel free to add your name seperated with a space
+ "i18n.languageName": "English (UK)",
+ "i18n.languageNameEnglish": "English (UK)",
+ "i18n.category": "main",
+ "i18n.authors": "Core, inalone, nosh118",
"date.format": "${d} ${m}, ${y}",
- // translations
"term.equalizer": "Equaliser",
- "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalisation , Equalisers and Visualisers, however on some systems this may cause stuttering in audio tracks.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalisation", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalisation, Equalisers and Visualisers - however on some systems this may cause stuttering in audio tracks.",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalisation",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalises peak volume for individual tracks to create a more uniform listening experience.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialisation", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialisation",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialise audio and make audio more 3-dimensional (note: This is not Dolby Atmos)",
- "spatial.notTurnedOn": "Audio Spatialisation is disabled. To use, please enable it first."
+ "spatial.notTurnedOn": "Audio Spatialisation is disabled. To use, please enable it first.",
+ "action.tray.minimize": "Minimise to Tray"
}
diff --git a/src/i18n/en_HODOR.jsonc b/src/i18n/en_HODOR.json
similarity index 80%
rename from src/i18n/en_HODOR.jsonc
rename to src/i18n/en_HODOR.json
index e925e968..5736ce86 100644
--- a/src/i18n/en_HODOR.jsonc
+++ b/src/i18n/en_HODOR.json
@@ -1,25 +1,15 @@
-{ // HODOR
-
- // i18n Info
- "i18n.languageName": "HODOR", // name of language in native language
- "i18n.languageNameEnglish": "HODOR", // name of language in English
- "i18n.category": "fun", // main = real language, fun = fun community languages
- "i18n.authors": "HODOR", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+{
+ "i18n.languageName": "HODOR",
+ "i18n.languageNameEnglish": "HODOR",
+ "i18n.category": "fun",
+ "i18n.authors": "HODOR",
"app.name": "HODER",
-
"date.format": "${m} ${d}, ${y}",
-
- // Dialogs
"dialog.cancel": "NO HODOR",
"dialog.ok": "YES HODOR",
-
- // Notification
"notification.updatingLibrarySongs": "UPDATING HODOR HODORS...",
"notification.updatingLibraryAlbums": "UPDATING HODOR HODORBUMS...",
"notification.updatingLibraryArtists": "UPDATING HODOR HODORTISTS...",
- // Terms
"term.appleInc": "HODOR Inc.",
"term.appleMusic": "HODOR MUSIC",
"term.applePodcasts": "HODOR PODCASTS",
@@ -91,10 +81,10 @@
"term.less": "hodor",
"term.showMore": "MORE HODOR",
"term.showLess": "LESS HODOR",
- "term.topSongs" : "TOP HODORS",
+ "term.topSongs": "TOP HODORS",
"term.latestReleases": "LATEST HODORS",
"term.time.added": "HODOR ADDED",
- "term.time.released": "HODOR RELEASED",
+ "term.time.released": "HODOR RELEASED",
"term.time.updated": "HODOR UPDATED",
"term.fullscreenView": "FULL HODOR",
"term.defaultView": "NO HODOR",
@@ -121,10 +111,8 @@
"term.time.seconds": "HODOR",
"term.time.second": "HODOR",
"term.funLanguages": "HODOR SPEAKS",
- "term.videos": "HODOR WATCHING",
+ "term.videos": "HODOR WATCHING",
"term.menu": "HODOR MENU",
-
- // Home
"home.title": "HODOR",
"home.recentlyPlayed": "RECENTLY HODOR",
"home.recentlyAdded": "NEW HODOR",
@@ -133,13 +121,10 @@
"home.madeForYou": "HODOR FOR YOU",
"home.friendsListeningTo": "FRIENDS HODOR HODOR",
"home.followedArtists": "FOLLOWED HODOR",
- // Errors
"error.appleMusicSubRequired": "HODOR MUSIC REQUIRES A HODOR.",
"error.connectionError": "CANNOT HODOR TO HODOR.",
"error.noResults": "NO HODOR.",
"error.noResults.description": "TRY NEW HODOR.",
-
- //Podcasts
"podcast.followOnCider": "FOLLOW ON HODOR",
"podcast.followedOnCider": "FOLLOWING ON HODOR",
"podcast.subscribeOnItunes": "SUBSCRIBE ON iHODOR",
@@ -148,8 +133,6 @@
"podcast.episodes": "HODORS",
"podcast.playEpisode": "PLAY HODOR",
"podcast.website": "HODORCAST PAGE",
-
- // Actions
"action.addToLibrary": "ADD HODOR",
"action.addToLibrary.success": "YES HODOR",
"action.addToLibrary.error": "NO HODOR",
@@ -190,123 +173,96 @@
"action.import": "HODOR IN",
"action.export": "HODOR OUT",
"action.showAlbum": "SHOW HODOR HODOR",
- // Waiting on Core for moving plugin to app.ts
"action.tray.minimize": "HODOR TO TRAY",
"action.tray.quit": "HODOR",
"action.tray.show": "SEE",
-
- // Settings - General (Reserved)
"settings.header.general": "HODORAL",
"settings.header.general.description": "HODOR HODORAL HODOR FOR HODOR.",
"settings.option.general.language": "HODOR SPEAKS",
-
- // Language optgroups
"settings.option.general.language.main": "REAL HODORS",
"settings.option.general.language.fun": "HODOR HODORS",
"settings.option.general.language.unsorted": "NO HODORS",
-
- // Settings - Audio
"settings.header.audio": "HODOR HEARS",
"settings.header.audio.description": "ADJUST HODOR EARS FOR HODOR HODOR.",
- "settings.option.audio.quality": "HODOR QUALITY", // Dropdown
+ "settings.option.audio.quality": "HODOR QUALITY",
"settings.header.audio.quality.high": "HODOR!!.",
"settings.header.audio.quality.low": "hodor.",
"settings.header.audio.quality.auto": "HODORMATIC",
- "settings.option.audio.seamlessTransition": "SEAMLESS HODOR", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "ADVANCED HODOR", // Toggle
+ "settings.option.audio.seamlessTransition": "SEAMLESS HODOR",
+ "settings.option.audio.enableAdvancedFunctionality": "ADVANCED HODOR",
"settings.option.audio.enableAdvancedFunctionality.description": "ENABLING HODOR FUNCTIONALITY WILL HODOR FOR EXTENDED HODOR FEATURES LIKE HODOR NORMALIZATION , HODORIZERS AND HODORS, BUT ON SOME HODOR SYSTEMS THIS HODOR CAUSE HODOR IN HODOR.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "HODOR NORMALIZATION", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "HODOR NORMALIZATION",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "NORMALIZES HODOR VOLUME FOR INDIVIDUAL HODORS TO HODOR A MORE HODOR LISTENING HODOR.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "HODOR SPATIALIZATION", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "HODOR SPATIALIZATION",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "SPATIALIZE HODOR AND MAKE HODOR MORE 3-HODOR (HODOR: THIS IS NOT HODOR ATMOS)",
- // Settings - Visual
- "settings.header.visual": "HODOR SEES",
+ "settings.header.visual": "HODOR SEES",
"settings.header.visual.description": "ADJUST HODOR EYES FOR HODOR.",
- "settings.option.visual.windowBackgroundStyle": "BACK HODOR STYLE", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "BACK HODOR STYLE",
"settings.header.visual.windowBackgroundStyle.none": "NO HODOR",
"settings.header.visual.windowBackgroundStyle.artwork": "HODORWORK",
"settings.header.visual.windowBackgroundStyle.image": "HODOR",
- "settings.option.visual.animatedArtwork": "MOVING HODORWORK", // Dropdown
+ "settings.option.visual.animatedArtwork": "MOVING HODORWORK",
"settings.header.visual.animatedArtwork.always": "YES HODOR",
"settings.header.visual.animatedArtwork.limited": "SOME HODOR",
"settings.header.visual.animatedArtwork.disable": "NO HODOR",
- "settings.option.visual.animatedArtworkQuality": "MOVING HODOR QUALITY", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "MOVING HODOR QUALITY",
"settings.header.visual.animatedArtworkQuality.low": "hodor..",
"settings.header.visual.animatedArtworkQuality.medium": "HODOR.",
"settings.header.visual.animatedArtworkQuality.high": "HODOR!",
"settings.header.visual.animatedArtworkQuality.veryHigh": "HODOR HODOR!",
"settings.header.visual.animatedArtworkQuality.extreme": "HODOOOOOOOR!!",
- "settings.option.visual.animatedWindowBackground": "ANIMATED HODOR BACK", // Toggle
- "settings.option.visual.hardwareAcceleration": "HODOR ACCELERATION", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "ANIMATED HODOR BACK",
+ "settings.option.visual.hardwareAcceleration": "HODOR ACCELERATION",
"settings.option.visual.hardwareAcceleration.description": "NEED RE HODOR",
- "settings.header.visual.hardwareAcceleration.default": "HODOR.",
- "settings.header.visual.hardwareAcceleration.webGPU": "WEB HODOR!!",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "SHOW HODOR NAME?", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "HODOR.",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WEB HODOR!!",
+ "settings.option.visual.showPersonalInfo": "SHOW HODOR NAME?",
"settings.header.lyrics": "HODOR READS",
"settings.header.lyrics.description": "ADJUST THE HODOR TEXT FOR HODOR.",
- "settings.option.lyrics.enableMusixmatch": "MUSIXMATCH HODOR", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "HO-DOR SING MODE (MUSIXMATCH HODOR)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "TRANSLATE HODOR TEXT", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "HODOR YOUTUBE HODOR TEXT FOR HODOR VIDEOS", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "MUSIXMATCH HODOR",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "HO-DOR SING MODE (MUSIXMATCH HODOR)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "TRANSLATE HODOR TEXT",
+ "settings.option.lyrics.enableYoutubeLyrics": "HODOR YOUTUBE HODOR TEXT FOR HODOR VIDEOS",
"settings.header.connectivity": "HODORTIVITY",
"settings.header.connectivity.description": "ADJUST THE HODORTIVITY FOR HODOR.",
- "settings.option.connectivity.discordRPC": "DISCORD HODOR", // Dropdown
- "settings.option.connectivity.playbackNotifications": "NOTIFICATION FOR HODOR", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "DISCORD HODOR",
+ "settings.option.connectivity.playbackNotifications": "NOTIFICATION FOR HODOR",
"settings.header.connectivity.discordRPC.cider": "SEE HODOR AS 'CIDER'",
"settings.header.connectivity.discordRPC.appleMusic": "SEE HODOR AS 'HODOR MUSIC'",
- "settings.option.connectivity.discordRPC.clearOnPause": "HODOR DISCORD ON PAUSE", // Toggle
- "settings.option.connectivity.lastfmScrobble": "HODOR.FM SCROBBLING", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "HODOR.FM HODOR DELAY (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "YES HODOR.FM NOW HODORING",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "DELETE HODORING HODORTIST FROM HODOR TITLE (HODOR.FM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "FILTER MULTI HODOEDR HODOR (HODOR.FM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "HODOR DISCORD ON PAUSE",
+ "settings.option.connectivity.lastfmScrobble": "HODOR.FM SCROBBLING",
+ "settings.option.connectivity.lastfmScrobble.delay": "HODOR.FM HODOR DELAY (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "YES HODOR.FM NOW HODORING",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "DELETE HODORING HODORTIST FROM HODOR TITLE (HODOR.FM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "FILTER MULTI HODOEDR HODOR (HODOR.FM)",
"settings.header.experimental": "EXPERIMENTAL HODOR",
"settings.header.experimental.description": "ADJUST THE EXPERIMENTAL HODOR FOR HODOR.",
- "settings.option.experimental.compactUI": "smol hodor", // Toggle
+ "settings.option.experimental.compactUI": "smol hodor",
"settings.option.experimental.closeButtonBehaviour": "CLOSE HODOR BUTTON",
"settings.option.experimental.closeButtonBehaviour.quit": "END HODOR",
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "MINIMIZE HODOR TO HODORBAR",
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "MINIMIZE HODOR TO HODORAY",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
"spatial.notTurnedOn": "HODOR SPATIALIZATION IS HODOR. TO HODOR, PLEASE HODOR IT HODOR.",
- "spatial.spatialProperties" : "SPATIAL HODOR",
- "spatial.width" : "HODOR WIDTH",
- "spatial.height" : "HODOR HEIGHT",
- "spatial.depth" : "HODOR DEPTH",
- "spatial.gain" : "HODOR POWER",
- "spatial.roomMaterials" : "ROOM HODORS",
- "spatial.roomDimensions" : "ROOM HODOR SIZE",
- "spatial.roomPositions" : "ROOM HODOR POSITION",
- "spatial.setDimensions" : "HODOR SIZE",
- "spatial.setPositions" : "SET HODOR POSITION",
- "spatial.up" : "UP HODOR",
- "spatial.front" : "FRONT HODOR",
- "spatial.left" : "LEFT HODOR",
- "spatial.right" : "RIGHT HODOR",
- "spatial.back" : "BACK HODOR",
- "spatial.down" : "DOWN HODOR",
- "spatial.listener" : "HODOR EARS",
- "spatial.audioSource" : "HODOR PLAYS",
-
- // Settings - Unfinished
+ "spatial.spatialProperties": "SPATIAL HODOR",
+ "spatial.width": "HODOR WIDTH",
+ "spatial.height": "HODOR HEIGHT",
+ "spatial.depth": "HODOR DEPTH",
+ "spatial.gain": "HODOR POWER",
+ "spatial.roomMaterials": "ROOM HODORS",
+ "spatial.roomDimensions": "ROOM HODOR SIZE",
+ "spatial.roomPositions": "ROOM HODOR POSITION",
+ "spatial.setDimensions": "HODOR SIZE",
+ "spatial.setPositions": "SET HODOR POSITION",
+ "spatial.up": "UP HODOR",
+ "spatial.front": "FRONT HODOR",
+ "spatial.left": "LEFT HODOR",
+ "spatial.right": "RIGHT HODOR",
+ "spatial.back": "BACK HODOR",
+ "spatial.down": "DOWN HODOR",
+ "spatial.listener": "HODOR EARS",
+ "spatial.audioSource": "HODOR PLAYS",
"settings.header.unfinished": "NOT HODOR YET",
-
- // Web Remote
"remote.web.title": "HODOR REMOTE",
"remote.web.description": "HODOR THE HODOR TO HODOR YOUR HODOR UP WITH THIS HODOR INSTANCE",
-
- //About
"about.thanks": "HODOR THANKS TO THE HODOR TEAM AND ALL OF OUR HODORS."
-
}
\ No newline at end of file
diff --git a/src/i18n/en_OWO.json b/src/i18n/en_OWO.json
new file mode 100644
index 00000000..303d1c58
--- /dev/null
+++ b/src/i18n/en_OWO.json
@@ -0,0 +1,380 @@
+{
+ "i18n.languageName": "Engwish (OwO)",
+ "i18n.languageNameEnglish": "Engwish (OwO)",
+ "i18n.category": "fun",
+ "i18n.authors": "@deerwithacurl @gamingliamstudios",
+ "app.name": "Cidew",
+ "date.format": "${m} ${d}, ${y}",
+ "dialog.cancel": "Cancew",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Updating wibwawy songs...",
+ "notification.updatingLibraryAlbums": "Updating wibwawy awbums...",
+ "notification.updatingLibraryArtists": "Updating wibwawy awtists...",
+ "term.appleInc": "Appwe Inc.",
+ "term.appleMusic": "Appwe Music",
+ "term.applePodcasts": "Appwe Podcasts",
+ "term.itunes": "iTunyes",
+ "term.github": "GitHub",
+ "term.discord": "Discowd",
+ "term.learnMore": "Weawn mowe",
+ "term.accountSettings": "Account Settings",
+ "term.logout": "Wogout",
+ "term.login": "Wog In",
+ "term.about": "About",
+ "term.privateSession": "Pwivate Session",
+ "term.queue": "Queue",
+ "term.history": "Histowy",
+ "term.search": "Seawch",
+ "term.library": "Wibwawy",
+ "term.listenNow": "Wisten Nyow",
+ "term.browse": "Bwowse",
+ "term.radio": "Wadio",
+ "term.recentlyAdded": "Wecentwy Added",
+ "term.songs": "Songs",
+ "term.albums": "Awbums",
+ "term.artists": "Awtists",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Pwaywists",
+ "term.playlist": "Pwaywist",
+ "term.newPlaylist": "Nyew Pwaywist",
+ "term.newPlaylistFolder": "Nyew Pwaywist Fowdew",
+ "term.createNewPlaylist": "Cweate Nyew Pwaywist",
+ "term.createNewPlaylistFolder": "Cweate Nyew Pwaywist Fowdew",
+ "term.deletePlaylist": "Awe you suwe you want to dewete this pwaywist?",
+ "term.play": "Pway",
+ "term.pause": "Pause",
+ "term.previous": "Pwevious",
+ "term.next": "Nyext",
+ "term.shuffle": "Shuffwe",
+ "term.repeat": "Wepeat",
+ "term.volume": "Vowume",
+ "term.mute": "Mute",
+ "term.unmute": "Unmute",
+ "term.share": "Shawe",
+ "term.share.success": "Copied to cwipboawd",
+ "term.settings": "Settings",
+ "term.seeAll": "See Aww",
+ "term.sortBy": "Sowt By",
+ "term.sortBy.album": "Awbum",
+ "term.sortBy.artist": "Awtist",
+ "term.sortBy.name": "Nyame",
+ "term.sortBy.genre": "Genwe",
+ "term.sortBy.releaseDate": "Wewease Date",
+ "term.sortBy.duration": "Duwation",
+ "term.sortBy.dateAdded": "Date Added",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascending",
+ "term.sortOrder.descending": "Descending",
+ "term.viewAs": "View As",
+ "term.viewAs.coverArt": "Cuvw Awt",
+ "term.viewAs.list": "Wist",
+ "term.size": "Size",
+ "term.size.normal": "Nyowmaw",
+ "term.size.compact": "Compact",
+ "term.enable": "Enyabwe",
+ "term.disable": "Disabwe",
+ "term.enabled": "Enyabwed",
+ "term.disabled": "Disabwed",
+ "term.connect": "Connyect",
+ "term.connecting": "Connyecting",
+ "term.disconnect": "Disconnyect",
+ "term.authed": "Authed",
+ "term.confirm": "Confiwm?",
+ "term.more": "Mowe",
+ "term.less": "Wess",
+ "term.showMore": "Show mowe",
+ "term.showLess": "Show wess",
+ "term.topSongs": "Top Songs",
+ "term.latestReleases": "Watest Weweases",
+ "term.time.added": "Added",
+ "term.time.released": "Weweased",
+ "term.time.updated": "Updated",
+ "term.time.days": "days",
+ "term.time.day": "day",
+ "term.time.hours": "houws",
+ "term.time.hour": "houw",
+ "term.time.minutes": "minyutes",
+ "term.time.minute": "minyute",
+ "term.time.seconds": "seconds",
+ "term.time.second": "second",
+ "term.fullscreenView": "Fuwwscween View",
+ "term.defaultView": "Defauwt View",
+ "term.audioSettings": "Audio Settings",
+ "term.audioControls": "Vowume Contwows",
+ "term.clearAll": "Cweaw Aww",
+ "term.recentStations": "Wecent Stations",
+ "term.language": "Wanguage",
+ "term.funLanguages": "Fun",
+ "term.noLyrics": "Woading... / Wywics nyot found./ Instwumentaw.",
+ "term.copyright": "Copywight",
+ "term.rightsReserved": "Aww Wights Wesewved.",
+ "term.sponsor": "Sponsow this pwoject",
+ "term.ciderTeam": "Cidew Team",
+ "term.developer": "Devewopew",
+ "term.socialTeam": "Sociaw Team",
+ "term.socials": "Sociaws",
+ "term.contributors": "Contwibutows",
+ "term.equalizer": "Equawizew",
+ "term.reset": "Weset",
+ "term.tracks": "twacks",
+ "term.track": {
+ "one": "track",
+ "other": "tracks"
+ },
+ "term.videos": "Videos",
+ "term.menu": "Menyu",
+ "term.check": "Check",
+ "term.aboutArtist": "About {{artistName}}",
+ "term.topResult": "Top Wesuwt",
+ "term.sharedPlaylists": "Shawed Pwaywists",
+ "term.people": "Peopwe",
+ "term.newpreset.name": "Nyew EQ Pweset Nyame",
+ "term.addedpreset": "Added Pweset",
+ "term.deletepreset.warn": "Awe you suwe you want to dewete this pweset?",
+ "term.deletedpreset": "Wemuvd pweset",
+ "term.defaultPresets": "Defauwt Pwesets",
+ "term.userPresets": "Usew Pwesets",
+ "term.requestError": "Thewe was a pwobwem with the wequest.",
+ "term.song.link.generate": "Getting song.wink shawe UWW...",
+ "term.musicVideos": "Music Videos",
+ "term.stations": "Stations",
+ "term.curators": "Cuwatows",
+ "term.appleCurators": "Appwe Cuwatows",
+ "term.radioShows": "Wadio Shows",
+ "term.recordLabels": "Wecowd Wabews",
+ "term.videoExtras": "Video Extwas",
+ "term.top": "Top",
+ "term.version": "Vewsion",
+ "term.noVideos": "Nyo videos found.",
+ "term.plugin": "Pwug-in",
+ "term.pluginMenu": "Pwug-in Menyu",
+ "term.replay": "Wepway",
+ "term.uniqueAlbums": "Unyique Awbums",
+ "term.uniqueArtists": "Unyique Awtists",
+ "term.uniqueSongs": "Unyique Songs",
+ "term.topArtists": "Top Awtists",
+ "term.listenedTo": "Wistenyed to:",
+ "term.times": "times",
+ "term.topAlbums": "Top Awbums",
+ "term.plays": "Pways",
+ "term.topGenres": "Top Genwes",
+ "term.confirmLogout": "Awe you suwe you want to wogout?",
+ "home.title": "Home",
+ "home.recentlyPlayed": "Wecentwy Pwayed",
+ "home.recentlyAdded": "Wecentwy Added",
+ "home.artistsFeed": "Youw Awtists Feed",
+ "home.artistsFeed.noArtist": "Fowwow some awtists to see theiw watest weweases",
+ "home.madeForYou": "Made Fow You",
+ "home.friendsListeningTo": "Fwiends Wistenying To",
+ "home.followedArtists": "Fowwowed Awtists",
+ "error.appleMusicSubRequired": "Appwe Music wequiwes a subscwiption.",
+ "error.connectionError": "Thewe was a pwobwem connyecting to Appwe Music.",
+ "error.noResults": "Nyo Wesuwts.",
+ "error.noResults.description": "Twy a nyew seawch.",
+ "podcast.followOnCider": "Fowwow On Cidew",
+ "podcast.followedOnCider": "Fowwowing On Cidew",
+ "podcast.subscribeOnItunes": "Subscwibe On iTunyes",
+ "podcast.subscribedOnItunes": "Subscwibed On iTunyes",
+ "podcast.itunesStore": "iTunyes Stowe",
+ "podcast.episodes": "Episodes",
+ "podcast.playEpisode": "Pway Episode",
+ "podcast.website": "Podcast Website",
+ "action.addToLibrary": "Add to Wibwawy",
+ "action.addToLibrary.success": "Added to Wibwawy",
+ "action.addToLibrary.error": "Ewwow Adding to Wibwawy",
+ "action.removeFromLibrary": "Wemuv fwom Wibwawy",
+ "action.removeFromLibrary.success": "Wemuvd fwom Wibwawy",
+ "action.addToQueue": "Add to Queue",
+ "action.addToQueue.success": "Added to Queue",
+ "action.addToQueue.error": "Ewwow Adding to Queue",
+ "action.removeFromQueue": "Wemuv fwom Queue",
+ "action.removeFromQueue.success": "Wemuvd fwom Queue",
+ "action.removeFromQueue.error": "Ewwow Wemoving fwom Queue",
+ "action.createPlaylist": "Cweate a Nyew Pwaywist",
+ "action.addToPlaylist": "Add to Pwaywist",
+ "action.removeFromPlaylist": "Wemuv fwom Pwaywist",
+ "action.addToFavorites": "Add to Favowites",
+ "action.follow": "Fowwow",
+ "action.follow.success": "Fowwowed",
+ "action.follow.error": "Ewwow Fowwowing",
+ "action.unfollow": "Unfowwow",
+ "action.unfollow.success": "Unfowwowed",
+ "action.unfollow.error": "Ewwow Unfowwowing",
+ "action.playNext": "Pway Nyext",
+ "action.playLater": "Pway Watew",
+ "action.startRadio": "Stawt Wadio",
+ "action.goToArtist": "Go to Awtist",
+ "action.goToAlbum": "Go to Awbum",
+ "action.moveToTop": "Muv out of Fowdew",
+ "action.share": "Shawe",
+ "action.rename": "Wenyame",
+ "action.love": "Wuv",
+ "action.unlove": "Unwuv",
+ "action.dislike": "Diswike",
+ "action.undoDislike": "Undo diswike",
+ "action.showWebRemoteQR": "Web Wemote",
+ "action.playTracksNext": "Pway ${app.selectedMediaItems.length} twacks nyext",
+ "action.playTracksLater": "Pway ${app.selectedMediaItems.length} twacks watew",
+ "action.removeTracks": "Wemuv ${self.selectedItems.length} twacks fwom queue",
+ "action.import": "Impowt",
+ "action.export": "Expowt",
+ "action.showAlbum": "Show Compwete Awbum",
+ "action.tray.minimize": "Minyimize to Tway",
+ "action.tray.quit": "Quit",
+ "action.tray.show": "Show",
+ "action.update": "Update",
+ "action.install": "Instaww",
+ "action.copy": "Copy",
+ "action.newpreset": "Nyew Pweset...",
+ "action.deletepreset": "Dewete Pweset",
+ "action.open": "Open",
+ "settings.header.general": "Genyewaw",
+ "settings.header.general.description": "Adjust the genyewaw settings fow Cidew.",
+ "settings.option.general.language": "Wanguage",
+ "settings.option.general.resumebehavior": "Wesume behaviow",
+ "settings.option.general.resumebehavior.description": "Wesume behaviow affects how Cidew wiww wesume youw session when you wetuwn to the app.",
+ "settings.option.general.resumebehavior.locally": "Wocawwy",
+ "settings.option.general.resumebehavior.locally.description": "Cidew wiww wesume youw wast session on this machinye.",
+ "settings.option.general.resumebehavior.history": "Histowy",
+ "settings.option.general.resumebehavior.history.description": "Cidew wiww queue the wast song fwom youw uvwaww Appwe Music histowy, acwoss devices.",
+ "settings.option.general.language.main": "Wanguages",
+ "settings.option.general.language.fun": "Fun Wanguages",
+ "settings.option.general.language.unsorted": "Unsowted",
+ "settings.option.general.updateCider": "Update Cidew",
+ "settings.option.general.updateCider.branch": "Cidew Update Bwanch",
+ "settings.option.general.updateCider.branch.description": "Sewect the bwanch to update Cidew to",
+ "settings.option.general.updateCider.branch.main": "Stabwe",
+ "settings.option.general.updateCider.branch.develop": "Devewopment",
+ "settings.notyf.updateCider.update-not-available": "Nyo update avaiwabwe",
+ "settings.notyf.updateCider.update-downloaded": "Update has been downwoaded, westawt to appwy",
+ "settings.notyf.updateCider.update-error": "Ewwow updating Cidew",
+ "settings.notyf.updateCider.update-timeout": "Update timed out",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "Adjust the audio settings fow Cidew.",
+ "settings.option.audio.volumeStep": "Vowume Step",
+ "settings.option.audio.maxVolume": "Max Vowume",
+ "settings.option.audio.quality": "Audio Quawity",
+ "settings.header.audio.quality.hireslossless": "Hi-Wes Wosswess",
+ "settings.header.audio.quality.hireslossless.description": "up to 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Wosswess",
+ "settings.header.audio.quality.lossless.description": "up to 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "High",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standawd",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "Seamwess Audio Twansition",
+ "settings.option.audio.enableAdvancedFunctionality": "Enyabwe Advanced Functionyawity",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Enyabwing AudioContext functionyawity wiww awwow fow extended audio featuwes wike Audio Nyowmawization, Equawizews and Visuawizews - howevew on some systems this may cause stuttewing in audio twacks.",
+ "settings.option.audio.audioLab": "Cidew Audio Wab",
+ "settings.option.audio.audioLab.description": "An assowtment of in-house devewoped audio effects fow Cidew.",
+ "settings.warn.audioLab.withoutAF": "AudioContext (Advanced Functionyawity) is wequiwed to enyabwe Cidew Audio Wabowatowy.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Anyawog Wawmth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simuwates the anyawog wawmth modewwed aftew the Kowg Nyutube 6P1",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Anyawog Wawmth intensity",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Changes the intensity of the Anyawog Wawmth Moduwe pwocessing.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Smooth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Wawm",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cidew Adwenyawinye Pwocessow\u2122\ufe0f",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes evewything sound both wichew and mowe wivewy | Designyed by Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is nyot compatibwe with Spatiawization. Pwease disabwe Spatiawization to continyue.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Stwength",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the stwength of the pwocessing donye to the audio. (Aggwessive may yiewd undesiwabwe wesuwts)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standawd",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggwessive",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Nyowmawization",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Nyowmawizes peak vowume fow individuaw twacks to cweate a mowe unyifowm wistenying expewience.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatiawization",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatiawize audio and make audio mowe 3-dimensionyaw (nyote: This is nyot Dowby Atmos)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cidew Tunyed Spatiawization",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pwe-tunyed Spatiawizing Effect, disabwes the customizabwe settings of Audio Spatiawization. Spatiawization must be enyabwed as a pwewequisite.",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cidew Spatiawization Pwofiwe",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tunying Pwofiwe of the Spatiawization. (Wequiwes App Westawt)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standawd",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophiwe",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatiawization is nyot compatibwe with CAP. Pwease disabwe CAP to continyue.",
+ "settings.header.visual": "Visuaw",
+ "settings.header.visual.description": "Adjust the visuaw settings fow Cidew.",
+ "settings.option.visual.windowBackgroundStyle": "Window Backgwound Stywe",
+ "settings.header.visual.windowBackgroundStyle.none": "Nyonye",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Awtwowk",
+ "settings.header.visual.windowBackgroundStyle.image": "Image",
+ "settings.option.visual.animatedArtwork": "Anyimated Awtwowk",
+ "settings.header.visual.animatedArtwork.always": "Awways",
+ "settings.header.visual.animatedArtwork.limited": "Wimited to pages and speciaw entwies",
+ "settings.header.visual.animatedArtwork.disable": "Disabwe evewywhewe",
+ "settings.option.visual.animatedArtworkQuality": "Anyimated Awtwowk Quawity",
+ "settings.header.visual.animatedArtworkQuality.low": "Wow",
+ "settings.header.visual.animatedArtworkQuality.medium": "Medium",
+ "settings.header.visual.animatedArtworkQuality.high": "High",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Vewy High",
+ "settings.header.visual.animatedArtworkQuality.extreme": "Extweme",
+ "settings.option.visual.animatedWindowBackground": "Anyimated Window Backgwound",
+ "settings.option.visual.hardwareAcceleration": "Hawdwawe Accewewation",
+ "settings.option.visual.hardwareAcceleration.description": "Wequiwes wewaunch",
+ "settings.header.visual.hardwareAcceleration.default": "Defauwt",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Theme",
+ "settings.option.visual.theme.github.download": "Instaww fwom GitHub UWW",
+ "settings.option.visual.theme.github.explore": "Expwowe GitHub Themes",
+ "settings.header.visual.theme.github.page": "Themes fwom GitHub",
+ "settings.option.visual.theme.github.install.confirm": "Awe you suwe you want to instaww {{ repo }}?",
+ "settings.prompt.visual.theme.github.URL": "Entew the UWW of the theme you want to instaww",
+ "settings.notyf.visual.theme.install.success": "Theme instawwed successfuwwy",
+ "settings.notyf.visual.theme.install.error": "Theme instawwation faiwed",
+ "settings.option.visual.theme.default": "Cidew",
+ "settings.option.visual.theme.dark": "Dawk",
+ "settings.option.visual.showPersonalInfo": "Show Pewsonyaw Info",
+ "settings.header.lyrics": "Wywics",
+ "settings.header.lyrics.description": "Adjust the wywics settings fow Cidew.",
+ "settings.option.lyrics.enableMusixmatch": "Enyabwe Musixmatch Wywics",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Enyabwe Kawaoke Mode (Musixmatch onwy)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Twanswation Pwefewwed Wanguage",
+ "settings.option.lyrics.enableYoutubeLyrics": "Enyabwe Youtube Wywics fow Music Videos",
+ "settings.header.connectivity": "Connyectivity",
+ "settings.header.connectivity.description": "Adjust the connyectivity settings fow Cidew.",
+ "settings.option.connectivity.discordRPC": "Discowd Wich Pwesence",
+ "settings.option.connectivity.playbackNotifications": "Pwayback Nyotifications",
+ "settings.header.connectivity.discordRPC.cider": "Dispway as 'Cidew'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Dispway as 'Appwe Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Cweaw Discowd Wich Pwesence on Pause",
+ "settings.option.connectivity.lastfmScrobble": "Wast.fm Scwobbwing",
+ "settings.option.connectivity.lastfmScrobble.delay": "Wast.fm Scwobbwe Deway (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enyabwe Wast.fm Nyow Pwaying",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Wemuv featuwing awtists fwom song titwe (Wast.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Fiwtew wooped twack (Wast.fm)",
+ "settings.header.debug": "Debug",
+ "settings.option.debug.copy_log": "Copy wogs to cwipboawd",
+ "settings.option.debug.openAppData": "Open Cidew Fowdew",
+ "settings.header.experimental": "Expewimentaw",
+ "settings.header.experimental.description": "Adjust the expewimentaw settings fow Cidew.",
+ "settings.option.experimental.unknownPlugin": "Unknyown Souwces",
+ "settings.option.experimental.unknownPlugin.description": "Awwow instawwation of pwugins fwom wepos othew than the Cidew Pwugin Wepositowy",
+ "settings.option.experimental.compactUI": "Compact UI",
+ "settings.option.experimental.close_button_hide": "Cwose Button Shouwd Hide the Appwication",
+ "settings.option.experimental.inline_playlists": "Inwinye Pwaywists and Awbums",
+ "settings.option.advanced.playlistTrackMapping": "Pwaywist Twack Mapping",
+ "settings.option.advanced.playlistTrackMapping.description": "Enyabwes deep scannying of pwaywists to detewminye which twacks awe in which pwaywists.",
+ "spatial.notTurnedOn": "Audio Spatiawization is disabwed. To use, pwease enyabwe it fiwst.",
+ "spatial.spatialProperties": "Spatiaw Pwopewties",
+ "spatial.width": "Width",
+ "spatial.height": "Height",
+ "spatial.depth": "Depth",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "Woom Matewiaws",
+ "spatial.roomDimensions": "Woom Dimensions",
+ "spatial.roomPositions": "Woom Positions",
+ "spatial.setDimensions": "Set Dimensions",
+ "spatial.setPositions": "Set Positions",
+ "spatial.up": "Up",
+ "spatial.front": "Fwont",
+ "spatial.left": "Weft",
+ "spatial.right": "Wight",
+ "spatial.back": "Back",
+ "spatial.down": "Down",
+ "spatial.listener": "Wistenyew",
+ "spatial.audioSource": "Audio Souwce",
+ "settings.header.unfinished": "Unfinyished",
+ "remote.web.title": "Cidew Wemote",
+ "remote.web.description": "Scan the QW code to paiw youw phonye up with this Cidew instance",
+ "about.thanks": "Majow thanks to the Cidew Cowwective Team and aww of ouw contwibutows."
+}
\ No newline at end of file
diff --git a/src/i18n/en_PISS.jsonc b/src/i18n/en_PISS.json
similarity index 69%
rename from src/i18n/en_PISS.jsonc
rename to src/i18n/en_PISS.json
index ddd831a0..7f061d86 100644
--- a/src/i18n/en_PISS.jsonc
+++ b/src/i18n/en_PISS.json
@@ -1,25 +1,15 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "piss", // name of language in native language
- "i18n.languageNameEnglish": "English (piss)", // name of language in English
- "i18n.category": "fun", // main = real language, fun = fun community languages
- "i18n.authors": "@SoNothingMC", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+{
+ "i18n.languageName": "piss",
+ "i18n.languageNameEnglish": "English (piss)",
+ "i18n.category": "fun",
+ "i18n.authors": "@SoNothingMC @saboooor",
"app.name": "piss",
-
- "date.format": "${y}-${m}-${d}", // ISO 8601 for the win!
-
- // Dialogs
+ "date.format": "${y}-${m}-${d}",
"dialog.cancel": "no piss",
"dialog.ok": "yes piss",
-
- // Notification
"notification.updatingLibrarySongs": "pisssing all over your songs",
"notification.updatingLibraryAlbums": "pissing all over your albums",
"notification.updatingLibraryArtists": "pissing all over your idols",
- // Terms
"term.appleInc": "piss Inc.",
"term.appleMusic": "piss music",
"term.applePodcasts": "piss podcasts",
@@ -32,14 +22,15 @@
"term.login": "piss in",
"term.about": "piss info",
"term.privateSession": "piss in private",
- "term.queue": "to be pissed",
+ "term.queue": "the toilet",
+ "term.history": "the sewage",
"term.search": "find piss",
"term.library": "obtained piss",
"term.listenNow": "piss now",
"term.browse": "find piss",
"term.radio": "piss everywhere",
"term.recentlyAdded": "recently obtained piss",
- "term.songs": "piss list", // not to be confused with pisslist (playlist)
+ "term.songs": "piss list",
"term.albums": "piss collection",
"term.artists": "pissers",
"term.podcasts": "pisscasts",
@@ -60,6 +51,7 @@
"term.mute": "piss without sound",
"term.unmute": "piss with sound",
"term.share": "piss on your friends",
+ "term.share.success": "copied piss, go piss on your friends",
"term.settings": "pissettings",
"term.seeAll": "all of the piss",
"term.sortBy": "piss by",
@@ -67,14 +59,15 @@
"term.sortBy.artist": "pissers",
"term.sortBy.name": "piss name",
"term.sortBy.genre": "way to piss",
- "term.sortBy.releaseDate": "pissed date",
+ "term.sortBy.releaseDate": "repissed date",
"term.sortBy.duration": "piss duration",
+ "term.sortBy.dateAdded": "obtained date",
"term.sortOrder": "piss-PISS",
"term.sortOrder.ascending": "pissing upwards",
"term.sortOrder.descending": "pissing downwards",
"term.viewAs": "piss as",
"term.viewAs.coverArt": "piss art",
- "term.viewAs.list": "piss list", // not to be confused with pisslist (playlist)
+ "term.viewAs.list": "piss list",
"term.size": "piss size",
"term.size.normal": "normal piss",
"term.size.compact": "compact piss",
@@ -91,11 +84,11 @@
"term.less": "piss less",
"term.showMore": "more piss",
"term.showLess": "less piss",
- "term.topSongs" : "top piss",
- "term.latestReleases": "latest piss collection",
- "term.time.added": "pissed",
- "term.time.released": "pissed",
- "term.time.updated": "pissed",
+ "term.topSongs": "top piss",
+ "term.latestReleases": "latest piss",
+ "term.time.added": "obtained",
+ "term.time.released": "repissed",
+ "term.time.updated": "pissdated",
"term.time.hours": "hours",
"term.time.hour": "hour",
"term.time.minutes": "minutes",
@@ -120,12 +113,34 @@
"term.contributors": "more pisseneers",
"term.equalizer": "advanced piss configuration",
"term.reset": "repiss",
- "term.tracks": "pisses", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "piss videos đŗ",
+ "term.track": {
+ "one": "piss",
+ "other": "pisses"
+ },
+ "term.videos": "piss videos",
"term.menu": "piss menu",
"term.check": "piss!",
-
- // Home
+ "term.aboutArtist": "about pisser {{artistName}}",
+ "term.topResult": "top piss",
+ "term.sharedPlaylists": "shared pisslists",
+ "term.people": "pissers",
+ "term.newpreset.name": "new advanced piss prepiss name",
+ "term.addedpreset": "obtained prepiss",
+ "term.deletepreset.warn": "are you sure you want to obliterate this prepiss?",
+ "term.deletedpreset": "obliterated prepiss",
+ "term.defaultPresets": "default prepisses",
+ "term.userPresets": "your prepisses",
+ "term.requestError": "the request got pissed on",
+ "term.song.link.generate": "pissing on piss.linkâĻ",
+ "term.musicVideos": "piss videos",
+ "term.stations": "piss stations",
+ "term.curators": "pissators",
+ "term.appleCurators": "piss pissators",
+ "term.radioShows": "shows that piss everywhere",
+ "term.recordLabels": "piss labels",
+ "term.videoExtras": "extra piss videos",
+ "term.top": "topiss",
+ "term.version": "pission",
"home.title": "piss central",
"home.recentlyPlayed": "recently pissed on",
"home.recentlyAdded": "recently obtained piss",
@@ -134,13 +149,10 @@
"home.madeForYou": "pissed for you",
"home.friendsListeningTo": "friends pissing to",
"home.followedArtists": "followed pissers",
- // Errors
"error.appleMusicSubRequired": "piss music requires, like y'know, an actual piss music subscription to actually use.",
"error.connectionError": "oh, piss.",
"error.noResults": "no piss found",
"error.noResults.description": "try pissing somewhere else (or press Enter/Return to search)",
-
- //Podcasts
"podcast.followOnCider": "piss on Cider",
"podcast.followedOnCider": "pissed on Cider",
"podcast.subscribeOnItunes": "piss on iPiss",
@@ -149,8 +161,6 @@
"podcast.episodes": "pisses",
"podcast.playEpisode": "play piss",
"podcast.website": "pisscast site",
-
- // Actions
"action.addToLibrary": "obtain piss",
"action.addToLibrary.success": "piss obtained",
"action.addToLibrary.error": "error obtaining piss",
@@ -191,95 +201,103 @@
"action.import": "impiss",
"action.export": "expiss",
"action.showAlbum": "show complete piss collection",
- // Waiting on Core for moving plugin to app.ts
"action.tray.minimize": "piss off to tray",
"action.tray.quit": "piss off",
"action.tray.show": "piss back",
-
- // Settings - General
+ "action.update": "piss!",
+ "action.copy": "copiss",
+ "action.newpreset": "new prepissâĻ",
+ "action.deletepreset": "obliterate prepiss",
"settings.header.general": "general",
"settings.header.general.description": "the dumping place for settings when there are no other places to put them into",
- "settings.option.general.language": "piss around the world",
-
- // Language optgroups
+ "settings.option.general.language": "piss around the world",
"settings.option.general.language.main": "actaul human languages",
"settings.option.general.language.fun": "piss languages",
"settings.option.general.language.unsorted": "???? who put this here",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "piss on cider",
+ "settings.option.general.updateCider.branch": "where to piss on cider",
+ "settings.option.general.updateCider.branch.description": "there are two toilets, where do you want to piss?",
+ "settings.option.general.updateCider.branch.main": "smooth pissing experience",
+ "settings.option.general.updateCider.branch.develop": "cutting-edge piss development",
"settings.header.audio": "piss sounds",
"settings.header.audio.description": "change how your piss sounds",
- "settings.option.audio.quality": "piss quality", // Dropdown
+ "settings.option.audio.quality": "piss quality",
+ "settings.header.audio.quality.hireslossless": "ungodly piss",
+ "settings.header.audio.quality.hireslossless.description": "up to 24-piss/192 pissHz",
+ "settings.header.audio.quality.lossless": "colorful piss",
+ "settings.header.audio.quality.lossless.description": "up to 24-piss/48 pissHz",
+ "settings.header.audio.quality.enhanced": "business class piss",
"settings.header.audio.quality.high": "nice piss",
- "settings.header.audio.quality.low": "piss with blood",
- "settings.header.audio.quality.auto": "automatic piss",
- "settings.option.audio.seamlessTransition": "seamless piss-to-piss transition", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "cool piss tricks", // Toggle
+ "settings.header.audio.quality.high.description": "256 kpiss",
+ "settings.header.audio.quality.standard": "piss with blood",
+ "settings.header.audio.quality.standard.description": "64 kpiss",
+ "settings.option.audio.seamlessTransition": "seamless piss-to-piss transition",
+ "settings.option.audio.enableAdvancedFunctionality": "cool piss tricks",
"settings.option.audio.enableAdvancedFunctionality.description": "enabling the AudioContext thingy allows you to do cool stuffs, however on some systems your song may stutter",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "piss normaliztion", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Audio Pissifierâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "makes your bladder go overboard and makes your piss crisp and clear",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "pissifier dont go well with 3d piss. turn it off and try again.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "pissifier strength",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "tune your bladder (blood may appear with turbo strength)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "normal piss",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "turbo piss",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "piss normaliztion",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "protect your eardrums from overly loud/slient pisses",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "3D piss", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "3D piss",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "this aint the dolby atmos you are looking for but its still pretty crazy so check it out",
- // Settings - Visual
- "settings.header.visual": "piss appearance",
+ "settings.header.visual": "piss appearance",
"settings.header.visual.description": "change how your piss looks",
- "settings.option.visual.windowBackgroundStyle": "background piss", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "background piss",
"settings.header.visual.windowBackgroundStyle.none": "no piss",
"settings.header.visual.windowBackgroundStyle.artwork": "piss art",
"settings.header.visual.windowBackgroundStyle.image": "piss image",
- "settings.option.visual.animatedArtwork": "moving piss art", // Dropdown
+ "settings.option.visual.animatedArtwork": "moving piss art",
"settings.header.visual.animatedArtwork.always": "yes piss",
"settings.header.visual.animatedArtwork.limited": "only piss pages and special pisses",
"settings.header.visual.animatedArtwork.disable": "no piss",
- "settings.option.visual.animatedArtworkQuality": "moving piss art quality", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "moving piss art quality",
"settings.header.visual.animatedArtworkQuality.low": "piss with blood",
"settings.header.visual.animatedArtworkQuality.medium": "okay piss",
"settings.header.visual.animatedArtworkQuality.high": "nice piss",
"settings.header.visual.animatedArtworkQuality.veryHigh": "good piss",
"settings.header.visual.animatedArtworkQuality.extreme": "literally 4k piss",
- "settings.option.visual.animatedWindowBackground": "moving background piss", // Toggle
- "settings.option.visual.hardwareAcceleration": "make Cider piss faster", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "moving background piss",
+ "settings.option.visual.hardwareAcceleration": "make Cider piss faster",
"settings.option.visual.hardwareAcceleration.description": "you need to relaunch Cider",
- "settings.header.visual.hardwareAcceleration.default": "default piss",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebPISS",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "show yourself to the pissiverse", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "default piss",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebPISS",
+ "settings.header.visual.theme": "colored piss",
+ "settings.option.visual.theme.github.download": "piss from PissHub URL",
+ "settings.prompt.visual.theme.github.URL": "piss on the URL for your colorful piss",
+ "settings.notyf.visual.theme.install.success": "colored piss obtained",
+ "settings.notyf.visual.theme.install.error": "colored piss got pissed onâĻ",
+ "settings.option.visual.theme.default": "same old piss",
+ "settings.option.visual.theme.dark": "black piss",
+ "settings.option.visual.showPersonalInfo": "show yourself to the pissiverse",
"settings.header.lyrics": "piss lyrics",
"settings.header.lyrics.description": "change how your piss speaks to you",
- "settings.option.lyrics.enableMusixmatch": "Musixpiss piss lyrics", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "pissraoke mode (Musixpiss only)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "language for Musixpiss translations", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "PissTube subtitles for piss videos", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "Musixpiss piss lyrics",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "pissraoke mode (Musixpiss only)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "language for Musixpiss translations",
+ "settings.option.lyrics.enableYoutubeLyrics": "PissTube subtitles for piss videos",
"settings.header.connectivity": "pisser-to-pisser connections",
"settings.header.connectivity.description": "change how Cider piss on other people, including you",
- "settings.option.connectivity.discordRPC": "Pisscord rich pissence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "toilet notifications", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Pisscord rich pissence",
+ "settings.option.connectivity.playbackNotifications": "toilet notifications",
"settings.header.connectivity.discordRPC.cider": "piss as 'Cider'",
"settings.header.connectivity.discordRPC.appleMusic": "piss as 'piss music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "flush Pisscord rich pissence when holding your piss", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Piss.fm scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "Piss.fm scrobble delay (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "push now playing data to Piss.fm",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "remove featured pissers from piss names (Piss.fm)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "filter same piss (Piss.fm)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "flush Pisscord rich pissence when holding your piss",
+ "settings.option.connectivity.lastfmScrobble": "Piss.fm scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Piss.fm scrobble delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "push now playing data to Piss.fm",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "dump featured pissers from piss names (Piss.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "filter same piss (Piss.fm)",
"settings.header.experimental": "piss lab",
"settings.header.experimental.description": "mitochondria is the powerhouse of the cell",
- "settings.option.experimental.compactUI": "compact piss", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "piss off button behaviour",
- "settings.option.experimental.closeButtonBehaviour.quit": "ask cider to piss off",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "piss off to the taskbar",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "piss off to the tray",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
+ "settings.option.experimental.compactUI": "compact piss",
+ "settings.option.experimental.close_button_hide": "play hide-and-seek when clicking close button",
+ "settings.option.experimental.copy_log": "copy sewage to pissboard",
+ "settings.option.experimental.inline_playlists": "inpiss pisslists and piss collections",
"spatial.notTurnedOn": "3D piss is not on. turn it on lol",
"spatial.spatialProperties": "3D properties",
"spatial.width": "longness",
@@ -299,14 +317,8 @@
"spatial.down": "the piss on the floor",
"spatial.listener": "you",
"spatial.audioSource": "piss source",
-
- // Settings - Unfinished
"settings.header.unfinished": "DLC piss",
-
- // Web Remote
"remote.web.title": "piss remote",
- "remote.web.description": "piss on your phone camera to connect to Cider.",
-
- // About
+ "remote.web.description": "piss on your phone camera to pair with Cider.",
"about.thanks": "thanks to the Cider Collective team and all the pisseneers putting this together"
-}
+}
\ No newline at end of file
diff --git a/src/i18n/en_QUK.json b/src/i18n/en_QUK.json
new file mode 100644
index 00000000..0473db45
--- /dev/null
+++ b/src/i18n/en_QUK.json
@@ -0,0 +1,319 @@
+{
+ "i18n.languageName": "Language of the Quacks",
+ "i18n.languageNameEnglish": "Language of the Quacks",
+ "i18n.category": "fun",
+ "i18n.authors": "@quacksire",
+ "app.name": "Cider",
+ "date.format": "${m} ${d}, ${y}",
+ "dialog.cancel": "Cancel",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Quacking library songs...",
+ "notification.updatingLibraryAlbums": "Quacking library albums...",
+ "notification.updatingLibraryArtists": "Quacking library artists...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Quack more",
+ "term.accountSettings": "Account Settings",
+ "term.logout": "Quackout",
+ "term.login": "Quack In",
+ "term.about": "About",
+ "term.privateSession": "Private Session",
+ "term.queue": "Queue",
+ "term.history": "History",
+ "term.search": "Search",
+ "term.library": "Library",
+ "term.listenNow": "Listen Now",
+ "term.browse": "Quack",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "Recently Quacked",
+ "term.songs": "Songs",
+ "term.albums": "Albums",
+ "term.artists": "Artists",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Playlists",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "New Playlist",
+ "term.newPlaylistFolder": "New Playlist Folder",
+ "term.createNewPlaylist": "Quack New Playlist",
+ "term.createNewPlaylistFolder": "Quack New Playlist Folder",
+ "term.deletePlaylist": "Are you sure you want to quack this playlist?",
+ "term.play": "Play",
+ "term.pause": "Pause",
+ "term.previous": "Previous",
+ "term.next": "Next",
+ "term.shuffle": "Shuffle",
+ "term.repeat": "Repeat",
+ "term.volume": "Volume",
+ "term.mute": "Quack",
+ "term.unmute": "Unquack",
+ "term.share": "Quack",
+ "term.share.success": "Quacked to clipboard",
+ "term.settings": "Settings",
+ "term.seeAll": "Quack All",
+ "term.sortBy": "Quack By",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Artist",
+ "term.sortBy.name": "Name",
+ "term.sortBy.genre": "Genre",
+ "term.sortBy.releaseDate": "Release Date",
+ "term.sortBy.duration": "Duration",
+ "term.sortBy.dateAdded": "Date Quacked",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascending",
+ "term.sortOrder.descending": "Descending",
+ "term.viewAs": "Quack As",
+ "term.viewAs.coverArt": "Cover Art",
+ "term.viewAs.list": "List",
+ "term.size": "Size",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Compact",
+ "term.enable": "Enable",
+ "term.disable": "Disable",
+ "term.enabled": "Enabled",
+ "term.disabled": "Disabled",
+ "term.connect": "Connect",
+ "term.connecting": "Quacking",
+ "term.disconnect": "Disconnect",
+ "term.authed": "Authed",
+ "term.confirm": "You a duck?",
+ "term.more": "More",
+ "term.less": "Less",
+ "term.showMore": "Quack more",
+ "term.showLess": "Quack less",
+ "term.topSongs": "Top Songs",
+ "term.latestReleases": "Latest Releases",
+ "term.time.added": "Quacked",
+ "term.time.released": "Quacked",
+ "term.time.updated": "Quacked",
+ "term.time.hours": "hours",
+ "term.time.hour": "hour",
+ "term.time.minutes": "minutes",
+ "term.time.minute": "minute",
+ "term.time.seconds": "seconds",
+ "term.time.second": "second",
+ "term.fullscreenView": "Fullscreen View",
+ "term.defaultView": "Default View",
+ "term.audioSettings": "Audio Settings",
+ "term.clearAll": "Clear All",
+ "term.recentStations": "Recent Stations",
+ "term.language": "Language",
+ "term.funLanguages": "Fun",
+ "term.noLyrics": "Quacking... / Lyrics not found./ Instrumental.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "All Rights Reserved.",
+ "term.sponsor": "Sponsor this project",
+ "term.ciderTeam": "Cider Team",
+ "term.developer": "Developer",
+ "term.socialTeam": "Social Team",
+ "term.socials": "Socials",
+ "term.contributors": "Contributors",
+ "term.equalizer": "Equalizer",
+ "term.reset": "Reset",
+ "term.track": {
+ "one": "duck",
+ "other": "ducks"
+ },
+ "term.tracks": "tracks",
+ "term.videos": "Videos",
+ "term.menu": "Menu",
+ "term.check": "Quack",
+ "term.aboutArtist": "About {{artistName}}",
+ "term.topResult": "Top Result",
+ "term.sharedPlaylists": "Shared Playlists",
+ "term.people": "People",
+ "term.newpreset.name": "New EQ Preset Name",
+ "term.addedpreset": "Quacked Preset",
+ "term.deletepreset.warn": "Are you sure you want to delete this preset?",
+ "term.deletedpreset": "Quacked preset",
+ "term.requestError": "There was a problem with the request.",
+ "term.song.link.generate": "Quacking song.link share URL...",
+ "term.musicVideos": "Music Videos",
+ "term.stations": "Stations",
+ "term.curators": "Curators",
+ "term.appleCurators": "Apple Curators",
+ "term.radioShows": "Radio Shows",
+ "term.recordLabels": "Record Labels",
+ "term.videoExtras": "Video Extras",
+ "term.top": "Top",
+ "term.version": "Version",
+ "home.title": "Home",
+ "home.recentlyPlayed": "Recently Quacked",
+ "home.recentlyAdded": "Recently Quacked",
+ "home.artistsFeed": "Your Artists Feed",
+ "home.artistsFeed.noArtist": "Follow some artists first and their latest releases will be here",
+ "home.madeForYou": "Made For You",
+ "home.friendsListeningTo": "Friends Quacking To",
+ "home.followedArtists": "Quacked Artists",
+ "error.appleMusicSubRequired": "Apple Music requires a subscription.",
+ "error.connectionError": "There was a problem quacking to Apple Music.",
+ "error.noResults": "No Results.",
+ "error.noResults.description": "Try a new duck.",
+ "podcast.followOnCider": "Quack On Cider",
+ "podcast.followedOnCider": "Quacking On Cider",
+ "podcast.subscribeOnItunes": "Quack On iTunes",
+ "podcast.subscribedOnItunes": "Quacked On iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Episodes",
+ "podcast.playEpisode": "Quack Episode",
+ "podcast.website": "Podcast Website",
+ "action.addToLibrary": "Quack to Library",
+ "action.addToLibrary.success": "Quacked to Library",
+ "action.addToLibrary.error": "Error Adding to Library",
+ "action.removeFromLibrary": "Quack from Library",
+ "action.removeFromLibrary.success": "Quacked from Library",
+ "action.addToQueue": "Quack to Queue",
+ "action.addToQueue.success": "Quacked to Queue",
+ "action.addToQueue.error": "Error Quacking to Queue",
+ "action.removeFromQueue": "Quack from Queue",
+ "action.removeFromQueue.success": "Quacked from Queue",
+ "action.removeFromQueue.error": "Error Removing from Queue",
+ "action.createPlaylist": "Create a New Playlist",
+ "action.addToPlaylist": "Quack to Playlist",
+ "action.removeFromPlaylist": "Quack from Playlist",
+ "action.addToFavorites": "Quack to Favorites",
+ "action.follow": "Quack",
+ "action.follow.success": "Quacked",
+ "action.follow.error": "Error Quacking",
+ "action.unfollow": "Unquack",
+ "action.unfollow.success": "Unquacked",
+ "action.unfollow.error": "Error Unquacking",
+ "action.playNext": "Quack Next",
+ "action.playLater": "Quack Later",
+ "action.startRadio": "Quack Radio",
+ "action.goToArtist": "Quack to Artist",
+ "action.goToAlbum": "Quack to Album",
+ "action.moveToTop": "Quack to top",
+ "action.share": "Quack",
+ "action.rename": "Quack",
+ "action.love": "Quack",
+ "action.unlove": "Unquack",
+ "action.dislike": "Disquack",
+ "action.undoDislike": "Unquack disquack",
+ "action.showWebRemoteQR": "Web Remote",
+ "action.playTracksNext": "Quack ${app.selectedMediaItems.length} tracks next",
+ "action.playTracksLater": "Quack ${app.selectedMediaItems.length} tracks later",
+ "action.removeTracks": "Quack ${self.selectedItems.length} tracks from queue",
+ "action.import": "Import",
+ "action.export": "Export",
+ "action.showAlbum": "Quack Complete Album",
+ "action.tray.minimize": "Quackmize to Tray",
+ "action.tray.quit": "Die",
+ "action.tray.show": "Alive Me",
+ "action.update": "gib new quackys",
+ "action.copy": "Quack",
+ "action.newpreset": "New Quackset...",
+ "action.deletepreset": "Delete Quackset",
+ "settings.header.general": "General",
+ "settings.header.general.description": "Adjust the general settings for Cider.",
+ "settings.option.general.language": "Language",
+ "settings.option.general.language.main": "Languages",
+ "settings.option.general.language.fun": "Fun Languages",
+ "settings.option.general.language.unsorted": "Unsorted",
+ "settings.option.general.updateCider": "Update Cider",
+ "settings.option.general.updateCider.branch": "Cider Update Branch",
+ "settings.option.general.updateCider.branch.description": "Select the branch to update Cider to",
+ "settings.option.general.updateCider.branch.main": "Stable",
+ "settings.option.general.updateCider.branch.develop": "Development",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "Adjust the audio settings for Cider.",
+ "settings.option.audio.quality": "Audio Quality",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "up to 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "up to 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "High",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standard",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "Seamless Audio Transition",
+ "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization , Equalizers and Visualizers, however on some systems this may cause stuttering in audio tracks.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively | Designed by Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is not compatible with Spatialization. Please disable Spatialization to continue.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressive",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialize audio and make audio more 3-dimensional (note: This is not Dolby Atmos)",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.",
+ "settings.header.visual": "Visual",
+ "settings.header.visual.description": "Adjust the visual settings for Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Window Background Style",
+ "settings.header.visual.windowBackgroundStyle.none": "None",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
+ "settings.header.visual.windowBackgroundStyle.image": "Image",
+ "settings.option.visual.animatedArtwork": "Animated Artwork",
+ "settings.header.visual.animatedArtwork.always": "Always",
+ "settings.header.visual.animatedArtwork.limited": "Limited to pages and special entries",
+ "settings.header.visual.animatedArtwork.disable": "Disable everywhere",
+ "settings.option.visual.animatedArtworkQuality": "Animated Artwork Quality",
+ "settings.header.visual.animatedArtworkQuality.low": "Low",
+ "settings.header.visual.animatedArtworkQuality.medium": "Medium",
+ "settings.header.visual.animatedArtworkQuality.high": "High",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Very High",
+ "settings.header.visual.animatedArtworkQuality.extreme": "Extreme",
+ "settings.option.visual.animatedWindowBackground": "Animated Window Background",
+ "settings.option.visual.hardwareAcceleration": "Hardware Acceleration",
+ "settings.option.visual.hardwareAcceleration.description": "Requires relaunch",
+ "settings.header.visual.hardwareAcceleration.default": "Default",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Theme",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Dark",
+ "settings.option.visual.showPersonalInfo": "Show Personal Info",
+ "settings.header.lyrics": "Lyrics",
+ "settings.header.lyrics.description": "Adjust the lyrics settings for Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Enable Musixmatch Lyrics",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Enable Karaoke Mode (Musixmatch only)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Translation Preferred Language",
+ "settings.option.lyrics.enableYoutubeLyrics": "Enable Youtube Lyrics for Music Videos",
+ "settings.header.connectivity": "Connectivity",
+ "settings.header.connectivity.description": "Adjust the connectivity settings for Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Playback Notifications",
+ "settings.header.connectivity.discordRPC.cider": "Display as 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Display as 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Clear Discord Rich Presence on Pause",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
+ "settings.header.experimental": "Experimental",
+ "settings.header.experimental.description": "Adjust the experimental settings for Cider.",
+ "settings.option.experimental.compactUI": "Compact UI",
+ "settings.option.experimental.close_button_hide": "Close Button Should Hide the Application",
+ "settings.option.experimental.copy_log": "Copy logs to clipboard",
+ "settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
+ "spatial.notTurnedOn": "Audio Spatialization is disabled. To use, please enable it first.",
+ "spatial.spatialProperties": "Spatial Properties",
+ "spatial.width": "Width",
+ "spatial.height": "Height",
+ "spatial.depth": "Depth",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "Room Materials",
+ "spatial.roomDimensions": "Room Dimensions",
+ "spatial.roomPositions": "Room Positions",
+ "spatial.setDimensions": "Set Dimensions",
+ "spatial.setPositions": "Set Positions",
+ "spatial.up": "Up",
+ "spatial.front": "Front",
+ "spatial.left": "Left",
+ "spatial.right": "Right",
+ "spatial.back": "Back",
+ "spatial.down": "Down",
+ "spatial.listener": "Listener",
+ "spatial.audioSource": "Audio Source",
+ "settings.header.unfinished": "Unfinished",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "Scan the QR code to pair your phone up with this Cider instance",
+ "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors. Translation file made by @quacksire"
+}
\ No newline at end of file
diff --git a/src/i18n/en_SGA.jsonc b/src/i18n/en_SGA.json
similarity index 65%
rename from src/i18n/en_SGA.jsonc
rename to src/i18n/en_SGA.json
index ab6a1138..257204bf 100644
--- a/src/i18n/en_SGA.jsonc
+++ b/src/i18n/en_SGA.json
@@ -1,25 +1,15 @@
{
-
- // i18n Info
- "i18n.languageName": "â¤á|:ááŽáŖâᎠá|:i!âáááˇáŖ", // name of language in native language
- "i18n.languageNameEnglish": "Galactic Alphabet", // name of language in English
- "i18n.category": "fun", // main = real language, fun = fun community languages
- "i18n.authors": "@kyw504100", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+ "i18n.languageName": "â¤á|:ááŽáŖâᎠá|:i!âáááˇáŖ",
+ "i18n.languageNameEnglish": "Galactic Alphabet",
+ "i18n.category": "fun",
+ "i18n.authors": "@kyw504100",
"app.name": "áŽââ¸áˇâˇ",
-
"date.format": "${m} ${d}, ${y}",
-
- // Dialogs
"dialog.cancel": "áŽáãĒáŽáˇ|:",
"dialog.ok": "á¡Į¡",
-
- // Notification
"notification.updatingLibrarySongs": "âi!â¸ááŖâãĒ⤠|:âáâˇáâˇāĨĨ ĪáãĒâ¤Ī...",
"notification.updatingLibraryAlbums": "âi!â¸ááŖâãĒ⤠|:âáâˇáâˇāĨĨ á|:áâá˛Ī...",
"notification.updatingLibraryArtists": "âi!â¸ááŖâãĒ⤠|:âáâˇáâˇāĨĨ áâˇáŖâĪáŖĪ...",
- // Terms
"term.appleInc": "ái!i!|:ᡠâãĒáŽ.",
"term.appleMusic": "ái!i!|:ᡠá˛âĪâáŽ",
"term.applePodcasts": "ái!i!|:ᡠi!áâ¸áŽáĪáŖĪ",
@@ -64,6 +54,7 @@
"term.sortBy.genre": "â¤áˇãĒâˇáˇ",
"term.sortBy.releaseDate": "âˇáˇ|:áˇáĪᡠâ¸ááŖáˇ",
"term.sortBy.duration": "â¸ââˇááŖâáãĒ",
+ "term.sortBy.dateAdded": "â¸ááŖáˇ áâ¸â¸áˇâ¸",
"term.sortOrder": "á-âŠ",
"term.sortOrder.ascending": "áĪáŽáˇãĒâ¸âãĒâ¤",
"term.sortOrder.descending": "â¸áˇĪáŽáˇãĒâ¸âãĒâ¤",
@@ -86,10 +77,10 @@
"term.less": "|:áˇĪĪ",
"term.showMore": "Īâáâ´ á˛áâˇáˇ",
"term.showLess": "Īâáâ´ |:áˇĪĪ",
- "term.topSongs" : "áŖái! ĪáãĒâ¤Ī",
+ "term.topSongs": "áŖái! ĪáãĒâ¤Ī",
"term.latestReleases": "|:ááŖáˇĪáŖ âˇáˇ|:áˇáĪáˇĪ",
"term.time.added": "áâ¸â¸áˇâ¸",
- "term.time.released": "âˇáˇ|:áˇáĪáˇâ¸",
+ "term.time.released": "âˇáˇ|:áˇáĪáˇâ¸",
"term.time.updated": "âi!â¸ááŖáˇâ¸",
"term.time.hours": "âáââˇĪ",
"term.time.hour": "âáââˇ",
@@ -115,12 +106,31 @@
"term.contributors": "áŽáãĒáŖâˇâáâáŖáâˇĪ",
"term.equalizer": "áˇáâá|:ââŠáˇâˇ",
"term.reset": "âˇáˇĪáˇáŖ",
- "term.tracks": "áŖâˇááŽÂˇĮ¡Ī", // Assume x amount of tracks. e.g. 50 tracks
+ "term.tracks": "áŖâˇááŽÂˇĮ¡Ī",
"term.videos": "âââ¸áˇá",
- "term.menu": "á˛áˇâãĒ",
- "term.showAlbum": "Īâáâ´ áŽáá˛i!|:áˇáŖáˇ á|:áâá˛",
-
- // Home
+ "term.menu": "á˛áˇâãĒ",
+ "term.check": "áŽâáˇáŽÂˇĮ¡",
+ "term.aboutArtist": "áááâáŖ {{artistName}}",
+ "term.topResult": "áŖái! âˇáˇĪâ|:áŖ",
+ "term.sharedPlaylists": "Īâáâˇáˇâ¸ i!|:áāĨĨ|:âĪáŖĪ",
+ "term.people": "i!áˇái!|:áˇ",
+ "term.newpreset.name": "ãĒáˇâ´ áˇá i!âˇáˇĪáˇáŖ ãĒáá˛áˇ",
+ "term.addedpreset": "áâ¸â¸áˇâ¸ i!âˇáˇĪáˇáŖ",
+ "term.deletepreset.warn": "áâˇáˇ āĨĨáâ Īââˇáˇ āĨĨáâ â´áãĒáŖ áŖá â¸áˇ|:áˇáŖáˇ áŖââĪ i!âˇáˇĪáˇáŖ?",
+ "term.deletedpreset": "âˇáˇá˛áâáˇâ¸ i!âˇáˇĪáˇáŖ",
+ "term.defaultPresets": "â¸áˇâáâ|:áŖ i!âˇáˇĪáˇáŖĪ",
+ "term.userPresets": "âĪáˇâˇ i!âˇáˇĪáˇáŖĪ",
+ "term.requestError": "áŖâáˇâˇáˇ â´áĪ á i!âˇáá|:áˇá˛ â´âáŖâ áŖâᡠâˇáˇáâáˇĪáŖ.",
+ "term.song.link.generate": "â¤áˇáŖáŖâãĒ⤠ĪáãĒâ¤.|:âãĒ¡Į¡ Īâáâˇáˇ ââˇ|:...",
+ "term.musicVideos": "á˛âĪâᎠâââ¸áˇáĪ",
+ "term.stations": "ĪáŖááŖâáãĒĪ",
+ "term.curators": "áŽââˇááŖáâˇĪ",
+ "term.appleCurators": "ái!i!|:ᡠáŽââˇááŖáâˇĪ",
+ "term.radioShows": "âˇáâ¸âá Īâáâ´Ī",
+ "term.recordLabels": "âˇáˇáŽáâˇâ¸ |:áááˇ|:Ī",
+ "term.videoExtras": "âââ¸áˇá áˇ/áŖâˇáĪ",
+ "term.top": "áŖái!",
+ "term.version": "âáˇâˇĪâáãĒ",
"home.title": "âáá˛áˇ",
"home.recentlyPlayed": "âˇáˇáŽáˇãĒáŖ|:āĨĨ i!|:áāĨĨáˇâ¸",
"home.recentlyAdded": "âˇáˇáŽáˇãĒáŖ|:āĨĨ áâ¸â¸áˇâ¸",
@@ -129,13 +139,10 @@
"home.madeForYou": "á˛áâ¸áˇ âá⡠āĨĨáâ",
"home.friendsListeningTo": "ââˇâáˇãĒâ¸Ī |:âĪáŖáˇãĒâãĒ⤠áŖá",
"home.followedArtists": "âá|:|:áâ´áˇâ¸ áâˇáŖâĪáŖĪ",
- // Errors
"error.appleMusicSubRequired": "ái!i!|:ᡠá˛âĪâᎠâˇáˇáâââˇáˇĪ á ĪâáĪáŽâˇâi!áŖâáãĒ.",
"error.connectionError": "áŖâáˇâˇáˇ â´áĪ á i!âˇáá|:áˇá˛ áŽáãĒãĒáˇáŽáŖâãĒ⤠áŖá ái!i!|:ᡠá˛âĪâáŽ.",
"error.noResults": "ãĒá âˇáˇĪâ|:áŖĪ.",
"error.noResults.description": "áŖâˇāĨĨ á ãĒáˇâ´ ĪáˇáâˇáŽâ.",
-
- //Podcasts
"podcast.followOnCider": "âá|:|:áâ´ áãĒ áŽââ¸áˇâˇ",
"podcast.followedOnCider": "âá|:|:áâ´âãĒ⤠áãĒ áŽââ¸áˇâˇ",
"podcast.subscribeOnItunes": "ĪâáĪáŽâˇâáᡠáãĒ âáŖâãĒáˇĪ",
@@ -144,8 +151,6 @@
"podcast.episodes": "áˇi!âĪáâ¸áˇĪ",
"podcast.playEpisode": "i!|:áāĨĨ áˇi!âĪáâ¸áˇ",
"podcast.website": "I!áâ¸áŽáĪáŖ â´áˇáĪâáŖáˇ",
-
- // Actions
"action.addToLibrary": "áâ¸â¸ áŖá |:âáâˇáâˇāĨĨ",
"action.addToLibrary.success": "áâ¸â¸áˇâ¸ áŖá |:âáâˇáâˇāĨĨ",
"action.addToLibrary.error": "áˇâˇâˇá⡠áâ¸â¸âãĒ⤠áŖá |:âáâˇáâˇāĨĨ",
@@ -185,117 +190,125 @@
"action.removeTracks": "âˇáˇá˛áâᡠ${self.selectedItems.length} áŖâˇááŽÂˇĮÂˇĪ ââˇáᲠáâáˇâáˇ",
"action.import": "âá˛i!áâˇáŖ",
"action.export": "áˇ/i!áâˇáŖ",
-
- // Settings - General
+ "action.showAlbum": "Īâáâ´ áŽáá˛i!|:áˇáŖáˇ á|:áâá˛",
+ "action.tray.minimize": "á˛âãĒâá˛ââŠáˇ áŖá áŖâˇáāĨĨ",
+ "action.tray.quit": "áââáŖ",
+ "action.tray.show": "Īâáâ´",
+ "action.update": "âi!â¸ááŖáˇ",
+ "action.copy": "áŽái!āĨĨ",
+ "action.newpreset": "ãĒáˇâ´ i!âˇáˇĪáˇáŖ...",
+ "action.deletepreset": "â¸áˇ|:áˇáŖáˇ i!âˇáˇĪáˇáŖ",
"settings.header.general": "â¤áˇãĒáˇâˇá|:",
"settings.header.general.description": "áâ¸âŽâĪáŖ áŖâᡠâ¤áˇãĒáˇâˇá|: ĪáˇáŖáŖâãĒâ¤Ī âá⡠áŽââ¸áˇâˇ.",
"settings.option.general.language": "|:áãĒâ¤âáâ¤áˇ",
-
- // Language optgroups
"settings.option.general.language.main": "|:áãĒâ¤âáâ¤áˇĪ",
"settings.option.general.language.fun": "ââãĒ |:áãĒâ¤âáâ¤áˇĪ",
"settings.option.general.language.unsorted": "âãĒĪáâˇáŖáˇâ¸",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "âi!â¸ááŖáˇ áŽââ¸áˇâˇ",
+ "settings.option.general.updateCider.branch": "áŽââ¸áˇâˇ âi!â¸ááŖáˇ áâˇáãĒáŽâ",
+ "settings.option.general.updateCider.branch.description": "Īáˇ|:áˇáŽáŖ áŖâᡠáâˇáãĒáŽâ áŖá âi!â¸ááŖáˇ áŽââ¸áˇâˇ áŖá",
+ "settings.option.general.updateCider.branch.main": "ĪáŖáá|:áˇ",
+ "settings.option.general.updateCider.branch.develop": "â¸áˇâáˇ|:ái!á˛áˇãĒáŖ",
"settings.header.audio": "áââ¸âá",
"settings.header.audio.description": "áâ¸âŽâĪáŖ áŖâᡠáââ¸âá ĪáˇáŖáŖâãĒâ¤Ī âá⡠áŽââ¸áˇâˇ.",
- "settings.option.audio.quality": "áââ¸âá áâá|:âáŖāĨĨ", // Dropdown
+ "settings.option.audio.quality": "áââ¸âá áâá|:âáŖāĨĨ",
+ "settings.header.audio.quality.hireslossless": "ââ-âˇáˇĪ |:áĪĪ|:áˇĪĪ",
+ "settings.header.audio.quality.hireslossless.description": "(âi! áŖá 24-áâáŖ/192 ¡Į¡ââŠ)",
+ "settings.header.audio.quality.lossless": "|:áĪĪ|:áˇĪĪ",
+ "settings.header.audio.quality.lossless.description": "(âi! áŖá 24-áâáŖ/48 ¡Į¡ââŠ)",
"settings.header.audio.quality.high": "âââ¤â",
- "settings.header.audio.quality.low": "|:áâ´",
- "settings.header.audio.quality.auto": "áâáŖá",
- "settings.option.audio.seamlessTransition": "Īáˇáá˛|:áˇĪĪ áââ¸âá áŖâˇáãĒĪâáŖâáãĒ", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "áˇãĒáá|:ᡠáâ¸âáãĒáŽáˇâ¸ ââãĒáŽáŖâáãĒá|:âáŖāĨĨ", // Toggle
+ "settings.header.audio.quality.high.description": "256 ¡Į¡ái!Ī",
+ "settings.header.audio.quality.standard": "ĪáŖáãĒâ¸áâˇâ¸",
+ "settings.header.audio.quality.standard.description": "64 ¡Į¡ái!Ī",
+ "settings.option.audio.seamlessTransition": "Īáˇáá˛|:áˇĪĪ áââ¸âá áŖâˇáãĒĪâáŖâáãĒ",
+ "settings.option.audio.enableAdvancedFunctionality": "áˇãĒáá|:ᡠáâ¸âáãĒáŽáˇâ¸ ââãĒáŽáŖâáãĒá|:âáŖāĨĨ",
"settings.option.audio.enableAdvancedFunctionality.description": "áˇãĒáá|:âãĒ⤠áââ¸âááŽáãĒáŖáˇ/áŖ ââãĒáŽáŖâáãĒá|:âáŖāĨĨ â´â|:|: á|:|:áâ´ âá⡠áˇ/áŖáˇãĒâ¸áˇâ¸ áââ¸âá âáˇááŖââˇáˇĪ |:â¡Į¡ᡠáââ¸âá ãĒáâˇá˛á|:ââŠááŖâáãĒ , áˇáâá|:ââŠáˇâˇĪ áãĒ⸠ââĪâá|:ââŠáˇâˇĪ, âáâ´áˇâáˇâˇ áãĒ Īáá˛áˇ ĪāĨĨĪáŖáˇá˛Ī áŖââĪ á˛áāĨĨ áŽáâĪᡠĪáŖâáŖáŖáˇâˇâãĒ⤠âãĒ áââ¸âá áŖâˇááŽÂˇĮ¡Ī.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "áââ¸âá ãĒáâˇá˛á|:ââŠááŖâáãĒ", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "áŽââ¸áˇâˇ áâ¸âˇáˇãĒá|:âãĒᡠi!âˇááŽáˇĪĪáâˇâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "i!ĪāĨĨáŽâáááŽáâĪáŖâᎠáˇãĒâáãĒáŽáˇá˛áˇãĒáŖĪ áŖâááŖ á˛á¡Į¡áˇĪ áˇâáˇâˇāĨĨáŖââãĒ⤠ĪáâãĒ⸠áááŖâ âˇâáŽâáˇâˇ áãĒ⸠á˛áâˇáˇ |:ââáˇ|:āĨĨ | â¸áˇĪââ¤ãĒáˇâ¸ áāĨĨ á˛áâ¡Į¡ââ´â.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "áŽái! âĪ ãĒááŖ áŽáá˛i!ááŖâá|:ᡠâ´âáŖâ Īi!ááŖâá|:ââŠááŖâáãĒ. i!|:áˇáĪᡠâ¸âĪáá|:ᡠĪi!ááŖâá|:ââŠááŖâáãĒ áŖá áŽáãĒáŖâãĒâáˇ.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "áŽái! ĪáŖâˇáˇãĒâ¤áŖâ",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "áŽâáãĒâ¤áˇĪ áŖâᡠĪáŖâˇáˇãĒâ¤áŖâ áâ áŖâᡠi!âˇááŽáˇĪĪâãĒ⤠â¸áãĒᡠáŖá áŖâᡠáââ¸âá. (áâ¤â¤âˇáˇĪĪââᡠá˛áāĨĨ āĨĨâáˇ|:⸠âãĒâ¸áˇĪââˇáá|:ᡠâˇáˇĪâ|:áŖĪ)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "ĪáŖáãĒâ¸áâˇâ¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "áâ¤â¤âˇáˇĪĪââáˇ",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "áââ¸âá ãĒáâˇá˛á|:ââŠááŖâáãĒ",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "ãĒáâˇá˛á|:ââŠáˇĪ i!áˇá¡Į¡ âá|:âá˛áˇ âá⡠âãĒâ¸ââââ¸âá|: áŖâˇááŽÂˇĮÂˇĪ áŖá áŽâˇáˇááŖáˇ á á˛áâˇáˇ âãĒââáâˇá˛ |:âĪáŖáˇãĒâãĒ⤠áˇ/i!áˇâˇâáˇãĒáŽáˇ.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "áââ¸âá Īi!ááŖâá|:ââŠááŖâáãĒ", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "áââ¸âá Īi!ááŖâá|:ââŠááŖâáãĒ",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Īi!ááŖâá|:ââŠáˇ áââ¸âá áãĒ⸠á˛á¡Į¡ᡠáââ¸âá á˛áâˇáˇ 3-â¸âá˛áˇãĒĪâáãĒá|: (ãĒááŖáˇ: áŖââĪ âĪ ãĒááŖ â¸á|:áāĨĨ ááŖá˛áĪ)",
- // Settings - Visual
- "settings.header.visual": "ââĪâá|:",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Īi!ááŖâá|:ââŠááŖâáãĒ âĪ ãĒááŖ áŽáá˛i!ááŖâá|:ᡠâ´âáŖâ áŽái!. i!|:áˇáĪᡠâ¸âĪáá|:ᡠáŽái! áŖá áŽáãĒáŖâãĒâáˇ.",
+ "settings.header.visual": "ââĪâá|:",
"settings.header.visual.description": "áâ¸âŽâĪáŖ áŖâᡠââĪâá| ĪáˇáŖáŖâãĒâ¤Ī âá⡠áŽââ¸áˇâˇ.",
- "settings.option.visual.windowBackgroundStyle": "â´âãĒâ¸áâ´ áááŽÂˇĮ¡â¤âˇáâãĒ⸠ĪáŖāĨĨ|:áˇ", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "â´âãĒâ¸áâ´ áááŽÂˇĮ¡â¤âˇáâãĒ⸠ĪáŖāĨĨ|:áˇ",
"settings.header.visual.windowBackgroundStyle.none": "ãĒáãĒáˇ",
"settings.header.visual.windowBackgroundStyle.artwork": "áâˇáŖâ´áâˇÂˇĮ¡",
"settings.header.visual.windowBackgroundStyle.image": "âá˛áâ¤áˇ",
- "settings.option.visual.animatedArtwork": "áãĒâá˛ááŖáˇâ¸ áâˇáŖâ´áâˇÂˇĮ¡", // Dropdown
+ "settings.option.visual.animatedArtwork": "áãĒâá˛ááŖáˇâ¸ áâˇáŖâ´áâˇÂˇĮ¡",
"settings.header.visual.animatedArtwork.always": "á|:â´áāĨĨĪ",
"settings.header.visual.animatedArtwork.limited": "|:âá˛âáŖáˇâ¸ áŖá i!áâ¤áˇĪ áãĒ⸠Īi!áˇáŽâá|: áˇãĒáŖâˇâáˇĪ",
"settings.header.visual.animatedArtwork.disable": "â¸âĪáá|:ᡠáˇâáˇâˇāĨĨâ´âáˇâˇáˇ",
- "settings.option.visual.animatedArtworkQuality": "áãĒâá˛ááŖáˇâ¸ áâˇáŖâ´áâˇÂˇĮ¡ áâá|:âáŖāĨĨ", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "áãĒâá˛ááŖáˇâ¸ áâˇáŖâ´áâˇÂˇĮ¡ áâá|:âáŖāĨĨ",
"settings.header.visual.animatedArtworkQuality.low": "|:áâ´",
"settings.header.visual.animatedArtworkQuality.medium": "á˛áˇâ¸ââá˛",
"settings.header.visual.animatedArtworkQuality.high": "âââ¤â",
"settings.header.visual.animatedArtworkQuality.veryHigh": "âáˇâˇāĨĨ âââ¤â",
"settings.header.visual.animatedArtworkQuality.extreme": "áˇ/áŖâˇáˇá˛áˇ",
- "settings.option.visual.animatedWindowBackground": "áãĒâá˛ááŖáˇâ¸ â´âãĒâ¸áâ´ áááŽÂˇĮ¡â¤âˇáâãĒâ¸", // Toggle
- "settings.option.visual.hardwareAcceleration": "âáâˇâ¸â´áâˇáˇ ááŽáŽáˇ|:áˇâˇááŖâáãĒ", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "áãĒâá˛ááŖáˇâ¸ â´âãĒâ¸áâ´ áááŽÂˇĮ¡â¤âˇáâãĒâ¸",
+ "settings.option.visual.hardwareAcceleration": "âáâˇâ¸â´áâˇáˇ ááŽáŽáˇ|:áˇâˇááŖâáãĒ",
"settings.option.visual.hardwareAcceleration.description": "âˇáˇáâââˇáˇĪ âˇáˇ|:áâãĒáŽâ",
- "settings.header.visual.hardwareAcceleration.default": "â¸áˇâáâ|:áŖ",
- "settings.header.visual.hardwareAcceleration.webGPU": "â´áˇáâ¤i!â",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Īâáâ´ i!áˇâˇĪáãĒá|: âãĒâá", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "â¸áˇâáâ|:áŖ",
+ "settings.header.visual.hardwareAcceleration.webGPU": "â´áˇáâ¤i!â",
+ "settings.header.visual.theme": "áŖâáˇá˛áˇ",
+ "settings.option.visual.theme.github.download": "âãĒĪáŖá|:|: ââˇáᲠâ¤âáŖââá ââˇ|:",
+ "settings.prompt.visual.theme.github.URL": "áˇãĒáŖáˇâˇ áŖâᡠââˇ|: áâ áŖâᡠáŖâáˇá˛áˇ āĨĨáâ â´áãĒáŖ áŖá âãĒĪáŖá|:|:",
+ "settings.notyf.visual.theme.install.success": "áŖâáˇá˛áˇ âãĒĪáŖá|:|:áˇâ¸ ĪâáŽáŽáˇĪĪââ|:|:āĨĨ",
+ "settings.notyf.visual.theme.install.error": "áŖâáˇá˛áˇ âãĒĪáŖá|:|:ááŖâáãĒ âáâ|:áˇâ¸",
+ "settings.option.visual.theme.default": "áŽââ¸áˇâˇ",
+ "settings.option.visual.theme.dark": "â¸áâˇÂˇĮ¡",
+ "settings.option.visual.showPersonalInfo": "Īâáâ´ i!áˇâˇĪáãĒá|: âãĒâá",
"settings.header.lyrics": "|:āĨĨâˇâáŽĪ",
"settings.header.lyrics.description": "áâ¸âŽâĪáŖ áŖâᡠ|:āĨĨâˇâáŽĪ ĪáˇáŖáŖâãĒâ¤Ī âá⡠áŽââ¸áˇâˇ.",
- "settings.option.lyrics.enableMusixmatch": "áˇãĒáá|:ᡠá˛âĪâĖ/á˛ááŖáŽâ |:āĨĨâˇâáŽĪ", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "áˇãĒáá|:ᡠ¡Į¡áâˇáá¡Į¡ᡠá˛áâ¸áˇ (á˛âĪâĖ/á˛ááŖáŽâ áãĒ|:āĨĨ)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "á˛âĪâĖ/á˛ááŖáŽâ áŖâˇáãĒĪ|:ááŖâáãĒ i!âˇáˇâáˇâˇâˇáˇâ¸ |:áãĒâ¤âáâ¤áˇ", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "áˇãĒáá|:ᡠāĨĨáâáŖâáᡠ|:āĨĨâˇâáŽĪ âá⡠á˛âĪâᎠâââ¸áˇáĪ", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "áˇãĒáá|:ᡠá˛âĪâĖ/á˛ááŖáŽâ |:āĨĨâˇâáŽĪ",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "áˇãĒáá|:ᡠ¡Į¡áâˇáá¡Į¡ᡠá˛áâ¸áˇ (á˛âĪâĖ/á˛ááŖáŽâ áãĒ|:āĨĨ)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "á˛âĪâĖ/á˛ááŖáŽâ áŖâˇáãĒĪ|:ááŖâáãĒ i!âˇáˇâáˇâˇâˇáˇâ¸ |:áãĒâ¤âáâ¤áˇ",
+ "settings.option.lyrics.enableYoutubeLyrics": "áˇãĒáá|:ᡠāĨĨáâáŖâáᡠ|:āĨĨâˇâáŽĪ âá⡠á˛âĪâᎠâââ¸áˇáĪ",
"settings.header.connectivity": "áŽáãĒãĒáˇáŽáŖâââáŖāĨĨ",
"settings.header.connectivity.description": "áâ¸âŽâĪáŖ áŖâᡠáŽáãĒãĒáˇáŽáŖâââáŖāĨĨ ĪáˇáŖáŖâãĒâ¤Ī âá⡠áŽââ¸áˇâˇ.",
- "settings.option.connectivity.discordRPC": "â¸âĪáŽáâˇâ¸ âˇâáŽâ i!âˇáˇĪáˇãĒáŽáˇ", // Dropdown
- "settings.option.connectivity.playbackNotifications": "i!|:áāĨĨáááŽÂˇĮ¡ ãĒááŖâââáŽááŖâáãĒĪ", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "â¸âĪáŽáâˇâ¸ âˇâáŽâ i!âˇáˇĪáˇãĒáŽáˇ",
+ "settings.option.connectivity.playbackNotifications": "i!|:áāĨĨáááŽÂˇĮ¡ ãĒááŖâââáŽááŖâáãĒĪ",
"settings.header.connectivity.discordRPC.cider": "â¸âĪi!|:áāĨĨ áĪ 'áŽââ¸áˇâˇ'",
"settings.header.connectivity.discordRPC.appleMusic": "â¸âĪi!|:áāĨĨ áĪ 'ái!i!|:ᡠá˛âĪâáŽ'",
- "settings.option.connectivity.discordRPC.clearOnPause": "áŽ|:áˇá⡠â¸âĪáŽáâˇâ¸ âˇâáŽâ i!âˇáˇĪáˇãĒáŽáˇ áãĒ i!áâĪáˇ", // Toggle
- "settings.option.connectivity.lastfmScrobble": "|:áĪáŖâᲠĪáŽâˇááá|:âãĒâ¤", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "|:áĪáŖâᲠĪáŽâˇááá|:ᡠâ¸áˇ|:áāĨĨ (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "áˇãĒáá|:ᡠ|:áĪáŖâᲠãĒáâ´ i!|:áāĨĨâãĒâ¤",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "âˇáˇá˛áâᡠâáˇááŖââˇâãĒ⤠áâˇáŖâĪáŖĪ ââˇáᲠĪáãĒ⤠áŖâáŖ|:ᡠ(|:áĪáŖâá˛)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "ââ|:áŖáˇâˇ |:áái!áˇâ¸ áŖâˇááŽÂˇĮ¡ (|:áĪáŖâá˛)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "áŽ|:áˇá⡠â¸âĪáŽáâˇâ¸ âˇâáŽâ i!âˇáˇĪáˇãĒáŽáˇ áãĒ i!áâĪáˇ",
+ "settings.option.connectivity.lastfmScrobble": "|:áĪáŖ.âᲠĪáŽâˇááá|:âãĒâ¤",
+ "settings.option.connectivity.lastfmScrobble.delay": "|:áĪáŖ.âᲠĪáŽâˇááá|:ᡠâ¸áˇ|:áāĨĨ (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "áˇãĒáá|:ᡠ|:áĪáŖ.âᲠãĒáâ´ i!|:áāĨĨâãĒâ¤",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "âˇáˇá˛áâᡠâáˇááŖââˇâãĒ⤠áâˇáŖâĪáŖĪ ââˇáᲠĪáãĒ⤠áŖâáŖ|:ᡠ(|:áĪáŖ.âá˛)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "ââ|:áŖáˇâˇ |:áái!áˇâ¸ áŖâˇááŽÂˇĮ¡ (|:áĪáŖ.âá˛)",
"settings.header.experimental": "áˇ/i!áˇâˇâá˛áˇãĒáŖá|:",
"settings.header.experimental.description": "áâ¸âŽâĪáŖ áŖâᡠáˇ/i!áˇâˇâá˛áˇãĒáŖá|: ĪáˇáŖáŖâãĒâ¤Ī âá⡠áŽââ¸áˇâˇ.",
- "settings.option.experimental.compactUI": "áŽáá˛i!ááŽáŖ ââ", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "áŽ|:áĪᡠáâáŖáŖáãĒ ááˇâáââáââˇ",
- "settings.option.experimental.closeButtonBehaviour.quit": "áââáŖ áŽââ¸áˇâˇ",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "á˛âãĒâá˛ââŠáˇ áŖá áŖáĪ¡Į¡ááâˇ",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "á˛âãĒâá˛ââŠáˇ áŖá ĪāĨĨĪáŖáˇá˛ áŖâˇáāĨĨ",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.spatialProperties" : "Īi!ááŖâá|: i!âˇái!áˇâˇáŖâáˇĪ",
- "spatial.width" : "â´ââ¸áŖâ",
- "spatial.height" : "âáˇââ¤âáŖ",
- "spatial.depth" : "â¸áˇi!áŖâ",
- "spatial.gain" : "â¤áâãĒ",
- "spatial.roomMaterials" : "âˇááᲠá˛ááŖáˇâˇâá|:Ī",
- "spatial.roomDimensions" : "âˇááᲠâ¸âá˛áˇãĒĪâáãĒĪ",
- "spatial.roomPositions" : "âˇááᲠi!áĪâáŖâáãĒĪ",
- "spatial.setDimensions" : "ĪáˇáŖ â¸âá˛áˇãĒĪâáãĒĪ",
- "spatial.setPositions" : "ĪáˇáŖ i!áĪâáŖâáãĒĪ",
- "spatial.up" : "âi!",
- "spatial.front" : "ââˇáãĒáŖ",
- "spatial.left" : "|:áˇâáŖ",
- "spatial.right" : "âˇââ¤âáŖ",
- "spatial.back" : "áááŽÂˇĮ¡",
- "spatial.down" : "â¸áâ´ãĒ",
- "spatial.listener" : "|:âĪáŖáˇãĒáˇâˇ",
- "spatial.audioSource" : "áââ¸âá ĪáââˇáŽáˇ",
-
- // Settings - Unfinished
+ "settings.option.experimental.compactUI": "áŽáá˛i!ááŽáŖ ââ",
+ "settings.option.experimental.close_button_hide": "áŽ|:áĪᡠáâáŖáŖáãĒ Īâáâ|:⸠âââ¸áˇ áŖâᡠái!i!|:âáŽááŖâáãĒ",
+ "settings.option.experimental.copy_log": "áŽái!āĨĨ |:áâ¤Ī áŖá áŽ|:âi!áááâˇâ¸",
+ "settings.option.experimental.inline_playlists": "âãĒ|:âãĒᡠi!|:áāĨĨ|:âĪáŖĪ áãĒ⸠á|:áâá˛Ī",
+ "spatial.notTurnedOn": "áââ¸âá Īi!ááŖâá|:ââŠááŖâáãĒ âĪ â¸âĪáá|:áˇâ¸. áŖá âĪáˇ, i!|:áˇáĪᡠáˇãĒáá|:ᡠâáŖ âââˇĪáŖ.",
+ "spatial.spatialProperties": "Īi!ááŖâá|: i!âˇái!áˇâˇáŖâáˇĪ",
+ "spatial.width": "â´ââ¸áŖâ",
+ "spatial.height": "âáˇââ¤âáŖ",
+ "spatial.depth": "â¸áˇi!áŖâ",
+ "spatial.gain": "â¤áâãĒ",
+ "spatial.roomMaterials": "âˇááᲠá˛ááŖáˇâˇâá|:Ī",
+ "spatial.roomDimensions": "âˇááᲠâ¸âá˛áˇãĒĪâáãĒĪ",
+ "spatial.roomPositions": "âˇááᲠi!áĪâáŖâáãĒĪ",
+ "spatial.setDimensions": "ĪáˇáŖ â¸âá˛áˇãĒĪâáãĒĪ",
+ "spatial.setPositions": "ĪáˇáŖ i!áĪâáŖâáãĒĪ",
+ "spatial.up": "âi!",
+ "spatial.front": "ââˇáãĒáŖ",
+ "spatial.left": "|:áˇâáŖ",
+ "spatial.right": "âˇââ¤âáŖ",
+ "spatial.back": "áááŽÂˇĮ¡",
+ "spatial.down": "â¸áâ´ãĒ",
+ "spatial.listener": "|:âĪáŖáˇãĒáˇâˇ",
+ "spatial.audioSource": "áââ¸âá ĪáââˇáŽáˇ",
"settings.header.unfinished": "âãĒââãĒâĪâáˇâ¸",
-
- // Web Remote
"remote.web.title": "áŽââ¸áˇâˇ âˇáˇá˛ááŖáˇ",
"remote.web.description": "ĪáŽáãĒ áŖâᡠá⡠áŽáâ¸áˇ áŖá i!áâ⡠āĨĨáâ⡠i!âáãĒᡠâi! â´âáŖâ áŖââĪ áŽââ¸áˇâˇ âãĒĪáŖáãĒáŽáˇ",
-
- // About
"about.thanks": "á˛áâŽá⡠áŖâáãĒ¡ĮÂˇĪ áŖá áŖâᡠáŽââ¸áˇâˇ áŽá|:|:áˇáŽáŖââᡠáŖáˇáᲠáãĒ⸠á|:|: áâ áâ⡠áŽáãĒáŖâˇâáâáŖáâˇĪ."
}
\ No newline at end of file
diff --git a/src/i18n/en_US.json b/src/i18n/en_US.json
new file mode 100644
index 00000000..5d437392
--- /dev/null
+++ b/src/i18n/en_US.json
@@ -0,0 +1,395 @@
+{
+ "i18n.languageName": "English (US)",
+ "i18n.languageNameEnglish": "English (US)",
+ "i18n.category": "main",
+ "i18n.authors": "@maikirakiwi @kyw504100 @nosh118",
+ "app.name": "Cider",
+ "date.format": "${m} ${d}, ${y}",
+ "dialog.cancel": "Cancel",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Updating library songs...",
+ "notification.updatingLibraryAlbums": "Updating library albums...",
+ "notification.updatingLibraryArtists": "Updating library artists...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Learn more",
+ "term.accountSettings": "Account Settings",
+ "term.logout": "Logout",
+ "term.login": "Log In",
+ "term.about": "About",
+ "term.privateSession": "Private Session",
+ "term.queue": "Queue",
+ "term.history": "History",
+ "term.search": "Search",
+ "term.library": "Library",
+ "term.listenNow": "Listen Now",
+ "term.browse": "Browse",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "Recently Added",
+ "term.songs": "Songs",
+ "term.albums": "Albums",
+ "term.artists": "Artists",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Playlists",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "New Playlist",
+ "term.newPlaylistFolder": "New Playlist Folder",
+ "term.createNewPlaylist": "Create New Playlist",
+ "term.createNewPlaylistFolder": "Create New Playlist Folder",
+ "term.deletePlaylist": "Are you sure you want to delete this playlist?",
+ "term.play": "Play",
+ "term.pause": "Pause",
+ "term.previous": "Previous",
+ "term.next": "Next",
+ "term.shuffle": "Shuffle",
+ "term.repeat": "Repeat",
+ "term.volume": "Volume",
+ "term.mute": "Mute",
+ "term.unmute": "Unmute",
+ "term.share": "Share",
+ "term.share.success": "Copied to clipboard",
+ "term.settings": "Settings",
+ "term.seeAll": "See All",
+ "term.sortBy": "Sort By",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Artist",
+ "term.sortBy.name": "Name",
+ "term.sortBy.genre": "Genre",
+ "term.sortBy.releaseDate": "Release Date",
+ "term.sortBy.duration": "Duration",
+ "term.sortBy.dateAdded": "Date Added",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascending",
+ "term.sortOrder.descending": "Descending",
+ "term.viewAs": "View As",
+ "term.viewAs.coverArt": "Cover Art",
+ "term.viewAs.list": "List",
+ "term.size": "Size",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Compact",
+ "term.enable": "Enable",
+ "term.disable": "Disable",
+ "term.enabled": "Enabled",
+ "term.disabled": "Disabled",
+ "term.connect": "Connect",
+ "term.connecting": "Connecting",
+ "term.disconnect": "Disconnect",
+ "term.authed": "Authed",
+ "term.confirm": "Confirm?",
+ "term.more": "More",
+ "term.less": "Less",
+ "term.showMore": "Show more",
+ "term.showLess": "Show less",
+ "term.topSongs": "Top Songs",
+ "term.latestReleases": "Latest Releases",
+ "term.time.added": "Added",
+ "term.time.released": "Released",
+ "term.time.updated": "Updated",
+ "term.time.days": "days",
+ "term.time.day": "day",
+ "term.time.hours": "hours",
+ "term.time.hour": "hour",
+ "term.time.minutes": "minutes",
+ "term.time.minute": "minute",
+ "term.time.seconds": "seconds",
+ "term.time.second": "second",
+ "term.fullscreenView": "Fullscreen View",
+ "term.defaultView": "Default View",
+ "term.audioSettings": "Audio Settings",
+ "term.audioControls": "Volume Controls",
+ "term.clearAll": "Clear All",
+ "term.recentStations": "Recent Stations",
+ "term.language": "Language",
+ "term.funLanguages": "Fun",
+ "term.noLyrics": "Loading... / Lyrics not found./ Instrumental.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "All Rights Reserved.",
+ "term.sponsor": "Sponsor this project",
+ "term.ciderTeam": "Cider Team",
+ "term.developer": "Developer",
+ "term.socialTeam": "Social Team",
+ "term.socials": "Socials",
+ "term.contributors": "Contributors",
+ "term.equalizer": "Equalizer",
+ "term.reset": "Reset",
+ "term.tracks": "tracks",
+ "term.track": {
+ "one" : "track",
+ "other" : "tracks"
+ },
+ "term.videos": "Videos",
+ "term.menu": "Menu",
+ "term.check": "Check",
+ "term.aboutArtist": "About {{artistName}}",
+ "term.topResult": "Top Result",
+ "term.sharedPlaylists": "Shared Playlists",
+ "term.people": "People",
+ "term.newpreset.name": "New EQ Preset Name",
+ "term.addedpreset": "Added Preset",
+ "term.deletepreset.warn": "Are you sure you want to delete this preset?",
+ "term.deletedpreset": "Removed preset",
+ "term.defaultPresets": "Default Presets",
+ "term.userPresets": "User Presets",
+ "term.requestError": "There was a problem with the request.",
+ "term.song.link.generate": "Getting song.link share URL...",
+ "term.musicVideos": "Music Videos",
+ "term.stations": "Stations",
+ "term.curators": "Curators",
+ "term.appleCurators": "Apple Curators",
+ "term.radioShows": "Radio Shows",
+ "term.recordLabels": "Record Labels",
+ "term.videoExtras": "Video Extras",
+ "term.top": "Top",
+ "term.version": "Version",
+ "term.noVideos": "No videos found.",
+ "term.plugin": "Plug-in",
+ "term.pluginMenu": "Plug-in Menu",
+ "term.pluginMenu.none": "No interactive plugins",
+ "term.replay": "Replay",
+ "term.uniqueAlbums": "Unique Albums",
+ "term.uniqueArtists": "Unique Artists",
+ "term.uniqueSongs": "Unique Songs",
+ "term.topArtists": "Top Artists",
+ "term.listenedTo": "Listened to:",
+ "term.times": "times",
+ "term.topAlbums": "Top Albums",
+ "term.plays": "Plays",
+ "term.topGenres": "Top Genres",
+ "term.confirmLogout": "Are you sure you want to logout?",
+ "home.title": "Home",
+ "home.recentlyPlayed": "Recently Played",
+ "home.recentlyAdded": "Recently Added",
+ "home.artistsFeed": "Your Artists Feed",
+ "home.artistsFeed.noArtist": "Follow some artists to see their latest releases",
+ "home.madeForYou": "Made For You",
+ "home.friendsListeningTo": "Friends Listening To",
+ "home.followedArtists": "Followed Artists",
+ "error.appleMusicSubRequired": "Apple Music requires a subscription.",
+ "error.connectionError": "There was a problem connecting to Apple Music.",
+ "error.noResults": "No Results.",
+ "error.noResults.description": "Try a new search.",
+ "podcast.followOnCider": "Follow On Cider",
+ "podcast.followedOnCider": "Following On Cider",
+ "podcast.subscribeOnItunes": "Subscribe On iTunes",
+ "podcast.subscribedOnItunes": "Subscribed On iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Episodes",
+ "podcast.playEpisode": "Play Episode",
+ "podcast.website": "Podcast Website",
+ "action.addToLibrary": "Add to Library",
+ "action.addToLibrary.success": "Added to Library",
+ "action.addToLibrary.error": "Error Adding to Library",
+ "action.removeFromLibrary": "Remove from Library",
+ "action.removeFromLibrary.success": "Removed from Library",
+ "action.addToQueue": "Add to Queue",
+ "action.addToQueue.success": "Added to Queue",
+ "action.addToQueue.error": "Error Adding to Queue",
+ "action.removeFromQueue": "Remove from Queue",
+ "action.removeFromQueue.success": "Removed from Queue",
+ "action.removeFromQueue.error": "Error Removing from Queue",
+ "action.createPlaylist": "Create a New Playlist",
+ "action.addToPlaylist": "Add to Playlist",
+ "action.removeFromPlaylist": "Remove from Playlist",
+ "action.addToFavorites": "Add to Favorites",
+ "action.follow": "Follow",
+ "action.follow.success": "Followed",
+ "action.follow.error": "Error Following",
+ "action.unfollow": "Unfollow",
+ "action.unfollow.success": "Unfollowed",
+ "action.unfollow.error": "Error Unfollowing",
+ "action.playNext": "Play Next",
+ "action.playLater": "Play Later",
+ "action.startRadio": "Start Radio",
+ "action.goToArtist": "Go to Artist",
+ "action.goToAlbum": "Go to Album",
+ "action.showInPlaylist": "Show in Playlist",
+ "action.showInAppleMusic": "Show in Apple Music",
+ "action.moveToTop": "Move out of Folder",
+ "action.share": "Share",
+ "action.rename": "Rename",
+ "action.love": "Love",
+ "action.unlove": "Unlove",
+ "action.dislike": "Dislike",
+ "action.undoDislike": "Undo dislike",
+ "action.showWebRemoteQR": "Web Remote",
+ "action.playTracksNext": "Play ${app.selectedMediaItems.length} tracks next",
+ "action.playTracksLater": "Play ${app.selectedMediaItems.length} tracks later",
+ "action.removeTracks": "Remove ${self.selectedItems.length} tracks from queue",
+ "action.import": "Import",
+ "action.export": "Export",
+ "action.showAlbum": "Show Complete Album",
+ "action.tray.minimize": "Minimize to Tray",
+ "action.tray.quit": "Quit",
+ "action.tray.show": "Show",
+ "action.update": "Update",
+ "action.install": "Install",
+ "action.copy": "Copy",
+ "action.newpreset": "New Preset...",
+ "action.deletepreset": "Delete Preset",
+ "action.open": "Open",
+ "action.relaunch.confirm": "Do you want to relaunch Cider?",
+ "settings.header.general": "General",
+ "settings.header.general.description": "Adjust the general settings for Cider.",
+ "settings.option.general.language": "Language",
+ "settings.option.general.resumebehavior": "Resume behavior",
+ "settings.option.general.resumebehavior.description": "Resume behavior affects how Cider will resume your session when you return to the app.",
+ "settings.option.general.resumebehavior.locally": "Locally",
+ "settings.option.general.resumebehavior.locally.description": "Cider will resume your last session on this machine.",
+ "settings.option.general.resumebehavior.history": "History",
+ "settings.option.general.resumebehavior.history.description": "Cider will queue the last song from your overall Apple Music history, across devices.",
+ "settings.option.general.language.main": "Languages",
+ "settings.option.general.language.fun": "Fun Languages",
+ "settings.option.general.language.unsorted": "Unsorted",
+ "settings.option.general.updateCider": "Update Cider",
+ "settings.option.general.updateCider.branch": "Cider Update Branch",
+ "settings.option.general.updateCider.branch.description": "Select the branch to update Cider to",
+ "settings.option.general.updateCider.branch.main": "Stable",
+ "settings.option.general.updateCider.branch.develop": "Development",
+ "settings.notyf.updateCider.update-not-available": "No update available",
+ "settings.notyf.updateCider.update-downloaded": "Update has been downloaded, restart to apply",
+ "settings.notyf.updateCider.update-error": "Error updating Cider",
+ "settings.notyf.updateCider.update-timeout": "Update timed out",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "Adjust the audio settings for Cider.",
+ "settings.option.audio.volumeStep": "Volume Step",
+ "settings.option.audio.maxVolume": "Max Volume",
+ "settings.option.audio.quality": "Audio Quality",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "up to 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "up to 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "High",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standard",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "Seamless Audio Transition",
+ "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization, Equalizers and Visualizers - however on some systems this may cause stuttering in audio tracks.",
+ "settings.option.audio.audioLab": "Cider Audio Lab",
+ "settings.option.audio.audioLab.description": "An assortment of in-house developed audio effects for Cider.",
+ "settings.warn.audioLab.withoutAF": "AudioContext (Advanced Functionality) is required to enable Cider Audio Laboratory.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Analog Warmth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simulates the analog warmth modelled after the Korg Nutube 6P1",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Analog Warmth intensity",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Changes the intensity of the Analog Warmth Module processing.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Smooth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Warm",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively | Designed by Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is not compatible with Spatialization. Please disable Spatialization to continue.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressive",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialize audio and make audio more 3-dimensional (note: This is not Dolby Atmos)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned Spatializing Effect, disables the customizable settings of Audio Spatialization. Spatialization must be enabled as a prerequisite.",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider Spatialization Profile",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tuning Profile of the Spatialization. (Requires App Restart)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.",
+ "settings.header.visual": "Visual",
+ "settings.header.visual.description": "Adjust the visual settings for Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Window Background Style",
+ "settings.header.visual.windowBackgroundStyle.none": "None",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
+ "settings.header.visual.windowBackgroundStyle.image": "Image",
+ "settings.option.visual.animatedArtwork": "Animated Artwork",
+ "settings.header.visual.animatedArtwork.always": "Always",
+ "settings.header.visual.animatedArtwork.limited": "Limited to pages and special entries",
+ "settings.header.visual.animatedArtwork.disable": "Disable everywhere",
+ "settings.option.visual.animatedArtworkQuality": "Animated Artwork Quality",
+ "settings.header.visual.animatedArtworkQuality.low": "Low",
+ "settings.header.visual.animatedArtworkQuality.medium": "Medium",
+ "settings.header.visual.animatedArtworkQuality.high": "High",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Very High",
+ "settings.header.visual.animatedArtworkQuality.extreme": "Extreme",
+ "settings.option.visual.animatedWindowBackground": "Animated Window Background",
+ "settings.option.visual.hardwareAcceleration": "Hardware Acceleration",
+ "settings.option.visual.hardwareAcceleration.description": "Requires relaunch",
+ "settings.header.visual.hardwareAcceleration.default": "Default",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Theme",
+ "settings.option.visual.theme.github.download": "Install from GitHub URL",
+ "settings.option.visual.theme.github.explore": "Explore GitHub Themes",
+ "settings.header.visual.theme.github.page": "Themes from GitHub",
+ "settings.option.visual.theme.github.install.confirm": "Are you sure you want to install {{ repo }}?",
+ "settings.prompt.visual.theme.github.URL": "Enter the URL of the theme you want to install",
+ "settings.notyf.visual.theme.install.success": "Theme installed successfully",
+ "settings.notyf.visual.theme.install.error": "Theme installation failed",
+ "settings.header.visual.plugin": "Plugin",
+ "settings.option.visual.plugin.github.download": "Install from GitHub URL",
+ "settings.option.visual.plugin.github.explore": "Explore GitHub Plugins",
+ "settings.header.visual.plugin.github.page": "Plugins from GitHub",
+ "settings.option.visual.plugin.github.install.confirm": "Are you sure you want to install {{ repo }}?",
+ "settings.prompt.visual.plugin.github.URL": "Enter the URL of the plugin you want to install",
+ "settings.prompt.visual.plugin.github.success": "Plugin installed successfully, Press OK to relaunch Cider",
+ "settings.notyf.visual.plugin.install.success": "Plugin installed successfully",
+ "settings.notyf.visual.plugin.install.error": "Plugin installation failed",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Dark",
+ "settings.option.visual.showPersonalInfo": "Show Personal Info",
+ "settings.header.lyrics": "Lyrics",
+ "settings.header.lyrics.description": "Adjust the lyrics settings for Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Enable Musixmatch Lyrics",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Enable Karaoke Mode (Musixmatch only)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Translation Preferred Language",
+ "settings.option.lyrics.enableYoutubeLyrics": "Enable Youtube Lyrics for Music Videos",
+ "settings.header.connectivity": "Connectivity",
+ "settings.header.connectivity.description": "Adjust the connectivity settings for Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Playback Notifications",
+ "settings.header.connectivity.discordRPC.cider": "Display as 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Display as 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Clear Discord Rich Presence on Pause",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
+ "settings.header.debug": "Debug",
+ "settings.option.debug.copy_log": "Copy logs to clipboard",
+ "settings.option.debug.openAppData": "Open Cider Folder",
+ "settings.header.experimental": "Experimental",
+ "settings.header.experimental.description": "Adjust the experimental settings for Cider.",
+ "settings.option.experimental.unknownPlugin": "Unknown Sources",
+ "settings.option.experimental.unknownPlugin.description": "Allow installation of plugins from repos other than the Cider Plugin Repository",
+ "settings.option.experimental.compactUI": "Compact UI",
+ "settings.option.experimental.close_button_hide": "Close Button Should Hide the Application",
+ "settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
+ "settings.option.advanced.playlistTrackMapping": "Playlist Track Mapping",
+ "settings.option.advanced.playlistTrackMapping.description": "Enables deep scanning of playlists to determine which tracks are in which playlists. Playlist cache build times can increase significantly.",
+ "settings.option.visual.transparent": "Transparent frame",
+ "settings.option.visual.transparent.description": "Transparent frame (needs Theme Support , requires relaunch)",
+ "spatial.notTurnedOn": "Audio Spatialization is disabled. To use, please enable it first.",
+ "spatial.spatialProperties": "Spatial Properties",
+ "spatial.width": "Width",
+ "spatial.height": "Height",
+ "spatial.depth": "Depth",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "Room Materials",
+ "spatial.roomDimensions": "Room Dimensions",
+ "spatial.roomPositions": "Room Positions",
+ "spatial.setDimensions": "Set Dimensions",
+ "spatial.setPositions": "Set Positions",
+ "spatial.up": "Up",
+ "spatial.front": "Front",
+ "spatial.left": "Left",
+ "spatial.right": "Right",
+ "spatial.back": "Back",
+ "spatial.down": "Down",
+ "spatial.listener": "Listener",
+ "spatial.audioSource": "Audio Source",
+ "settings.header.unfinished": "Unfinished",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "Scan the QR code to pair your phone up with this Cider instance",
+ "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors."
+}
diff --git a/src/i18n/es_ES.json b/src/i18n/es_ES.json
new file mode 100644
index 00000000..109705a1
--- /dev/null
+++ b/src/i18n/es_ES.json
@@ -0,0 +1,270 @@
+{
+ "i18n.languageName": "EspaÃąol (ES)",
+ "i18n.languageNameEnglish": "Spanish (Spain)",
+ "i18n.category": "main",
+ "i18n.authors": "@j.fl220",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "Cancelar",
+ "dialog.ok": "Aceptar",
+ "notification.updatingLibrarySongs": "Actualizando canciones de la biblioteca...",
+ "notification.updatingLibraryAlbums": "Actualizando ÃĄlbumes de la biblioteca...",
+ "notification.updatingLibraryArtists": "Actualizando biblioteca de artistas...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Leer mÃĄs",
+ "term.accountSettings": "Ajustes de la cuenta",
+ "term.logout": "Cerrar sesiÃŗn",
+ "term.login": "Iniciar sesiÃŗn",
+ "term.about": "MÃĄs informaciÃŗn",
+ "term.privateSession": "SesiÃŗn privada",
+ "term.queue": "En cola",
+ "term.search": "Buscar",
+ "term.library": "Biblioteca",
+ "term.listenNow": "Escuchar",
+ "term.browse": "Explorar",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "AÃąadido recientemente",
+ "term.songs": "Canciones",
+ "term.albums": "Ãlbumes",
+ "term.artists": "Artistas",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Playlists",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "Nueva playlist",
+ "term.newPlaylistFolder": "Nueva carpeta de playlists",
+ "term.createNewPlaylist": "Crear nueva playlists",
+ "term.createNewPlaylistFolder": "Crear nueva carpeta de playlists",
+ "term.deletePlaylist": "ÂŋEstÃĄ seguro que desea eliminar esta playlist?",
+ "term.play": "Reproducir",
+ "term.pause": "Pausar",
+ "term.previous": "Anterior",
+ "term.next": "Siguiente",
+ "term.shuffle": "Aleatorio",
+ "term.repeat": "Repetir",
+ "term.volume": "Volumen",
+ "term.mute": "Silenciar",
+ "term.unmute": "Desilenciar",
+ "term.share": "Compartir",
+ "term.settings": "Ajustes",
+ "term.seeAll": "Ver todo",
+ "term.sortBy": "Ordenar por",
+ "term.sortBy.album": "Ãlbum",
+ "term.sortBy.artist": "Artista",
+ "term.sortBy.name": "Nombre",
+ "term.sortBy.genre": "GÊnero",
+ "term.sortBy.releaseDate": "Fecha de lanzamiento",
+ "term.sortBy.duration": "DuraciÃŗn",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascendiente",
+ "term.sortOrder.descending": "Descendiente",
+ "term.viewAs": "Ver como",
+ "term.viewAs.coverArt": "CarÃĄtula",
+ "term.viewAs.list": "Lista",
+ "term.size": "TamaÃąo",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Compacto",
+ "term.enable": "Habilitar",
+ "term.disable": "Deshabilitar",
+ "term.enabled": "Activado",
+ "term.disabled": "Desactivado",
+ "term.connect": "Conectar",
+ "term.connecting": "Conectando",
+ "term.disconnect": "Desconectado",
+ "term.authed": "Autentificado",
+ "term.confirm": "ÂŋConfirmar?",
+ "term.more": "MÃĄs",
+ "term.less": "Menos",
+ "term.showMore": "Mostrar mÃĄs",
+ "term.showLess": "Mostrar menos",
+ "term.topSongs": "Top canciones",
+ "term.latestReleases": "Ãltimos lanzamientos",
+ "term.time.added": "AÃąadido",
+ "term.time.released": "Lanzado",
+ "term.time.updated": "Actualizado",
+ "term.time.hours": "horas",
+ "term.time.hour": "hora",
+ "term.time.minutes": "minutos",
+ "term.time.minute": "minuto",
+ "term.time.seconds": "segundos",
+ "term.time.second": "segundo",
+ "term.fullscreenView": "Pantalla completa",
+ "term.defaultView": "Vista por defecto",
+ "term.audioSettings": "Ajustes de audio",
+ "term.clearAll": "Borrar todo",
+ "term.recentStations": "Radios recientes",
+ "term.language": "Idioma",
+ "term.funLanguages": "Divertido",
+ "term.noLyrics": "Cargando... / Letra no encontrada./ Instrumental.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "Todos los derechos reservados.",
+ "term.sponsor": "Apoya este proyecto",
+ "term.ciderTeam": "Equipo Cider",
+ "term.developer": "Desarrollador",
+ "term.socialTeam": "Equipo RRSS",
+ "term.socials": "Redes sociales",
+ "term.contributors": "Contribuidores",
+ "term.equalizer": "Equalizador",
+ "term.reset": "Resetear",
+ "term.tracks": "canciones",
+ "term.videos": "VÃdeos",
+ "term.menu": "MenÃē",
+ "term.check": "Comprobar",
+ "term.aboutArtist": "MÃĄs sobre {{artistName}}",
+ "home.title": "Inicio",
+ "home.recentlyPlayed": "Reproducciones recientes",
+ "home.recentlyAdded": "AÃąadido recientemente",
+ "home.artistsFeed": "Historial de tus artistas",
+ "home.artistsFeed.noArtist": "Sigue primero a algunos artistas y sus Ãēltimos lanzamientos aparecerÃĄn aquÃ",
+ "home.madeForYou": "Hecho para ti",
+ "home.friendsListeningTo": "Tus amigos estÃĄn escuchando",
+ "home.followedArtists": "Artistas que sigues",
+ "error.appleMusicSubRequired": "Apple Music necesita una suscripciÃŗn.",
+ "error.connectionError": "Ha habido un problema al conectar con Apple Music.",
+ "error.noResults": "Sin resultados",
+ "error.noResults.description": "Intenta otra bÃēsqueda.",
+ "podcast.followOnCider": "Seguir en Cider",
+ "podcast.followedOnCider": "Siguiendo en Cider",
+ "podcast.subscribeOnItunes": "Suscribirse en iTunes",
+ "podcast.subscribedOnItunes": "Suscrito en iTunes",
+ "podcast.itunesStore": "Tienda de iTunes",
+ "podcast.episodes": "Episodios",
+ "podcast.playEpisode": "Iniciar Episodio",
+ "podcast.website": "Pagina del podcast",
+ "action.addToLibrary": "AÃąadir a la biblioteca",
+ "action.addToLibrary.success": "AÃąadido a la biblioteca",
+ "action.addToLibrary.error": "Error al aÃąadir a la biblioteca",
+ "action.removeFromLibrary": "Eliminar de la biblioteca",
+ "action.removeFromLibrary.success": "Eliminado de la biblioteca",
+ "action.addToQueue": "AÃąadir a la cola",
+ "action.addToQueue.success": "AÃąadido a la cola",
+ "action.addToQueue.error": "Error al aÃąadirlo a la cola",
+ "action.removeFromQueue": "Elimiar de la cola",
+ "action.removeFromQueue.success": "Eliminado de la cola",
+ "action.removeFromQueue.error": "Error al eliminarlo de la cola",
+ "action.createPlaylist": "Crear nueva playlist",
+ "action.addToPlaylist": "AÃąadir a la playlist",
+ "action.removeFromPlaylist": "Eliminar de la playlist",
+ "action.addToFavorites": "AÃąadir a favoritos",
+ "action.follow": "Seguir",
+ "action.follow.success": "Siguiendo",
+ "action.follow.error": "Error al seguir",
+ "action.unfollow": "Dejar de seguir",
+ "action.unfollow.success": "Has dejado de seguirle",
+ "action.unfollow.error": "Error al dejar de seguir",
+ "action.playNext": "Reproducir a continuaciÃŗn",
+ "action.playLater": "Reproducir al final",
+ "action.startRadio": "Crear emisora",
+ "action.goToArtist": "Ir al artista",
+ "action.goToAlbum": "Mostrar ÃĄlbum",
+ "action.moveToTop": "Mover a arriba",
+ "action.share": "Compartir",
+ "action.rename": "Renombrar",
+ "action.love": "Me gusta",
+ "action.unlove": "Eliminar me gusta",
+ "action.dislike": "Sugerir menos este estilo",
+ "action.undoDislike": "Sugerir este estilo",
+ "action.showWebRemoteQR": "ConexiÃŗn remota",
+ "action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} siguiente canciÃŗn",
+ "action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} como Ãēltima canciÃŗn",
+ "action.removeTracks": "Eliminar ${self.selectedItems.length} canciones de la cola",
+ "action.import": "Importar",
+ "action.export": "Exportar",
+ "action.showAlbum": "Mostrar ÃĄlbum completo",
+ "action.tray.minimize": "Mover a la bandeja",
+ "action.tray.quit": "Salir",
+ "action.tray.show": "Abrir",
+ "action.update": "Actualizar",
+ "settings.header.general": "General",
+ "settings.header.general.description": "Ajustes generales de Cider.",
+ "settings.option.general.language": "Idioma",
+ "settings.option.general.language.main": "Idiomas",
+ "settings.option.general.language.fun": "Idiomas divertidos",
+ "settings.option.general.language.unsorted": "Sin clasificar",
+ "settings.option.general.updateCider": "Actualizar Cider",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "Ajustes del audio de Cider.",
+ "settings.option.audio.quality": "Calidad de audio",
+ "settings.header.audio.quality.high": "Alto",
+ "settings.header.audio.quality.low": "Bajo",
+ "settings.header.audio.quality.auto": "Auto",
+ "settings.option.audio.seamlessTransition": "TransiciÃŗn de audio perfecta",
+ "settings.option.audio.enableAdvancedFunctionality": "Activar funciones avanzadas",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirÃĄ funciones de audio extendidas como NormalizaciÃŗn de audio, Ecualizadores y Visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las canciones.",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizar volumen",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza los picos altos de canciones para hacer la experiencia de escucha mejor.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "EspacializaciÃŗn del audio",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacializa mÃĄs el audio y conviÊrtelo mÃĄs 3-dimensional (nota: Esto no es Dolby Atmos)",
+ "settings.header.visual": "Visual",
+ "settings.header.visual.description": "Ajustes visuales para Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Estilo del fondo de la ventana",
+ "settings.header.visual.windowBackgroundStyle.none": "Nada",
+ "settings.header.visual.windowBackgroundStyle.artwork": "CarÃĄtula",
+ "settings.header.visual.windowBackgroundStyle.image": "Imagen",
+ "settings.option.visual.animatedArtwork": "CarÃĄtula animada",
+ "settings.header.visual.animatedArtwork.always": "Habilitar siempre",
+ "settings.header.visual.animatedArtwork.limited": "Limitado a algunas pÃĄginas",
+ "settings.header.visual.animatedArtwork.disable": "Deshabilitar en todas partes",
+ "settings.option.visual.animatedArtworkQuality": "Calidad de la carÃĄtula animada",
+ "settings.header.visual.animatedArtworkQuality.low": "Bajo",
+ "settings.header.visual.animatedArtworkQuality.medium": "Medio",
+ "settings.header.visual.animatedArtworkQuality.high": "Alto",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto",
+ "settings.header.visual.animatedArtworkQuality.extreme": "Extrema",
+ "settings.option.visual.animatedWindowBackground": "Fondo de la ventana animado",
+ "settings.option.visual.hardwareAcceleration": "AceleraciÃŗn del hardware",
+ "settings.option.visual.hardwareAcceleration.description": "La app requiere reinicio",
+ "settings.header.visual.hardwareAcceleration.default": "Por defecto",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.option.visual.showPersonalInfo": "Mostrar informaciÃŗn personal",
+ "settings.header.lyrics": "Letras",
+ "settings.header.lyrics.description": "Ajuste las letras para Cider",
+ "settings.option.lyrics.enableMusixmatch": "Habilitar las letras de Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Habilita el modo Karaoke (solo con Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Idioma de traducciÃŗn por defecto en Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "Habilitar las letras de Youtube para los videos con mÃēsica",
+ "settings.header.connectivity": "Conectividad",
+ "settings.header.connectivity.description": "Ajusta la conectividad para Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Notificaciones de reproducciÃŗn",
+ "settings.header.connectivity.discordRPC.cider": "Mostrar como 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Mostrar como 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Quitar Discord Rich Presence en pausa",
+ "settings.option.connectivity.lastfmScrobble": "Scrobbling Last.fm",
+ "settings.option.connectivity.lastfmScrobble.delay": "Delay del Scrobbling en Last.fm (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Habilitar 'Escuchando ahora' en Last.fm",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del tÃtulo de la canciÃŗn (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)",
+ "settings.header.experimental": "En pruebas",
+ "settings.header.experimental.description": "Ajustes en pruebas para Cider.",
+ "settings.option.experimental.compactUI": "Interfaz de usuario compacto",
+ "settings.option.experimental.close_button_hide": "El botÃŗn de cerrar minimizarÃĄ la aplicaciÃŗn en la bandeja",
+ "spatial.notTurnedOn": "La espacializaciÃŗn del audio esta desactivada. Para usarlo primero actÃvelo.",
+ "spatial.spatialProperties": "Propiedades espaciales",
+ "spatial.width": "Ancho",
+ "spatial.height": "Altura",
+ "spatial.depth": "Profundidad",
+ "spatial.gain": "Ganancia",
+ "spatial.roomMaterials": "Material de la habitaciÃŗn",
+ "spatial.roomDimensions": "DimensiÃŗn de la habitaciÃŗn",
+ "spatial.roomPositions": "Posiciones de la habitaciÃŗn",
+ "spatial.setDimensions": "Establecer dimensiones",
+ "spatial.setPositions": "Establecer posiciones",
+ "spatial.up": "Arriba",
+ "spatial.front": "Delante",
+ "spatial.left": "Izquierda",
+ "spatial.right": "Derecha",
+ "spatial.back": "AtrÃĄs",
+ "spatial.down": "Abajo",
+ "spatial.listener": "Oyente",
+ "spatial.audioSource": "Salida del audio",
+ "settings.header.unfinished": "Sin acabar",
+ "settings.header.unfinished.description": "Ajustes siendo testeados, no estÃĄn acabados.",
+ "remote.web.title": "Cider Remoto",
+ "remote.web.description": "Escanee el cÃŗdigo QR para emparejar su telÊfono con su cliente de Cider",
+ "about.thanks": "MuchÃsimas gracias al equipo de Cider Collective y tambiÊn a todos nuestros contribuidores."
+}
\ No newline at end of file
diff --git a/src/i18n/es_ES.jsonc b/src/i18n/es_ES.jsonc
deleted file mode 100644
index 6ad1ee9d..00000000
--- a/src/i18n/es_ES.jsonc
+++ /dev/null
@@ -1,312 +0,0 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "EspaÃąol (ES)", // name of language in native language
- "i18n.languageNameEnglish": "Spanish (Spain)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@j.fl220", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
- "app.name": "Cider",
-
- "date.format": "${d} ${m}, ${y}",
-
- // Dialogs
- "dialog.cancel": "Cancelar",
- "dialog.ok": "Aceptar",
-
- // Notification
- "notification.updatingLibrarySongs": "Actualizando canciones de la biblioteca...",
- "notification.updatingLibraryAlbums": "Actualizando ÃĄlbumes de la biblioteca...",
- "notification.updatingLibraryArtists": "Actualizando biblioteca de artistas...",
- // Terms
- "term.appleInc": "Apple Inc.",
- "term.appleMusic": "Apple Music",
- "term.applePodcasts": "Apple Podcasts",
- "term.itunes": "iTunes",
- "term.github": "GitHub",
- "term.discord": "Discord",
- "term.learnMore": "Leer mÃĄs",
- "term.accountSettings": "Ajustes de la cuenta",
- "term.logout": "Cerrar sesiÃŗn",
- "term.login": "Iniciar sesiÃŗn",
- "term.about": "MÃĄs informaciÃŗn",
- "term.privateSession": "SesiÃŗn privada",
- "term.queue": "En cola",
- "term.search": "Buscar",
- "term.library": "Biblioteca",
- "term.listenNow": "Escuchar",
- "term.browse": "Explorar",
- "term.radio": "Radio",
- "term.recentlyAdded": "AÃąadido recientemente",
- "term.songs": "Canciones",
- "term.albums": "Ãlbumes",
- "term.artists": "Artistas",
- "term.podcasts": "Podcasts",
- "term.playlists": "Playlists",
- "term.playlist": "Playlist",
- "term.newPlaylist": "Nueva playlist",
- "term.newPlaylistFolder": "Nueva carpeta de playlists",
- "term.createNewPlaylist": "Crear nueva playlists",
- "term.createNewPlaylistFolder": "Crear nueva carpeta de playlists",
- "term.deletePlaylist": "ÂŋEstÃĄ seguro que desea eliminar esta playlist?",
- "term.play": "Reproducir",
- "term.pause": "Pausar",
- "term.previous": "Anterior",
- "term.next": "Siguiente",
- "term.shuffle": "Aleatorio",
- "term.repeat": "Repetir",
- "term.volume": "Volumen",
- "term.mute": "Silenciar",
- "term.unmute": "Desilenciar",
- "term.share": "Compartir",
- "term.settings": "Ajustes",
- "term.seeAll": "Ver todo",
- "term.sortBy": "Ordenar por",
- "term.sortBy.album": "Ãlbum",
- "term.sortBy.artist": "Artista",
- "term.sortBy.name": "Nombre",
- "term.sortBy.genre": "GÊnero",
- "term.sortBy.releaseDate": "Fecha de lanzamiento",
- "term.sortBy.duration": "DuraciÃŗn",
- "term.sortOrder": "A-Z",
- "term.sortOrder.ascending": "Ascendiente",
- "term.sortOrder.descending": "Descendiente",
- "term.viewAs": "Ver como",
- "term.viewAs.coverArt": "CarÃĄtula",
- "term.viewAs.list": "Lista",
- "term.size": "TamaÃąo",
- "term.size.normal": "Normal",
- "term.size.compact": "Compacto",
- "term.enable": "Habilitar",
- "term.disable": "Deshabilitar",
- "term.enabled": "Activado",
- "term.disabled": "Desactivado",
- "term.connect": "Conectar",
- "term.connecting": "Conectando",
- "term.disconnect": "Desconectado",
- "term.authed": "Autentificado",
- "term.confirm": "ÂŋConfirmar?",
- "term.more": "MÃĄs",
- "term.less": "Menos",
- "term.showMore": "Mostrar mÃĄs",
- "term.showLess": "Mostrar menos",
- "term.topSongs" : "Top canciones",
- "term.latestReleases": "Ãltimos lanzamientos",
- "term.time.added": "AÃąadido",
- "term.time.released": "Lanzado",
- "term.time.updated": "Actualizado",
- "term.time.hours": "horas",
- "term.time.hour": "hora",
- "term.time.minutes": "minutos",
- "term.time.minute": "minuto",
- "term.time.seconds": "segundos",
- "term.time.second": "segundo",
- "term.fullscreenView": "Pantalla completa",
- "term.defaultView": "Vista por defecto",
- "term.audioSettings": "Ajustes de audio",
- "term.clearAll": "Borrar todo",
- "term.recentStations": "Radios recientes",
- "term.language": "Idioma",
- "term.funLanguages": "Divertido",
- "term.noLyrics": "Cargando... / Letra no encontrada./ Instrumental.",
- "term.copyright": "Copyright",
- "term.rightsReserved": "Todos los derechos reservados.",
- "term.sponsor": "Apoya este proyecto",
- "term.ciderTeam": "Equipo Cider",
- "term.developer": "Desarrollador",
- "term.socialTeam": "Equipo RRSS",
- "term.socials": "Redes sociales",
- "term.contributors": "Contribuidores",
- "term.equalizer": "Equalizador",
- "term.reset": "Resetear",
- "term.tracks": "canciones", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "VÃdeos",
- "term.menu": "MenÃē",
- "term.check": "Comprobar",
- "term.aboutArtist": "MÃĄs sobre {{artistName}}", // e.g. 'About Doja Cat'
- "term.updateCider": "Actualizar Cider",
-
- // Home
- "home.title": "Inicio",
- "home.recentlyPlayed": "Reproducciones recientes",
- "home.recentlyAdded": "AÃąadido recientemente",
- "home.artistsFeed": "Historial de tus artistas",
- "home.artistsFeed.noArtist": "Sigue primero a algunos artistas y sus Ãēltimos lanzamientos aparecerÃĄn aquÃ",
- "home.madeForYou": "Hecho para ti",
- "home.friendsListeningTo": "Tus amigos estÃĄn escuchando",
- "home.followedArtists": "Artistas que sigues",
- // Errors
- "error.appleMusicSubRequired": "Apple Music necesita una suscripciÃŗn.",
- "error.connectionError": "Ha habido un problema al conectar con Apple Music.",
- "error.noResults": "Sin resultados",
- "error.noResults.description": "Intenta otra bÃēsqueda.",
-
- //Podcasts
- "podcast.followOnCider": "Seguir en Cider",
- "podcast.followedOnCider": "Siguiendo en Cider",
- "podcast.subscribeOnItunes": "Suscribirse en iTunes",
- "podcast.subscribedOnItunes": "Suscrito en iTunes",
- "podcast.itunesStore": "Tienda de iTunes",
- "podcast.episodes": "Episodios",
- "podcast.playEpisode": "Iniciar Episodio",
- "podcast.website": "Pagina del podcast",
-
- // Actions
- "action.addToLibrary": "AÃąadir a la biblioteca",
- "action.addToLibrary.success": "AÃąadido a la biblioteca",
- "action.addToLibrary.error": "Error al aÃąadir a la biblioteca",
- "action.removeFromLibrary": "Eliminar de la biblioteca",
- "action.removeFromLibrary.success": "Eliminado de la biblioteca",
- "action.addToQueue": "AÃąadir a la cola",
- "action.addToQueue.success": "AÃąadido a la cola",
- "action.addToQueue.error": "Error al aÃąadirlo a la cola",
- "action.removeFromQueue": "Elimiar de la cola",
- "action.removeFromQueue.success": "Eliminado de la cola",
- "action.removeFromQueue.error": "Error al eliminarlo de la cola",
- "action.createPlaylist": "Crear nueva playlist",
- "action.addToPlaylist": "AÃąadir a la playlist",
- "action.removeFromPlaylist": "Eliminar de la playlist",
- "action.addToFavorites": "AÃąadir a favoritos",
- "action.follow": "Seguir",
- "action.follow.success": "Siguiendo",
- "action.follow.error": "Error al seguir",
- "action.unfollow": "Dejar de seguir",
- "action.unfollow.success": "Has dejado de seguirle",
- "action.unfollow.error": "Error al dejar de seguir",
- "action.playNext": "Reproducir a continuaciÃŗn",
- "action.playLater": "Reproducir al final",
- "action.startRadio": "Crear emisora",
- "action.goToArtist": "Ir al artista",
- "action.goToAlbum": "Mostrar ÃĄlbum",
- "action.moveToTop": "Mover a arriba",
- "action.share": "Compartir",
- "action.rename": "Renombrar",
- "action.love": "Me gusta",
- "action.unlove": "Eliminar me gusta",
- "action.dislike": "Sugerir menos este estilo",
- "action.undoDislike": "Sugerir este estilo",
- "action.showWebRemoteQR": "ConexiÃŗn remota",
- "action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} siguiente canciÃŗn",
- "action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} como Ãēltima canciÃŗn",
- "action.removeTracks": "Eliminar ${self.selectedItems.length} canciones de la cola",
- "action.import": "Importar",
- "action.export": "Exportar",
- "action.showAlbum": "Mostrar ÃĄlbum completo",
- "action.tray.minimize": "Mover a la bandeja",
- "action.tray.quit": "Salir",
- "action.tray.show": "Abrir",
- "action.update": "Actualizar",
-
- // Settings - General
- "settings.header.general": "General",
- "settings.header.general.description": "Ajustes generales de Cider.",
- "settings.option.general.language": "Idioma",
-
- // Language optgroups
- "settings.option.general.language.main": "Idiomas",
- "settings.option.general.language.fun": "Idiomas divertidos",
- "settings.option.general.language.unsorted": "Sin clasificar",
-
- // Settings - Audio
- "settings.header.audio": "Audio",
- "settings.header.audio.description": "Ajustes del audio de Cider.",
- "settings.option.audio.quality": "Calidad de audio", // Dropdown
- "settings.header.audio.quality.high": "Alto",
- "settings.header.audio.quality.low": "Bajo",
- "settings.header.audio.quality.auto": "Auto",
- "settings.option.audio.seamlessTransition": "TransiciÃŗn de audio perfecta", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Activar funciones avanzadas", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirÃĄ funciones de audio extendidas como NormalizaciÃŗn de audio, Ecualizadores y Visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las canciones.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizar volumen", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza los picos altos de canciones para hacer la experiencia de escucha mejor.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "EspacializaciÃŗn del audio", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacializa mÃĄs el audio y conviÊrtelo mÃĄs 3-dimensional (nota: Esto no es Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visual",
- "settings.header.visual.description": "Ajustes visuales para Cider.",
- "settings.option.visual.windowBackgroundStyle": "Estilo del fondo de la ventana", // Toggle
- "settings.header.visual.windowBackgroundStyle.none": "Nada",
- "settings.header.visual.windowBackgroundStyle.artwork": "CarÃĄtula",
- "settings.header.visual.windowBackgroundStyle.image": "Imagen",
- "settings.option.visual.animatedArtwork": "CarÃĄtula animada", // Dropdown
- "settings.header.visual.animatedArtwork.always": "Habilitar siempre",
- "settings.header.visual.animatedArtwork.limited": "Limitado a algunas pÃĄginas",
- "settings.header.visual.animatedArtwork.disable": "Deshabilitar en todas partes",
- "settings.option.visual.animatedArtworkQuality": "Calidad de la carÃĄtula animada", // Dropdown
- "settings.header.visual.animatedArtworkQuality.low": "Bajo",
- "settings.header.visual.animatedArtworkQuality.medium": "Medio",
- "settings.header.visual.animatedArtworkQuality.high": "Alto",
- "settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto",
- "settings.header.visual.animatedArtworkQuality.extreme": "Extrema",
- "settings.option.visual.animatedWindowBackground": "Fondo de la ventana animado", // Toggle
- "settings.option.visual.hardwareAcceleration": "AceleraciÃŗn del hardware", // Dropdown
- "settings.option.visual.hardwareAcceleration.description": "La app requiere reinicio",
- "settings.header.visual.hardwareAcceleration.default": "Por defecto",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Mostrar informaciÃŗn personal", // Toggle
-
- // Settings - Lyrics
- "settings.header.lyrics": "Letras",
- "settings.header.lyrics.description": "Ajuste las letras para Cider",
- "settings.option.lyrics.enableMusixmatch": "Habilitar las letras de Musixmatch", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Habilita el modo Karaoke (solo con Musixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Idioma de traducciÃŗn por defecto en Musixmatch", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Habilitar las letras de Youtube para los videos con mÃēsica", // Toggle
-
- // Settings - Connectivity
- "settings.header.connectivity": "Conectividad",
- "settings.header.connectivity.description": "Ajusta la conectividad para Cider.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "Notificaciones de reproducciÃŗn", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "Mostrar como 'Cider'",
- "settings.header.connectivity.discordRPC.appleMusic": "Mostrar como 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "Quitar Discord Rich Presence en pausa", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Scrobbling Last.fm", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "Delay del Scrobbling en Last.fm (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Habilitar 'Escuchando ahora' en Last.fm",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del tÃtulo de la canciÃŗn (Last.fm)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
- "settings.header.experimental": "En pruebas",
- "settings.header.experimental.description": "Ajustes en pruebas para Cider.",
- "settings.option.experimental.compactUI": "Interfaz de usuario compacto", // Toggle
- "settings.option.experimental.close_button_hide": "El botÃŗn de cerrar minimizarÃĄ la aplicaciÃŗn en la bandeja",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.notTurnedOn": "La espacializaciÃŗn del audio esta desactivada. Para usarlo primero actÃvelo.",
- "spatial.spatialProperties": "Propiedades espaciales",
- "spatial.width": "Ancho",
- "spatial.height": "Altura",
- "spatial.depth": "Profundidad",
- "spatial.gain": "Ganancia",
- "spatial.roomMaterials": "Material de la habitaciÃŗn",
- "spatial.roomDimensions": "DimensiÃŗn de la habitaciÃŗn",
- "spatial.roomPositions": "Posiciones de la habitaciÃŗn",
- "spatial.setDimensions": "Establecer dimensiones",
- "spatial.setPositions": "Establecer posiciones",
- "spatial.up": "Arriba",
- "spatial.front": "Delante",
- "spatial.left": "Izquierda",
- "spatial.right": "Derecha",
- "spatial.back": "AtrÃĄs",
- "spatial.down": "Abajo",
- "spatial.listener": "Oyente",
- "spatial.audioSource": "Salida del audio",
-
- // Settings - Unfinished
- "settings.header.unfinished": "Sin acabar",
- "settings.header.unfinished.description": "Ajustes siendo testeados, no estÃĄn acabados.",
-
- // Web Remote
- "remote.web.title": "Cider Remoto",
- "remote.web.description": "Escanee el cÃŗdigo QR para emparejar su telÊfono con su cliente de Cider",
-
- // About
- "about.thanks": "MuchÃsimas gracias al equipo de Cider Collective y tambiÊn a todos nuestros contribuidores."
- }
diff --git a/src/i18n/fr_CA.jsonc b/src/i18n/fr_CA.json
similarity index 78%
rename from src/i18n/fr_CA.jsonc
rename to src/i18n/fr_CA.json
index 132cf845..64e22373 100644
--- a/src/i18n/fr_CA.jsonc
+++ b/src/i18n/fr_CA.json
@@ -1,299 +1,257 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "Français (CA)", // name of language in native language
- "i18n.languageNameEnglish": "French (CA)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "brock#7527", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
- "app.name": "Cider",
-
- "date.format": "${m} ${d}, ${y}",
-
- // Dialogs
- "dialog.cancel": "Annuler",
- "dialog.ok": "D'accord",
-
- // Notification
- "notification.updatingLibrarySongs": "RafraÃŽchir des chansons...",
- "notification.updatingLibraryAlbums": "RafraÃŽchir des albums...",
- "notification.updatingLibraryArtists": "RafraÃŽchir des artistes...",
- // Terms
- "term.appleInc": "Apple Inc.",
- "term.appleMusic": "Apple Music",
- "term.applePodcasts": "Apple Podcasts",
- "term.itunes": "iTunes",
- "term.github": "GitHub",
- "term.discord": "Discord",
- "term.learnMore": "Savoir plus",
- "term.accountSettings": "RÊglages du compte",
- "term.logout": "Se dÊconnecter",
- "term.login": "Se connecter",
- "term.about": "Ã propos",
- "term.privateSession": "Session en privÊe",
- "term.queue": "Suivants",
- "term.search": "Rechercher",
- "term.library": "Bibliothèque",
- "term.listenNow": "à Êcouter",
- "term.browse": "Parcourir",
- "term.radio": "Radio",
- "term.recentlyAdded": "AjoutÊ rÊcemment",
- "term.songs": "Chansons",
- "term.albums": "Albums",
- "term.artists": "Artistes",
- "term.podcasts": "Podcasts",
- "term.playlists": "Listes de lecture",
- "term.playlist": "Liste de lecture",
- "term.play": "Ãcouter",
- "term.pause": "Pause",
- "term.previous": "Retour",
- "term.next": "Suivant",
- "term.shuffle": "Lecture alÊatoire",
- "term.repeat": "RÊpÊter",
- "term.volume": "Volume",
- "term.mute": "Assourde",
- "term.unmute": "RÊactiver",
- "term.share": "Partager",
- "term.settings": "RÊglages",
- "term.seeAll": "Voix tous",
- "term.sortBy": "Sorter par",
- "term.sortBy.album": "Album",
- "term.sortBy.artist": "Artiste",
- "term.sortBy.name": "Nom",
- "term.sortBy.genre": "Genre",
- "term.sortBy.releaseDate": "Date de sortie",
- "term.sortBy.duration": "Duration",
- "term.sortOrder": "A-Z",
- "term.sortOrder.ascending": "Ascender",
- "term.sortOrder.descending": "Descender",
- "term.viewAs": "Voix comme",
- "term.viewAs.coverArt": "Art de couverture",
- "term.viewAs.list": "Liste",
- "term.size": "Grandeur",
- "term.size.normal": "Normal",
- "term.size.compact": "Compacte",
- "term.enable": "Activer",
- "term.disable": "DÊsactiver",
- "term.enabled": "ActivÊe",
- "term.disabled": "DÊsactivÊe",
- "term.connect": "Connecter",
- "term.connecting": "De liaison",
- "term.disconnect": "DÊconnecter",
- "term.authed": "Authed",
- "term.confirm": "Confirmer ?",
- "term.more": "De plus",
- "term.less": "De moins",
- "term.showMore": "Voir plus",
- "term.showLess": "Voir moins",
- "term.topSongs" : "Meilleures chansons",
- "term.latestReleases": "Nouvelles sorties",
- "term.time.added": "AjoutÊ",
- "term.time.released": "PubliÊ",
- "term.time.updated": "Mis à jour",
- "term.time.hours": "heures",
- "term.time.hour": "heur",
- "term.time.minutes": "minutes",
- "term.time.minute": "minute",
- "term.time.seconds": "secondes",
- "term.time.second": "seconde",
- "term.fullscreenView": "Vue plein Êcran",
- "term.defaultView": "Vue par dÊfaut",
- "term.spacializedAudioSetting": "RÊglage audio spacialisÊ",
- "term.clearAll": "Tout effacer",
- "term.recentStations": "Stations rÊcentes",
- "term.language": "Langue",
- "term.funLanguages": "Amusement",
- "term.noLyrics": "Loading... / Paroles pas trouvÊ./ Instrumental.",
- "term.copyright": "Droits d'auteur",
- "term.rightsReserved": "Tous les droits sont rÊservÊs.",
- "term.sponsor": "Parrainez ce projet",
- "term.ciderTeam": "Team Cider",
- "term.developer": "DÊveloppeur",
- "term.socialTeam": "Ãquipe sociale",
- "term.contributors": "Contributeurs",
- "term.equalizer": "Ãgaliseur",
- "term.reset": "RÊinitialiser",
- "term.tracks": "chansons", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "VidÊos",
- "term.menu": "Menu",
- "action.showAlbum": "Afficher l'album complet",
-
- // Home
- "home.title": "Maison",
- "home.recentlyPlayed": "JouÊ rÊcemment",
- "home.recentlyAdded": "AjoutÊ rÊcemment",
- "home.artistsFeed": "Votre flux d'artistes",
- "home.artistsFeed.noArtist": "Suivez certains artistes en premier et leurs dernières sorties seront ici",
- "home.madeForYou": "CreÊr pour toi",
- "home.friendsListeningTo": "Amis Êcoutant",
- "home.followedArtists": "Artistes suivis",
- // Errors
- "error.appleMusicSubRequired": "Apple Music nÊcessite un abonnement.",
- "error.connectionError": "Un problème est survenu lors de la connexion à Apple Music.",
- "error.noResults": "Pas de resultats.",
- "error.noResults.description": "Essayez une nouvelle recherche.",
-
- //Podcasts
- "podcast.followOnCider": "Suivez sur Cider",
- "podcast.followedOnCider": "Suivi sur Cider",
- "podcast.subscribeOnItunes": "S'abonner sur iTunes",
- "podcast.subscribedOnItunes": "AbonnÊ sur iTunes",
- "podcast.itunesStore": "iTunes Store",
- "podcast.episodes": "Ãpisodes",
- "podcast.playEpisode": "Lire l'Êpisode",
- "podcast.website": "Site web du Podcast",
-
- // Actions
- "action.addToLibrary": "Ajouter à biblio",
- "action.addToLibrary.success": "AjoutÊ à biblio",
- "action.addToLibrary.error": "Erreur lors de l'ajout à biblio",
- "action.removeFromLibrary": "Enlever du biblio",
- "action.removeFromLibrary.success": "EnlevÊ du biblio",
- "action.addToQueue": "Ajouter à suivants",
- "action.addToQueue.success": "AjoutÊ à suivants",
- "action.addToQueue.error": "Erreur lors de l'ajout à suivants",
- "action.removeFromQueue": "Enlever du suivants",
- "action.removeFromQueue.success": "EnlevÊ du suivants",
- "action.removeFromQueue.error": "Erreur lors d'enleve du suivants",
- "action.addToPlaylist": "Ajoute à liste de lecture",
- "action.removeFromPlaylist": "Enleve de liste de lecture",
- "action.addToFavorites": "Ajoute à Favorites",
- "action.follow": "Suivre",
- "action.follow.success": "Suivi",
- "action.follow.error": "Erreur a suivre",
- "action.unfollow": "Arreter a suivi",
- "action.unfollow.success": "Arreter a suivre",
- "action.unfollow.error": "Erreur de arreter à suivre",
- "action.playNext": "Jouer en prochaine",
- "action.playLater": "Jouer plus tard",
- "action.startRadio": "Commencer la radio",
- "action.goToArtist": "Aller à l'artiste",
- "action.goToAlbum": "Aller à l'album",
- "action.moveToTop": "DÊplacer vers le haut",
- "action.share": "Partager",
- "action.rename": "Renommer",
- "action.love": "J'adore",
- "action.unlove": "Je n'adore plus",
- "action.dislike": "Moins de suggestions similaires",
- "action.undoDislike": "Annuler le choix Moins de suggestions de ce type",
- "action.showWebRemoteQR": "Demontrer la Web Remote QR",
- "action.playTracksNext": "Joue ${app.selectedMediaItems.length} chansons en prochain",
- "action.playTracksLater": "Joue ${app.selectedMediaItems.length} chansons plus tard",
- "action.removeTracks": "Remove ${self.selectedItems.length} tracks from queue",
- "action.import": "Importer",
- "action.export": "Exporter",
-
- // Settings - General
- "settings.header.general": "RÊglages gÊnÊraux",
- "settings.header.general.description": "RÊglez les rÊglages gÊnÊraux de Cider.",
- "settings.option.general.language": "Langue",
-
- // Language optgroups
- "settings.option.general.language.main": "Langue",
- "settings.option.general.language.fun": "Langues amusantes",
- "settings.option.general.language.unsorted": "Non triÊ",
-
- // Settings - Audio
- "settings.header.audio": "Audio",
- "settings.header.audio.description": "RÊglez les rÊglages audio de Cider.",
- "settings.option.audio.quality": "QualitÊ audio", // Dropdown
- "settings.header.audio.quality.high": "Haut",
- "settings.header.audio.quality.low": "Bas",
- "settings.header.audio.quality.auto": "Auto",
- "settings.option.audio.seamlessTransition": "Transition audio fluide", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Activer la fonctionnalitÊ avancÊe", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "L'activation de la fonctionnalitÊ AudioContext permettra des fonctionnalitÊs audio Êtendues telles que la normalisation audio, les Êgaliseurs et les visualiseurs, mais sur certains systèmes, cela peut provoquer des saccades dans les chansons audio.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisation audio", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour crÊer une expÊrience d'Êcoute plus uniforme.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialisez l'audio et rendez l'audio plus tridimensionnel (remarque: il ne s'agit pas de Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visuel",
- "settings.header.visual.description": "Ajustez les rÊglages visuels de Cider.",
- "settings.option.visual.windowBackgroundStyle": "Style d'arrière-plan de la window", // Toggle
- "settings.header.visual.windowBackgroundStyle.none": "Rien",
- "settings.header.visual.windowBackgroundStyle.artwork": "Ouvrages d'art",
- "settings.header.visual.windowBackgroundStyle.image": "Image",
- "settings.option.visual.animatedArtwork": "Oeuvre animÊe", // Dropdown
- "settings.header.visual.animatedArtwork.always": "Toujours",
- "settings.header.visual.animatedArtwork.limited": "LimitÊ aux pages et aux entrÊes spÊciales",
- "settings.header.visual.animatedArtwork.disable": "DÊsactiver partout",
- "settings.option.visual.animatedArtworkQuality": "QualitÊ des illustrations animÊes", // Dropdown
- "settings.header.visual.animatedArtworkQuality.low": "Bas",
- "settings.header.visual.animatedArtworkQuality.medium": "Moyen",
- "settings.header.visual.animatedArtworkQuality.high": "Haut",
- "settings.header.visual.animatedArtworkQuality.veryHigh": "Très haut",
- "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÃĒme",
- "settings.option.visual.animatedWindowBackground": "Fond de window animÊ", // Toggle
- "settings.option.visual.hardwareAcceleration": "AccÊlÊration matÊrielle", // Dropdown
- "settings.option.visual.hardwareAcceleration.description": "NÊcessite une relance",
- "settings.header.visual.hardwareAcceleration.default": "DÊfaut",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Afficher les informations personnelles", // Toggle
-
- // Settings - Lyrics
- "settings.header.lyrics": "Paroles",
- "settings.header.lyrics.description": "Ajustez les rÊglages des paroles de Cider.",
- "settings.option.lyrics.enableMusixmatch": "Activer les paroles de Musixmatch", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Activer le mode karaokÊ (Musixmatch uniquement)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Traduction Musixmatch langue prÊfÊrÊe", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Activer les paroles Youtube pour les clips vidÊo", // Toggle
-
- // Settings - Connectivity
- "settings.header.connectivity": "ConnectivitÊ",
- "settings.header.connectivity.description": "Ajustez les rÊglages de connectivitÊ pour Cider.",
- "settings.option.connectivity.discordRPC": "Discord Riche PrÊsence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "Notifications de lecture", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "Afficher comme 'Cider'",
- "settings.header.connectivity.discordRPC.appleMusic": "Afficher comme 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "Effacer la Discord Riche PrÊsence en pause", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Scrobbling LastFM", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "DÊlai de scrobble LastFM (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer LastFM en jouer maitenant",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer la chanson en boucle (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
- "settings.header.experimental": "ExpÊrimental",
- "settings.header.experimental.description": "Ajustez les rÊglages expÊrimentaux pour Cider.",
- "settings.option.experimental.compactUI": "UI Compact", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "Comportement du bouton de fermeture",
- "settings.option.experimental.closeButtonBehaviour.quit": "Quitter Cider",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "RÊduire à la barre des tÃĸches",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "RÊduire dans le bac",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.spatialProperties" : "PropriÊtÊs spatiales",
- "spatial.width" : "Largeur",
- "spatial.height" : "Hauteur",
- "spatial.depth" : "Profondeur",
- "spatial.gain" : "Gagner",
- "spatial.roomMaterials" : "MatÊriaux de la chambre",
- "spatial.roomDimensions" : "Dimensions de la chambre",
- "spatial.roomPositions" : "Positions de la chambre",
- "spatial.setDimensions" : "DÊfinir les cotes",
- "spatial.setPositions" : "DÊfinir les positions",
- "spatial.up" : "Haut",
- "spatial.front" : "Avant",
- "spatial.left" : "Gauche",
- "spatial.right" : "Droite",
- "spatial.back" : "Arrière",
- "spatial.down" : "Bas",
- "spatial.listener" : "Auditeur",
- "spatial.audioSource" : "Source audio",
-
- // Settings - Unfinished
- "settings.header.unfinished": "InachevÊe",
-
- // Web Remote
- "remote.web.title": "Cider Remote",
- "remote.web.description": "Scannez le code QR pour coupler votre tÊlÊphone avec cette instance Cider",
-
- // About
- "about.thanks": "Un grand merci à l'Êquipe de Cider Collective et à tous nos contributeurs."
+{
+ "i18n.languageName": "Français (CA)",
+ "i18n.languageNameEnglish": "French (CA)",
+ "i18n.category": "main",
+ "i18n.authors": "brock#7527",
+ "app.name": "Cider",
+ "date.format": "${m} ${d}, ${y}",
+ "dialog.cancel": "Annuler",
+ "dialog.ok": "D'accord",
+ "notification.updatingLibrarySongs": "RafraÃŽchir des chansons...",
+ "notification.updatingLibraryAlbums": "RafraÃŽchir des albums...",
+ "notification.updatingLibraryArtists": "RafraÃŽchir des artistes...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Savoir plus",
+ "term.accountSettings": "RÊglages du compte",
+ "term.logout": "Se dÊconnecter",
+ "term.login": "Se connecter",
+ "term.about": "Ã propos",
+ "term.privateSession": "Session en privÊe",
+ "term.queue": "Suivants",
+ "term.search": "Rechercher",
+ "term.library": "Bibliothèque",
+ "term.listenNow": "à Êcouter",
+ "term.browse": "Parcourir",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "AjoutÊ rÊcemment",
+ "term.songs": "Chansons",
+ "term.albums": "Albums",
+ "term.artists": "Artistes",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Listes de lecture",
+ "term.playlist": "Liste de lecture",
+ "term.play": "Ãcouter",
+ "term.pause": "Pause",
+ "term.previous": "Retour",
+ "term.next": "Suivant",
+ "term.shuffle": "Lecture alÊatoire",
+ "term.repeat": "RÊpÊter",
+ "term.volume": "Volume",
+ "term.mute": "Assourde",
+ "term.unmute": "RÊactiver",
+ "term.share": "Partager",
+ "term.settings": "RÊglages",
+ "term.seeAll": "Voix tous",
+ "term.sortBy": "Sorter par",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Artiste",
+ "term.sortBy.name": "Nom",
+ "term.sortBy.genre": "Genre",
+ "term.sortBy.releaseDate": "Date de sortie",
+ "term.sortBy.duration": "Duration",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascender",
+ "term.sortOrder.descending": "Descender",
+ "term.viewAs": "Voix comme",
+ "term.viewAs.coverArt": "Art de couverture",
+ "term.viewAs.list": "Liste",
+ "term.size": "Grandeur",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Compacte",
+ "term.enable": "Activer",
+ "term.disable": "DÊsactiver",
+ "term.enabled": "ActivÊe",
+ "term.disabled": "DÊsactivÊe",
+ "term.connect": "Connecter",
+ "term.connecting": "De liaison",
+ "term.disconnect": "DÊconnecter",
+ "term.authed": "Authed",
+ "term.confirm": "Confirmer ?",
+ "term.more": "De plus",
+ "term.less": "De moins",
+ "term.showMore": "Voir plus",
+ "term.showLess": "Voir moins",
+ "term.topSongs": "Meilleures chansons",
+ "term.latestReleases": "Nouvelles sorties",
+ "term.time.added": "AjoutÊ",
+ "term.time.released": "PubliÊ",
+ "term.time.updated": "Mis à jour",
+ "term.time.hours": "heures",
+ "term.time.hour": "heur",
+ "term.time.minutes": "minutes",
+ "term.time.minute": "minute",
+ "term.time.seconds": "secondes",
+ "term.time.second": "seconde",
+ "term.fullscreenView": "Vue plein Êcran",
+ "term.defaultView": "Vue par dÊfaut",
+ "term.spacializedAudioSetting": "RÊglage audio spacialisÊ",
+ "term.clearAll": "Tout effacer",
+ "term.recentStations": "Stations rÊcentes",
+ "term.language": "Langue",
+ "term.funLanguages": "Amusement",
+ "term.noLyrics": "Loading... / Paroles pas trouvÊ./ Instrumental.",
+ "term.copyright": "Droits d'auteur",
+ "term.rightsReserved": "Tous les droits sont rÊservÊs.",
+ "term.sponsor": "Parrainez ce projet",
+ "term.ciderTeam": "Team Cider",
+ "term.developer": "DÊveloppeur",
+ "term.socialTeam": "Ãquipe sociale",
+ "term.contributors": "Contributeurs",
+ "term.equalizer": "Ãgaliseur",
+ "term.reset": "RÊinitialiser",
+ "term.tracks": "chansons",
+ "term.videos": "VidÊos",
+ "term.menu": "Menu",
+ "action.showAlbum": "Afficher l'album complet",
+ "home.title": "Maison",
+ "home.recentlyPlayed": "JouÊ rÊcemment",
+ "home.recentlyAdded": "AjoutÊ rÊcemment",
+ "home.artistsFeed": "Votre flux d'artistes",
+ "home.artistsFeed.noArtist": "Suivez certains artistes en premier et leurs dernières sorties seront ici",
+ "home.madeForYou": "CreÊr pour toi",
+ "home.friendsListeningTo": "Amis Êcoutant",
+ "home.followedArtists": "Artistes suivis",
+ "error.appleMusicSubRequired": "Apple Music nÊcessite un abonnement.",
+ "error.connectionError": "Un problème est survenu lors de la connexion à Apple Music.",
+ "error.noResults": "Pas de resultats.",
+ "error.noResults.description": "Essayez une nouvelle recherche.",
+ "podcast.followOnCider": "Suivez sur Cider",
+ "podcast.followedOnCider": "Suivi sur Cider",
+ "podcast.subscribeOnItunes": "S'abonner sur iTunes",
+ "podcast.subscribedOnItunes": "AbonnÊ sur iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Ãpisodes",
+ "podcast.playEpisode": "Lire l'Êpisode",
+ "podcast.website": "Site web du Podcast",
+ "action.addToLibrary": "Ajouter à biblio",
+ "action.addToLibrary.success": "AjoutÊ à biblio",
+ "action.addToLibrary.error": "Erreur lors de l'ajout à biblio",
+ "action.removeFromLibrary": "Enlever du biblio",
+ "action.removeFromLibrary.success": "EnlevÊ du biblio",
+ "action.addToQueue": "Ajouter à suivants",
+ "action.addToQueue.success": "AjoutÊ à suivants",
+ "action.addToQueue.error": "Erreur lors de l'ajout à suivants",
+ "action.removeFromQueue": "Enlever du suivants",
+ "action.removeFromQueue.success": "EnlevÊ du suivants",
+ "action.removeFromQueue.error": "Erreur lors d'enleve du suivants",
+ "action.addToPlaylist": "Ajoute à liste de lecture",
+ "action.removeFromPlaylist": "Enleve de liste de lecture",
+ "action.addToFavorites": "Ajoute à Favorites",
+ "action.follow": "Suivre",
+ "action.follow.success": "Suivi",
+ "action.follow.error": "Erreur a suivre",
+ "action.unfollow": "Arreter a suivi",
+ "action.unfollow.success": "Arreter a suivre",
+ "action.unfollow.error": "Erreur de arreter à suivre",
+ "action.playNext": "Jouer en prochaine",
+ "action.playLater": "Jouer plus tard",
+ "action.startRadio": "Commencer la radio",
+ "action.goToArtist": "Aller à l'artiste",
+ "action.goToAlbum": "Aller à l'album",
+ "action.moveToTop": "DÊplacer vers le haut",
+ "action.share": "Partager",
+ "action.rename": "Renommer",
+ "action.love": "J'adore",
+ "action.unlove": "Je n'adore plus",
+ "action.dislike": "Moins de suggestions similaires",
+ "action.undoDislike": "Annuler le choix Moins de suggestions de ce type",
+ "action.showWebRemoteQR": "Demontrer la Web Remote QR",
+ "action.playTracksNext": "Joue ${app.selectedMediaItems.length} chansons en prochain",
+ "action.playTracksLater": "Joue ${app.selectedMediaItems.length} chansons plus tard",
+ "action.removeTracks": "Remove ${self.selectedItems.length} tracks from queue",
+ "action.import": "Importer",
+ "action.export": "Exporter",
+ "settings.header.general": "RÊglages gÊnÊraux",
+ "settings.header.general.description": "RÊglez les rÊglages gÊnÊraux de Cider.",
+ "settings.option.general.language": "Langue",
+ "settings.option.general.language.main": "Langue",
+ "settings.option.general.language.fun": "Langues amusantes",
+ "settings.option.general.language.unsorted": "Non triÊ",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "RÊglez les rÊglages audio de Cider.",
+ "settings.option.audio.quality": "QualitÊ audio",
+ "settings.header.audio.quality.high": "Haut",
+ "settings.header.audio.quality.low": "Bas",
+ "settings.header.audio.quality.auto": "Auto",
+ "settings.option.audio.seamlessTransition": "Transition audio fluide",
+ "settings.option.audio.enableAdvancedFunctionality": "Activer la fonctionnalitÊ avancÊe",
+ "settings.option.audio.enableAdvancedFunctionality.description": "L'activation de la fonctionnalitÊ AudioContext permettra des fonctionnalitÊs audio Êtendues telles que la normalisation audio, les Êgaliseurs et les visualiseurs, mais sur certains systèmes, cela peut provoquer des saccades dans les chansons audio.",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisation audio",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour crÊer une expÊrience d'Êcoute plus uniforme.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialisez l'audio et rendez l'audio plus tridimensionnel (remarque: il ne s'agit pas de Dolby Atmos)",
+ "settings.header.visual": "Visuel",
+ "settings.header.visual.description": "Ajustez les rÊglages visuels de Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Style d'arrière-plan de la window",
+ "settings.header.visual.windowBackgroundStyle.none": "Rien",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Ouvrages d'art",
+ "settings.header.visual.windowBackgroundStyle.image": "Image",
+ "settings.option.visual.animatedArtwork": "Oeuvre animÊe",
+ "settings.header.visual.animatedArtwork.always": "Toujours",
+ "settings.header.visual.animatedArtwork.limited": "LimitÊ aux pages et aux entrÊes spÊciales",
+ "settings.header.visual.animatedArtwork.disable": "DÊsactiver partout",
+ "settings.option.visual.animatedArtworkQuality": "QualitÊ des illustrations animÊes",
+ "settings.header.visual.animatedArtworkQuality.low": "Bas",
+ "settings.header.visual.animatedArtworkQuality.medium": "Moyen",
+ "settings.header.visual.animatedArtworkQuality.high": "Haut",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Très haut",
+ "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÃĒme",
+ "settings.option.visual.animatedWindowBackground": "Fond de window animÊ",
+ "settings.option.visual.hardwareAcceleration": "AccÊlÊration matÊrielle",
+ "settings.option.visual.hardwareAcceleration.description": "NÊcessite une relance",
+ "settings.header.visual.hardwareAcceleration.default": "DÊfaut",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.option.visual.showPersonalInfo": "Afficher les informations personnelles",
+ "settings.header.lyrics": "Paroles",
+ "settings.header.lyrics.description": "Ajustez les rÊglages des paroles de Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Activer les paroles de Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Activer le mode karaokÊ (Musixmatch uniquement)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Traduction Musixmatch langue prÊfÊrÊe",
+ "settings.option.lyrics.enableYoutubeLyrics": "Activer les paroles Youtube pour les clips vidÊo",
+ "settings.header.connectivity": "ConnectivitÊ",
+ "settings.header.connectivity.description": "Ajustez les rÊglages de connectivitÊ pour Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Riche PrÊsence",
+ "settings.option.connectivity.playbackNotifications": "Notifications de lecture",
+ "settings.header.connectivity.discordRPC.cider": "Afficher comme 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Afficher comme 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Effacer la Discord Riche PrÊsence en pause",
+ "settings.option.connectivity.lastfmScrobble": "Scrobbling LastFM",
+ "settings.option.connectivity.lastfmScrobble.delay": "DÊlai de scrobble LastFM (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer LastFM en jouer maitenant",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer la chanson en boucle (LastFM)",
+ "settings.header.experimental": "ExpÊrimental",
+ "settings.header.experimental.description": "Ajustez les rÊglages expÊrimentaux pour Cider.",
+ "settings.option.experimental.compactUI": "UI Compact",
+ "settings.option.experimental.closeButtonBehaviour": "Comportement du bouton de fermeture",
+ "settings.option.experimental.closeButtonBehaviour.quit": "Quitter Cider",
+ "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "RÊduire à la barre des tÃĸches",
+ "settings.option.experimental.closeButtonBehaviour.minimizeTray": "RÊduire dans le bac",
+ "spatial.spatialProperties": "PropriÊtÊs spatiales",
+ "spatial.width": "Largeur",
+ "spatial.height": "Hauteur",
+ "spatial.depth": "Profondeur",
+ "spatial.gain": "Gagner",
+ "spatial.roomMaterials": "MatÊriaux de la chambre",
+ "spatial.roomDimensions": "Dimensions de la chambre",
+ "spatial.roomPositions": "Positions de la chambre",
+ "spatial.setDimensions": "DÊfinir les cotes",
+ "spatial.setPositions": "DÊfinir les positions",
+ "spatial.up": "Haut",
+ "spatial.front": "Avant",
+ "spatial.left": "Gauche",
+ "spatial.right": "Droite",
+ "spatial.back": "Arrière",
+ "spatial.down": "Bas",
+ "spatial.listener": "Auditeur",
+ "spatial.audioSource": "Source audio",
+ "settings.header.unfinished": "InachevÊe",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "Scannez le code QR pour coupler votre tÊlÊphone avec cette instance Cider",
+ "about.thanks": "Un grand merci à l'Êquipe de Cider Collective et à tous nos contributeurs."
}
\ No newline at end of file
diff --git a/src/i18n/fr_FR.json b/src/i18n/fr_FR.json
new file mode 100644
index 00000000..63e14a26
--- /dev/null
+++ b/src/i18n/fr_FR.json
@@ -0,0 +1,301 @@
+{
+ "i18n.languageName": "Français",
+ "i18n.languageNameEnglish": "French",
+ "i18n.category": "main",
+ "i18n.authors": "@ErwanGit",
+ "app.name": "Cider",
+ "date.format": "${d} ${m} ${y}",
+ "dialog.cancel": "Annuler",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Mise à jour des chansons de la bibliothèque...",
+ "notification.updatingLibraryAlbums": "Mise à jour des albums de la bibliothèque...",
+ "notification.updatingLibraryArtists": "Mise à jour des artistes de la bibliothèque...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "En savoir plus",
+ "term.accountSettings": "Paramètres du compte",
+ "term.logout": "DÊconnexion",
+ "term.login": "Connexion",
+ "term.about": "Ã propos",
+ "term.privateSession": "Session privÊe",
+ "term.queue": "File d'attente",
+ "term.history": "Historique",
+ "term.search": "Recherche",
+ "term.library": "Bibliothèque",
+ "term.listenNow": "Ãcoutez maintenant",
+ "term.browse": "Explorer",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "AjoutÊ rÊcemment",
+ "term.songs": "Musiques",
+ "term.albums": "Albums",
+ "term.artists": "Artistes",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Playlists",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "Nouvelle Playlist",
+ "term.newPlaylistFolder": "Nouveau dossier de playlist",
+ "term.createNewPlaylist": "CrÊer une nouvelle playlist",
+ "term.createNewPlaylistFolder": "Create New Playlist Folder",
+ "term.deletePlaylist": "Ãtes-vous sÃģr de vouloir supprimer cette playlist ?",
+ "term.play": "Lecture",
+ "term.pause": "Pause",
+ "term.previous": "PrÊcÊdent",
+ "term.next": "Suivant",
+ "term.shuffle": "AlÊatoire",
+ "term.repeat": "RÊpÊter",
+ "term.volume": "Volume",
+ "term.mute": "Rendre muet",
+ "term.unmute": "Ne plus rendre muet",
+ "term.share": "Partager",
+ "term.settings": "Paramètres",
+ "term.share.success": "CopiÊ dans le presse-papier",
+ "term.seeAll": "Voir tout",
+ "term.sortBy": "Trier par",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Artiste",
+ "term.sortBy.name": "Nom",
+ "term.sortBy.genre": "Genre",
+ "term.sortBy.releaseDate": "Date de sortie",
+ "term.sortBy.duration": "DurÊe",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascendant",
+ "term.sortOrder.descending": "Descendant",
+ "term.viewAs": "Voir comme",
+ "term.viewAs.coverArt": "Pochette d'album",
+ "term.viewAs.list": "Liste",
+ "term.size": "Taille",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Compacte",
+ "term.enable": "Activer",
+ "term.disable": "DÊsactiver",
+ "term.enabled": "ActivÊ",
+ "term.disabled": "DÊsactivÊ",
+ "term.connect": "Connecter",
+ "term.connecting": "Connexion",
+ "term.disconnect": "DÊconnexion",
+ "term.authed": "AuthentifiÊ",
+ "term.confirm": "Confirmer ?",
+ "term.more": "Plus",
+ "term.less": "Moins",
+ "term.showMore": "Afficher plus",
+ "term.showLess": "Afficher moins",
+ "term.topSongs": "Meilleurs titres",
+ "term.latestReleases": "Dernières sorties",
+ "term.time.added": "AjoutÊ",
+ "term.time.released": "PubliÊ",
+ "term.time.updated": "Mis à jour",
+ "term.time.hours": "heures",
+ "term.time.hour": "heure",
+ "term.time.minutes": "minutes",
+ "term.time.minute": "minute",
+ "term.time.seconds": "secondes",
+ "term.time.second": "seconde",
+ "term.fullscreenView": "Vue plein Êcran",
+ "term.defaultView": "Vue par dÊfaut",
+ "term.spacializedAudioSetting": "Paramètres audio spatialisÊs",
+ "term.clearAll": "Tout effacer",
+ "term.recentStations": "Stations rÊcentes",
+ "term.language": "Langue",
+ "term.funLanguages": "Amusant",
+ "term.noLyrics": "Chargement... / Paroles non trouvÊ./ Instrumental.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "Tous droits rÊservÊs.",
+ "term.sponsor": "Soutenez ce projet",
+ "term.ciderTeam": "Ãquipe Cider",
+ "term.developer": "DÊveloppeur",
+ "term.socialTeam": "Ãquipe de communication",
+ "term.socials": "RÊseaux sociaux",
+ "term.contributors": "Contributeurs",
+ "term.equalizer": "Ãgaliseur",
+ "term.reset": "RÊinitialiser",
+ "term.tracks": "musiques",
+ "term.videos": "VidÊos",
+ "term.menu": "Menu",
+ "term.check": "VÊrifier",
+ "term.aboutArtist": "Ã propos de {{artistName}}",
+ "term.topResult": "Meilleurs rÊsultats",
+ "term.sharedPlaylists": "Playlists partagÊes",
+ "term.people": "Personnes",
+ "term.newpreset.name": "Nouveau nom du prÊrÊglage de l'Êgaliseur",
+ "term.addedpreset": "Ajout d'un prÊrÊglage",
+ "term.deletepreset.warn": "Ãtes-vous sÃģr de vouloir supprimer ce prÊrÊglage ?",
+ "term.deletedpreset": "Suppression d'un prÊrÊglage",
+ "term.musicVideos": "VidÊos musicales",
+ "term.stations": "Stations",
+ "term.curators": "Curateurs",
+ "term.appleCurators": "Curateurs Apple",
+ "term.radioShows": "Ãmissions de radio",
+ "term.recordLabels": "Labels de disques",
+ "term.videoExtras": "VidÊos bonus",
+ "term.top": "Top",
+ "home.title": "Accueil",
+ "home.recentlyPlayed": "JouÊ rÊcemment",
+ "home.recentlyAdded": "RÊcemment ajoutÊ",
+ "home.artistsFeed": "Votre file d'artistes",
+ "home.artistsFeed.noArtist": "Suivez d'abord certains artistes et leurs dernières sorties seront ici",
+ "home.madeForYou": "Fait pour vous",
+ "home.friendsListeningTo": "Vos amis Êcoutent",
+ "home.followedArtists": "Artistes suivis",
+ "error.appleMusicSubRequired": "Apple Music nÊcessite un abonnement.",
+ "error.connectionError": "Il y a eu un problème de connexion à Apple Music.",
+ "error.noResults": "Aucun rÊsultat.",
+ "error.noResults.description": "Essayez une nouvelle recherche.",
+ "podcast.followOnCider": "Suivre sur Cider",
+ "podcast.followedOnCider": "Suivi sur Cider",
+ "podcast.subscribeOnItunes": "Suivre sur iTunes",
+ "podcast.subscribedOnItunes": "Suivi sur iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Ãpisodes",
+ "podcast.playEpisode": "Lire l'Êpisode",
+ "podcast.website": "Site du podcast",
+ "action.addToLibrary": "Ajouter à la bibliothèque",
+ "action.addToLibrary.success": "AjoutÊ à la bibliothèque",
+ "action.addToLibrary.error": "Erreur lors de l'ajout à la bibliothèque",
+ "action.removeFromLibrary": "Retirer de la bibliothèque",
+ "action.removeFromLibrary.success": "RetirÊ de la bibliothèque",
+ "action.addToQueue": "Ajouter à la file d'attente",
+ "action.addToQueue.success": "AjoutÊ à la file d'attente",
+ "action.addToQueue.error": "Erreur lors de l'ajout à la file d'attente",
+ "action.removeFromQueue": "Retirer de la file d'attente",
+ "action.removeFromQueue.success": "RetirÊ de la file d'attente",
+ "action.removeFromQueue.error": "Erreur lors du retrait de la file d'attente",
+ "action.createPlaylist": "CrÊer une nouvelle playlist",
+ "action.addToPlaylist": "Ajouter à une playlist",
+ "action.removeFromPlaylist": "Retirer de la playlist",
+ "action.addToFavorites": "Ajouter aux favoris",
+ "action.follow": "Suivre",
+ "action.follow.success": "Suivi",
+ "action.follow.error": "Erreur lors de l'abonnement",
+ "action.unfollow": "Se dÊsabonner",
+ "action.unfollow.success": "DÊsabonnÊ",
+ "action.unfollow.error": "Erreur lors du dÊsabonnement",
+ "action.playNext": "Jouer après",
+ "action.playLater": "Jouer plus tard",
+ "action.startRadio": "Lancer la radio",
+ "action.goToArtist": "Aller à l'artiste",
+ "action.goToAlbum": "Aller à l'album",
+ "action.moveToTop": "Haut de page",
+ "action.share": "Partager",
+ "action.rename": "Renommer",
+ "action.love": "Aimer",
+ "action.unlove": "Ne plus aimer",
+ "action.dislike": "Je n'aime pas",
+ "action.undoDislike": "Je n'aime plus",
+ "action.showWebRemoteQR": "Afficher le QR Code de la tÊlÊcommande à distance",
+ "action.playTracksNext": "Jouer ${app.selectedMediaItems.length} musiques après",
+ "action.playTracksLater": "Jouer ${app.selectedMediaItems.length} musiques plus tard",
+ "action.removeTracks": "Retirer ${self.selectedItems.length} musiques de la file d'attente",
+ "action.import": "Importer",
+ "action.export": "Exporter",
+ "action.showAlbum": "Afficher l'album complet",
+ "action.tray.minimize": "RÊduire dans la barre d'outils",
+ "action.tray.quit": "Quitter",
+ "action.tray.show": "Afficher",
+ "action.update": "Mettre à jour",
+ "action.copy": "Copier",
+ "action.newpreset": "Nouveau prÊrÊglage...",
+ "action.deletepreset": "Supprimer le prÊrÊglage",
+ "settings.header.general": "GÊnÊral",
+ "settings.header.general.description": "Ajuster les paramètres gÊnÊraux de Cider.",
+ "settings.option.general.language": "Langue",
+ "settings.option.general.language.main": "Langues",
+ "settings.option.general.language.fun": "Langues amusantes",
+ "settings.option.general.language.unsorted": "Non triÊ",
+ "settings.option.general.updateCider": "Mettre à jour Cider",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "Ajuster les paramètres audio de Cider.",
+ "settings.option.audio.quality": "QualitÊ Audio",
+ "settings.header.audio.quality.hireslossless": "Lossless haute qualitÊ (Hi-Res)",
+ "settings.header.audio.quality.hireslossless.description": "(jusqu'Ã 24 bits/192 kHz)",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "(jusqu'Ã 24 bits/48 kHz)",
+ "settings.header.audio.quality.enhanced": "AmÊliorÊ",
+ "settings.header.audio.quality.high": "ÃlevÊe",
+ "settings.header.audio.quality.low": "Faible",
+ "settings.header.audio.quality.auto": "Automatique",
+ "settings.option.audio.seamlessTransition": "Fondu audio transparent",
+ "settings.option.audio.enableAdvancedFunctionality": "Activer les fonctions avancÊes",
+ "settings.option.audio.enableAdvancedFunctionality.description": "L'activation de la fonctionnalitÊ AudioContext permet d'utiliser des fonctions audio Êtendues telles que la normalisation du son, les Êgaliseurs et les visualiseurs. Toutefois, sur certains systèmes, cela peut provoquer des bÊgaiements dans les pistes audio.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Moteur de traitement psycho-acoustique Cider",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Un processus de traitement qui fait croire à votre cerveau que les fichiers sont de meilleure qualitÊ.",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisation du son",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour crÊer une expÊrience d'Êcoute plus uniforme.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spatialisation audio",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialiser l'audio et rendre l'audio plus tridimensionnel (note: Ce n'est pas Dolby Atmos)",
+ "settings.header.visual": "Visuel",
+ "settings.header.visual.description": "Ajuster les paramètres visuels de Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Style d'arrière-plan de la fenÃĒtre",
+ "settings.header.visual.windowBackgroundStyle.none": "Aucun",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Pochette d'album",
+ "settings.header.visual.windowBackgroundStyle.image": "Image",
+ "settings.option.visual.animatedArtwork": "Pochette d'album animÊe",
+ "settings.header.visual.animatedArtwork.always": "Toujours",
+ "settings.header.visual.animatedArtwork.limited": "LimitÊ aux pages et aux entrÊes spÊciales",
+ "settings.header.visual.animatedArtwork.disable": "DÊsactiver partout",
+ "settings.option.visual.animatedArtworkQuality": "QualitÊ de la pochette d'album animÊe",
+ "settings.header.visual.animatedArtworkQuality.low": "Faible",
+ "settings.header.visual.animatedArtworkQuality.medium": "Moyen",
+ "settings.header.visual.animatedArtworkQuality.high": "ÃlevÊe",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Très ÊlevÊe",
+ "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÃĒme",
+ "settings.option.visual.animatedWindowBackground": "Arrière-plan de fenÃĒtre animÊ",
+ "settings.option.visual.hardwareAcceleration": "AccÊlÊration matÊrielle",
+ "settings.option.visual.hardwareAcceleration.description": "NÊcessite un relancement",
+ "settings.header.visual.hardwareAcceleration.default": "DÊfaut",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Thème",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Sombre",
+ "settings.option.visual.showPersonalInfo": "Afficher vos informations personnelles",
+ "settings.header.lyrics": "Paroles",
+ "settings.header.lyrics.description": "Ajuster les paramètres des paroles pour Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Activer les paroles Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Activer le mode karaokÊ (Musixmatch seulement)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Langue prÊfÊrÊe pour les traductions Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "Activer les paroles YouTube pour les vidÊos de musique",
+ "settings.header.connectivity": "ConnectivitÊ",
+ "settings.header.connectivity.description": "Ajuster les paramètres de connectivitÊ de Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Notifications de lecture",
+ "settings.header.connectivity.discordRPC.cider": "Afficher comme 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Afficher comme 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "DÊsactiver le Discord Rich Presence quand la musique est en pause",
+ "settings.option.connectivity.lastfmScrobble": "Scrobble LastFM",
+ "settings.option.connectivity.lastfmScrobble.delay": "DÊlai de Scrobble LastFM (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer la lecture en cours sur LastFM",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer les titres en boucle (LastFM)",
+ "settings.header.experimental": "ExpÊrimental",
+ "settings.header.experimental.description": "Ajuster les paramètres expÊrimentaux de Cider.",
+ "settings.option.experimental.compactUI": "Interface utilisateur compacte",
+ "settings.option.experimental.close_button_hide": "Le bouton de fermeture doit masquer l'application",
+ "settings.option.experimental.copy_log": "Copier les logs dans le presse-papier",
+ "settings.option.experimental.inline_playlists": "Playlists et albums en ligne",
+ "spatial.notTurnedOn": "La spatialisation audio est dÊsactivÊe. Pour l'utiliser, vous devez d'abord l'activer.",
+ "spatial.spatialProperties": "PropriÊtÊs spatiales",
+ "spatial.width": "Largeur",
+ "spatial.height": "Hauteur",
+ "spatial.depth": "Profondeur",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "MatÊriaux de la pièce",
+ "spatial.roomDimensions": "Dimensions de la pièce",
+ "spatial.roomPositions": "Positions de la pièce",
+ "spatial.setDimensions": "DÊfinir les dimensions",
+ "spatial.setPositions": "DÊfinir les positions",
+ "spatial.up": "Haut",
+ "spatial.front": "Avant",
+ "spatial.left": "Gauche",
+ "spatial.right": "Droite",
+ "spatial.back": "Retour",
+ "spatial.down": "Bas",
+ "spatial.listener": "Auditeur",
+ "spatial.audioSource": "Source Audio",
+ "settings.header.unfinished": "InachevÊe",
+ "remote.web.title": "Cider à distance",
+ "remote.web.description": "Scanner le QR code pour associer votre tÊlÊphone avec cette instance Cider",
+ "about.thanks": "Un grand merci à l'Êquipe de la Cider Collective et à tous nos contributeurs."
+}
\ No newline at end of file
diff --git a/src/i18n/fr_FR.jsonc b/src/i18n/fr_FR.jsonc
deleted file mode 100644
index 83ecc9e2..00000000
--- a/src/i18n/fr_FR.jsonc
+++ /dev/null
@@ -1,300 +0,0 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "Français", // name of language in native language
- "i18n.languageNameEnglish": "French", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@ErwanGit", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
- "app.name": "Cider",
-
- "date.format": "${d} ${m} ${y}",
-
- // Dialogs
- "dialog.cancel": "Annuler",
- "dialog.ok": "OK",
-
- // Notification
- "notification.updatingLibrarySongs": "Mise à jour des chansons de la bibliothèque...",
- "notification.updatingLibraryAlbums": "Mise à jour des albums de la bibliothèque...",
- "notification.updatingLibraryArtists": "Mise à jour des artistes de la bibliothèque...",
- // Terms
- "term.appleInc": "Apple Inc.",
- "term.appleMusic": "Apple Music",
- "term.applePodcasts": "Apple Podcasts",
- "term.itunes": "iTunes",
- "term.github": "GitHub",
- "term.discord": "Discord",
- "term.learnMore": "En savoir plus",
- "term.accountSettings": "Paramètres du compte",
- "term.logout": "DÊconnexion",
- "term.login": "Connexion",
- "term.about": "Ã propos",
- "term.privateSession": "Session privÊe",
- "term.queue": "File d'attente",
- "term.search": "Recherche",
- "term.library": "Bibliothèque",
- "term.listenNow": "Ãcoutez maintenant",
- "term.browse": "Explorer",
- "term.radio": "Radio",
- "term.recentlyAdded": "AjoutÊ rÊcemment",
- "term.songs": "Musiques",
- "term.albums": "Albums",
- "term.artists": "Artistes",
- "term.podcasts": "Podcasts",
- "term.playlists": "Playlists",
- "term.playlist": "Playlist",
- "term.play": "Lecture",
- "term.pause": "Pause",
- "term.previous": "PrÊcÊdent",
- "term.next": "Suivant",
- "term.shuffle": "AlÊatoire",
- "term.repeat": "RÊpÊter",
- "term.volume": "Volume",
- "term.mute": "Rendre muet",
- "term.unmute": "Ne plus rendre muet",
- "term.share": "Partager",
- "term.settings": "Paramètres",
- "term.seeAll": "Voir tout",
- "term.sortBy": "Trier par",
- "term.sortBy.album": "Album",
- "term.sortBy.artist": "Artiste",
- "term.sortBy.name": "Nom",
- "term.sortBy.genre": "Genre",
- "term.sortBy.releaseDate": "Date de sortie",
- "term.sortBy.duration": "DurÊe",
- "term.sortOrder": "A-Z",
- "term.sortOrder.ascending": "Ascendant",
- "term.sortOrder.descending": "Descendant",
- "term.viewAs": "Voir comme",
- "term.viewAs.coverArt": "Pochette d'album",
- "term.viewAs.list": "Liste",
- "term.size": "Taille",
- "term.size.normal": "Normal",
- "term.size.compact": "Compacte",
- "term.enable": "Activer",
- "term.disable": "DÊsactiver",
- "term.enabled": "ActivÊ",
- "term.disabled": "DÊsactivÊ",
- "term.connect": "Connecter",
- "term.connecting": "Connexion",
- "term.disconnect": "DÊconnexion",
- "term.authed": "AuthentifiÊ",
- "term.confirm": "Confirmer ?",
- "term.more": "Plus",
- "term.less": "Moins",
- "term.showMore": "Afficher plus",
- "term.showLess": "Afficher moins",
- "term.topSongs" : "Meilleurs titres",
- "term.latestReleases": "Dernières sorties",
- "term.time.added": "AjoutÊ",
- "term.time.released": "PubliÊ",
- "term.time.updated": "Mis à jour",
- "term.time.hours": "heures",
- "term.time.hour": "heure",
- "term.time.minutes": "minutes",
- "term.time.minute": "minute",
- "term.time.seconds": "secondes",
- "term.time.second": "seconde",
- "term.fullscreenView": "Vue plein Êcran",
- "term.defaultView": "Vue par dÊfaut",
- "term.spacializedAudioSetting": "Paramètres audio spatialisÊs",
- "term.clearAll": "Tout effacer",
- "term.recentStations": "Stations rÊcentes",
- "term.language": "Langue",
- "term.funLanguages": "Amusant",
- "term.noLyrics": "Chargement... / Paroles non trouvÊ./ Instrumental.",
- "term.copyright": "Copyright",
- "term.rightsReserved": "Tous droits rÊservÊs.",
- "term.sponsor": "Soutenez ce projet",
- "term.ciderTeam": "Ãquipe Cider",
- "term.developer": "DÊveloppeur",
- "term.socialTeam": "Ãquipe de communication",
- "term.contributors": "Contributeurs",
- "term.equalizer": "Ãgaliseur",
- "term.reset": "RÊinitialiser",
- "term.tracks": "musiques", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "VidÊos",
- "term.menu": "Menu",
- "action.showAlbum": "Afficher l'album complet",
-
- // Home
- "home.title": "Accueil",
- "home.recentlyPlayed": "JouÊ rÊcemment",
- "home.recentlyAdded": "RÊcemment ajoutÊ",
- "home.artistsFeed": "Votre file d'artistes",
- "home.artistsFeed.noArtist": "Suivez d'abord certains artistes et leurs dernières sorties seront ici",
- "home.madeForYou": "Fait pour vous",
- "home.friendsListeningTo": "Vos amis Êcoutent",
- "home.followedArtists": "Artistes suivis",
- // Errors
- "error.appleMusicSubRequired": "Apple Music nÊcessite un abonnement.",
- "error.connectionError": "Il y a eu un problème de connexion à Apple Music.",
- "error.noResults": "Aucun rÊsultat.",
- "error.noResults.description": "Essayez une nouvelle recherche.",
-
- //Podcasts
- "podcast.followOnCider": "Suivre sur Cider",
- "podcast.followedOnCider": "Suivi sur Cider",
- "podcast.subscribeOnItunes": "Suivre sur iTunes",
- "podcast.subscribedOnItunes": "Suivi sur iTunes",
- "podcast.itunesStore": "iTunes Store",
- "podcast.episodes": "Ãpisodes",
- "podcast.playEpisode": "Lire l'Êpisode",
- "podcast.website": "Site du podcast",
-
- // Actions
- "action.addToLibrary": "Ajouter à la bibliothèque",
- "action.addToLibrary.success": "AjoutÊ à la bibliothèque",
- "action.addToLibrary.error": "Erreur lors de l'ajout à la bibliothèque",
- "action.removeFromLibrary": "Retirer de la bibliothèque",
- "action.removeFromLibrary.success": "RetirÊ de la bibliothèque",
- "action.addToQueue": "Ajouter à la file d'attente",
- "action.addToQueue.success": "AjoutÊ à la file d'attente",
- "action.addToQueue.error": "Erreur lors de l'ajout à la file d'attente",
- "action.removeFromQueue": "Retirer de la file d'attente",
- "action.removeFromQueue.success": "RetirÊ de la file d'attente",
- "action.removeFromQueue.error": "Erreur lors du retrait de la file d'attente",
- "action.addToPlaylist": "Ajouter à une playlist",
- "action.removeFromPlaylist": "Retirer de la playlist",
- "action.addToFavorites": "Ajouter aux favoris",
- "action.follow": "Suivre",
- "action.follow.success": "Suivi",
- "action.follow.error": "Erreur lors de l'abonnement",
- "action.unfollow": "Se dÊsabonner",
- "action.unfollow.success": "DÊsabonnÊ",
- "action.unfollow.error": "Erreur lors du dÊsabonnement",
- "action.playNext": "Jouer après",
- "action.playLater": "Jouer plus tard",
- "action.startRadio": "Lancer la radio",
- "action.goToArtist": "Aller à l'artiste",
- "action.goToAlbum": "Aller à l'album",
- "action.moveToTop": "Haut de page",
- "action.share": "Partager",
- "action.rename": "Renommer",
- "action.love": "Aimer",
- "action.unlove": "Ne plus aimer",
- "action.dislike": "Je n'aime pas",
- "action.undoDislike": "Je n'aime plus",
- "action.showWebRemoteQR": "Afficher le QR Code de la tÊlÊcommande à distance",
- "action.playTracksNext": "Jouer ${app.selectedMediaItems.length} musiques après",
- "action.playTracksLater": "Jouer ${app.selectedMediaItems.length} musiques plus tard",
- "action.removeTracks": "Retirer ${self.selectedItems.length} musiques de la file d'attente",
- "action.import": "Importer",
- "action.export": "Exporter",
-
- // Settings - General
- "settings.header.general": "GÊnÊral",
- "settings.header.general.description": "Ajuster les paramètres gÊnÊraux de Cider.",
- "settings.option.general.language": "Langue",
-
- // Language optgroups
- "settings.option.general.language.main": "Langues",
- "settings.option.general.language.fun": "Langues amusantes",
- "settings.option.general.language.unsorted": "Non triÊ",
-
- // Settings - Audio
- "settings.header.audio": "Audio",
- "settings.header.audio.description": "Ajuster les paramètres audio de Cider.",
- "settings.option.audio.quality": "QualitÊ Audio", // Dropdown
- "settings.header.audio.quality.high": "ÃlevÊe",
- "settings.header.audio.quality.low": "Faible",
- "settings.header.audio.quality.auto": "Automatique",
- "settings.option.audio.seamlessTransition": "Fondu audio transparent", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Activer les fonctions avancÊes", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "L'activation de la fonctionnalitÊ AudioContext permet d'utiliser des fonctions audio Êtendues telles que la normalisation du son, les Êgaliseurs et les visualiseurs. Toutefois, sur certains systèmes, cela peut provoquer des bÊgaiements dans les pistes audio.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisation du son", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour crÊer une expÊrience d'Êcoute plus uniforme.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spatialisation audio", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialiser l'audio et rendre l'audio plus tridimensionnel (note: Ce n'est pas Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visuel",
- "settings.header.visual.description": "Ajuster les paramètres visuels de Cider.",
- "settings.option.visual.windowBackgroundStyle": "Style d'arrière-plan de la fenÃĒtre", // Toggle
- "settings.header.visual.windowBackgroundStyle.none": "Aucun",
- "settings.header.visual.windowBackgroundStyle.artwork": "Pochette d'album",
- "settings.header.visual.windowBackgroundStyle.image": "Image",
- "settings.option.visual.animatedArtwork": "Pochette d'album animÊe", // Dropdown
- "settings.header.visual.animatedArtwork.always": "Toujours",
- "settings.header.visual.animatedArtwork.limited": "LimitÊ aux pages et aux entrÊes spÊciales",
- "settings.header.visual.animatedArtwork.disable": "DÊsactiver partout",
- "settings.option.visual.animatedArtworkQuality": "QualitÊ de la pochette d'album animÊe", // Dropdown
- "settings.header.visual.animatedArtworkQuality.low": "Faible",
- "settings.header.visual.animatedArtworkQuality.medium": "Moyen",
- "settings.header.visual.animatedArtworkQuality.high": "ÃlevÊe",
- "settings.header.visual.animatedArtworkQuality.veryHigh": "Très ÊlevÊe",
- "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÃĒme",
- "settings.option.visual.animatedWindowBackground": "Arrière-plan de fenÃĒtre animÊ", // Toggle
- "settings.option.visual.hardwareAcceleration": "AccÊlÊration matÊrielle", // Dropdown
- "settings.option.visual.hardwareAcceleration.description": "NÊcessite un relancement",
- "settings.header.visual.hardwareAcceleration.default": "DÊfaut",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Afficher vos informations personnelles", // Toggle
-
- // Settings - Lyrics
- "settings.header.lyrics": "Paroles",
- "settings.header.lyrics.description": "Ajuster les paramètres des paroles pour Cider.",
- "settings.option.lyrics.enableMusixmatch": "Activer les paroles Musixmatch", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Activer le mode karaokÊ (Musixmatch seulement)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Langue prÊfÊrÊe pour les traductions Musixmatch", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Activer les paroles YouTube pour les vidÊos de musique", // Toggle
-
- // Settings - Connectivity
- "settings.header.connectivity": "ConnectivitÊ",
- "settings.header.connectivity.description": "Ajuster les paramètres de connectivitÊ de Cider.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "Notifications de lecture", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "Afficher comme 'Cider'",
- "settings.header.connectivity.discordRPC.appleMusic": "Afficher comme 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "DÊsactiver le Discord Rich Presence quand la musique est en pause", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Scrobble LastFM", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "DÊlai de Scrobble LastFM (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer la lecture en cours sur LastFM",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer les titres en boucle (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
- "settings.header.experimental": "ExpÊrimental",
- "settings.header.experimental.description": "Ajuster les paramètres expÊrimentaux de Cider.",
- "settings.option.experimental.compactUI": "Interface utilisateur compacte", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "Comportement du bouton de fermeture",
- "settings.option.experimental.closeButtonBehaviour.quit": "Quitter Cider",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "RÊduire dans la barre des tÃĸches",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "RÊduire dans la barre d'outils",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.spatialProperties": "PropriÊtÊs spatiales",
- "spatial.width": "Largeur",
- "spatial.height": "Hauteur",
- "spatial.depth": "Profondeur",
- "spatial.gain": "Gain",
- "spatial.roomMaterials": "MatÊriaux de la pièce",
- "spatial.roomDimensions": "Dimensions de la pièce",
- "spatial.roomPositions": "Positions de la pièce",
- "spatial.setDimensions": "DÊfinir les dimensions",
- "spatial.setPositions": "DÊfinir les positions",
- "spatial.up": "Haut",
- "spatial.front": "Avant",
- "spatial.left": "Gauche",
- "spatial.right": "Droite",
- "spatial.back": "Retour",
- "spatial.down": "Bas",
- "spatial.listener": "Auditeur",
- "spatial.audioSource": "Source Audio",
-
- // Settings - Unfinished
- "settings.header.unfinished": "InachevÊe",
-
- // Web Remote
- "remote.web.title": "Cider Remote",
- "remote.web.description": "Scanner le QR code pour associer votre tÊlÊphone avec cette instance Cider",
-
- // About
- "about.thanks": "Un grand merci à l'Êquipe de la Cider Collective et à tous nos contributeurs."
- }
-
\ No newline at end of file
diff --git a/src/i18n/en_US.jsonc b/src/i18n/hi_IN.json
similarity index 54%
rename from src/i18n/en_US.jsonc
rename to src/i18n/hi_IN.json
index 0436c4e7..ba5afe31 100644
--- a/src/i18n/en_US.jsonc
+++ b/src/i18n/hi_IN.json
@@ -1,100 +1,92 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "English (US)", // name of language in native language
- "i18n.languageNameEnglish": "English (US)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+{
+ "i18n.languageName": "ā¤šā¤ŋ⤍āĨā¤ĻāĨ",
+ "i18n.languageNameEnglish": "Hindi",
+ "i18n.category": "main",
+ "i18n.authors": "@maikirakiwi @vringster",
"app.name": "Cider",
-
"date.format": "${m} ${d}, ${y}",
-
- // Dialogs
- "dialog.cancel": "Cancel",
- "dialog.ok": "OK",
-
- // Notification
- "notification.updatingLibrarySongs": "Updating library songs...",
- "notification.updatingLibraryAlbums": "Updating library albums...",
- "notification.updatingLibraryArtists": "Updating library artists...",
- // Terms
+ "dialog.cancel": "⤰āĨā¤āĨā¤",
+ "dialog.ok": "⤠āĨā¤ ā¤šāĨ",
+ "notification.updatingLibrarySongs": "ā¤
ā¤Ēā¤ĄāĨā¤ā¤ŋā¤ā¤ ā¤˛ā¤žā¤ā¤ŦāĨ⤰āĨ⤰āĨ ā¤āĨ ā¤ā¤žā¤¨āĨ...",
+ "notification.updatingLibraryAlbums": "ā¤
ā¤Ēā¤ĄāĨā¤ā¤ŋā¤ā¤ ā¤˛ā¤žā¤ā¤ŦāĨ⤰āĨ⤰āĨ ā¤āĨ ā¤ā¤˛āĨā¤Ŧā¤Ž...",
+ "notification.updatingLibraryArtists": "ā¤
ā¤Ēā¤ĄāĨā¤ā¤ŋā¤ā¤ ā¤˛ā¤žā¤ā¤ŦāĨ⤰āĨ⤰āĨ ā¤āĨ ā¤ā¤˛ā¤žā¤ā¤žā¤°...",
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
"term.itunes": "iTunes",
"term.github": "GitHub",
"term.discord": "Discord",
- "term.learnMore": "Learn more",
- "term.accountSettings": "Account Settings",
- "term.logout": "Logout",
- "term.login": "Login",
- "term.about": "About",
- "term.privateSession": "Private Session",
- "term.queue": "Queue",
- "term.search": "Search",
- "term.library": "Library",
- "term.listenNow": "Listen Now",
- "term.browse": "Browse",
- "term.radio": "Radio",
- "term.recentlyAdded": "Recently Added",
- "term.songs": "Songs",
- "term.albums": "Albums",
- "term.artists": "Artists",
- "term.podcasts": "Podcasts",
- "term.playlists": "Playlists",
- "term.playlist": "Playlist",
- "term.newPlaylist": "New Playlist",
- "term.newPlaylistFolder": "New Playlist Folder",
- "term.createNewPlaylist": "Create New Playlist",
- "term.createNewPlaylistFolder": "Create New Playlist Folder",
- "term.deletePlaylist": "Are you sure you want to delete this playlist?",
- "term.play": "Play",
- "term.pause": "Pause",
- "term.previous": "Previous",
- "term.next": "Next",
- "term.shuffle": "Shuffle",
- "term.repeat": "Repeat",
- "term.volume": "Volume",
- "term.mute": "Mute",
- "term.unmute": "Unmute",
- "term.share": "Share",
- "term.settings": "Settings",
- "term.seeAll": "See All",
- "term.sortBy": "Sort By",
- "term.sortBy.album": "Album",
- "term.sortBy.artist": "Artist",
- "term.sortBy.name": "Name",
- "term.sortBy.genre": "Genre",
- "term.sortBy.releaseDate": "Release Date",
- "term.sortBy.duration": "Duration",
- "term.sortOrder": "A-Z",
- "term.sortOrder.ascending": "Ascending",
- "term.sortOrder.descending": "Descending",
- "term.viewAs": "View As",
- "term.viewAs.coverArt": "Cover Art",
- "term.viewAs.list": "List",
- "term.size": "Size",
- "term.size.normal": "Normal",
- "term.size.compact": "Compact",
- "term.enable": "Enable",
- "term.disable": "Disable",
- "term.enabled": "Enabled",
- "term.disabled": "Disabled",
- "term.connect": "Connect",
- "term.connecting": "Connecting",
- "term.disconnect": "Disconnect",
- "term.authed": "Authed",
- "term.confirm": "Confirm ?",
- "term.more": "More",
- "term.less": "Less",
- "term.showMore": "Show more",
- "term.showLess": "Show less",
- "term.topSongs" : "Top Songs",
+ "term.learnMore": "ā¤ā¤° ā¤ā¤žā¤¨ā¤ŋā¤",
+ "term.accountSettings": "ā¤ā¤žā¤¤ā¤ž ⤏āĨā¤ā¤ŋā¤ā¤āĨ⤏",
+ "term.logout": "⤞āĨ⤠ā¤ā¤ā¤",
+ "term.login": "⤞āĨ⤠ā¤ā¤¨",
+ "term.about": "ā¤āĨ ā¤Ŧā¤žā¤°āĨ ā¤ŽāĨā¤",
+ "term.privateSession": "ā¤āĨā¤ĒāĨ⤤ ⤏āĨā¤ļ⤍",
+ "term.queue": "ā¤ā¤¤ā¤žā¤°",
+ "term.history": "ā¤šā¤ŋ⤏āĨā¤ā¤°āĨ",
+ "term.search": "ā¤āĨ⤠ā¤ā¤°āĨā¤",
+ "term.library": "ā¤˛ā¤žā¤ā¤ŦāĨ⤰āĨ⤰āĨ",
+ "term.listenNow": "ā¤
ā¤āĨ ⤏āĨ⤍ā¤ŋ⤝āĨā¤",
+ "term.browse": "ā¤ŦāĨā¤°ā¤žā¤ā¤ā¤ŧ",
+ "term.radio": "⤰āĨā¤Ąā¤ŋ⤝āĨ",
+ "term.recentlyAdded": "ā¤šā¤žā¤˛ ā¤šāĨ ā¤ŽāĨ⤠ā¤āĨāĨāĨā¤ ā¤šāĨā¤",
+ "term.songs": "ā¤ā¤žā¤¨āĨ",
+ "term.albums": "ā¤ā¤˛āĨā¤Ŧā¤Ž",
+ "term.artists": "ā¤ā¤˛ā¤žā¤ā¤žā¤°",
+ "term.podcasts": "ā¤ĒāĨā¤Ąā¤ā¤žā¤¸āĨā¤ā¤¸",
+ "term.playlists": "ā¤ĒāĨ⤞āĨ⤞ā¤ŋ⤏āĨā¤āĨ⤏",
+ "term.playlist": "ā¤ĒāĨ⤞āĨ⤞ā¤ŋ⤏āĨā¤",
+ "term.newPlaylist": "⤍⤠ā¤ĒāĨ⤞āĨ⤞ā¤ŋ⤏āĨā¤āĨ⤏",
+ "term.newPlaylistFolder": "⤍⤠ā¤ĒāĨ⤞āĨ⤞ā¤ŋ⤏āĨā¤āĨ⤏ ā¤Ģā¤ŧāĨ⤞āĨā¤Ąā¤°",
+ "term.createNewPlaylist": "⤍⤠ā¤ĒāĨ⤞āĨ⤞ā¤ŋ⤏āĨā¤āĨ⤏ ā¤Ŧā¤¨ā¤žā¤ā¤",
+ "term.createNewPlaylistFolder": "⤍⤠ā¤ĒāĨ⤞āĨ⤞ā¤ŋ⤏āĨā¤āĨ⤏ ā¤Ģā¤ŧāĨ⤞āĨā¤Ąā¤° ā¤Ŧā¤¨ā¤žā¤ā¤",
+ "term.deletePlaylist": "ā¤āĨā¤¯ā¤ž ā¤ā¤Ē ā¤ĩā¤žā¤ā¤ ā¤ā¤¸ ā¤ĒāĨ⤞āĨ⤞ā¤ŋ⤏āĨ⤠ā¤āĨ ā¤šā¤ā¤žā¤¨ā¤ž ā¤ā¤žā¤šā¤¤āĨ ā¤šāĨā¤",
+ "term.play": "ā¤ĒāĨ⤞āĨ",
+ "term.pause": "ā¤ ā¤šā¤°ā¤žā¤ĩ",
+ "term.previous": "ā¤Ēā¤ŋā¤ā¤˛āĨ",
+ "term.next": "ā¤
ā¤ā¤˛āĨ",
+ "term.shuffle": "ā¤ļā¤Ģ⤞",
+ "term.repeat": "⤰ā¤ŋā¤ĒāĨā¤",
+ "term.volume": "ā¤ĩāĨ⤞āĨ⤝āĨā¤Ž",
+ "term.mute": "ā¤ŽāĨ⤝āĨā¤",
+ "term.unmute": "ā¤
ā¤¨ā¤ŽāĨ⤝āĨā¤",
+ "term.share": "ā¤ļāĨ⤝⤰",
+ "term.share.success": "ā¤āĨ⤞ā¤ŋā¤Ēā¤ŦāĨ⤰āĨā¤Ą ā¤ŽāĨ⤠ā¤āĨā¤ĒāĨā¤Ą",
+ "term.settings": "⤏āĨā¤ā¤ŋā¤ā¤āĨ⤏",
+ "term.seeAll": "⤏ā¤āĨ ā¤ĻāĨā¤āĨā¤",
+ "term.sortBy": "⤏āĨ⤰āĨ⤠ā¤Ŧā¤žā¤¯āĨ",
+ "term.sortBy.album": "ā¤ā¤˛āĨā¤Ŧā¤Ž",
+ "term.sortBy.artist": "ā¤ā¤˛ā¤žā¤ā¤žā¤°",
+ "term.sortBy.name": "ā¤¨ā¤žā¤Ž",
+ "term.sortBy.genre": "ā¤ļāĨ⤞āĨ",
+ "term.sortBy.releaseDate": "⤰ā¤ŋ⤞āĨā¤ā¤ŧ ā¤āĨ ā¤¤ā¤žā¤°āĨā¤",
+ "term.sortBy.duration": "⤞ā¤ā¤Ŧā¤žā¤",
+ "term.sortOrder": "ā¤-āĨāĨ",
+ "term.sortOrder.ascending": "ā¤
⤏āĨā¤ā¤Ąā¤ŋā¤ā¤",
+ "term.sortOrder.descending": "ā¤Ąā¤ŋ⤏āĨā¤ā¤Ąā¤ŋā¤ā¤",
+ "term.viewAs": "ā¤ĩā¤ŋ⤝āĨ ā¤ā¤¸",
+ "term.viewAs.coverArt": "ā¤ā¤ĩ⤰ ā¤ā¤°āĨā¤",
+ "term.viewAs.list": "⤏āĨā¤āĨ",
+ "term.size": "ā¤¸ā¤žā¤āĨ",
+ "term.size.normal": "ā¤¸ā¤žā¤§ā¤žā¤°ā¤Ŗ",
+ "term.size.compact": "ā¤Ēā¤ŋā¤ā¤ā¤ž ā¤šāĨā¤",
+ "term.enable": "ā¤āĨ⤞āĨā¤",
+ "term.disable": "ā¤Ŧā¤ā¤Ļ",
+ "term.enabled": "ā¤āĨā¤˛ā¤ž ā¤šāĨā¤",
+ "term.disabled": "ā¤Ŧā¤ā¤Ļ ā¤šāĨā¤ ā¤šāĨā¤",
+ "term.connect": "ā¤ā¤¨āĨā¤āĨā¤",
+ "term.connecting": "ā¤ā¤¨āĨā¤āĨā¤ā¤ŋā¤ā¤",
+ "term.disconnect": "ā¤Ąā¤ŋ⤏ā¤ā¤¨āĨā¤āĨā¤",
+ "term.authed": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤ŋ⤤",
+ "term.confirm": "ā¤Ēā¤āĨā¤ā¤ž?",
+ "term.more": "āĨāĨā¤¯ā¤žā¤Ļā¤ž",
+ "term.less": "ā¤ā¤Ž",
+ "term.showMore": "ā¤Ļā¤ŋā¤ā¤žā¤ā¤ āĨāĨā¤¯ā¤žā¤Ļā¤ž",
+ "term.showLess": "ā¤Ļā¤ŋā¤ā¤žā¤ā¤ ā¤ā¤Ž",
+ "term.topSongs": "Top Songs",
"term.latestReleases": "Latest Releases",
"term.time.added": "Added",
- "term.time.released": "Released",
+ "term.time.released": "Released",
"term.time.updated": "Updated",
"term.time.hours": "hours",
"term.time.hour": "hour",
@@ -120,14 +112,26 @@
"term.contributors": "Contributors",
"term.equalizer": "Equalizer",
"term.reset": "Reset",
- "term.tracks": "tracks", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "Videos",
+ "term.tracks": "tracks",
+ "term.videos": "Videos",
"term.menu": "Menu",
"term.check": "Check",
- "term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat'
- "term.updateCider": "Update Cider",
-
- // Home
+ "term.aboutArtist": "About {{artistName}}",
+ "term.topResult": "Top Result",
+ "term.sharedPlaylists": "Shared Playlists",
+ "term.people": "People",
+ "term.newpreset.name": "⤍⤠EQ Preset Name",
+ "term.addedpreset": "Added Preset",
+ "term.deletepreset.warn": "Are you sure you want to delete this preset?",
+ "term.deletedpreset": "Removed preset",
+ "term.musicVideos": "Music Videos",
+ "term.stations": "Stations",
+ "term.curators": "Curators",
+ "term.appleCurators": "Apple Curators",
+ "term.radioShows": "Radio Shows",
+ "term.recordLabels": "Record Labels",
+ "term.videoExtras": "Video Extras",
+ "term.top": "Top",
"home.title": "Home",
"home.recentlyPlayed": "Recently Played",
"home.recentlyAdded": "Recently Added",
@@ -136,13 +140,10 @@
"home.madeForYou": "Made For You",
"home.friendsListeningTo": "Friends Listening To",
"home.followedArtists": "Followed Artists",
- // Errors
"error.appleMusicSubRequired": "Apple Music requires a subscription.",
"error.connectionError": "There was a problem connecting to Apple Music.",
"error.noResults": "No Results.",
- "error.noResults.description": "Try a new search.",
-
- //Podcasts
+ "error.noResults.description": "Try a ⤍⤠search.",
"podcast.followOnCider": "Follow On Cider",
"podcast.followedOnCider": "Following On Cider",
"podcast.subscribeOnItunes": "Subscribe On iTunes",
@@ -151,8 +152,6 @@
"podcast.episodes": "Episodes",
"podcast.playEpisode": "Play Episode",
"podcast.website": "Podcast Website",
-
- // Actions
"action.addToLibrary": "Add to Library",
"action.addToLibrary.success": "Added to Library",
"action.addToLibrary.error": "Error Adding to Library",
@@ -164,7 +163,7 @@
"action.removeFromQueue": "Remove from Queue",
"action.removeFromQueue.success": "Removed from Queue",
"action.removeFromQueue.error": "Error Removing from Queue",
- "action.createPlaylist": "Create a New Playlist",
+ "action.createPlaylist": "ā¤Ŧā¤¨ā¤žā¤ā¤ a ⤍⤠Playlist",
"action.addToPlaylist": "Add to Playlist",
"action.removeFromPlaylist": "Remove from Playlist",
"action.addToFavorites": "Add to Favorites",
@@ -192,93 +191,98 @@
"action.removeTracks": "Remove ${self.selectedItems.length} tracks from queue",
"action.import": "Import",
"action.export": "Export",
- "action.showAlbum": "Show Complete Album",
+ "action.showAlbum": "ā¤Ļā¤ŋā¤ā¤žā¤ā¤ Complete Album",
"action.tray.minimize": "Minimize to Tray",
"action.tray.quit": "Quit",
- "action.tray.show": "Show",
+ "action.tray.show": "ā¤Ļā¤ŋā¤ā¤žā¤ā¤",
"action.update": "Update",
-
- // Settings - General
+ "action.copy": "Copy",
+ "action.newpreset": "⤍⤠Preset...",
+ "action.deletepreset": "Delete Preset",
"settings.header.general": "General",
"settings.header.general.description": "Adjust the general settings for Cider.",
"settings.option.general.language": "Language",
-
- // Language optgroups
"settings.option.general.language.main": "Languages",
"settings.option.general.language.fun": "Fun Languages",
"settings.option.general.language.unsorted": "Unsorted",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "Update Cider",
+ "settings.option.general.updateCider.branch": "Cider Update Branch",
+ "settings.option.general.updateCider.branch.description": "Select the branch to update Cider to",
+ "settings.option.general.updateCider.branch.main": "Stable",
+ "settings.option.general.updateCider.branch.develop": "Development",
"settings.header.audio": "Audio",
"settings.header.audio.description": "Adjust the audio settings for Cider.",
- "settings.option.audio.quality": "Audio Quality", // Dropdown
+ "settings.option.audio.quality": "Audio Quality",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "up to 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "up to 24-bit/48 kHz",
"settings.header.audio.quality.high": "High",
- "settings.header.audio.quality.low": "Low",
- "settings.header.audio.quality.auto": "Auto",
- "settings.option.audio.seamlessTransition": "Seamless Audio Transition", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality", // Toggle
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standard",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "Seamless Audio Transition",
+ "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality",
"settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization , Equalizers and Visualizers, however on some systems this may cause stuttering in audio tracks.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively | Designed by Maikiwi.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressive",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialize audio and make audio more 3-dimensional (note: This is not Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visual",
+ "settings.header.visual": "Visual",
"settings.header.visual.description": "Adjust the visual settings for Cider.",
- "settings.option.visual.windowBackgroundStyle": "Window Background Style", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "Window Background Style",
"settings.header.visual.windowBackgroundStyle.none": "None",
"settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
"settings.header.visual.windowBackgroundStyle.image": "Image",
- "settings.option.visual.animatedArtwork": "Animated Artwork", // Dropdown
+ "settings.option.visual.animatedArtwork": "Animated Artwork",
"settings.header.visual.animatedArtwork.always": "Always",
"settings.header.visual.animatedArtwork.limited": "Limited to pages and special entries",
"settings.header.visual.animatedArtwork.disable": "Disable everywhere",
- "settings.option.visual.animatedArtworkQuality": "Animated Artwork Quality", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "Animated Artwork Quality",
"settings.header.visual.animatedArtworkQuality.low": "Low",
"settings.header.visual.animatedArtworkQuality.medium": "Medium",
"settings.header.visual.animatedArtworkQuality.high": "High",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Very High",
"settings.header.visual.animatedArtworkQuality.extreme": "Extreme",
- "settings.option.visual.animatedWindowBackground": "Animated Window Background", // Toggle
- "settings.option.visual.hardwareAcceleration": "Hardware Acceleration", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "Animated Window Background",
+ "settings.option.visual.hardwareAcceleration": "Hardware Acceleration",
"settings.option.visual.hardwareAcceleration.description": "Requires relaunch",
- "settings.header.visual.hardwareAcceleration.default": "Default",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Show Personal Info", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "Default",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Theme",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Dark",
+ "settings.option.visual.showPersonalInfo": "ā¤Ļā¤ŋā¤ā¤žā¤ā¤ Personal Info",
"settings.header.lyrics": "Lyrics",
"settings.header.lyrics.description": "Adjust the lyrics settings for Cider.",
- "settings.option.lyrics.enableMusixmatch": "Enable Musixmatch Lyrics", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Enable Karaoke Mode (Musixmatch only)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Translation Preferred Language", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Enable Youtube Lyrics for Music Videos", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "Enable Musixmatch Lyrics",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Enable Karaoke Mode (Musixmatch only)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Translation Preferred Language",
+ "settings.option.lyrics.enableYoutubeLyrics": "Enable Youtube Lyrics for Music Videos",
"settings.header.connectivity": "Connectivity",
"settings.header.connectivity.description": "Adjust the connectivity settings for Cider.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "Playback Notifications", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Playback Notifications",
"settings.header.connectivity.discordRPC.cider": "Display as 'Cider'",
"settings.header.connectivity.discordRPC.appleMusic": "Display as 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "Clear Discord Rich Presence on Pause", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "Clear Discord Rich Presence on Pause",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
"settings.header.experimental": "Experimental",
"settings.header.experimental.description": "Adjust the experimental settings for Cider.",
- "settings.option.experimental.compactUI": "Compact UI", // Toggle
+ "settings.option.experimental.compactUI": "Compact UI",
"settings.option.experimental.close_button_hide": "Close Button Should Hide the Application",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
+ "settings.option.experimental.copy_log": "Copy logs to clipboard",
+ "settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
"spatial.notTurnedOn": "Audio Spatialization is disabled. To use, please enable it first.",
"spatial.spatialProperties": "Spatial Properties",
"spatial.width": "Width",
@@ -298,14 +302,8 @@
"spatial.down": "Down",
"spatial.listener": "Listener",
"spatial.audioSource": "Audio Source",
-
- // Settings - Unfinished
"settings.header.unfinished": "Unfinished",
-
- // Web Remote
"remote.web.title": "Cider Remote",
"remote.web.description": "Scan the QR code to pair your phone up with this Cider instance",
-
- // About
"about.thanks": "Major thanks to the Cider Collective Team and all of our contributors."
-}
+}
\ No newline at end of file
diff --git a/src/i18n/hu_HU.jsonc b/src/i18n/hu_HU.json
similarity index 50%
rename from src/i18n/hu_HU.jsonc
rename to src/i18n/hu_HU.json
index 1fc03018..45726d3e 100644
--- a/src/i18n/hu_HU.jsonc
+++ b/src/i18n/hu_HU.json
@@ -1,311 +1,368 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "Magyar", // name of language in native language
- "i18n.languageNameEnglish": "Hungarian", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@Greenoliv @Rias @BenjaminStonawski", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
- "app.name": "Cider",
-
- "date.format": "${m} ${d}, ${y}",
-
- // Dialogs
- "dialog.cancel": "MÊgsem",
- "dialog.ok": "OK",
-
- // Notification
- "notification.updatingLibrarySongs": "ZenekÃļnyvtÃĄr frissÃtÊse...",
- "notification.updatingLibraryAlbums": "Albumok frissÃtÊse...",
- "notification.updatingLibraryArtists": "ElÅadÃŗk frissÃtÊse...",
- // Terms
- "term.appleInc": "Apple Inc.",
- "term.appleMusic": "Apple Music",
- "term.applePodcasts": "Apple Podcasts",
- "term.itunes": "iTunes",
- "term.github": "GitHub",
- "term.discord": "Discord",
- "term.learnMore": "Tudj meg tÃļbbet",
- "term.accountSettings": "FiÃŗkbeÃĄllÃtÃĄsok",
- "term.logout": "KijelentkezÊs",
- "term.login": "BejelentkezÊs",
- "term.about": "NÊvjegy",
- "term.privateSession": "PrivÃĄt hallgatÃĄs",
- "term.queue": "VÃĄrÃŗlista",
- "term.search": "KeresÊs",
- "term.library": "KÃļnyvtÃĄr",
- "term.listenNow": "HallgatÃĄs most",
- "term.browse": "BÃļngÊszÊs",
- "term.radio": "RÃĄdiÃŗ",
- "term.recentlyAdded": "NemrÊg hozzÃĄadott",
- "term.songs": "Dalok",
- "term.albums": "Albumok",
- "term.artists": "ElÅadÃŗk",
- "term.podcasts": "Podcastok",
- "term.playlists": "LejÃĄtszÃĄsi listÃĄk",
- "term.playlist": "LejÃĄtszÃĄsi lista",
- "term.newPlaylist": "Ãj lejÃĄtszÃĄsi lista",
- "term.newPlaylistFolder": "Ãj lejÃĄtszÃĄsi lista mappa",
- "term.createNewPlaylist": "Ãj lejÃĄtszÃĄsi lista lÊtrehozÃĄsa",
- "term.createNewPlaylistFolder": "Ãj lejÃĄtszÃĄsi lista mappa lÊtrehozÃĄsa",
- "term.deletePlaylist": "Biztosan szeretnÊ tÃļrÃļlni a lejÃĄtszÃĄsi listÃĄt?",
- "term.play": "LejÃĄtszÃĄs",
- "term.pause": "MegÃĄllÃtÃĄs",
- "term.previous": "ElÅzÅ",
- "term.next": "KÃļvetkezÅ",
- "term.shuffle": "KeverÊs",
- "term.repeat": "IsmÊtlÊs",
- "term.volume": "HangerÅ",
- "term.mute": "NÊmÃtÃĄs",
- "term.unmute": "NÊmÃtÃĄs feloldÃĄsa",
- "term.share": "MegosztÃĄs",
- "term.settings": "BeÃĄllÃtÃĄsok",
- "term.seeAll": "Ãsszes",
- "term.sortBy": "RendezÊs",
- "term.sortBy.album": "Album",
- "term.sortBy.artist": "ElÅadÃŗ",
- "term.sortBy.name": "NÊv",
- "term.sortBy.genre": "MÅąfaj",
- "term.sortBy.releaseDate": "KiadÃĄs dÃĄtuma",
- "term.sortBy.duration": "IdÅtartam",
- "term.sortOrder": "A-Z",
- "term.sortOrder.ascending": "NÃļvekvÅ",
- "term.sortOrder.descending": "CsÃļkkenÅ",
- "term.viewAs": "MegjelenÃtÊs",
- "term.viewAs.coverArt": "BorÃtÃŗ",
- "term.viewAs.list": "Lista",
- "term.size": "MÊret",
- "term.size.normal": "NormÃĄl",
- "term.size.compact": "Kompakt",
- "term.enable": "Be",
- "term.disable": "Ki",
- "term.enabled": "Be",
- "term.disabled": "Ki",
- "term.connect": "CsatlakoztatÃĄs",
- "term.connecting": "CsatlakozÃĄs",
- "term.disconnect": "LecsatlakozatÃĄs",
- "term.authed": "HitelesÃtve",
- "term.confirm": "JÃŗvÃĄhagyja?",
- "term.more": "TÃļbb",
- "term.less": "Kevesebb",
- "term.showMore": "Mutass tÃļbbet",
- "term.showLess": "Mutass kevesebbet",
- "term.topSongs" : "A legjobb dalok",
- "term.latestReleases": "Ãj megjelenÊsek",
- "term.time.added": "HozzÃĄadva",
- "term.time.released": "Kiadva:",
- "term.time.updated": "FrissÃtve",
- "term.time.hours": "Ãŗra",
- "term.time.hour": "Ãŗra",
- "term.time.minutes": "perc",
- "term.time.minute": "perc",
- "term.time.seconds": "mÃĄsodperc",
- "term.time.second": "mÃĄsodperc",
- "term.fullscreenView": "Teljes kÊpernyÅs mÃŗd",
- "term.defaultView": "AlapÊrtelmezett nÊzet",
- "term.spacializedAudioSetting": "TÊrbeli hangzÃĄs",
- "term.clearAll": "Ãsszes tÃļrlÊse",
- "term.recentStations": "NemrÊg jÃĄtszott",
- "term.language": "Nyelv",
- "term.funLanguages": "MÃŗkÃĄs",
- "term.noLyrics": "DalszÃļveg nem talÃĄlhatÃŗ",
- "term.copyright": "SzerzÅi jog",
- "term.rightsReserved": "Minden jog fenntartva.",
- "term.sponsor": "TÃĄmogasd a projektet",
- "term.ciderTeam": "A Cider csapata",
- "term.developer": "FejlesztÅ",
- "term.socialTeam": "SzociÃĄlis csapat",
- "term.socials": "SzociÃĄlis",
- "term.contributors": "KÃļzremÅąkÃļdÅk",
- "term.equalizer": "HangszÃnszabÃĄlyzÃŗ",
- "term.reset": "VisszaÃĄllÃtÃĄs",
- "term.tracks": "zeneszÃĄm", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "VideÃŗk",
- "term.menu": "MenÃŧ",
- "term.check": "EllenÅrzÊs",
- "term.aboutArtist": "TovÃĄbbi informÃĄciÃŗ {{artistName}} elÅadÃŗrÃŗl", // e.g. 'About Doja Cat'
- "term.updateCider": "Cider frissÃtÊse",
-
- // Home
- "home.title": "KezdÅlap",
- "home.recentlyPlayed": "NemrÊg jÃĄtszott",
- "home.recentlyAdded": "NemrÊg hozzÃĄadott",
- "home.artistsFeed": "Az elÅadÃŗid feedje",
- "home.artistsFeed.noArtist": "KÃļvess nÊhÃĄny elÅadÃŗt, hogy a legÃējabb zenÊi itt megjelenhessenek.",
- "home.madeForYou": "SzemÊlyre szabva",
- "home.friendsListeningTo": "A barÃĄtaid Êpp ezt hallgatjÃĄk",
- "home.followedArtists": "KÃļvetett elÅadÃŗk",
- // Errors
- "error.appleMusicSubRequired": "Apple Music elÅfizetÊs szÃŧksÊges.",
- "error.connectionError": "Hiba tÃļrtÊnt az Apple Music-hoz valÃŗ csatlakozÃĄs kÃļzben.",
- "error.noResults": "Nincs talÃĄlat",
- "error.noResults.description": "PrÃŗbÃĄlkozzon Ãēj keresÊssel",
-
- //Podcasts
- "podcast.followOnCider": "KÃļvetÊs a Cideren",
- "podcast.followedOnCider": "KÃļvetve a Cideren",
- "podcast.subscribeOnItunes": "FeliratkozÃĄs az iTunes-ban",
- "podcast.subscribedOnItunes": "Feliratkozva az iTunes-ban",
- "podcast.itunesStore": "iTunes Store",
- "podcast.episodes": "EpizÃŗdok",
- "podcast.playEpisode": "EpizÃŗd lejÃĄtszÃĄsa",
- "podcast.website": "Podcast weboldala",
-
- // Actions
- "action.addToLibrary": "HozzÃĄadÃĄs a kÃļnyvtÃĄrhoz",
- "action.addToLibrary.success": "HozzÃĄadva a kÃļnyvtÃĄrhoz",
- "action.addToLibrary.error": "Hiba a hozzÃĄadÃĄskor.",
- "action.removeFromLibrary": "TÃļrlÊs a KÃļnytÃĄrbÃŗl",
- "action.removeFromLibrary.success": "TÃļrÃļlve a kÃļnyvtÃĄrbÃŗl",
- "action.addToQueue": "HozzÃĄadÃĄs a vÃĄrÃŗlistÃĄhoz",
- "action.addToQueue.success": "HozzÃĄadva a vÃĄrÃŗlistÃĄhoz",
- "action.addToQueue.error": "Sikertelen hozzÃĄadÃĄs a vÃĄrÃŗlistÃĄhoz",
- "action.removeFromQueue": "TÃļrlÊs a vÃĄrÃŗlistÃĄrÃŗl",
- "action.removeFromQueue.success": "TÃļrÃļlve a vÃĄrÃŗlistÃĄrÃŗl",
- "action.removeFromQueue.error": "Sikertelen tÃļrlÊs a vÃĄrÃŗlistÃĄrÃŗl",
- "action.createPlaylist": "Ãj lejÃĄtszÃĄsi lista lÊtrehozÃĄsa",
- "action.addToPlaylist": "LejÃĄtszÃĄsi listÃĄhoz adÃĄs",
- "action.removeFromPlaylist": "TÃļrlÊs a lejÃĄtszÃĄsi listÃĄrÃŗl",
- "action.addToFavorites": "HozzÃĄadÃĄs a kedvencekhez",
- "action.follow": "KÃļvetÊs",
- "action.follow.success": "KÃļvetve",
- "action.follow.error": "Sikertelen kÃļvetÊs",
- "action.unfollow": "KÃļvetÊs visszavonÃĄsa",
- "action.unfollow.success": "KÃļvetÊs visszavonva",
- "action.unfollow.error": "Sikertelen visszavonÃĄs",
- "action.playNext": "LejÃĄtszÃĄs kÃļvetkezÅkÊnt",
- "action.playLater": "LejÃĄtszÃĄs utolsÃŗkÊnt",
- "action.startRadio": "ÃllomÃĄs lÊtrehozÃĄsa",
- "action.goToArtist": "ElÅadÃŗ megjelenÃtÊse",
- "action.goToAlbum": "Album megjelenÃtÊse",
- "action.moveToTop": "MozgatÃĄs legfelÃŧlre",
- "action.share": "MegosztÃĄs",
- "action.rename": "ÃtnevezÊs",
- "action.love": "Kedvelem",
- "action.unlove": "KedvelÊs visszavonÃĄsa",
- "action.dislike": "Nem kedvelem",
- "action.undoDislike": "Nem kedvelÊs visszavonÃĄsa",
- "action.showWebRemoteQR": "TÃĄvirÃĄnyÃtÃŗ QR kÃŗd megjelenÃtÊse",
- "action.playTracksNext": "${app.selectedMediaItems.length} zenÊk lejÃĄtszÃĄsa kÃļvetkezÅnek",
- "action.playTracksLater": "${app.selectedMediaItems.length} zenÊk lejÃĄtszÃĄsa kÊsÅbb",
- "action.removeTracks": "${self.selectedItems.length} zenÊk eltÃĄvolÃtÃĄsa a vÃĄrÃŗlistÃĄrÃŗl",
- "action.import": "ImportÃĄlÃĄs",
- "action.export": "ExportÃĄlÃĄs",
- "action.showAlbum": "Teljes album megjelenÃtÊse",
- // Waiting on Core for moving plugin to app.ts
- "action.tray.minimize": "KicsinyÃtÊs a tÃĄlcÃĄra",
- "action.tray.quit": "KilÊpÊs",
- "action.tray.show": "A kÃļvetkezÅ megjelenÃtÊse:",
-
- // Settings - General
- "settings.header.general": "ÃltalÃĄnos",
- "settings.header.general.description": "A Cider ÃĄltalÃĄnos beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa",
- "settings.option.general.language": "Nyelv",
-
- // Language optgroups
- "settings.option.general.language.main": "Nyelvek",
- "settings.option.general.language.fun": "MÃŗkÃĄs nyelvek",
- "settings.option.general.language.unsorted": "Nem besorolhatÃŗ",
-
- // Settings - Audio
- "settings.header.audio": "Hang",
- "settings.header.audio.description": "A Cider hangbeÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa",
- "settings.option.audio.quality": "HangminÅsÊg", // Dropdown
- "settings.header.audio.quality.high": "Magas",
- "settings.header.audio.quality.low": "Alacsony",
- "settings.header.audio.quality.auto": "Automatikus",
- "settings.option.audio.seamlessTransition": "SzÃŧnetmentes lejÃĄtszÃĄs", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "HaladÃŗ funkcionalitÃĄs engedÊlyezÊse", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "Az AudioContext funkciÃŗ engedÊlyezÊse lehetÅvÊ teszi a fejlettebb hangfunkciÃŗkat, pÊldÃĄul a normalizÃĄsÃĄst, a hangszÃnszabÃĄlyzÃŗt Ês a vizualizÃĄciÃŗ funkciÃŗkat, azonban egyes szÃĄmÃtÃŗgÊpeken ez akadozÃĄst okozhat a hangsÃĄvokban.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "NormalizÃĄlÃĄs", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "NormalizÃĄlja az egyes zeneszÃĄmok hangosabb rÊszeit, hogy egysÊgesebb hallgatÃĄsi ÊlmÊnyt hozzon lÊtre.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "TÊrbeli hangzÃĄs", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "TÊrbeli hangzÃĄs Ês a hang hÃĄromdimenziÃŗsabbÃĄ tÊtele (Ez nem ÃļsszekeverendÅ a Dolby Atmos-szal!)",
- // Settings - Visual
- "settings.header.visual": "VizuÃĄlis",
- "settings.header.visual.description": "A Cider vizuÃĄlis beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
- "settings.option.visual.windowBackgroundStyle": "Ablak hÃĄttÊr stÃlusa", // Toggle
- "settings.header.visual.windowBackgroundStyle.none": "Egyik sem",
- "settings.header.visual.windowBackgroundStyle.artwork": "BorÃtÃŗ",
- "settings.header.visual.windowBackgroundStyle.image": "KÊp",
- "settings.option.visual.animatedArtwork": "AnimÃĄlt borÃtÃŗ", // Dropdown
- "settings.header.visual.animatedArtwork.always": "Mindig",
- "settings.header.visual.animatedArtwork.limited": "Oldalakra Ês speciÃĄlis bejegyzÊsekre korlÃĄtozva",
- "settings.header.visual.animatedArtwork.disable": "KikapcsolÃĄs mindenhol",
- "settings.option.visual.animatedArtworkQuality": "AnimÃĄlt borÃtÃŗ minÅsÊge", // Dropdown
- "settings.header.visual.animatedArtworkQuality.low": "Alacsony",
- "settings.header.visual.animatedArtworkQuality.medium": "KÃļzepes",
- "settings.header.visual.animatedArtworkQuality.high": "Magas",
- "settings.header.visual.animatedArtworkQuality.veryHigh": "Nagyon magas",
- "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÊm",
- "settings.option.visual.animatedWindowBackground": "AnimÃĄlt ablakhÃĄttÊr", // Toggle
- "settings.option.visual.hardwareAcceleration": "Hardveres gyorsÃtÃĄs", // Dropdown
- "settings.option.visual.hardwareAcceleration.description": "ÃjraindÃtÃĄs szÃŧksÊges",
- "settings.header.visual.hardwareAcceleration.default": "Alap",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "SzemÊlyes adatok mutatÃĄsa", // Toggle
-
- // Settings - Lyrics
- "settings.header.lyrics": "DalszÃļveg",
- "settings.header.lyrics.description": "A Cider dalszÃļveg beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
- "settings.option.lyrics.enableMusixmatch": "MusixMatch dalszÃļvegek engedÊlyezÊse", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Karaoke mÃŗd bekapcsolÃĄsa (Csak MusixMatch esetÊn)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "MusixMatch fordÃtÃĄs nyelve", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "YouTube dalszÃļvegek engedÊlyezÊse a zenei videÃŗknÃĄl", // Toggle
-
- // Settings - Connectivity
- "settings.header.connectivity": "CsatlakozhatÃŗsÃĄgok",
- "settings.header.connectivity.description": "A Cider csatlakozÃĄs beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "ÃrtesÃtÊs Ãēj dal lejÃĄtszÃĄsakor", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "MegjelenÃtÊs 'Cider'-kÊnt",
- "settings.header.connectivity.discordRPC.appleMusic": "MegjelenÃtÊs 'Apple Music'-kÊnt",
- "settings.option.connectivity.discordRPC.clearOnPause": "Discord Rich Presence tÃļrlÊse megÃĄllÃtÃĄsnÃĄl", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble KÊsleltetÊs (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "LastFM Now Playing engedÊlyezÊse",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "A kÃļzremÅąkÃļdÅ elÅadÃŗk eltÃĄvolÃtÃĄsa a dal cÃmÊbÅl (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Loopolt zeneszÃĄm szÅąrÊse (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
- "settings.header.experimental": "KÃsÊrleti",
- "settings.header.experimental.description": "A Cider kÃsÊrleti beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
- "settings.option.experimental.compactUI": "Kompakt UI", // Toggle
- "settings.option.experimental.close_button_hide": "A bezÃĄrÃĄs gomb rejtse el az alkalmazÃĄst",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.notTurnedOn": "A tÊrbeli hangzÃĄs ki van kapcsolva, hasznÃĄlatÃĄhoz kapcsolja be.",
- "spatial.spatialProperties": "TÊrbeli hangzÃĄs",
- "spatial.width": "SzÊlessÊg",
- "spatial.height": "MagassÃĄg",
- "spatial.depth": "HosszÃēsÃĄg",
- "spatial.gain": "Gain",
- "spatial.roomMaterials": "Szoba felÊpÃtÊse",
- "spatial.roomDimensions": "Szoba mÊretei",
- "spatial.roomPositions": "Szoba pozÃciÃŗi",
- "spatial.setDimensions": "MÊretek beÃĄllÃtÃĄsa",
- "spatial.setPositions": "PozÃciÃŗk beÃĄllÃtÃĄsa",
- "spatial.up": "Fent",
- "spatial.front": "ElÅl",
- "spatial.left": "Balra",
- "spatial.right": "Jobbra",
- "spatial.back": "HÃĄtul",
- "spatial.down": "Lent",
- "spatial.listener": "HallgatÃŗ",
- "spatial.audioSource": "HangforrÃĄs",
-
- // Settings - Unfinished
- "settings.header.unfinished": "Befejezetlen",
-
- // Web Remote
- "remote.web.title": "Cider Remote",
- "remote.web.description": "Olvasd be ezt a QR-kÃŗdot a telefonoddal, hogy vezÊrelhesd a lejÃĄtszÃŗt.",
-
- // About
- "about.thanks": "KÃļszÃļnet a Cider Collective csapatÃĄnak Ês minden kÃļzremÅąkÃļdÅnek."
-}
+{
+ "i18n.languageName": "Magyar",
+ "i18n.languageNameEnglish": "Hungarian",
+ "i18n.category": "main",
+ "i18n.authors": "@Greenoliv @Amaru @BenjaminStonawski",
+ "app.name": "Cider",
+ "date.format": "${m} ${d}, ${y}",
+ "dialog.cancel": "MÊgsem",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "ZenekÃļnyvtÃĄr frissÃtÊse...",
+ "notification.updatingLibraryAlbums": "Albumok frissÃtÊse...",
+ "notification.updatingLibraryArtists": "ElÅadÃŗk frissÃtÊse...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcastok",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Tudj meg tÃļbbet",
+ "term.accountSettings": "FiÃŗkbeÃĄllÃtÃĄsok",
+ "term.logout": "KijelentkezÊs",
+ "term.login": "BejelentkezÊs",
+ "term.about": "NÊvjegy",
+ "term.privateSession": "PrivÃĄt hallgatÃĄs",
+ "term.queue": "VÃĄrÃŗlista",
+ "term.history": "ElÅzmÊnyek",
+ "term.search": "KeresÊs",
+ "term.library": "KÃļnyvtÃĄr",
+ "term.listenNow": "HallgatÃĄs most",
+ "term.browse": "BÃļngÊszÊs",
+ "term.radio": "RÃĄdiÃŗ",
+ "term.recentlyAdded": "NemrÊg hozzÃĄadott",
+ "term.songs": "Dalok",
+ "term.albums": "Albumok",
+ "term.artists": "ElÅadÃŗk",
+ "term.podcasts": "Podcastok",
+ "term.playlists": "LejÃĄtszÃĄsi listÃĄk",
+ "term.playlist": "LejÃĄtszÃĄsi lista",
+ "term.newPlaylist": "Ãj lejÃĄtszÃĄsi lista",
+ "term.newPlaylistFolder": "Ãj mappa",
+ "term.createNewPlaylist": "Ãj lejÃĄtszÃĄsi lista lÊtrehozÃĄsa",
+ "term.createNewPlaylistFolder": "Ãj mappa lÊtrehozÃĄsa",
+ "term.deletePlaylist": "Biztosan szeretnÊ tÃļrÃļlni a lejÃĄtszÃĄsi listÃĄt?",
+ "term.play": "LejÃĄtszÃĄs",
+ "term.pause": "MegÃĄllÃtÃĄs",
+ "term.previous": "ElÅzÅ",
+ "term.next": "KÃļvetkezÅ",
+ "term.shuffle": "KeverÊs",
+ "term.repeat": "IsmÊtlÊs",
+ "term.volume": "HangerÅ",
+ "term.mute": "NÊmÃtÃĄs",
+ "term.unmute": "NÊmÃtÃĄs feloldÃĄsa",
+ "term.share": "MegosztÃĄs",
+ "term.share.success": "MÃĄsolva a vÃĄgÃŗlapra",
+ "term.settings": "BeÃĄllÃtÃĄsok",
+ "term.seeAll": "Ãsszes",
+ "term.sortBy": "RendezÊs",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "ElÅadÃŗ",
+ "term.sortBy.name": "NÊv",
+ "term.sortBy.genre": "MÅąfaj",
+ "term.sortBy.releaseDate": "KiadÃĄs dÃĄtuma",
+ "term.sortBy.duration": "IdÅtartam",
+ "term.sortBy.dateAdded": "HozzÃĄadÃĄs dÃĄtuma",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "NÃļvekvÅ",
+ "term.sortOrder.descending": "CsÃļkkenÅ",
+ "term.viewAs": "MegjelenÃtÊs",
+ "term.viewAs.coverArt": "BorÃtÃŗ",
+ "term.viewAs.list": "Lista",
+ "term.size": "MÊret",
+ "term.size.normal": "NormÃĄl",
+ "term.size.compact": "Kompakt",
+ "term.enable": "Be",
+ "term.disable": "Ki",
+ "term.enabled": "Be",
+ "term.disabled": "Ki",
+ "term.connect": "CsatlakoztatÃĄs",
+ "term.connecting": "CsatlakozÃĄs",
+ "term.disconnect": "LecsatlakozatÃĄs",
+ "term.authed": "HitelesÃtve",
+ "term.confirm": "JÃŗvÃĄhagyja?",
+ "term.more": "TÃļbb",
+ "term.less": "Kevesebb",
+ "term.showMore": "Mutass tÃļbbet",
+ "term.showLess": "Mutass kevesebbet",
+ "term.topSongs": "A legjobb dalok",
+ "term.latestReleases": "Ãj megjelenÊsek",
+ "term.time.added": "HozzÃĄadva",
+ "term.time.released": "Kiadva",
+ "term.time.updated": "FrissÃtve",
+ "term.time.hours": "Ãŗra",
+ "term.time.hour": "Ãŗra",
+ "term.time.minutes": "perc",
+ "term.time.minute": "perc",
+ "term.time.seconds": "mÃĄsodperc",
+ "term.time.second": "mÃĄsodperc",
+ "term.fullscreenView": "Teljes kÊpernyÅs mÃŗd",
+ "term.defaultView": "AlapÊrtelmezett nÊzet",
+ "term.audioSettings": "HangbeÃĄllÃtÃĄsok",
+ "term.audioControls": "HangerÅ beÃĄllÃtÃĄs",
+ "term.clearAll": "Ãsszes tÃļrlÊse",
+ "term.recentStations": "NemrÊg jÃĄtszott",
+ "term.language": "Nyelv",
+ "term.funLanguages": "FantÃĄzianyelvek",
+ "term.noLyrics": "BetÃļltÊs... / DalszÃļveg nem talÃĄlhatÃŗ. / InstrumentÃĄlis.",
+ "term.copyright": "SzerzÅi jog",
+ "term.rightsReserved": "Minden jog fenntartva.",
+ "term.sponsor": "TÃĄmogasd a projektet",
+ "term.ciderTeam": "A Cider csapata",
+ "term.developer": "FejlesztÅ",
+ "term.socialTeam": "KÃļzÃļssÊgi csapat",
+ "term.socials": "SzociÃĄlis",
+ "term.contributors": "HozzÃĄjÃĄrulÃŗk",
+ "term.equalizer": "HangszÃnszabÃĄlyozÃŗ",
+ "term.reset": "VisszaÃĄllÃtÃĄs",
+ "term.tracks": "zeneszÃĄm",
+ "term.videos": "VideÃŗk",
+ "term.menu": "MenÃŧ",
+ "term.check": "EllenÅrzÊs",
+ "term.aboutArtist": "About {{artistName}}",
+ "term.topResult": "Legjobb talÃĄlatok",
+ "term.sharedPlaylists": "Megosztott lejÃĄtszÃĄsi listÃĄk",
+ "term.people": "Profilok",
+ "term.newpreset.name": "Ãj EQ elÅbeÃĄllÃtÃĄs nÊv",
+ "term.addedpreset": "ElÅbeÃĄllÃtÃĄs hozzÃĄadva",
+ "term.deletepreset.warn": "Biztos tÃļrÃļlni szeretnÊd ezt az elÅbeÃĄllÃtÃĄst?",
+ "term.deletedpreset": "ElÅbeÃĄllÃtÃĄs tÃļrÃļlve",
+ "term.defaultPresets": "Alap elÅbeÃĄllÃtÃĄsok",
+ "term.userPresets": "FelhasznÃĄlÃŗi beÃĄllÃtÃĄsok",
+ "term.requestError": "Hiba tÃļrtÊnt a lekÊrÊs kÃļzben.",
+ "term.song.link.generate": "song.link URL lekÊrÊse...",
+ "term.musicVideos": "VideÃŗklipek",
+ "term.stations": "ÃllomÃĄsok",
+ "term.curators": "KurÃĄtorok",
+ "term.appleCurators": "Apple KurÃĄtorok",
+ "term.radioShows": "RÃĄdiÃŗadÃĄsok",
+ "term.recordLabels": "Record Labels",
+ "term.videoExtras": "VideÃŗextrÃĄk",
+ "term.top": "Top",
+ "term.version": "VerziÃŗ",
+ "term.noVideos": "Nincs talÃĄlat.",
+ "term.plugin": "Plug-in",
+ "term.pluginMenu": "Plug-in MenÃŧ",
+ "term.replay": "Replay",
+ "term.uniqueAlbums": "Unique Albums",
+ "term.uniqueArtists": "Unique Artists",
+ "term.uniqueSongs": "Unique Songs",
+ "term.topArtists": "Top Artists",
+ "term.listenedTo": "Listened to:",
+ "term.times": "alkalom",
+ "term.topAlbums": "Top Albums",
+ "term.plays": "Plays",
+ "term.topGenres": "Top Genres",
+ "term.confirmLogout": "Biztosan ki szeretnÊl jelentkezni?",
+ "home.title": "KezdÅlap",
+ "home.recentlyPlayed": "NemrÊg jÃĄtszott",
+ "home.recentlyAdded": "NemrÊg hozzÃĄadott",
+ "home.artistsFeed": "Az elÅadÃŗid feedje",
+ "home.artistsFeed.noArtist": "KÃļvess nÊhÃĄny elÅadÃŗt, hogy a legÃējabb zenÊik itt megjelenjenek",
+ "home.madeForYou": "SzemÊlyre szabva",
+ "home.friendsListeningTo": "A barÃĄtaid Êpp ezt hallgatjÃĄk",
+ "home.followedArtists": "KÃļvetett elÅadÃŗk",
+ "error.appleMusicSubRequired": "Apple Music elÅfizetÊs szÃŧksÊges.",
+ "error.connectionError": "Hiba tÃļrtÊnt az Apple Musichoz valÃŗ csatlakozÃĄs kÃļzben.",
+ "error.noResults": "Nincs talÃĄlat",
+ "error.noResults.description": "PrÃŗbÃĄlkozzon Ãēj keresÊssel",
+ "podcast.followOnCider": "KÃļvetÊs a Cideren",
+ "podcast.followedOnCider": "KÃļvetve a Cideren",
+ "podcast.subscribeOnItunes": "FeliratkozÃĄs az iTunesban",
+ "podcast.subscribedOnItunes": "Feliratkozva az iTunesban",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "EpizÃŗdok",
+ "podcast.playEpisode": "EpizÃŗd lejÃĄtszÃĄsa",
+ "podcast.website": "Podcast weboldala",
+ "action.addToLibrary": "HozzÃĄadÃĄs a KÃļnyvtÃĄrhoz",
+ "action.addToLibrary.success": "HozzÃĄadva a KÃļnyvtÃĄrhoz",
+ "action.addToLibrary.error": "Hiba a hozzÃĄadÃĄskor.",
+ "action.removeFromLibrary": "TÃļrlÊs a KÃļnytÃĄrbÃŗl",
+ "action.removeFromLibrary.success": "TÃļrÃļlve a KÃļnyvtÃĄrbÃŗl",
+ "action.addToQueue": "HozzÃĄadÃĄs a vÃĄrÃŗlistÃĄhoz",
+ "action.addToQueue.success": "HozzÃĄadva a vÃĄrÃŗlistÃĄhoz",
+ "action.addToQueue.error": "Sikertelen hozzÃĄadÃĄs a vÃĄrÃŗlistÃĄhoz",
+ "action.removeFromQueue": "TÃļrlÊs a vÃĄrÃŗlistÃĄrÃŗl",
+ "action.removeFromQueue.success": "TÃļrÃļlve a vÃĄrÃŗlistÃĄrÃŗl",
+ "action.removeFromQueue.error": "Sikertelen tÃļrlÊs a vÃĄrÃŗlistÃĄrÃŗl",
+ "action.createPlaylist": "Ãj lejÃĄtszÃĄsi lista lÊtrehozÃĄsa",
+ "action.addToPlaylist": "LejÃĄtszÃĄsi listÃĄhoz adÃĄs",
+ "action.removeFromPlaylist": "TÃļrlÊs a lejÃĄtszÃĄsi listÃĄrÃŗl",
+ "action.addToFavorites": "HozzÃĄadÃĄs a kedvencekhez",
+ "action.follow": "KÃļvetÊs",
+ "action.follow.success": "KÃļvetve",
+ "action.follow.error": "Sikertelen kÃļvetÊs",
+ "action.unfollow": "KÃļvetÊs visszavonÃĄsa",
+ "action.unfollow.success": "KÃļvetÊs visszavonva",
+ "action.unfollow.error": "Sikertelen visszavonÃĄs",
+ "action.playNext": "LejÃĄtszÃĄs kÃļvetkezÅkÊnt",
+ "action.playLater": "LejÃĄtszÃĄs utolsÃŗkÊnt",
+ "action.startRadio": "ÃllomÃĄs lÊtrehozÃĄsa",
+ "action.goToArtist": "ElÅadÃŗ megjelenÃtÊse",
+ "action.goToAlbum": "Album megjelenÃtÊse",
+ "action.moveToTop": "MozgatÃĄs legfelÃŧlre",
+ "action.share": "MegosztÃĄs",
+ "action.rename": "ÃtnevezÊs",
+ "action.love": "Szeretem",
+ "action.unlove": "MÊgsem szeretem",
+ "action.dislike": "Kevesebb ilyen javasolÃĄsa",
+ "action.undoDislike": "A Kevesebb ilyen javasolÃĄsa visszavonÃĄsa",
+ "action.showWebRemoteQR": "TÃĄvirÃĄnyÃtÃŗ",
+ "action.playTracksNext": "${app.selectedMediaItems.length} zenÊk lejÃĄtszÃĄsa kÃļvetkezÅnek",
+ "action.playTracksLater": "${app.selectedMediaItems.length} zenÊk lejÃĄtszÃĄsa kÊsÅbb",
+ "action.removeTracks": "${self.selectedItems.length} zenÊk eltÃĄvolÃtÃĄsa a vÃĄrÃŗlistÃĄrÃŗl",
+ "action.import": "ImportÃĄlÃĄs",
+ "action.export": "ExportÃĄlÃĄs",
+ "action.showAlbum": "Teljes album megjelenÃtÊse",
+ "action.tray.minimize": "KicsinyÃtÊs a tÃĄlcÃĄra",
+ "action.tray.quit": "KilÊpÊs",
+ "action.tray.show": "MegjelenÃtÊs",
+ "action.update": "FrissÃtÊs",
+ "action.install": "TelepÃtÊs",
+ "action.copy": "MÃĄsolÃĄs",
+ "action.newpreset": "Ãj Preset...",
+ "action.deletepreset": "Preset tÃļrlÊse",
+ "action.open": "MegnyitÃĄs",
+ "settings.header.general": "ÃltalÃĄnos",
+ "settings.header.general.description": "A Cider ÃĄltalÃĄnos beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
+ "settings.option.general.language": "Nyelv",
+ "settings.option.general.resumebehavior": "Resume behavior",
+ "settings.option.general.resumebehavior.description": "Resume behavior affects how Cider will resume your session when you return to the app.",
+ "settings.option.general.resumebehavior.locally": "Locally",
+ "settings.option.general.resumebehavior.locally.description": "Cider will resume your last session on this machine.",
+ "settings.option.general.resumebehavior.history": "History",
+ "settings.option.general.resumebehavior.history.description": "Cider will queue the last song from your overall Apple Music history, across devices.",
+ "settings.option.general.language.main": "Nyelvek",
+ "settings.option.general.language.fun": "FantÃĄzianyelvek",
+ "settings.option.general.language.unsorted": "AzonosÃtatlan",
+ "settings.option.general.updateCider": "Cider frissÃtÊse",
+ "settings.option.general.updateCider.branch": "VerziÃŗ kivÃĄlasztÃĄsa",
+ "settings.option.general.updateCider.branch.description": "VÃĄlaszd ki a Cider melyik verziÃŗjÃĄra szeretnÊl frissÃteni",
+ "settings.option.general.updateCider.branch.main": "NormÃĄl",
+ "settings.option.general.updateCider.branch.develop": "FejlesztÅi",
+ "settings.header.audio": "Hang",
+ "settings.header.audio.description": "A Cider hangbeÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
+ "settings.option.audio.volumeStep": "HangerŠlÊptÊk",
+ "settings.option.audio.maxVolume": "Maximum hangerÅ",
+ "settings.option.audio.quality": "HangminÅsÊg",
+ "settings.header.audio.quality.hireslossless": "Nagy felbontÃĄsÃē vesztesÊgmentes",
+ "settings.header.audio.quality.hireslossless.description": "max. 24-bit/192 kHz sebessÊgen",
+ "settings.header.audio.quality.lossless": "VesztesÊgmentes",
+ "settings.header.audio.quality.lossless.description": "max. up to 24-bit/48 kHz sebessÊgen",
+ "settings.header.audio.quality.high": "High",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standard",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "SzÃŧnetmentes lejÃĄtszÃĄs",
+ "settings.option.audio.enableAdvancedFunctionality": "HaladÃŗ funkcionalitÃĄs engedÊlyezÊse",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Az AudioContext funkciÃŗ engedÊlyezÊse lehetÅvÊ teszi a fejlettebb hangfunkciÃŗkat, pÊldÃĄul a NormalizÃĄsÃĄst, az Equalizereket Ês a Visualizer funkciÃŗkat, azonban egyes szÃĄmÃtÃŗgÊpeken ez akadozÃĄst okozhat a hangsÃĄvokban.",
+ "settings.option.audio.audioLab": "Cider Audio Lab",
+ "settings.option.audio.audioLab.description": "An assortment of in-house developed audio effects for Cider.",
+ "settings.warn.audioLab.withoutAF": "AudioContext (Advanced Functionality) is required to enable Cider Audio Laboratory.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Analog Warmth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simulates the analog warmth modelled after the Korg Nutube 6P1",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Analog Warmth intensity",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Changes the intensity of the Analog Warmth Module processing.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Smooth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Warm",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Pszichoakusztikus MÃŗdosÃtÃĄsok amik minden hangot felerÅsÃtenek Ês ÃŧtÅsebbÊ tesznek | KÊszÃtette Maikiwi",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "A CAP nem kompatibilis a TÊrbeli Hanggal. Kapcsold ki a TÊrbeli Hangot a folytatÃĄshoz.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP ErÅssÊg",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "MegvÃĄltoztatja a hangra vÊgzett feldolgozÃĄs erÅssÊgÊt. (Az AgresszÃv mÃŗd nemkÃvÃĄnatos eredmÊnyeket hozhat!)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "SzokÃĄsos",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "AgresszÃv",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "NormalizÃĄlÃĄs",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "NormalizÃĄlja az egyes zeneszÃĄmok hangosabb rÊszeit, hogy egysÊgesebb hallgatÃĄsi ÊlmÊnyt hozzon lÊtre.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "TÊrbeli hang",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "TÊrbeli hang Ês a hang hÃĄromdimenziÃŗsabbÃĄ tÊtele (Ez nem ÃļsszekeverendÅ a Dolby Atmos-szal!)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned Spatializing Effect, disables the customizable settings of Audio Spatialization. Spatialization must be enabled as a prerequisite.",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider Spatialization Profile",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tuning Profile of the Spatialization. (Requires App Restart)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "A TÊrbeli Hang nem kompatibilis a CAP-pal. Kapcsold ki a CAP-ot a folytatÃĄshoz.",
+ "settings.header.visual": "VizuÃĄlis",
+ "settings.header.visual.description": "A Cider vizuÃĄlis beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
+ "settings.option.visual.windowBackgroundStyle": "AblakhÃĄttÊr stÃlusa",
+ "settings.header.visual.windowBackgroundStyle.none": "Sehol",
+ "settings.header.visual.windowBackgroundStyle.artwork": "BorÃtÃŗ",
+ "settings.header.visual.windowBackgroundStyle.image": "KÊp",
+ "settings.option.visual.animatedArtwork": "AnimÃĄlt borÃtÃŗ",
+ "settings.header.visual.animatedArtwork.always": "Mindig",
+ "settings.header.visual.animatedArtwork.limited": "Oldalakra Ês speciÃĄlis bejegyzÊsekre korlÃĄtozva.",
+ "settings.header.visual.animatedArtwork.disable": "KikapcsolÃĄs mindenhol",
+ "settings.option.visual.animatedArtworkQuality": "AnimÃĄlt borÃtÃŗ minÅsÊge",
+ "settings.header.visual.animatedArtworkQuality.low": "Alacsony",
+ "settings.header.visual.animatedArtworkQuality.medium": "KÃļzepes",
+ "settings.header.visual.animatedArtworkQuality.high": "Magas",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Nagyon magas",
+ "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÊm",
+ "settings.option.visual.animatedWindowBackground": "AnimÃĄlt ablakhÃĄttÊr",
+ "settings.option.visual.hardwareAcceleration": "Hardveres gyorsÃtÃĄs",
+ "settings.option.visual.hardwareAcceleration.description": "ÃjraindÃtÃĄs szÃŧksÊges",
+ "settings.header.visual.hardwareAcceleration.default": "Alap",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "TÊma",
+ "settings.option.visual.theme.github.download": "TelepÃtÊs GitHub URL-rÅl",
+ "settings.option.visual.theme.github.explore": "TÊmaÃĄruhÃĄz",
+ "settings.header.visual.theme.github.page": "TÊmÃĄk a GitHub-rÃŗl",
+ "settings.option.visual.theme.github.install.confirm": "Biztos, hogy szeretnÊd telepÃteni a(z) {{ repo }} tÊmÃĄt?",
+ "settings.prompt.visual.theme.github.URL": "Add meg a telepÃtendÅ tÊma URL-jÊt",
+ "settings.notyf.visual.theme.install.success": "TÊma sikeresen telepÃtve",
+ "settings.notyf.visual.theme.install.error": "Sikertelen volt a tÊma telepÃtÊse",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "SÃļtÊt",
+ "settings.option.visual.showPersonalInfo": "SzemÊlyes adatok mutatÃĄsa",
+ "settings.header.lyrics": "DalszÃļveg",
+ "settings.header.lyrics.description": "A Cider dalszÃļveg beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
+ "settings.option.lyrics.enableMusixmatch": "MusixMatch dalszÃļvegek engedÊlyezÊse",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Karaoke mÃŗd bekapcsolÃĄsa (Csak MusixMatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "MusixMatch fordÃtÃĄs nyelve",
+ "settings.option.lyrics.enableYoutubeLyrics": "YouTube dalszÃļvegek engedÊlyezÊse a zenei videÃŗknÃĄl",
+ "settings.header.connectivity": "CsatlakozÃĄsok",
+ "settings.header.connectivity.description": "A Cider csatlakozÃĄs beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "LejÃĄtszÃĄs ÊrtesÃtÊsek",
+ "settings.header.connectivity.discordRPC.cider": "MegjelenÃtÊs 'Cider'-kÊnt",
+ "settings.header.connectivity.discordRPC.appleMusic": "MegjelenÃtÊs 'Apple Music'-kÊnt",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Discord Rich Presence tÃļrlÊse megÃĄllÃtÃĄsnÃĄl",
+ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble KÊsleltetÊs (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "LastFM Now Playing engedÊlyezÊse",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Loopolt zeneszÃĄm szÅąrÊse (LastFM)",
+ "settings.header.debug": "HibakeresÊs",
+ "settings.option.debug.copy_log": "NaplÃŗ mÃĄsolÃĄsa a vÃĄgÃŗlapra",
+ "settings.option.debug.openAppData": "Cider mappa megnyitÃĄsa",
+ "settings.header.experimental": "KÃsÊrleti",
+ "settings.header.experimental.description": "A Cider kÃsÊrleti beÃĄllÃtÃĄsainak mÃŗdosÃtÃĄsa.",
+ "settings.option.experimental.unknownPlugin": "Unknown Sources",
+ "settings.option.experimental.unknownPlugin.description": "Allow installion of plugins from repos other than the Cider Plugin Repository",
+ "settings.option.experimental.compactUI": "Kompakt felÃŧlet",
+ "settings.option.experimental.close_button_hide": "A bezÃĄrÃĄs gomb rejtse el az alkalmazÃĄst",
+ "settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
+ "spatial.notTurnedOn": "A tÊrbeli hangzÃĄs ki van kapcsolva, hasznÃĄlatÃĄhoz kapcsolja be.",
+ "spatial.spatialProperties": "TÊrbeli hang",
+ "spatial.width": "SzÊlessÊg",
+ "spatial.height": "MagassÃĄg",
+ "spatial.depth": "HosszÃēsÃĄg",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "Szoba felÊpÃtÊse",
+ "spatial.roomDimensions": "Szoba mÊretei",
+ "spatial.roomPositions": "Szoba pozÃciÃŗi",
+ "spatial.setDimensions": "MÊretek beÃĄllÃtÃĄsa",
+ "spatial.setPositions": "PozÃciÃŗk beÃĄllÃtÃĄsa",
+ "spatial.up": "Fent",
+ "spatial.front": "ElÅl",
+ "spatial.left": "Balra",
+ "spatial.right": "Jobbra",
+ "spatial.back": "HÃĄtul",
+ "spatial.down": "Lent",
+ "spatial.listener": "HallgatÃŗ",
+ "spatial.audioSource": "HangforrÃĄs",
+ "settings.header.unfinished": "Befejezetlen",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "Olvasd be ezt a QR-kÃŗdot a telefonoddal, hogy tudd vezÊrelni a lejÃĄtszÃŗt.",
+ "about.thanks": "KÃļszÃļnet a Cider Collective csapatÃĄnak Ês minden hozzÃĄjÃĄrulÃŗnak."
+}
diff --git a/src/i18n/in_ID.json b/src/i18n/in_ID.json
new file mode 100644
index 00000000..1fda2292
--- /dev/null
+++ b/src/i18n/in_ID.json
@@ -0,0 +1,309 @@
+{
+ "i18n.languageName": "Bahasa Indonesia",
+ "i18n.languageNameEnglish": "Indonesian",
+ "i18n.category": "main",
+ "i18n.authors": "@crystalshower",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "Batal",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Memperbarui Pustaka lagu...",
+ "notification.updatingLibraryAlbums": "Memperbarui Pustaka album...",
+ "notification.updatingLibraryArtists": "Memperbarui Pustaka artis...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Pelajari lebih lanjut",
+ "term.accountSettings": "Pengaturan Akun",
+ "term.logout": "Keluar",
+ "term.login": "Masuk",
+ "term.about": "Tentang",
+ "term.privateSession": "Sesi Pribadi",
+ "term.queue": "Antrian",
+ "term.history": "Riwayat",
+ "term.search": "Cari",
+ "term.library": "Pustaka",
+ "term.listenNow": "Dengarkan Sekarang",
+ "term.browse": "Telusuri",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "Baru Ditambahkan",
+ "term.songs": "Lagu",
+ "term.albums": "Album",
+ "term.artists": "Artis",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Playlist",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "Playlist Baru",
+ "term.newPlaylistFolder": "Folder Playlist Baru",
+ "term.createNewPlaylist": "Buat Playlist Baru",
+ "term.createNewPlaylistFolder": "Buat Folder Playlist Baru",
+ "term.deletePlaylist": "Yakin ingin menghapus playlist ini?",
+ "term.play": "Mainkan",
+ "term.pause": "Jeda",
+ "term.previous": "Sebelumnya",
+ "term.next": "Selanjutnya",
+ "term.shuffle": "Acak",
+ "term.repeat": "Ulangi",
+ "term.volume": "Volume",
+ "term.mute": "Bisu",
+ "term.unmute": "Bunyikan",
+ "term.share": "Bagikan",
+ "term.share.success": "Disalin ke clipboard",
+ "term.settings": "Pengaturan",
+ "term.seeAll": "Lihat Semua",
+ "term.sortBy": "Urutkan Berdasarkan",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Artis",
+ "term.sortBy.name": "Nama",
+ "term.sortBy.genre": "Genre",
+ "term.sortBy.releaseDate": "Tanggal Rilis",
+ "term.sortBy.duration": "Durasi",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Terkecil",
+ "term.sortOrder.descending": "Terbesar",
+ "term.viewAs": "Lihat Sebagai",
+ "term.viewAs.coverArt": "Cover Art",
+ "term.viewAs.list": "Daftar",
+ "term.size": "Ukuran",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Kompak",
+ "term.enable": "Aktifkan",
+ "term.disable": "Nonaktifkan",
+ "term.enabled": "Diaktifkan",
+ "term.disabled": "Dinonaktikan",
+ "term.connect": "Sambungkan",
+ "term.connecting": "Menyambungkan",
+ "term.disconnect": "Terputus",
+ "term.authed": "Diotentikasi",
+ "term.confirm": "Konfirmasi?",
+ "term.more": "Selebihnya",
+ "term.less": "Lebih Sedikit",
+ "term.showMore": "Tampilkan lebih banyak",
+ "term.showLess": "Tampilkan lebih sedikit",
+ "term.topSongs": "Lagu Teratas",
+ "term.latestReleases": "Rilis Terbaru",
+ "term.time.added": "Ditambahkan",
+ "term.time.released": "Dirilis",
+ "term.time.updated": "Diperbarui",
+ "term.time.hours": "jam",
+ "term.time.hour": "jam",
+ "term.time.minutes": "menit",
+ "term.time.minute": "menit",
+ "term.time.seconds": "detik",
+ "term.time.second": "detik",
+ "term.fullscreenView": "Mode Layar Penuh",
+ "term.defaultView": "Mode Default",
+ "term.audioSettings": "Pengaturan Audio",
+ "term.clearAll": "Bersihkan Semua",
+ "term.recentStations": "Stasiun Terbaru",
+ "term.language": "Bahasa",
+ "term.funLanguages": "Senang-senang",
+ "term.noLyrics": "Memuat... / Lirik tidak ditermukan./ Instrumental.",
+ "term.copyright": "Hak cipta",
+ "term.rightsReserved": "Hak cipta dilindungi Undang-undang.",
+ "term.sponsor": "Sponsori proyek ini",
+ "term.ciderTeam": "Cider Team",
+ "term.developer": "Pengembang",
+ "term.socialTeam": "Social Team",
+ "term.socials": "Sosial",
+ "term.contributors": "Kontributor",
+ "term.equalizer": "Equalizer",
+ "term.reset": "Atur Ulang",
+ "term.tracks": "lagu",
+ "term.videos": "Video",
+ "term.menu": "Menu",
+ "term.check": "Cek",
+ "term.aboutArtist": "Tentang {{artistName}}",
+ "term.topResult": "Hasil Teratas",
+ "term.sharedPlaylists": "Playlist yang dibagikan",
+ "term.people": "Orang",
+ "term.newpreset.name": "Nama Preset EQ Baru",
+ "term.addedpreset": "Preset Ditambahkan",
+ "term.deletepreset.warn": "Yakin ingin menghapus preset ini?",
+ "term.deletedpreset": "Preset dihapus",
+ "term.musicVideos": "Video Musik",
+ "term.stations": "Stasiun",
+ "term.curators": "Kurator",
+ "term.appleCurators": "Kurator Apple",
+ "term.radioShows": "Acara Radio",
+ "term.recordLabels": "Label Rekaman",
+ "term.videoExtras": "Bonus Video",
+ "term.top": "Atas",
+ "home.title": "Beranda",
+ "home.recentlyPlayed": "Baru Dimainkan",
+ "home.recentlyAdded": "Baru Ditambahkan",
+ "home.artistsFeed": "Feed Artis Anda",
+ "home.artistsFeed.noArtist": "Ikuti beberapa artis terlebih dahulu dan rilisan terbaru mereka akan ada di sini",
+ "home.madeForYou": "Dibuat Untuk Kamu",
+ "home.friendsListeningTo": "Teman Sedang Mendengarkan",
+ "home.followedArtists": "Artis Diikuti",
+ "error.appleMusicSubRequired": "Apple Music memerlukan langganan.",
+ "error.connectionError": "Terjadi masalah saat menyambungkan ke Apple Music.",
+ "error.noResults": "Tidak ada hasil.",
+ "error.noResults.description": "Coba pencarian baru.",
+ "podcast.followOnCider": "Ikuti Di Cider",
+ "podcast.followedOnCider": "Mengikuti Di Cider",
+ "podcast.subscribeOnItunes": "Langganan Di iTunes",
+ "podcast.subscribedOnItunes": "Berlangganan Di iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Episode",
+ "podcast.playEpisode": "Mainkan Episode",
+ "podcast.website": "Website Podcast",
+ "action.addToLibrary": "Tambahkan ke Pustaka",
+ "action.addToLibrary.success": "Ditambahkan ke Pustaka",
+ "action.addToLibrary.error": "Terjadi Kesalahan Saat Menambahkan Pustaka",
+ "action.removeFromLibrary": "Hapus dari Pustaka",
+ "action.removeFromLibrary.success": "Dihapus dari Pustaka",
+ "action.addToQueue": "Tambahkan ke Antrian",
+ "action.addToQueue.success": "Ditambahkan ke Antrian",
+ "action.addToQueue.error": "Terjadi Kesalahan Saat Menambahkan ke Antrean",
+ "action.removeFromQueue": "Hapus dari Antrian",
+ "action.removeFromQueue.success": "Dihapus dari Antrian",
+ "action.removeFromQueue.error": "Terjadi Kesalahan Saat Menghapus Antrian",
+ "action.createPlaylist": "Buat Playlist Baru",
+ "action.addToPlaylist": "Tambahkan ke Playlist",
+ "action.removeFromPlaylist": "Hapus dari Playlist",
+ "action.addToFavorites": "Tambahkan ke Favorit",
+ "action.follow": "Ikuti",
+ "action.follow.success": "Diikuti",
+ "action.follow.error": "Kesalahan Dalam Mengikuti",
+ "action.unfollow": "Berhenti Mengikuti",
+ "action.unfollow.success": "Sudah Tidak Mengikuti",
+ "action.unfollow.error": "Terjadi Kesalahan Saat Berhenti Mengikuti",
+ "action.playNext": "Mainkan Selanjutnya",
+ "action.playLater": "Mainkan Nanti",
+ "action.startRadio": "Mulai Radio",
+ "action.goToArtist": "Lihat Halaman Artis",
+ "action.goToAlbum": "Lihat Halaman Album",
+ "action.moveToTop": "Pindah ke Atas",
+ "action.share": "Bagikan",
+ "action.rename": "Ubah Nama",
+ "action.love": "Suka",
+ "action.unlove": "Batal Suka",
+ "action.dislike": "Tidak Suka",
+ "action.undoDislike": "Batalkan Tidak Suka",
+ "action.showWebRemoteQR": "Remot Web",
+ "action.playTracksNext": "Mainkan ${app.selectedMediaItems.length} lagu selanjutnya",
+ "action.playTracksLater": "Mainkan ${app.selectedMediaItems.length} lagu nanti",
+ "action.removeTracks": "Hapus ${self.selectedItems.length} lagu dari antrian",
+ "action.import": "Impor",
+ "action.export": "Ekspor",
+ "action.showAlbum": "Tampilkan Album Sepenuhnya",
+ "action.tray.minimize": "Sembunyikan ke Tray",
+ "action.tray.quit": "Keluar",
+ "action.tray.show": "Tampilkan",
+ "action.update": "Perbarui",
+ "action.copy": "Salin",
+ "action.newpreset": "Preset Baru...",
+ "action.deletepreset": "Hapus Preset",
+ "settings.header.general": "Umum",
+ "settings.header.general.description": "Sesuaikan pengaturan umum untuk Cider.",
+ "settings.option.general.language": "Bahasa",
+ "settings.option.general.language.main": "Bahasa",
+ "settings.option.general.language.fun": "Bahasa Candaan",
+ "settings.option.general.language.unsorted": "Tidak disortir",
+ "settings.option.general.updateCider": "Perbarui Cider",
+ "settings.option.general.updateCider.branch": "Branch Pembaruan Cider",
+ "settings.option.general.updateCider.branch.description": "Pilih branch untuk memperbarui Cider",
+ "settings.option.general.updateCider.branch.main": "Stable",
+ "settings.option.general.updateCider.branch.develop": "Development",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "Sesuaikan pengaturan audio untuk Cider.",
+ "settings.option.audio.quality": "Kualitas Audio",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "sampai dari 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "sampai dari 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "Tinggi",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standar",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "Transisi Audio Mulus",
+ "settings.option.audio.enableAdvancedFunctionality": "Aktifkan Fungsi Lanjutan",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Peningkatan Psikoakustik yang membuat semuanya terdengar lebih jelas dan lebih hidup | Dirancang oleh Maikiwi.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Kekuatan CAP",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Mengubah kekuatan pemrosesan yang dilakukan pada audio. (Agresif dapat menghasilkan hasil yang tidak diinginkan)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standar",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisasi Audio",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Menormalkan puncak volume untuk masing-masing lagu demi menciptakan pengalaman mendengarkan yang lebih seragam.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spasialisasi Audio",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Atur ruang audio dan buat audio lebih 3 dimensi (NB: Bukan Dolby Atmos)",
+ "settings.header.visual": "Visual",
+ "settings.header.visual.description": "Sesuaikan pengaturan visual untuk Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Gaya Latar Belakang Jendela",
+ "settings.header.visual.windowBackgroundStyle.none": "Tidak Ada",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
+ "settings.header.visual.windowBackgroundStyle.image": "Gambar",
+ "settings.option.visual.animatedArtwork": "Artwork Bergerak",
+ "settings.header.visual.animatedArtwork.always": "Selalu",
+ "settings.header.visual.animatedArtwork.limited": "Terbatas untuk halaman dan entri khusus",
+ "settings.header.visual.animatedArtwork.disable": "Matikan di semua tempat",
+ "settings.option.visual.animatedArtworkQuality": "Kualitas Artwork Bergerak",
+ "settings.header.visual.animatedArtworkQuality.low": "Rendah",
+ "settings.header.visual.animatedArtworkQuality.medium": "Medium",
+ "settings.header.visual.animatedArtworkQuality.high": "Tinggi",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Sangat Tinggi",
+ "settings.header.visual.animatedArtworkQuality.extreme": "Paling Tinggi",
+ "settings.option.visual.animatedWindowBackground": "Jendela Latar Belakang Bergerak",
+ "settings.option.visual.hardwareAcceleration": "Akselerasi Perangkat Keras (HW Acceleration)",
+ "settings.option.visual.hardwareAcceleration.description": "Membutuhkan dibuka ulang",
+ "settings.header.visual.hardwareAcceleration.default": "Default",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Tema",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Gelap",
+ "settings.option.visual.showPersonalInfo": "Tampilkan Info Pribadi",
+ "settings.header.lyrics": "Lyrics",
+ "settings.header.lyrics.description": "Sesuaikan pengaturan lirik untuk Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Aktifkan Lirik Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Aktifkan Mode Karaoke (khusus Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Bahasa Terjemahan Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "Aktifkan Lirik Youtube untuk Video Musik",
+ "settings.header.connectivity": "Konektivitas",
+ "settings.header.connectivity.description": "Sesuaikan pengaturan konektivitas untuk Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Pemberitahuan Pemutaran",
+ "settings.header.connectivity.discordRPC.cider": "Tampilkan sebagai 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Tampilkan sebagai 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Sembunyikan Discord Rich Presence saat dijeda",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Delay Last.fm Scrobble (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktifkan Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Hapus featuring artist dari judul lagu (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter lagu yang diulang (Last.fm)",
+ "settings.header.experimental": "Eksperimental",
+ "settings.header.experimental.description": "Sesuaikan pengaturan eksperimental untuk Cider.",
+ "settings.option.experimental.compactUI": "UI Kompak",
+ "settings.option.experimental.close_button_hide": "Tombol Tutup Menyembunyikan Aplikasi",
+ "settings.option.experimental.copy_log": "Salin log ke clipboard",
+ "settings.option.experimental.inline_playlists": "Playlist dan Album Sebaris",
+ "spatial.notTurnedOn": "Spasialisasi Audio dinonaktifkan. Untuk menggunakan, aktifkan terlebih dahulu.",
+ "spatial.spatialProperties": "Spatial Properties",
+ "spatial.width": "Lebar",
+ "spatial.height": "Tinggi",
+ "spatial.depth": "Kedalaman",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "Bahan Ruangan",
+ "spatial.roomDimensions": "Dimensi Ruangan",
+ "spatial.roomPositions": "Posisi Ruangan",
+ "spatial.setDimensions": "Atur Dimensi",
+ "spatial.setPositions": "Atur Posisi",
+ "spatial.up": "Atas",
+ "spatial.front": "Depan",
+ "spatial.left": "Kiri",
+ "spatial.right": "Kanan",
+ "spatial.back": "Belakang",
+ "spatial.down": "Bawah",
+ "spatial.listener": "Pendegar",
+ "spatial.audioSource": "Sumber Audio",
+ "settings.header.unfinished": "Belum Diselesaikan",
+ "remote.web.title": "Remote Cider",
+ "remote.web.description": "Pindai kode QR untuk memasangkan ponsel Anda dengan Cider.",
+ "about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami."
+}
\ No newline at end of file
diff --git a/src/i18n/it_IT.jsonc b/src/i18n/it_IT.json
similarity index 81%
rename from src/i18n/it_IT.jsonc
rename to src/i18n/it_IT.json
index 5c3589f0..51209dcc 100644
--- a/src/i18n/it_IT.jsonc
+++ b/src/i18n/it_IT.json
@@ -1,25 +1,15 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "Italiano", // name of language in native language
- "i18n.languageNameEnglish": "Italian", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "ConnectedR", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+{
+ "i18n.languageName": "Italiano",
+ "i18n.languageNameEnglish": "Italian",
+ "i18n.category": "main",
+ "i18n.authors": "ConnectedR",
"app.name": "Cider",
-
"date.format": "${d} ${m}, ${y}",
-
- // Dialogs
"dialog.cancel": "Annulla",
"dialog.ok": "OK",
-
- // Notification
"notification.updatingLibrarySongs": "Aggiornamento raccolta brani...",
"notification.updatingLibraryAlbums": "Aggornamento raccolta album...",
"notification.updatingLibraryArtists": "Aggiornamento raccolta artisti...",
- // Terms
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
@@ -91,10 +81,10 @@
"term.less": "Meno",
"term.showMore": "Mostra altro",
"term.showLess": "Mostra menu",
- "term.topSongs" : "Brani top",
+ "term.topSongs": "Brani top",
"term.latestReleases": "Uscite Recenti",
"term.time.added": "Aggiunto",
- "term.time.released": "Rilasciato",
+ "term.time.released": "Rilasciato",
"term.time.updated": "Aggiornato",
"term.time.hours": "ore",
"term.time.hour": "ora",
@@ -120,12 +110,10 @@
"term.contributors": "Contribuenti",
"term.equalizer": "Equalizzatore",
"term.reset": "Reset",
- "term.tracks": "brani", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "Video",
+ "term.tracks": "brani",
+ "term.videos": "Video",
"term.menu": "Menu",
"term.check": "Controllo",
-
- // Home
"home.title": "Casa",
"home.recentlyPlayed": "Ascoltato di recente",
"home.recentlyAdded": "Aggiunto di recente",
@@ -134,13 +122,10 @@
"home.madeForYou": "Per Te",
"home.friendsListeningTo": "Ascoltato da Amici",
"home.followedArtists": "Artisti Seguiti",
- // Errors
"error.appleMusicSubRequired": "Apple Music ha bisogno di un abbonamento.",
"error.connectionError": "C'è stato un problema nella connessione a Apple Music.",
"error.noResults": "Nessun risultato.",
"error.noResults.description": "Prova un'altra ricerca.",
-
- //Podcasts
"podcast.followOnCider": "Segui in Cider",
"podcast.followedOnCider": "Seguiti in Cider",
"podcast.subscribeOnItunes": "Iscriviti in iTunes",
@@ -149,8 +134,6 @@
"podcast.episodes": "Episodi",
"podcast.playEpisode": "Ascolta Episodio",
"podcast.website": "Sito Podcast",
-
- // Actions
"action.addToLibrary": "Aggiungi a Raccolta",
"action.addToLibrary.success": "Aggiunto a Raccolta",
"action.addToLibrary.error": "Errore ad Aggiungere a Raccolta",
@@ -191,122 +174,96 @@
"action.import": "Importa",
"action.export": "Esporta",
"action.showAlbum": "Mostra Album Intero",
- // Waiting on Core for moving plugin to app.ts
"action.tray.minimize": "Minimizza nel tray",
"action.tray.quit": "Chiudi",
"action.tray.show": "Mostra",
-
- // Settings - General
"settings.header.general": "Generale",
"settings.header.general.description": "Cambia le impostazioni generali di Cider.",
"settings.option.general.language": "Lingua",
-
- // Language optgroups
"settings.option.general.language.main": "Lingue",
"settings.option.general.language.fun": "Lingue da Scherzo",
"settings.option.general.language.unsorted": "Non ordinato",
-
- // Settings - Audio
"settings.header.audio": "Audio",
"settings.header.audio.description": "Cambia le impostazioni di audio di Cider.",
- "settings.option.audio.quality": "Qualità di audio", // Dropdown
+ "settings.option.audio.quality": "Qualità di audio",
"settings.header.audio.quality.high": "Alta",
"settings.header.audio.quality.low": "Bassa",
"settings.header.audio.quality.auto": "Automatica",
- "settings.option.audio.seamlessTransition": "Transizioni Audio Immediate", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Attiva funzionalità avanzata", // Toggle
+ "settings.option.audio.seamlessTransition": "Transizioni Audio Immediate",
+ "settings.option.audio.enableAdvancedFunctionality": "Attiva funzionalità avanzata",
"settings.option.audio.enableAdvancedFunctionality.description": "Attiva AudioContext per funzionalià audio avanzata Normalizzazione Audio, Equalizzatori and Visualizzatori, perÃ˛ su alcuni sistemi potrebbero causare lag nei brani.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizzazione Audio", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizzazione Audio",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizza il volume massimo nei brani per un'esperienza d'ascolto piÚ uniforme.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spazializzazione Audio", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spazializzazione Audio",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spazializza l'audio per dare un effetto piÚ tridimensionale (nota: questo non è Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visuale",
+ "settings.header.visual": "Visuale",
"settings.header.visual.description": "Cambia le impostazioni visuali per Cider.",
- "settings.option.visual.windowBackgroundStyle": "Stile Sfondo Finestra", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "Stile Sfondo Finestra",
"settings.header.visual.windowBackgroundStyle.none": "Nessuno",
"settings.header.visual.windowBackgroundStyle.artwork": "Copertina",
"settings.header.visual.windowBackgroundStyle.image": "Immagine",
- "settings.option.visual.animatedArtwork": "Copertina Animata", // Dropdown
+ "settings.option.visual.animatedArtwork": "Copertina Animata",
"settings.header.visual.animatedArtwork.always": "Sempre",
"settings.header.visual.animatedArtwork.limited": "Limita ad alcune pagine",
"settings.header.visual.animatedArtwork.disable": "Disattiva dappertutto",
- "settings.option.visual.animatedArtworkQuality": "Qualità Copertina Animata", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "Qualità Copertina Animata",
"settings.header.visual.animatedArtworkQuality.low": "Bassa",
"settings.header.visual.animatedArtworkQuality.medium": "Media",
"settings.header.visual.animatedArtworkQuality.high": "Alta",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Molto Alta",
"settings.header.visual.animatedArtworkQuality.extreme": "Estrema",
- "settings.option.visual.animatedWindowBackground": "Sfondo Finestra Animato", // Toggle
- "settings.option.visual.hardwareAcceleration": "Accelerazione Hardware", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "Sfondo Finestra Animato",
+ "settings.option.visual.hardwareAcceleration": "Accelerazione Hardware",
"settings.option.visual.hardwareAcceleration.description": "Richiede riavvio del'app",
- "settings.header.visual.hardwareAcceleration.default": "Normale",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Mostra Informazione Personale", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "Normale",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.option.visual.showPersonalInfo": "Mostra Informazione Personale",
"settings.header.lyrics": "Testi",
"settings.header.lyrics.description": "Aggiusta le impostazioni dei testi per Cider.",
- "settings.option.lyrics.enableMusixmatch": "Attiva Testi Musixmatch", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Attiva Modalità Karaoke (solo Musixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Lingua di Traduzione MusixMatch Preferita", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Attiva Testi da YouTube Per i Video ", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "Attiva Testi Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Attiva Modalità Karaoke (solo Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Lingua di Traduzione MusixMatch Preferita",
+ "settings.option.lyrics.enableYoutubeLyrics": "Attiva Testi da YouTube Per i Video ",
"settings.header.connectivity": "Connectività ",
"settings.header.connectivity.description": "Cambia le impostazioni di connettività per Cider.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "Notifiche di Riproduzione", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Notifiche di Riproduzione",
"settings.header.connectivity.discordRPC.cider": "Mostra come 'Cider'",
"settings.header.connectivity.discordRPC.appleMusic": "Mostra come 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "Pausare Disattiva la Rich Presence", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Scrobbling LastFM", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "Ritardo di Scrobbling LastFM (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Attiva Now Playing in LastFM",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Rimouvi Artisti Extra dal Titolo del Brano (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtra Brani Ripetuti (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "Pausare Disattiva la Rich Presence",
+ "settings.option.connectivity.lastfmScrobble": "Scrobbling LastFM",
+ "settings.option.connectivity.lastfmScrobble.delay": "Ritardo di Scrobbling LastFM (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Attiva Now Playing in LastFM",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Rimouvi Artisti Extra dal Titolo del Brano (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtra Brani Ripetuti (LastFM)",
"settings.header.experimental": "Sperimentale",
"settings.header.experimental.description": "Cambia impostazioni sperimentali per Cider.",
- "settings.option.experimental.compactUI": "Interfaccia Compatta", // Toggle
+ "settings.option.experimental.compactUI": "Interfaccia Compatta",
"settings.option.experimental.closeButtonBehaviour": "Comportamento Tasto Chiudi",
"settings.option.experimental.closeButtonBehaviour.quit": "Chiudi Cider",
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Minimizza",
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "Minimizza Nel Tray",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
"spatial.notTurnedOn": "Spazializzazione Audio è disattivata. Attivala prima.",
- "spatial.spatialProperties" : "Proprietà Spaziali",
- "spatial.width" : "Larghezza",
- "spatial.height" : "Altezza",
- "spatial.depth" : "Profondità ",
- "spatial.gain" : "Guadagno",
- "spatial.roomMaterials" : "Materiali Stanza",
- "spatial.roomDimensions" : "Dimensioni Stanza",
- "spatial.roomPositions" : "Posizioni Stanza",
- "spatial.setDimensions" : "Imposta Dimensioni",
- "spatial.setPositions" : "Imposta Posizioni",
- "spatial.up" : "Sopra",
- "spatial.front" : "In fronte",
- "spatial.left" : "Sinistra",
- "spatial.right" : "Destra",
- "spatial.back" : "Dietro",
- "spatial.down" : "Sotto",
- "spatial.listener" : "Utente",
- "spatial.audioSource" : "Fonte Audio",
-
- // Settings - Unfinished
+ "spatial.spatialProperties": "Proprietà Spaziali",
+ "spatial.width": "Larghezza",
+ "spatial.height": "Altezza",
+ "spatial.depth": "Profondità ",
+ "spatial.gain": "Guadagno",
+ "spatial.roomMaterials": "Materiali Stanza",
+ "spatial.roomDimensions": "Dimensioni Stanza",
+ "spatial.roomPositions": "Posizioni Stanza",
+ "spatial.setDimensions": "Imposta Dimensioni",
+ "spatial.setPositions": "Imposta Posizioni",
+ "spatial.up": "Sopra",
+ "spatial.front": "In fronte",
+ "spatial.left": "Sinistra",
+ "spatial.right": "Destra",
+ "spatial.back": "Dietro",
+ "spatial.down": "Sotto",
+ "spatial.listener": "Utente",
+ "spatial.audioSource": "Fonte Audio",
"settings.header.unfinished": "Incompleto",
-
- // Web Remote
"remote.web.title": "Telecomando Cider",
"remote.web.description": "Leggi il codice QR per connettere il tuo telefono con questa istanza di Cider",
-
- // About
"about.thanks": "Grazie mille alla Team di Cider Collective e tutti i nostri contribuenti."
}
\ No newline at end of file
diff --git a/src/i18n/ja_JP.jsonc b/src/i18n/ja_JP.json
similarity index 73%
rename from src/i18n/ja_JP.jsonc
rename to src/i18n/ja_JP.json
index 8c178de1..67f5d451 100644
--- a/src/i18n/ja_JP.jsonc
+++ b/src/i18n/ja_JP.json
@@ -1,30 +1,20 @@
{
- // App info
+ "i18n.languageName": "æĨæŦčĒ",
+ "i18n.languageNameEnglish": "Japanese",
+ "i18n.category": "main",
+ "i18n.authors": "@maikirakiwi",
"app.name": "Cider",
-
"date.format": "${y}åš´${m}æ${d}æĨ",
-
- // i18n Info
- "i18n.languageName": "æĨæŦčĒ", // name of language in native language
- "i18n.languageNameEnglish": "Japanese", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // Dialogs
"dialog.cancel": "ããŖãŗãģãĢ",
"dialog.ok": "OK",
-
- // Notification
"notification.updatingLibrarySongs": "ãŠã¤ããŠãĒãŽæ´æ°ä¸...",
"notification.updatingLibraryAlbums": "ãŠã¤ããŠãĒãŽæ´æ°ä¸...",
"notification.updatingLibraryArtists": "ãŠã¤ããŠãĒãŽæ´æ°ä¸...",
-
- // Terms
- "term.appleMusic": "Apple Music", // Follows brand term
- "term.applePodcasts": "Apple Podcasts", // Follows brand term
- "term.itunes": "iTunes", // Follows brand term
- "term.github": "GitHub", // Follows brand term
- "term.discord": "Discord", // Follows brand term
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
"term.learnMore": "čŠŗããæ
å ą",
"term.accountSettings": "ãĸãĢãĻãŗãč¨åŽ",
"term.logout": "ãĩã¤ãŗãĸãĻã",
@@ -63,6 +53,7 @@
"term.sortBy.genre": "ã¸ãŖãŗãĢ",
"term.sortBy.releaseDate": "é
äŋĄéå§æĨ",
"term.sortBy.duration": "æé",
+ "term.sortBy.dateAdded": "čŋŊå æĨ",
"term.sortOrder": "ä¸Ļãšæŋã",
"term.sortOrder.ascending": "æé ",
"term.sortOrder.descending": "éé ",
@@ -85,10 +76,10 @@
"term.less": "æ¸ãã",
"term.showMore": "ããŖã¨čĻã",
"term.showLess": "襨į¤ēæ°ãå°ãĒããã",
- "term.topSongs" : "ããããŊãŗã°",
+ "term.topSongs": "ããããŊãŗã°",
"term.latestReleases": "ããĨãŧãĒãĒãŧãš",
"term.time.added": "čŋŊå æĨ",
- "term.time.released": "é
äŋĄéå§æĨ",
+ "term.time.released": "é
äŋĄéå§æĨ",
"term.time.updated": "æįĩæ´æ°æĨ",
"term.time.hours": "æé",
"term.time.hour": "æé",
@@ -105,7 +96,7 @@
"term.language": "č¨čĒ",
"term.noLyrics": "ããŧããŖãŗã°ãã / æčŠãčĻã¤ãããĒã / 卿ĨŊæ˛.",
"term.copyright": "čäŊ樊",
- "term.rightsReserved": "All Rights Reserved.", // Translation does not exist in Japanese
+ "term.rightsReserved": "All Rights Reserved.",
"term.sponsor": "ãšããŗãĩãŧãĢãĒããžããã",
"term.ciderTeam": "Cider ããŧã ",
"term.developer": "éįēč
",
@@ -113,14 +104,16 @@
"term.contributors": "č˛ĸįŽč
",
"term.equalizer": "ã¤ãŗãŠã¤ãļãŧ",
"term.reset": "ãĒãģãã",
- "term.tracks": "æ˛", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "ãããĒ",
+ "term.track": {
+ "one": "æ˛",
+ "other": "æ˛"
+ },
+ "term.tracks": "æ˛",
+ "term.videos": "ãããĒ",
"term.menu": "ãĄããĨãŧ",
"term.check": "įĸēčĒ",
- "term.aboutArtist": "{{artistName}}ãĢã¤ããĻ", // e.g. 'About Doja Cat'
- "term.updateCider": "Cider æ´æ°",
-
- // Home
+ "term.aboutArtist": "{{artistName}}ãĢã¤ããĻ",
+ "term.version": "ããŧã¸ã§ãŗ",
"home.title": "ããŧã ",
"home.recentlyPlayed": "æčŋãŽåį",
"home.recentlyAdded": "æčŋčŋŊå ããé
įŽ",
@@ -129,13 +122,10 @@
"home.madeForYou": "ããĒããĢãããã",
"home.friendsListeningTo": "åéãč´ããĻãã",
"home.followedArtists": "ããŠããŧããĻãããĸãŧããŖãšã",
- // Errors
"error.appleMusicSubRequired": "Apple MusicãŽãĩããšã¯ãĒããˇã§ãŗãåŋ
čĻã§ãã",
"error.connectionError": "Apple MusicãĢæĨįļã§ããžããã",
"error.noResults": "čĻã¤ãããžããã§ãã",
"error.noResults.description": "ããä¸åēĻãčŠĻããã ããã",
-
- //Podcasts
"podcast.followOnCider": "Ciderã§ããŠããŧ",
"podcast.followedOnCider": "ããŠããŧä¸",
"podcast.subscribeOnItunes": "iTunesã§čŗŧčĒ",
@@ -144,8 +134,6 @@
"podcast.episodes": "įĒįĩ",
"podcast.playEpisode": "åį",
"podcast.website": "Podcast ãĻã§ã",
-
- // Actions
"action.addToLibrary": "ãŠã¤ããŠãĒãĢčŋŊå ",
"action.addToLibrary.success": "ãŠã¤ããŠãĒãĢčŋŊå ãããžãã",
"action.addToLibrary.error": "ãŠã¤ããŠãĒã¸ãŽčŋŊå ãĢå¤ąæããžãã",
@@ -189,105 +177,107 @@
"action.tray.quit": "įĩäē",
"action.tray.show": "襨į¤ē",
"action.update": "ãĸããããŧã",
-
- // Settings - Audio
+ "action.copy": "ãŗããŧ",
+ "action.newpreset": "ããĨãŧããĒãģãã",
+ "action.deletepreset": "ããĒãģãããåé¤",
+ "settings.header.general": "ä¸čŦ",
+ "settings.header.general.description": "CiderãŽä¸čŦč¨åŽ",
+ "settings.option.general.language.main": "ãĄã¤ãŗ",
+ "settings.option.general.language.fun": "čãã",
+ "settings.option.general.language.unsorted": "æĒåéĄ",
+ "settings.option.general.updateCider": "Cider æ´æ°",
"settings.header.audio": "ãĒãŧããŖãĒ",
"settings.header.audio.description": "CiderãŽãĒãŧããŖãĒč¨åŽ",
- "settings.option.audio.quality": "éŗčŗĒ", // Dropdown
+ "settings.option.audio.volumeStep": "éŗéčĒŋæ´ãŽãšããã",
+ "settings.option.audio.maxVolume": "æå¤§éŗé",
+ "settings.option.audio.quality": "éŗčŗĒ",
+ "settings.header.audio.quality.hireslossless": "ãã¤ãŦãžããšãŦãš",
+ "settings.header.audio.quality.hireslossless.description": "(æå¤§č§ŖååēĻ 24 ãããīŧ192 kHz)",
+ "settings.header.audio.quality.lossless": "ããšãŦãš",
+ "settings.header.audio.quality.lossless.description": "(æå¤§č§ŖååēĻ 24 ãããīŧ48 kHz)",
+ "settings.header.audio.quality.enhanced": "ã¨ãŗããŗãšã",
"settings.header.audio.quality.high": "éĢåčŗĒ",
- "settings.header.audio.quality.low": "éĢåšį",
+ "settings.header.audio.quality.standard": "éĢåšį",
"settings.header.audio.quality.auto": "čĒå",
- "settings.option.audio.seamlessTransition": "æ˛éãĒãã§åį", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "å
é˛įãĒæŠčŊ", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "AudioContext æŠčŊãæåšãĢããã¨ããĒãŧããŖãĒããŧããŠã¤ãēãįŠēéãĒãŧããŖãĒãã¤ãŗãŠã¤ãļãŧãĒãŠãŽæŠčŊãäŊŋį¨ã§ããžãããéŗãéåãããããããžããã", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ãĒãŧããŖãĒããŧããŠã¤ãē", // Toggle
+ "settings.option.audio.seamlessTransition": "æ˛éãĒãã§åį",
+ "settings.option.audio.enableAdvancedFunctionality": "å
é˛įãĒæŠčŊ",
+ "settings.option.audio.enableAdvancedFunctionality.description": "AudioContext æŠčŊãæåšãĢããã¨ããĒãŧããŖãĒããŧããŠã¤ãēãįŠēéãĒãŧããŖãĒãã¤ãŗãŠã¤ãļãŧãĒãŠãŽæŠčŊãäŊŋį¨ã§ããžãããéŗãéåãããããããžããã",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "å§į¸ŽéŗæēãéĢč§ŖååēĻãĢåĻįãããã¨ãĢããŖãĻãããšãŦãšį¸åŊãŽéŗčŗĒãĢåä¸ãããžãã",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAPãŽåŧˇã",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "æ¨æē",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "éĢ",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ãĒãŧããŖãĒããŧããŠã¤ãē",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "ããžããžãĒæ˛ãŽéŗéãåä¸ãĢããããæ´ãŖãéŗãæĨŊããããããĢããæŠčŊã§ãã",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ãĒãŧããŖãĒįŠēéå", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ãĒãŧããŖãĒįŠēéå",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ãĒãŧããŖãĒãįŠēéãĢåæŖãããæŠčŊã§ãã (ããĢããŧãĸããĸãšã§ã¯ãããžãã)",
- // Settings - Visual
"settings.header.visual": "ãã¸ãĨãĸãĢ",
"settings.header.visual.description": "CiderãŽãã¸ãĨãĸãĢč¨åŽ",
- "settings.option.visual.windowBackgroundStyle": "ãĸããĒãĻã¤ãŗããĻãŽčæ¯ãšãŋã¤ãĢ", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "ãĸããĒãĻã¤ãŗããĻãŽčæ¯ãšãŋã¤ãĢ",
"settings.header.visual.windowBackgroundStyle.none": "ãĒã",
"settings.header.visual.windowBackgroundStyle.artwork": "ãĸãŧãã¯ãŧã¯",
- "settings.option.visual.animatedArtwork": "ãĸããĄãŧãˇã§ãŗãĸãŧãã¯ãŧã¯", // Dropdown
+ "settings.option.visual.animatedArtwork": "ãĸããĄãŧãˇã§ãŗãĸãŧãã¯ãŧã¯",
"settings.header.visual.animatedArtwork.always": "常ãĢ襨į¤ē",
"settings.header.visual.animatedArtwork.limited": "ãĸãŧããŖãšãããŧã¸ãŽãŋ襨į¤ē",
"settings.header.visual.animatedArtwork.disable": "ãĒã",
- "settings.option.visual.animatedArtworkQuality": "ãĸããĄãŧãˇã§ãŗãĸãŧãã¯ãŧã¯ãŽåčŗĒ", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "ãĸããĄãŧãˇã§ãŗãĸãŧãã¯ãŧã¯ãŽåčŗĒ",
"settings.header.visual.animatedArtworkQuality.low": "äŊ",
"settings.header.visual.animatedArtworkQuality.medium": "ä¸",
"settings.header.visual.animatedArtworkQuality.high": "éĢ",
"settings.header.visual.animatedArtworkQuality.veryHigh": "čļ
éĢ",
"settings.header.visual.animatedArtworkQuality.extreme": "æéĢ",
- "settings.option.visual.animatedWindowBackground": "ãĸããĒãĻãŖãŗããĻãŽčæ¯ããĸããĄãŧãˇã§ãŗå", // Toggle
- "settings.option.visual.hardwareAcceleration": "ããŧããĻã§ãĸ ãĸã¯ãģãŠãŦãŧãˇã§ãŗ", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "ãĸããĒãĻãŖãŗããĻãŽčæ¯ããĸããĄãŧãˇã§ãŗå",
+ "settings.option.visual.hardwareAcceleration": "ããŧããĻã§ãĸ ãĸã¯ãģãŠãŦãŧãˇã§ãŗ",
"settings.option.visual.hardwareAcceleration.description": "ãĸããĒãåčĩˇåããåŋ
čĻããããžã",
- "settings.header.visual.hardwareAcceleration.default": "æĸåŽ",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "ããããŖãŧãĢã襨į¤ē", // Toggle
- // Settings - General (Reserved)
- "settings.header.general": "ä¸čŦ",
- "settings.header.general.description": "CiderãŽä¸čŦč¨åŽ",
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "æĸåŽ",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "ããŧã",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "ããŧã¯",
+ "settings.option.visual.showPersonalInfo": "ããããŖãŧãĢã襨į¤ē",
"settings.header.lyrics": "æčŠ",
"settings.header.lyrics.description": "æčŠãŽčĄ¨į¤ēč¨åŽ",
- "settings.option.lyrics.enableMusixmatch": "Musixmatchã§æčŠã襨į¤ēãã", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "ãĢãŠãĒãąãĸãŧããæåšãĢãã (MusixmatchãŽãŋ)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "æčŠãŽåĒå
č¨čĒ", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "YouTubeãŽæčŠãããĨãŧã¸ãã¯ãããĒãĢäŊŋį¨ãã", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "Musixmatchã§æčŠã襨į¤ēãã",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "ãĢãŠãĒãąãĸãŧããæåšãĢãã (MusixmatchãŽãŋ)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "æčŠãŽåĒå
č¨čĒ",
+ "settings.option.lyrics.enableYoutubeLyrics": "YouTubeãŽæčŠãããĨãŧã¸ãã¯ãããĒãĢäŊŋį¨ãã",
"settings.header.connectivity": "ãĸããĒã¨éŖæē",
"settings.header.connectivity.description": "CiderãŽéŖæēč¨åŽ",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.header.connectivity.discordRPC.cider": "'Cider' ã襨į¤ēãã",
"settings.header.connectivity.discordRPC.appleMusic": "'Apple Music' ã襨į¤ēãã",
- "settings.option.connectivity.discordRPC.clearOnPause": "䏿åæĸæãĢDiscord Rich Presenceãã¯ãĒãĸãã", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "䏿åæĸæãĢDiscord Rich Presenceãã¯ãĒãĸãã",
+ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)",
"settings.header.experimental": "čŠĻé¨įãĒæŠčŊ",
"settings.header.experimental.description": "éįēä¸ãŽåŽé¨įãĒæŠčŊã¯ä¸åŽå
¨ã§ä¸åŽåŽã§ããå¯čŊæ§ããããžã",
- "settings.option.experimental.compactUI": "ãŗãŗãã¯ãã¤ãŗãŋãŧãã§ãŧãš", // Toggle
- "settings.option.experimental.close_button_hide": "ãéãããããŋãŗã§ãĸããĒãé ããžã", // Dropdown
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.spatialProperties" : "įŠēéåãŽãããããŖ",
- "spatial.width" : "åš
",
- "spatial.height" : "éĢã",
- "spatial.depth" : "åĨĨčĄ",
- "spatial.gain" : "ã˛ã¤ãŗ",
- "spatial.roomMaterials" : "é¨åąãŽãããĒãĸãĢ",
- "spatial.roomDimensions" : "é¨åąãŽå¤§ãã",
- "spatial.roomPositions" : "é¨åąãŽäŊįŊŽ",
- "spatial.setDimensions" : "大ãããč¨åŽ",
- "spatial.setPositions" : "äŊįŊŽãč¨åŽ",
- "spatial.up" : "ä¸",
- "spatial.front" : "å",
- "spatial.left" : "åˇĻ",
- "spatial.right" : "åŗ",
- "spatial.back" : "åž",
- "spatial.down" : "ä¸",
- "spatial.listener" : "ãĒãšããŧ",
- "spatial.audioSource" : "éŗæē",
-
- // Settings - Unfinished
+ "settings.option.experimental.compactUI": "ãŗãŗãã¯ãã¤ãŗãŋãŧãã§ãŧãš",
+ "settings.option.experimental.close_button_hide": "ãéãããããŋãŗã§ãĸããĒãé ããžã",
+ "settings.option.experimental.copy_log": "ãã°ããŗããŧãã",
+ "settings.option.experimental.inline_playlists": "ããŦã¤ãĒãšããã¤ãŗãŠã¤ãŗã§čĄ¨į¤ē",
+ "spatial.spatialProperties": "įŠēéåãŽãããããŖ",
+ "spatial.width": "åš
",
+ "spatial.height": "éĢã",
+ "spatial.depth": "åĨĨčĄ",
+ "spatial.gain": "ã˛ã¤ãŗ",
+ "spatial.roomMaterials": "é¨åąãŽãããĒãĸãĢ",
+ "spatial.roomDimensions": "é¨åąãŽå¤§ãã",
+ "spatial.roomPositions": "é¨åąãŽäŊįŊŽ",
+ "spatial.setDimensions": "大ãããč¨åŽ",
+ "spatial.setPositions": "äŊįŊŽãč¨åŽ",
+ "spatial.up": "ä¸",
+ "spatial.front": "å",
+ "spatial.left": "åˇĻ",
+ "spatial.right": "åŗ",
+ "spatial.back": "åž",
+ "spatial.down": "ä¸",
+ "spatial.listener": "ãĒãšããŧ",
+ "spatial.audioSource": "éŗæē",
"settings.header.unfinished": "æĒåŽæ",
-
- // Web Remote
"remote.web.title": "Cider ãĒãĸãŧã",
"remote.web.description": "QRãŗãŧããäŊŋį¨ããĻãCiderã¨ãšããŧãããŠãŗãããĸãĒãŗã°ãã",
-
- //About
"about.thanks": "Cider Collective ã¨ãååããã ããč˛ĸįŽč
æ§ãĢæčŦįŗãä¸ããžãã"
-
-}
+}
\ No newline at end of file
diff --git a/src/i18n/ko_KR.jsonc b/src/i18n/ko_KR.json
similarity index 59%
rename from src/i18n/ko_KR.jsonc
rename to src/i18n/ko_KR.json
index 76d94149..71376370 100644
--- a/src/i18n/ko_KR.jsonc
+++ b/src/i18n/ko_KR.json
@@ -1,32 +1,22 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "íęĩė´", // name of language in native language
- "i18n.languageNameEnglish": "Korean", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@sj8923", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+{
+ "i18n.languageName": "íęĩė´ (KR)",
+ "i18n.languageNameEnglish": "Korean (KR)",
+ "i18n.category": "main",
+ "i18n.authors": "@Hazealign",
"app.name": "Cider",
-
- "date.format": "${y}ë
${m}ė ${d}ėŧ",
-
- // Dialogs
+ "date.format": "${y}. ${m}. ${d}",
"dialog.cancel": "뎍ė",
"dialog.ok": "íė¸",
-
- // Notification
- "notification.updatingLibrarySongs": "ëŧė´ë¸ëŦëĻŦ ęŗĄ ė
ë°ė´í¸ ė¤...",
- "notification.updatingLibraryAlbums": "ëŧė´ë¸ëŦëĻŦ ė¨ë˛ ė
ë°ė´í¸ ė¤...",
- "notification.updatingLibraryArtists": "ëŧė´ë¸ëŦëĻŦ ėí°ė¤í¸ ė
ë°ė´í¸ ė¤...",
- // Terms
+ "notification.updatingLibrarySongs": "ëŧė´ë¸ëŦëĻŦė ë
¸ëëĨŧ ė
ë°ė´í¸íë ė¤ė
ëë¤...",
+ "notification.updatingLibraryAlbums": "ëŧė´ë¸ëŦëĻŦė ė¨ë˛ė ė
ë°ė´í¸íë ė¤ė
ëë¤...",
+ "notification.updatingLibraryArtists": "ëŧė´ë¸ëŦëĻŦė ėí°ė¤í¸ëĨŧ ė
ë°ė´í¸íë ė¤ė
ëë¤...",
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
"term.itunes": "iTunes",
"term.github": "GitHub",
"term.discord": "Discord",
- "term.learnMore": "ëëŗ´ę¸°",
+ "term.learnMore": "ë ėėëŗ´ę¸°",
"term.accountSettings": "ęŗė ė¤ė ",
"term.logout": "ëĄęˇ¸ėė",
"term.login": "ëĄęˇ¸ė¸",
@@ -110,7 +100,7 @@
"term.language": "ė¸ė´",
"term.funLanguages": "ėŦ미ėë",
"term.noLyrics": "ëļëŦė¤ë ė¤... / ę°ėŦëĨŧ ė°žė ė ėėĩëë¤/ ė°ėŖŧęŗĄ",
- "term.copyright": "Copyright", // Used in Korea w/o translation
+ "term.copyright": "Copyright",
"term.rightsReserved": "All Rights Reserved.",
"term.sponsor": "ė´ íëĄė í¸ëĨŧ íėíė¸ė",
"term.ciderTeam": "Cider í",
@@ -120,14 +110,26 @@
"term.contributors": "기ėŦė",
"term.equalizer": "ė´íëŧė´ė ",
"term.reset": "ė´ę¸°í",
- "term.tracks": "í¸ë", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "ëšëė¤",
+ "term.tracks": "ęŗĄ",
+ "term.videos": "ëšëė¤",
"term.menu": "ëŠë´",
"term.check": "íė¸",
- "term.aboutArtist": "{{artistName}}ė ëí´", // e.g. 'About Doja Cat'
- "term.updateCider": "Cider ė
ë°ė´í¸",
-
- // Home
+ "term.aboutArtist": "{{artistName}}ė ëíėŦ",
+ "term.topResult": "Top Result",
+ "term.sharedPlaylists": "ęŗĩė íë ė´ëĻŦė¤í¸",
+ "term.people": "íëĄí",
+ "term.newpreset.name": "ė ė´íëŧė´ė íëĻŦė
",
+ "term.addedpreset": "ėļę°ë íëĻŦė
",
+ "term.deletepreset.warn": "ė ë§ëĄ íëĻŦė
ė ėė íėę˛ ėĩëęš?",
+ "term.deletedpreset": "íëĻŦė
ėė ",
+ "term.musicVideos": "ëŽ¤ė§ ëšëė¤",
+ "term.stations": "ė¤í
ė´ė
",
+ "term.curators": "íë ė´í°",
+ "term.appleCurators": "ė í íë ė´í°",
+ "term.radioShows": "ëŧëė¤ ėŧ",
+ "term.recordLabels": "ë ėŊë ë ė´ë¸",
+ "term.videoExtras": "ėļę° ëšëė¤",
+ "term.top": "Top",
"home.title": "í",
"home.recentlyPlayed": "ėĩęˇŧ ėŦėë íëĒŠ",
"home.recentlyAdded": "ėĩęˇŧ ėļę°ë íëĒŠ",
@@ -136,23 +138,18 @@
"home.madeForYou": "ëë§ė ėí ėļė˛",
"home.friendsListeningTo": "ėšęĩŦë¤ė´ ëŖë",
"home.followedArtists": "íëĄė°í ėí°ė¤í¸",
- // Errors
- "error.appleMusicSubRequired": "ė íëŽ¤ė§ ęĩŦë
ė´ íėíŠëë¤.",
- "error.connectionError": "ė íëŽ¤ė§ ė°ę˛°ė ëŦ¸ė ę° ë°ėíėĩëë¤.",
- "error.noResults": "결ęŗŧ ėė.",
- "error.noResults.description": "ėëĄ ę˛ėí´ėŖŧė¸ė.",
-
- //Podcasts
- "podcast.followOnCider": "Cider íëĄė°",
- "podcast.followedOnCider": "Cider íëĄė°ë¨",
- "podcast.subscribeOnItunes": "iTunes ęĩŦë
í기",
- "podcast.subscribedOnItunes": "iTunes ęĩŦë
ė¤",
- "podcast.itunesStore": "iTunes ė¤í ė´",
- "podcast.episodes": "ėíŧėë",
- "podcast.playEpisode": "ėíŧėë ėŦė",
- "podcast.website": "íėēė¤í¸ ėšėŦė´í¸",
-
- // Actions
+ "error.appleMusicSubRequired": "Apple Musicė ęĩŦë
ė íėëĄ íŠëë¤.",
+ "error.connectionError": "Apple Musicė ė°ę˛°íė§ ëĒģíėĩëë¤.",
+ "error.noResults": "결ęŗŧ ėė",
+ "error.noResults.description": "ë¤ė ėëí´ėŖŧė¸ė.",
+ "podcast.followOnCider": "Ciderėė íëĄė°í기",
+ "podcast.followedOnCider": "íëĄė° ė¤",
+ "podcast.subscribeOnItunes": "iTunesėė ęĩŦë
",
+ "podcast.subscribedOnItunes": "ęĩŦë
ė¤",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "ë°ŠėĄ",
+ "podcast.playEpisode": "ėŦė",
+ "podcast.website": "íėēė¤í¸ ėŦė´í¸",
"action.addToLibrary": "ëŗ´ę´í¨ė ėļę°",
"action.addToLibrary.success": "ëŗ´ę´í¨ė ėļę°ë¨",
"action.addToLibrary.error": "ëŗ´ę´í¨ė ėļę° ė¤í¨",
@@ -195,93 +192,83 @@
"action.showAlbum": "ė 랴 ė¨ë˛ ëŗ´ę¸°",
"action.tray.minimize": "í¸ë ė´ëĄ ėĩėí",
"action.tray.quit": "ėĸ
ëŖ",
- "action.tray.show": "", // None is Better in Korean
+ "action.tray.show": "",
"action.update": "ė
ë°ė´í¸",
-
- // Settings - General
- "settings.header.general": "ėŧë° ė¤ė ",
- "settings.header.general.description": "CiderëĨŧ ėí ėŧë° ė¤ė ė ėĄ°ė íŠëë¤.",
+ "action.copy": "ëŗĩėŦ",
+ "action.newpreset": "ė íëĻŦė
",
+ "action.deletepreset": "íëĻŦė
ėė ",
+ "settings.header.general": "ėŧë°",
+ "settings.header.general.description": "Ciderė ėŧë° ę¸°ëĨė ė¤ė íŠëë¤.",
"settings.option.general.language": "ė¸ė´",
-
- // Language optgroups
"settings.option.general.language.main": "ė¸ė´",
- "settings.option.general.language.fun": "ė¤íė ė¸ ė¸ė´",
- "settings.option.general.language.unsorted": "ė ëĻŦëė§ėė",
-
- // Settings - Audio
+ "settings.option.general.language.fun": "ėŦ미ëĨŧ ėí ė¸ė´",
+ "settings.option.general.language.unsorted": "미ëļëĨ",
+ "settings.option.general.updateCider": "Cider ė
ë°ė´í¸",
"settings.header.audio": "ė¤ëė¤",
- "settings.header.audio.description": "CiderëĨŧ ėí ė¤ëė¤ ė¤ė ė ėĄ°ė íė¸ė.",
- "settings.option.audio.quality": "ė¤ëė¤ íė§", // Dropdown
- "settings.header.audio.quality.high": "ëė",
+ "settings.header.audio.description": "Ciderė ė¤ëė¤ ę¸°ëĨė ė¤ė íŠëë¤.",
+ "settings.option.audio.quality": "ė¤ëė¤ ėė§",
+ "settings.header.audio.quality.high": "ęŗ íė§",
"settings.header.audio.quality.low": "ëŽė",
"settings.header.audio.quality.auto": "ėë",
- "settings.option.audio.seamlessTransition": "ę°ę˛Š ėë ėŦė", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "ė¤íė ė¸ ę¸°ëĨ", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "ë
¸ëŠëŧė´ėĻė ė´íëŧė´ė ė ę°ė íėĨ기ëĨė ėŦėŠí ė ėė§ë§ ėŧëļ ėė¤í
ėė ëęš íėė´ ë°ėí ė ėėĩëë¤.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ėŦė´ë ėë ėĄ°ė ", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "ę°ę° í¸ëė ëŗŧëĨ¨ė ėë ėĄ°ė íŠëë¤.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ęŗĩę° ėíĨ", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ėëĻŦëĨŧ ęŗĩę° ėíĨėŧëĄ ë§ë¤ęŗ 3dí¨ęŗŧëĨŧ ė¤ëë¤. (ėŖŧė: ëëš ė í¸ëǍė¤ę° ėë)",
- // Settings - Visual
- "settings.header.visual": "ėę° í¨ęŗŧ",
- "settings.header.visual.description": "CiderëĨŧ ėí ėę° í¨ęŗŧ ė¤ė ė ėĄ°ė íė¸ė.",
- "settings.option.visual.windowBackgroundStyle": "ė°Ŋ ë°°ę˛Ŋ ė¤ė ", // Toggle
+ "settings.option.audio.seamlessTransition": "íŦëĄė¤íė´ë 기ëĨ",
+ "settings.option.audio.enableAdvancedFunctionality": "ėļę° ę¸°ëĨ ė¤ė ",
+ "settings.option.audio.enableAdvancedFunctionality.description": "AudioContext 기ëĨė íėąííėŦ ė¤ëė¤ ė ęˇí, ė´íëŧė´ė , ëšėĨŦėŧëŧė´ė ëąė 기ëĨė ė¸ ė ėę˛ í´ė¤ëë¤. ėŧëļ ėė¤í
ėėë ė¤ëė¤ę° ë길 ė ėėĩëë¤.",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ė¤ëė¤ ė ęˇí",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "ę°ëŗ í¸ëė ėĩë ëŗŧëĨ¨ė ė ęˇííėŦ ëŗ´ë¤ ęˇ ėŧí ė˛ėˇ¨ ę˛Ŋíė ė ęŗĩíŠëë¤.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ė¤ëė¤ ęŗĩę°í",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ė¤ëė¤ëĨŧ ęŗĩę°ííęŗ ëėą 3ė°¨ėė ėŧëĄ ë§ë¤ė´ė¤ëë¤. (ė°¸ęŗ : ė´ ę¸°ëĨė Dolby Atmosę° ėëëë¤.)",
+ "settings.header.visual": "ėę°",
+ "settings.header.visual.description": "Ciderė ėę° ę¸°ëĨė ė¤ė íŠëë¤.",
+ "settings.option.visual.windowBackgroundStyle": "ėëė° ë°°ę˛Ŋ ė¤íėŧ",
"settings.header.visual.windowBackgroundStyle.none": "ėė",
"settings.header.visual.windowBackgroundStyle.artwork": "ėí¸ėíŦ",
"settings.header.visual.windowBackgroundStyle.image": "ė´ë¯¸ė§",
- "settings.option.visual.animatedArtwork": "ėė§ė´ë ėí¸ėíŦ", // Dropdown
- "settings.header.visual.animatedArtwork.always": "íėąí",
- "settings.header.visual.animatedArtwork.limited": "íšė íė´ė§ė íė ",
- "settings.header.visual.animatedArtwork.disable": "ëšíėąí",
- "settings.option.visual.animatedArtworkQuality": "ėė§ė´ë ėí¸ėíŦ íė§", // Dropdown
+ "settings.option.visual.animatedArtwork": "ė ëëŠė´ė
ė¨ë˛ íė§",
+ "settings.header.visual.animatedArtwork.always": "íė íėąí",
+ "settings.header.visual.animatedArtwork.limited": "íė´ė§ë íšė í늴ėėë§ íėąí",
+ "settings.header.visual.animatedArtwork.disable": "íė ëšíėąí",
+ "settings.option.visual.animatedArtworkQuality": "ė ëëŠė´ė
ė¨ë˛ íė§ íė§",
"settings.header.visual.animatedArtworkQuality.low": "ëŽė",
"settings.header.visual.animatedArtworkQuality.medium": "ė¤ę°",
"settings.header.visual.animatedArtworkQuality.high": "ëė",
"settings.header.visual.animatedArtworkQuality.veryHigh": "ë§¤ė° ëė",
- "settings.header.visual.animatedArtworkQuality.extreme": "ėĩęŗ ",
- "settings.option.visual.animatedWindowBackground": "ėė§ė´ë ė°Ŋ ë°°ę˛Ŋ", // Toggle
- "settings.option.visual.hardwareAcceleration": "íëė¨ė´ ę°ė", // Dropdown
- "settings.option.visual.hardwareAcceleration.description": "ėŦė¤í íė",
- "settings.header.visual.hardwareAcceleration.default": "ę¸°ëŗ¸",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "ID íė", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.animatedArtworkQuality.extreme": "ėĩė",
+ "settings.option.visual.animatedWindowBackground": "ėė§ė´ë ėëė° ë°°ę˛Ŋ",
+ "settings.option.visual.hardwareAcceleration": "íëė¨ė´ ę°ė",
+ "settings.option.visual.hardwareAcceleration.description": "ėŦėėė íėëĄ íŠëë¤.",
+ "settings.header.visual.hardwareAcceleration.default": "ę¸°ëŗ¸",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "í
ë§",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "ë¤íŦ",
+ "settings.option.visual.showPersonalInfo": "ę°ė¸ ė ëŗ´ ëŗ´ę¸°",
"settings.header.lyrics": "ę°ėŦ",
- "settings.header.lyrics.description": "CiderëĨŧ ėí ę°ėŦ ė¤ė ė ėĄ°ė íė¸ė.",
- "settings.option.lyrics.enableMusixmatch": "Musixmatch ę°ėŦ", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "ë
¸ëë°Š ëǍë (Musixmatchë§)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch ė í¸ ë˛ė ė¸ė´", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "뎤ė§ëšëė¤ ėŦė ė ė íë¸ėė ę°ėŦ ę°ė ¸ė¤ę¸°", // Toggle
-
- // Settings - Connectivity
- "settings.header.connectivity": "ė°ę˛°",
- "settings.header.connectivity.description": "CiderëĨŧ ėí ė°ę˛° ė¤ė ė ėĄ°ė íė¸ė.",
- "settings.option.connectivity.discordRPC": "Discord ėí íė", // Dropdown
- "settings.option.connectivity.playbackNotifications": "ėŦė ėí íė", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "'Cider'ëĄ íė",
- "settings.header.connectivity.discordRPC.appleMusic": "'Apple Music'ėŧëĄ íė",
- "settings.option.connectivity.discordRPC.clearOnPause": "ėŧė ė ė§ ėíėė Discord ėí íė ë기", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble ė§ė° (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Last.fm Now Playing íėą",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "ęŗĄ ė´ëĻėė íŧėŗë§ ėí°ė¤í¸ ëšŧ기 (Last.fm)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "ë°ëŗĩ ėŦė í¸ë ė ęą° (Last.fm)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
- "settings.header.experimental": "ė¤í 기ëĨ",
- "settings.header.experimental.description": "CiderëĨŧ ėí ė¤í 기ëĨė ėĄ°ė íė¸ė.",
- "settings.option.experimental.compactUI": "ėģ´íŠí¸ UI", // Toggle
- "settings.option.experimental.close_button_hide": "ëĢ기 ë˛íŧėŧëĄ íëĄęˇ¸ë¨ ė¨ę¸°ę¸°",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.notTurnedOn": "ë¨ŧė ęŗĩę° ėíĨ ė¤ė ė íėąíí´ėŖŧė¸ė.",
- "spatial.spatialProperties": "ęŗĩę° ėėą",
- "spatial.width": "ëëš",
+ "settings.header.lyrics.description": "Ciderė ę°ėŦ 기ëĨė ė¤ė íŠëë¤.",
+ "settings.option.lyrics.enableMusixmatch": "Musixmatch ę°ėŦ íėąí",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "ë
¸ëë°Š ëǍë íėąí (Musixmatchë§ ę°ëĨ)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch ë˛ė ė í¸ ė¸ė´",
+ "settings.option.lyrics.enableYoutubeLyrics": "ëŽ¤ė§ ëšëė¤ė ëí ė íë¸ ėë§ íėąí",
+ "settings.header.connectivity": "ė°ë",
+ "settings.header.connectivity.description": "Ciderė ė°ë 기ëĨė ė¤ė íŠëë¤.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "ėŦė ėëĻŧ",
+ "settings.header.connectivity.discordRPC.cider": "'Cider'ëĄ íėí기",
+ "settings.header.connectivity.discordRPC.appleMusic": "'Apple Music'ėŧëĄ íėí기",
+ "settings.option.connectivity.discordRPC.clearOnPause": "ėŧė ė ė§ ė Discord Rich Presenceė ë기",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm ė¤íŦëĄë¸ë§",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm ė¤íŦëĄë¸ ëë ė´ (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Last.fm Now Playing 기ëĨ íėąí",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "ęŗĄ ė ëĒŠėė íŧėŗë§ ėí°ė¤í¸ëĨŧ ė ė¸í기 (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "ëŖ¨í í¸ëė íí°í기 (Last.fm)",
+ "settings.header.experimental": "ė¤íė¤",
+ "settings.header.experimental.description": "Ciderė ė¤íė 기ëĨė ė¤ė íŠëë¤.",
+ "settings.option.experimental.compactUI": "ėģ´íŠí¸ UI",
+ "settings.option.experimental.close_button_hide": "ëĢ기 ë˛íŧė´ ė íëĻŦėŧė´ė
ė ę°ëĻ´ ę˛ė
ëë¤",
+ "settings.option.experimental.copy_log": "ëĄęˇ¸ëĨŧ í´ëĻŊëŗ´ëė ëŗĩėŦí기",
+ "settings.option.experimental.inline_playlists": "ė¸ëŧė¸ íë ė´ëĻŦė¤í¸ ë° ė¨ë˛",
+ "spatial.notTurnedOn": "ė¤ëė¤ ęŗĩę°íę° ëšíėąíëė´ėėĩëë¤. ėŦėŠí기 ė ė ë¨ŧė íėąíí´ėŖŧė¸ė.",
+ "spatial.spatialProperties": "ęŗĩę° ė¤ė ",
+ "spatial.width": "길ė´",
"spatial.height": "ëė´",
"spatial.depth": "ęšė´",
"spatial.gain": "ę˛ė¸",
@@ -296,16 +283,10 @@
"spatial.right": "ė¤ëĨ¸ėĒŊ",
"spatial.back": "ë¤",
"spatial.down": "ėë",
- "spatial.listener": "ė˛ėˇ¨ė",
- "spatial.audioSource": "ė¤ëė¤ ėļė˛",
-
- // Settings - Unfinished
+ "spatial.listener": "ėŦėŠė",
+ "spatial.audioSource": "ė¤ëė¤ ėė¤",
"settings.header.unfinished": "미ėėą",
-
- // Web Remote
"remote.web.title": "Cider ëĻŦëǍí¸",
- "remote.web.description": "Cider ė¸ė¤í´ė¤ė í´ë ė íëĨŧ ė°ę˛°íë ¤ëŠ´ QR ėŊëëĨŧ ė¤ėēí´ėŖŧė¸ė",
-
- // About
- "about.thanks": "Cider ėģŦë í°ë¸ íęŗŧ ė°ëĻŦė ëǍë 기ėŦėë¤ęģ ëë¨í ę°ėŦëĨŧ ííŠëë¤."
+ "remote.web.description": "QR ėŊëëĨŧ ė¤ėēí´ė Ciderė ė¤ë§í¸í°ė ė°ę˛°í기",
+ "about.thanks": "Cider Collective Teamęŗŧ ëǍë 기ėŦėë¤ėę˛ ę°ėŦíŠëë¤."
}
diff --git a/src/i18n/pt_BR.json b/src/i18n/pt_BR.json
new file mode 100644
index 00000000..be3d4838
--- /dev/null
+++ b/src/i18n/pt_BR.json
@@ -0,0 +1,307 @@
+{
+ "i18n.languageName": "PortuguÃĒs (brasileiro)",
+ "i18n.languageNameEnglish": "Portuguese (Brazil)",
+ "i18n.category": "main",
+ "i18n.authors": "",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "Cancelar",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Atualizando mÃēsicas na biblioteca...",
+ "notification.updatingLibraryAlbums": "Atualizando albuns na biblioteca...",
+ "notification.updatingLibraryArtists": "Atualizando artistas na biblioteca...",
+ "notification.connectionError": "Houve um problema a se conectar no Apple Music",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Saiba Mais",
+ "term.accountSettings": "DefiniçÃĩes da Conta",
+ "term.logout": "Sair",
+ "term.login": "Entrar",
+ "term.about": "Sobre",
+ "term.privateSession": "SessÃŖo Privada",
+ "term.queue": "Fila",
+ "term.search": "Procurar",
+ "term.library": "Biblioteca",
+ "term.listenNow": "Ouça Agora",
+ "term.browse": "Explorar",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "Adicionado Recentemente",
+ "term.songs": "MÃēsicas",
+ "term.albums": "Albuns",
+ "term.artists": "Artistas",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Playlists",
+ "term.playlist": "Playlist",
+ "term.play": "Tocar",
+ "term.pause": "Pausar",
+ "term.previous": "Anterior",
+ "term.next": "PrÃŗximo",
+ "term.shuffle": "AleatÃŗrio",
+ "term.repeat": "Repetir",
+ "term.volume": "Volume",
+ "term.mute": "Mudo",
+ "term.unmute": "Tirar o Mudo",
+ "term.share": "Compartilhar",
+ "term.settings": "DefiniçÃĩes",
+ "term.seeAll": "Ver Tudo",
+ "term.sortBy": "Organizar Por",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Artista",
+ "term.sortBy.name": "Nome",
+ "term.sortBy.genre": "Genero",
+ "term.sortBy.releaseDate": "Data de Lançamento",
+ "term.sortBy.duration": "DuraÃ§ÃŖo",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascendente",
+ "term.sortOrder.descending": "Descendente",
+ "term.viewAs": "Ver Como",
+ "term.viewAs.coverArt": "Capa",
+ "term.viewAs.list": "Lista",
+ "term.size": "Tamanho",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Compacto",
+ "term.enable": "Ativar",
+ "term.disable": "Desativar",
+ "term.enabled": "Ativado",
+ "term.disabled": "Desativado",
+ "term.connect": "Conectar",
+ "term.disconnect": "Desconectar",
+ "term.connecting": "Conectando",
+ "term.confirm": "Confirmar?",
+ "term.more": "Mais",
+ "term.less": "Menos",
+ "term.showMore": "Mostrar Mais",
+ "term.showLess": "Mostrar Menos",
+ "term.topSongs": "Top de MÃēsicas",
+ "term.latestReleases": "Ultimos Lançamentos",
+ "term.time.added": "Adicionado",
+ "term.time.released": "Lançado",
+ "term.time.updated": "Atualizado",
+ "term.fullscreenView": "VisualizaÃ§ÃŖo em Tela Cheia",
+ "term.defaultView": "VisualizaÃ§ÃŖo Normal",
+ "term.spacializedAudioSetting": "DefiniçÃĩes de Audio Espacial",
+ "term.clearAll": "Limpar Tudo",
+ "term.language": "Idioma",
+ "term.recentStations": "EstaçÃĩes Recentes",
+ "term.language": "Idioma",
+ "term.funLanguages": "Fun",
+ "term.noLyrics": "Carregando... / Letras nÃŖo achadas./ Instrumental.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "Todos direitos reservados.",
+ "term.sponsor": "Patrocine esse projeto",
+ "term.ciderTeam": "Time Cider",
+ "term.developer": "Desenvolvedor",
+ "term.socialTeam": "Time social",
+ "term.socials": "Redes Sociais",
+ "term.contributors": "Contribuidores",
+ "term.equalizer": "Equalizador",
+ "term.reset": "Resetar",
+ "term.tracks": "mÃēsicas",
+ "term.videos": "VÃdeos",
+ "term.menu": "Menu",
+ "term.check": "Checark",
+ "term.aboutArtist": "Sobre {{artistName}}",
+ "term.topResult": "Melhor resultado",
+ "term.sharedPlaylists": "Playlists compartilhadas",
+ "term.people": "Pessoas",
+ "term.newpreset.name": "Nova predefiniÃ§ÃŖo para o equalizador",
+ "term.addedpreset": "PredefiniÃ§ÃŖo adicionada",
+ "term.deletepreset.warn": "Certeza que quer apagar essa predefiniÃ§ÃŖo?",
+ "term.deletedpreset": "PredefiniÃ§ÃŖo removida",
+ "term.defaultPresets": "predefiniçÃĩes padrÃŖo",
+ "term.userPresets": "PredefiniçÃĩes do usuÃĄrio",
+ "term.requestError": "There was a problem with the request.",
+ "term.song.link.generate": "Gerando URL do song.link...",
+ "term.musicVideos": "VÃdeos",
+ "term.stations": "EstaçÃĩes",
+ "term.curators": "Curadores",
+ "term.appleCurators": "Curadores da Apple",
+ "term.radioShows": "Shows de Radio",
+ "term.recordLabels": "Gravadoras",
+ "term.videoExtras": "Extras",
+ "term.top": "Top",
+ "term.version": "VersÃŖo",
+ "term.noVideos": "VÃdeos nÃŖo encontrados.",
+ "home.title": "Inicio",
+ "home.recentlyPlayed": "Tocado Recentemente",
+ "home.recentlyAdded": "Adicionado Recentemente",
+ "home.artistsFeed": "Novidades dos seus Artistas",
+ "home.madeForYou": "Feito para VocÃĒ",
+ "home.friendsListeningTo": "Amigos Ouvindo",
+ "home.followedArtists": "Artistas Seguidos",
+ "home.artistsFeed.noArtist": "Siga uns artistas e o seus ultimos lançamentos aparecerÃŖo aqui",
+ "error.appleMusicSubRequired": "NecessÃĄrio uma assinatura Apple Music.",
+ "error.connectionError": "Aconteceu um problema ao conectar ao Apple Music.",
+ "error.noResults": "Sem resultados.",
+ "error.noResults.description": "Tente uma nova busca.",
+ "podcast.followOnCider": "Seguir no Cider",
+ "podcast.followedOnCider": "Seguindo no Cider",
+ "podcast.subscribeOnItunes": "Inscrever-se no iTunes",
+ "podcast.subscribedOnItunes": "Inscrito no iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Episodios",
+ "podcast.playEpisode": "Reproduzir episÃŗdio",
+ "podcast.website": "Website do Podcast",
+ "action.addToLibrary": "Adicionar à Biblioteca",
+ "action.addToLibrary.success": "Adicionado à Biblioteca",
+ "action.addToLibrary.error": "Erro ao Adicionar na Biblioteca",
+ "action.removeFromLibrary": "Remover da Biblioteca",
+ "action.removeFromLibrary.success": "Removido da Biblioteca",
+ "action.addToQueue": "Adicionar à Fila",
+ "action.addToQueue.success": "Adicionado à Fila",
+ "action.addToQueue.error": "Erro ao Adicionar à Fila",
+ "action.removeFromQueue": "Remover da Fila",
+ "action.removeFromQueue.success": "Removido da Fila",
+ "action.removeFromQueue.error": "Erro ao Remover da Fila",
+ "action.addToPlaylist": "Adicionar à Lista de ReproduÃ§ÃŖo",
+ "action.removeFromPlaylist": "Remover da Lista de ReproduÃ§ÃŖo",
+ "action.addToFavorites": "Adicionar aos Favoritos",
+ "action.follow": "Seguir",
+ "action.follow.success": "A Seguir",
+ "action.follow.error": "Erro ao Seguir",
+ "action.unfollow": "Deixar de Seguir",
+ "action.unfollow.success": "Deixou de Seguir",
+ "action.unfollow.error": "Erro ao Deixar de Seguir",
+ "action.playNext": "Reproduzir a Seguir",
+ "action.playLater": "Reproduzir por Ultimo",
+ "action.startRadio": "Começar Radio",
+ "action.goToArtist": "Ir para o Artista",
+ "action.goToAlbum": "Ir para o Album",
+ "action.moveToTop": "Mover para cima",
+ "action.share": "Compartilhar",
+ "action.rename": "Renomear",
+ "action.love": "Gostar",
+ "action.unlove": "Deixar de Gostar",
+ "action.dislike": "NÃŖo Gostar",
+ "action.undoDislike": "Deixar de NÃŖo Gostar",
+ "action.showWebRemoteQR": "Mostrar o QR para PÃĄgina Remota",
+ "action.playTracksNext": "Reproduzir ${app.selectedMediaItems.length} mÃēsicas a seguir",
+ "action.playTracksLater": "Reproduzir ${app.selectedMediaItems.length} mÃēsicas depois",
+ "action.removeTracks": "Remover ${self.selectedItems.length} mÃēsicas da fila",
+ "action.import": "Importar",
+ "action.export": "Exportar",
+ "action.showAlbum": "Mostrar album completo",
+ "action.tray.minimize": "Minimize to Tray",
+ "action.tray.quit": "Sair",
+ "action.tray.show": "Mostrar",
+ "action.update": "Atualizar",
+ "action.copy": "Copiar",
+ "action.newpreset": "Nova predefiniÃ§ÃŖo...",
+ "action.deletepreset": "Apagar predefiniÃ§ÃŖo",
+ "action.open": "Abrir",
+ "settings.header.general": "Principal",
+ "settings.header.general.description": "Ajustar as definiçoes principais no Cider.",
+ "settings.option.general.language": "Idioma",
+ "settings.option.general.language.main": "Idiomas",
+ "settings.option.general.language.fun": "Idiomas divertidos",
+ "settings.option.general.language.unsorted": "Sem categoria",
+ "settings.option.general.updateCider": "Atualizar o Cider",
+ "settings.option.general.updateCider.branch": "Cider Update Branch",
+ "settings.option.general.updateCider.branch.description": "Escolha a versÃŖo do Cider para atualizar",
+ "settings.option.general.updateCider.branch.main": "EstÃĄvel",
+ "settings.option.general.updateCider.branch.develop": "Em desenvolvimeno",
+ "settings.header.audio": "Ãudio",
+ "settings.header.audio.description": "Ajustar as configuraçÃĩes de ÃĄudio no Cider.",
+ "settings.option.audio.volumeStep": "Incrementos",
+ "settings.option.audio.maxVolume": "Volume mÃĄximo",
+ "settings.option.audio.quality": "Qualidade de Ãudio",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "atÊ 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "atÊ 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "Alta",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "PadrÃŖo",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "TransiÃ§ÃŖo de audio ...",
+ "settings.option.audio.enableAdvancedFunctionality": "Ativar configuraçÃĩes avancadas",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar a funcionalidade AudioContext permitirÃĄ recursos de ÃĄudio estendidos, como NormalizaÃ§ÃŖo de Ãudio , Equalizadores e Visualizadores. No entanto, em alguns sistemas, isso pode causar travamentos nas faixas de ÃĄudio.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Melhoras psicoacusticas que fazem com que tudo soe mais vivo | feito por Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP nÃŖo Ê compativel com Ãudio Espacial. Por favor, desative-o para continuar.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "PotÃĒncia do CAP",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Muda a potÃĒncia do processamento feito no ÃĄudio. (a funÃ§ÃŖo Agressiva pode levar a resultados nÃŖo desejados.)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "PadrÃŖo",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agressiva",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "NormalizaÃ§ÃŖo de Ãudio",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza o volume alto para faixas individuais para criar uma experiÃĒncia de audiÃ§ÃŖo mais uniforme.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Ãudio Espacial",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacialize o ÃĄudio e torne o ÃĄudio mais tridimensional (nota: isto nÃŖo Ê Dolby Atmos)",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Ãudio Espacial nÃŖo Ê compativel com o CAP. Por favor desative-o.",
+ "settings.header.visual": "Visual",
+ "settings.header.visual.description": "Ajustar as configuraçÃĩes visuais do Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela",
+ "settings.header.visual.windowBackgroundStyle.none": "Nenhum",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Capa",
+ "settings.header.visual.windowBackgroundStyle.image": "Imagem",
+ "settings.option.visual.animatedArtwork": "Capa animada",
+ "settings.header.visual.animatedArtwork.always": "Sempre",
+ "settings.header.visual.animatedArtwork.limited": "Limitado a pÃĄginas e entradas especiais",
+ "settings.header.visual.animatedArtwork.disable": "Desativar",
+ "settings.option.visual.animatedArtworkQuality": "Qualidade da capa animada",
+ "settings.header.visual.animatedArtworkQuality.low": "Baixa",
+ "settings.header.visual.animatedArtworkQuality.medium": "Media",
+ "settings.header.visual.animatedArtworkQuality.high": "Alta",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Muito Alta",
+ "settings.header.visual.animatedArtworkQuality.extreme": "Altissima",
+ "settings.option.visual.animatedWindowBackground": "Fundo animado",
+ "settings.option.visual.hardwareAcceleration": "AceleraÃ§ÃŖo de Hardware",
+ "settings.option.visual.hardwareAcceleration.description": "NecessÃĄrio reabrir o Cider",
+ "settings.header.visual.hardwareAcceleration.default": "PadrÃŖo",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Tema",
+ "settings.option.visual.theme.github.download": "Instalar pelo URL do GitHub",
+ "settings.option.visual.theme.github.explore": "Explorar temas no GitHub",
+ "settings.option.visual.theme.github.install.confirm": "Tem certeza que quer instalar {{ repo }}?",
+ "settings.prompt.visual.theme.github.URL": "Insira o URL do tema que deseja instalar",
+ "settings.notyf.visual.theme.install.success": "Tema instalado com sucesso",
+ "settings.notyf.visual.theme.install.error": "A instalaÃ§ÃŖo do tema falhou",
+ "settings.option.visual.showPersonalInfo": "Mostrar Informaçoes Pessoais",
+ "settings.header.lyrics": "Letras",
+ "settings.header.lyrics.description": "Ajustar as definiçÃĩes das letras no Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Ativar Letras do Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Ativar Modo Karaoke (sÃŗ para Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Idioma Preferido para TraduÃ§ÃŖo Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "Ativar letras do Youtube para videos musicais",
+ "settings.header.connectivity": "Conectividade",
+ "settings.header.connectivity.description": "Ajustar as definiçÃĩes de conectividade no Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.header.connectivity.discordRPC.cider": "Mostrar como 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Mostrar como 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Apagar Discord Rich Presence quando estiver pausado",
+ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Atraso dos Scrobbles do LastFM (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Ativar LastFM Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas de colaboraÃ§ÃŖo do nome da mÃēsica (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar mÃēsicas repitidas (Last.fm)",
+ "settings.header.debug": "Debug",
+ "settings.option.debug.copy_log": "Copiar logs",
+ "settings.option.debug.openAppData": "Abrir a pasta do Cider",
+ "settings.header.experimental": "Experimental",
+ "settings.header.experimental.description": "Ajustar as definiçÃĩes experimental no Cider.",
+ "settings.option.experimental.compactUI": "UI Compacto",
+ "settings.option.experimental.close_button_hide": "Fechar apenas esconde o Cider",
+ "spatial.spatialProperties": "Propriedades do Espacial",
+ "spatial.width": "Largura",
+ "spatial.height": "Altura",
+ "spatial.depth": "Profundidade",
+ "spatial.roomMaterials": "Materiais da Sala",
+ "spatial.roomDimensions": "DimensÃĩes da Sala",
+ "spatial.roomPositions": "PosiçÃĩes da Sala",
+ "spatial.setDimensions": "Definir DimensÃĩes",
+ "spatial.setPositions": "Definir PosiçÃĩes",
+ "spatial.up": "Acima",
+ "spatial.front": "Frente",
+ "spatial.left": "Esquerda",
+ "spatial.right": "Direita",
+ "spatial.back": "AtrÃĄs",
+ "spatial.down": "Abaixo",
+ "spatial.listener": "Ouvinte",
+ "spatial.audioSource": "Fonte de Audio",
+ "settings.header.unfinished": "Inacabado",
+ "remote.web.title": "Cider Remoto",
+ "remote.web.description": "Digitalize o cÃŗdigo QR para emparelhar seu telefone com esta instÃĸncia Cider"
+}
diff --git a/src/i18n/pt_BR.jsonc b/src/i18n/pt_BR.jsonc
deleted file mode 100644
index dad04de4..00000000
--- a/src/i18n/pt_BR.jsonc
+++ /dev/null
@@ -1,244 +0,0 @@
-{ // Base File
- // App info
- "app.name": "Cider",
-
- "date.format": "${d} ${m}, ${y}",
-
- // i18n Info
- "i18n.languageName": "PortuguÃĒs ( brasileiro )", // name of language in native language
- "i18n.languageNameEnglish": "Portuguese (Brazil)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // Dialogs
- "dialog.cancel": "Cancelar",
- "dialog.ok": "OK",
-
- // Notification
- "notification.updatingLibrarySongs": "Atualizando mÃēsicas na biblioteca...",
- "notification.updatingLibraryAlbums": "Atualizando albuns na biblioteca...",
- "notification.updatingLibraryArtists": "Atualizando artistas na biblioteca...",
- "notification.connectionError": "Houve um problema a se conectar no Apple Music",
-
- // Terms
- "term.appleMusic": "Apple Music",
- "term.applePodcasts": "Apple Podcasts",
- "term.itunes": "iTunes",
- "term.github": "GitHub",
- "term.discord": "Discord",
- "term.learnMore": "Saiba Mais",
- "term.accountSettings": "DefiniçÃĩes da Conta",
- "term.logout": "Sair",
- "term.login": "Entrar",
- "term.about": "Sobre",
- "term.privateSession": "SessÃŖo Privada",
- "term.queue": "Fila",
- "term.search": "Procurar",
- "term.library": "Biblioteca",
- "term.listenNow": "Ouça Agora",
- "term.browse": "Explorar",
- "term.radio": "Radio",
- "term.recentlyAdded": "Adicionado Recentemente",
- "term.songs": "MÃēsicas",
- "term.albums": "Albuns",
- "term.artists": "Artistas",
- "term.podcasts": "Podcasts",
- "term.playlists": "Listas de ReproduÃ§ÃŖo",
- "term.playlist": "Lista de ReproduÃ§ÃŖo",
- "term.play": "Tocar",
- "term.pause": "Pausar",
- "term.previous": "Anterior",
- "term.next": "PrÃŗximo",
- "term.shuffle": "AleatÃŗrio",
- "term.repeat": "Repetir",
- "term.volume": "Volume",
- "term.mute": "Mudo",
- "term.unmute": "Tirar o Mudo",
- "term.share": "Partilhar",
- "term.settings": "DefiniçÃĩes",
- "term.seeAll": "Ver Tudo",
- "term.sortBy": "Organizar Por",
- "term.sortBy.album": "Album",
- "term.sortBy.artist": "Artista",
- "term.sortBy.name": "Nome",
- "term.sortBy.genre": "Genero",
- "term.sortBy.releaseDate": "Data de Lançamento",
- "term.sortBy.duration": "DuraÃ§ÃŖo",
- "term.sortOrder": "A-Z",
- "term.sortOrder.ascending": "Ascendente",
- "term.sortOrder.descending": "Descendente",
- "term.viewAs": "Ver Como",
- "term.viewAs.coverArt": "Capa",
- "term.viewAs.list": "Lista",
- "term.size": "Tamanho",
- "term.size.normal": "Normal",
- "term.size.compact": "Compacto",
- "term.enable": "Ativar",
- "term.disable": "Desativar",
- "term.enabled": "Ativado",
- "term.disabled": "Desativado",
- "term.connect": "Conectar",
- "term.disconnect": "Desconectar",
- "term.connecting": "Conectando",
- "term.confirm": "Confirmar ?",
- "term.more": "Mais",
- "term.less": "Menos",
- "term.showMore": "Mostrar Mais",
- "term.showLess": "Mostrar Menos",
- "term.topSongs" : "Top de MÃēsicas",
- "term.latestReleases": "Ultimos Lançamentos",
- "term.time.added": "Adicionado",
- "term.time.released": "Lançado",
- "term.time.updated": "Atualizado",
- "term.fullscreenView": "VisualizaÃ§ÃŖo em Tela Cheia",
- "term.defaultView": "VisualizaÃ§ÃŖo Normal",
- "term.spacializedAudioSetting": "DefiniçÃĩes de Audio Espacial",
- "term.clearAll": "Limpar Tudo",
- "term.language": "Idioma",
- "term.recentStations": "EstaçÃĩes Recentes",
-
- // Home
- "home.title": "Inicio",
- "home.recentlyPlayed": "Tocado Recentemente",
- "home.recentlyAdded": "Adicionado Recentemente",
- "home.artistsFeed": "Novidades dos seus Artistas",
- "home.madeForYou": "Feito para VocÃĒ",
- "home.friendsListeningTo": "Amigos Ouvindo",
- "home.followedArtists": "Artistas Seguidos",
- // Errors
- "error.appleMusicSubRequired": "NecessÃĄrio uma assinatura Apple Music.",
-
- // Actions
- "action.addToLibrary": "Adicionar à Biblioteca",
- "action.addToLibrary.success": "Adicionado à Biblioteca",
- "action.addToLibrary.error": "Erro ao Adicionar na Biblioteca",
- "action.removeFromLibrary": "Remover da Biblioteca",
- "action.removeFromLibrary.success": "Removido da Biblioteca",
- "action.addToQueue": "Adicionar à Fila",
- "action.addToQueue.success": "Adicionado à Fila",
- "action.addToQueue.error": "Erro ao Adicionar à Fila",
- "action.removeFromQueue": "Remover da Fila",
- "action.removeFromQueue.success": "Removido da Fila",
- "action.removeFromQueue.error": "Erro ao Remover da Fila",
- "action.addToPlaylist": "Adicionar à Lista de ReproduÃ§ÃŖo",
- "action.removeFromPlaylist": "Remover da Lista de ReproduÃ§ÃŖo",
- "action.addToFavorites": "Adicionar aos Favoritos",
- "action.follow": "Seguir",
- "action.follow.success": "A Seguir",
- "action.follow.error": "Erro ao Seguir",
- "action.unfollow": "Deixar de Seguir",
- "action.unfollow.success": "Deixou de Seguir",
- "action.unfollow.error": "Erro ao Deixar de Seguir",
- "action.playNext": "Tocar Proximo",
- "action.playLater": "Tocar por Ultimo",
- "action.startRadio": "Começar Radio",
- "action.goToArtist": "Ir para o Artista",
- "action.goToAlbum": "Ir para o Album",
- "action.moveToTop": "Mover para cima",
- "action.share": "Partilhar",
- "action.rename": "Mudar o Nome",
- "action.love": "Gostar",
- "action.unlove": "Deixar de Gostar",
- "action.dislike": "NÃŖo Gostar",
- "action.undoDislike": "Deixar de NÃŖo Gostar",
- "action.showWebRemoteQR": "Mostrar o QR para PÃĄgina Remota",
- // Settings - Audio
- "settings.header.audio": "Audio",
- "settings.header.audio.description": "Ajustar as definiçÃĩes de audio no Cider.",
- "settings.option.audio.quality": "Qualidade do Audio", // Dropdown
- "settings.header.audio.quality.high": "Alta",
- "settings.header.audio.quality.low": "Baixa",
- "settings.header.audio.quality.auto": "Automatico",
- "settings.option.audio.seamlessTransition": "TransiÃ§ÃŖo de Ãudio Perfeita", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Ativar Funcionabilidades Avançadas", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar a funcionalidade AudioContext permitirÃĄ recursos de ÃĄudio estendidos, como NormalizaÃ§ÃŖo de Ãudio , Equalizadores e Visualizadores. No entanto, em alguns sistemas, isso pode causar travamentos nas faixas de ÃĄudio.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "NormalizaÃ§ÃŖo de Audio", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza o volume alto para faixas individuais para criar uma experiÃĒncia de audiÃ§ÃŖo mais uniforme.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Espacial", // Toggle
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacialize o ÃĄudio e torne o ÃĄudio mais tridimensional (nota: isto nÃŖo Ê Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visual",
- "settings.header.visual.description": "Ajustar as DefiniçÃĩes de Visual do Cider.",
- "settings.option.visual.windowBackgroundStyle": "Estilo do Fundo da Janela", // Toggle
- "settings.header.visual.windowBackgroundStyle.none": "Nenhum",
- "settings.header.visual.windowBackgroundStyle.artwork": "Capa",
- "settings.option.visual.animatedArtwork": "Capa Animada", // Dropdown
- "settings.header.visual.animatedArtwork.always": "Sempre",
- "settings.header.visual.animatedArtwork.limited": "Limitado a pÃĄginas e entradas especiais",
- "settings.header.visual.animatedArtwork.disable": "Desativar em Tudo",
- "settings.option.visual.animatedArtworkQuality": "Qualidade da Capa Animada", // Dropdown
- "settings.header.visual.animatedArtworkQuality.low": "Baixa",
- "settings.header.visual.animatedArtworkQuality.medium": "Media",
- "settings.header.visual.animatedArtworkQuality.high": "Alta",
- "settings.header.visual.animatedArtworkQuality.veryHigh": "Muito Alta",
- "settings.header.visual.animatedArtworkQuality.extreme": "Extrema",
- "settings.option.visual.animatedWindowBackground": "Fundo de Janela Animado", // Toggle
- "settings.option.visual.hardwareAcceleration": "AcelaraÃ§ÃŖo no Hardware", // Dropdown
- "settings.option.visual.hardwareAcceleration.description": "NecessÃĄrio reiniciar a aplicaÃ§ÃŖo",
- "settings.header.visual.hardwareAcceleration.default": "Normal",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
-
-
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Mostrar Informaçoes Pessoais", // Toggle
- // Settings - General (Reserved)
- "settings.header.general": "Principal",
- "settings.header.general.description": "Ajustar as definiçoes principais no Cider.",
-
- // Settings - Lyrics
- "settings.header.lyrics": "Letras",
- "settings.header.lyrics.description": "Ajustar as definiçÃĩes das letras no Cider.",
- "settings.option.lyrics.enableMusixmatch": "Ativar Letras do Musixmatch", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Ativar Modo Karaoke (sÃŗ para Musixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Idioma Preferido para TraduÃ§ÃŖo Musixmatch", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Ativar letras do Youtube para videos musicais", // Toggle
-
- // Settings - Connectivity
- "settings.header.connectivity": "Conectividade",
- "settings.header.connectivity.description": "Ajustar as definiçÃĩes de conectividade no Cider.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "Mostrar como 'Cider'",
- "settings.header.connectivity.discordRPC.appleMusic": "Mostrar como 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "Apagar Discord Rich Presence quando estiver pausado", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "Atraso dos Scrobbles do LastFM (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Ativar LastFM Now Playing",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas de colaboraÃ§ÃŖo do nome da mÃēsica (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
- "settings.header.experimental": "Experimental",
- "settings.header.experimental.description": "Ajustar as definiçÃĩes experimental no Cider.",
- "settings.option.experimental.compactUI": "UI Compacto", // Toggle
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.spatialProperties" : "Propriedades do Espacial",
- "spatial.width" : "Largura",
- "spatial.height" : "Altura",
- "spatial.depth" : "Profundidade",
- "spatial.roomMaterials" : "Materiais da Sala",
- "spatial.roomDimensions" : "DimensÃĩes da Sala",
- "spatial.roomPositions" : "PosiçÃĩes da Sala",
- "spatial.setDimensions" : "Definir DimensÃĩes",
- "spatial.setPositions" : "Definir PosiçÃĩes",
- "spatial.up" : "Acima",
- "spatial.front" : "Frente",
- "spatial.left" : "Esquerda",
- "spatial.right" : "Direita",
- "spatial.back" : "AtrÃĄs",
- "spatial.down" : "Abaixo",
- "spatial.listener" : "Ouvinte",
- "spatial.audioSource" : "Fonte de Audio",
-
-
-
-
- // Settings - Unfinished
- "settings.header.unfinished": "Inacabado",
-
- // Web Remote
- "remote.web.title": "Cider Remoto",
- "remote.web.description": "Digitalize o cÃŗdigo QR para emparelhar seu telefone com esta instÃĸncia Cider"
-}
\ No newline at end of file
diff --git a/src/i18n/ro_RO.jsonc b/src/i18n/ro_RO.json
similarity index 87%
rename from src/i18n/ro_RO.jsonc
rename to src/i18n/ro_RO.json
index 181257dd..e886f67d 100644
--- a/src/i18n/ro_RO.jsonc
+++ b/src/i18n/ro_RO.json
@@ -1,25 +1,16 @@
{
-
- // i18n Info
- "i18n.languageName": "RomÃĸnÄ", // name of language in native language
- "i18n.languageNameEnglish": "Romanian", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@SubZeroNexii georgechrc", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+ "i18n.languageName": "RomÃĸnÄ",
+ "i18n.languageNameEnglish": "Romanian",
+ "i18n.category": "main",
+ "i18n.authors": "@SubZeroNexii georgechrc",
"app.name": "Cider",
"date.format": "${d} ${m}, ${y}",
-
- // Dialogs
"dialog.cancel": "Anulare",
"dialog.ok": "OK",
-
- // Notification
"notification.updatingLibrarySongs": "Actualizare bibliotecÄ muzicÄ...",
"notification.updatingLibraryAlbums": "Actualizare bibliotecÄ albume...",
"notification.updatingLibraryArtists": "Actualizare bibliotecÄ artiČti...",
- // Terms
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
@@ -120,14 +111,12 @@
"term.contributors": "Contribuitori",
"term.equalizer": "Egalizator",
"term.reset": "Reset",
- "term.tracks": "melodii", // Assume x amount of tracks. e.g. 50 tracks
+ "term.tracks": "melodii",
"term.videos": "Videoclipuri",
"term.menu": "Meniu",
"term.check": "Verificare",
- "term.aboutArtist": "Despre {{artistName}}", // e.g. 'About Doja Cat'
+ "term.aboutArtist": "Despre {{artistName}}",
"term.updateCider": "Actualizare Cider",
-
- // Home
"home.title": "AcasÄ",
"home.recentlyPlayed": "Asculate Recent",
"home.recentlyAdded": "AdÄugate Recent",
@@ -136,13 +125,10 @@
"home.madeForYou": "Pentru tine",
"home.friendsListeningTo": "Prietenii tÄi ascultÄ",
"home.followedArtists": "ArtiČti UrmÄriČi",
- // Errors
"error.appleMusicSubRequired": "Apple Music necesitÄ un abonament.",
"error.connectionError": "A apÄrut o problemÄ ÃŽn conectarea la Apple Music.",
"error.noResults": "Nici un rezultat.",
"error.noResults.description": "ÃŽncearcÄ o nouÄ cÄutare.",
-
- //Podcasts
"podcast.followOnCider": "UrmÄreČte pe Cider",
"podcast.followedOnCider": "UrmÄrit pe Cider",
"podcast.subscribeOnItunes": "AboneazÄ-te pe iTunes",
@@ -151,8 +137,6 @@
"podcast.episodes": "Episoade",
"podcast.playEpisode": "Ãncepe Episodul",
"podcast.website": "PaginÄ Podcast",
-
- // Actions
"action.addToLibrary": "AdaugÄ ÃŽn LibrÄrie",
"action.addToLibrary.success": "AdÄugat ÃŽn LibrÄrie",
"action.addToLibrary.error": "Eroare la adÄugarea ÃŽn LibrÄrie",
@@ -197,88 +181,69 @@
"action.tray.quit": "IeČire",
"action.tray.show": "AratÄ",
"action.update": "ActualizeazÄ",
-
- // Settings - General
"settings.header.general": "General",
"settings.header.general.description": "AjusteazÄ setÄrile generale pentru Cider.",
"settings.option.general.language": "LimbÄ",
-
- // Language optgroups
"settings.option.general.language.main": "Limbi",
"settings.option.general.language.fun": "Amuzant",
"settings.option.general.language.unsorted": "Nesortate",
-
- // Settings - Audio
"settings.header.audio": "Audio",
"settings.header.audio.description": "AjusteazÄ setÄrile audio pentru Cider.",
- "settings.option.audio.quality": "Calitate Audio", // Dropdown
+ "settings.option.audio.quality": "Calitate Audio",
"settings.header.audio.quality.high": "RidicatÄ",
"settings.header.audio.quality.low": "RedusÄ",
"settings.header.audio.quality.auto": "Auto",
- "settings.option.audio.seamlessTransition": "TranziČie Audio NeÃŽntreruptÄ", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "ActiveazÄ FuncČionalitate AvansatÄ", // Toggle
+ "settings.option.audio.seamlessTransition": "TranziČie Audio NeÃŽntreruptÄ",
+ "settings.option.audio.enableAdvancedFunctionality": "ActiveazÄ FuncČionalitate AvansatÄ",
"settings.option.audio.enableAdvancedFunctionality.description": "Pornirea funcČionalitÄČii AudioContext va permite folosirea funcČiilor audio avansate precum Normalizare Volum , Egalizator Či Vizualizator, dar pe unele sisteme poate cauza probleme precum ÃŽntreruperi ÃŽn redare.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizare Volum", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizare Volum",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "NormalizeazÄ volumul maxim al melodiilor pentru a genera o experienČÄ audio optimÄ.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "SpaČializare Audio", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "SpaČializare Audio",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "SpaČializeazÄ sunetul Či face sunetul 3-dimensional (notÄ: Nu este Dolby Atmos)",
- // Settings - Visual
"settings.header.visual": "Vizual",
"settings.header.visual.description": "AjusteazÄ setÄrile vizuale pentru Cider.",
- "settings.option.visual.windowBackgroundStyle": "Stil Fundal FereastrÄ", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "Stil Fundal FereastrÄ",
"settings.header.visual.windowBackgroundStyle.none": "Niciunul",
"settings.header.visual.windowBackgroundStyle.artwork": "CopertÄ Melodie",
"settings.header.visual.windowBackgroundStyle.image": "Imagine",
- "settings.option.visual.animatedArtwork": "CopertÄ AnimatÄ", // Dropdown
+ "settings.option.visual.animatedArtwork": "CopertÄ AnimatÄ",
"settings.header.visual.animatedArtwork.always": "Ãntotdeauna",
"settings.header.visual.animatedArtwork.limited": "Limitat la pagini Či Albume speciale",
"settings.header.visual.animatedArtwork.disable": "DezactiveazÄ peste tot",
- "settings.option.visual.animatedArtworkQuality": "Calitate CopertÄ AnimatÄ", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "Calitate CopertÄ AnimatÄ",
"settings.header.visual.animatedArtworkQuality.low": "RedusÄ",
"settings.header.visual.animatedArtworkQuality.medium": "Medie",
"settings.header.visual.animatedArtworkQuality.high": "RidicatÄ",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Foarte RidicatÄ",
"settings.header.visual.animatedArtworkQuality.extreme": "ExtremÄ",
- "settings.option.visual.animatedWindowBackground": "Fundal FereastrÄ Animat", // Toggle
- "settings.option.visual.hardwareAcceleration": "Accelerare Hardware", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "Fundal FereastrÄ Animat",
+ "settings.option.visual.hardwareAcceleration": "Accelerare Hardware",
"settings.option.visual.hardwareAcceleration.description": "NecesitÄ Repornire",
"settings.header.visual.hardwareAcceleration.default": "Implitcit",
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "AratÄ informaČii personale", // Toggle
-
- // Settings - Lyrics
+ "settings.option.visual.showPersonalInfo": "AratÄ informaČii personale",
"settings.header.lyrics": "Versuri",
"settings.header.lyrics.description": "AjusteazÄ setÄrile versurilor pentru Cider.",
- "settings.option.lyrics.enableMusixmatch": "ActiveazÄ Versuri Musixmatch", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "ActiveazÄ Mod Karaoke (numai Musixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "LimbÄ PreferatÄ Traducere Musixmatch", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "ActiveazÄ Versuri Youtube pentru Videoclipuri MuzicÄ", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "ActiveazÄ Versuri Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "ActiveazÄ Mod Karaoke (numai Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "LimbÄ PreferatÄ Traducere Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "ActiveazÄ Versuri Youtube pentru Videoclipuri MuzicÄ",
"settings.header.connectivity": "Conectivitate",
"settings.header.connectivity.description": "AjusteazÄ setÄrile de conectivitate pentru Cider.",
- "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
- "settings.option.connectivity.playbackNotifications": "NotificÄri Redare", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "NotificÄri Redare",
"settings.header.connectivity.discordRPC.cider": "AfiČeazÄ ca 'Cider'",
"settings.header.connectivity.discordRPC.appleMusic": "AfiČeazÄ ca 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "CurÄČÄ Discord Rich Presence la PauzÄ", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", // Option to Connect
+ "settings.option.connectivity.discordRPC.clearOnPause": "CurÄČÄ Discord Rich Presence la PauzÄ",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "ActiveazÄ Last.fm Now Playing",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "ČtergeČi artiČtii invitat din titlul melodiei (Last.fm)",
"settings.option.connectivity.lastfmScrobble.filterLoop": "FiltreazÄ melodii repetate (Last.fm)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
"settings.header.experimental": "Experimental",
"settings.header.experimental.description": "AjusteazÄ setÄrile experimentale pentru Cider.",
- "settings.option.experimental.compactUI": "UI Compact", // Toggle
+ "settings.option.experimental.compactUI": "UI Compact",
"settings.option.experimental.close_button_hide": "Butonul de ÃŽnchidere ar trebui sÄ ascundÄ aplicaČia",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
"spatial.notTurnedOn": "SpaČializarea Audio este dezactivatÄ. Pentru a folosi opČiunea aceasta, activaČi-o mai ÃŽntÃĸi.",
"spatial.spatialProperties": "ProprietÄČi SpaČiale",
"spatial.width": "LÄČime",
@@ -298,14 +263,8 @@
"spatial.down": "Jos",
"spatial.listener": "AscultÄtor",
"spatial.audioSource": "SursÄ Audio",
-
- // Settings - Unfinished
"settings.header.unfinished": "Neterminat",
-
- // Web Remote
"remote.web.title": "TelecomandÄ Cider",
"remote.web.description": "ScaneazÄ codul QR pentru a ÃŽmperechea telefonul tÄu cu aceastÄ instanČÄ Cider",
-
- // About
"about.thanks": "Multe MulČumiri Echipei Colectiv Cider Či a tuturor contribuitorilor."
}
diff --git a/src/i18n/ru_RU.json b/src/i18n/ru_RU.json
new file mode 100644
index 00000000..a4e0bb2b
--- /dev/null
+++ b/src/i18n/ru_RU.json
@@ -0,0 +1,343 @@
+{
+ "i18n.languageName": "Đ ŅŅŅĐēиК (RU)",
+ "i18n.languageNameEnglish": "Russian (RU)",
+ "i18n.category": "main",
+ "i18n.authors": "@h0ckerman",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "ĐŅĐŧĐĩĐŊа",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "ĐĐąĐŊОвĐģĐĩĐŊиĐĩ ĐŧĐĩдиаŅĐĩĐēи ĐŋĐĩŅĐĩĐŊ...",
+ "notification.updatingLibraryAlbums": "ĐĐąĐŊОвĐģĐĩĐŊиĐĩ ĐŧĐĩдиаŅĐĩĐēи аĐģŅйОĐŧОв...",
+ "notification.updatingLibraryArtists": "ĐĐąĐŊОвĐģĐĩĐŊиĐĩ ĐŧĐĩдиаŅĐĩĐēи аŅŅиŅŅОв...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "ĐОдĐēаŅŅŅ Apple",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "ĐŖĐˇĐŊаŅŅ ĐąĐžĐģŅŅĐĩ",
+ "term.accountSettings": "ĐаŅŅŅОКĐēи аĐēĐēаŅĐŊŅа",
+ "term.logout": "ĐŅĐšŅи",
+ "term.login": "ĐОКŅи",
+ "term.about": "Đ Cider",
+ "term.privateSession": "ЧаŅŅĐŊĐ°Ņ ŅĐĩŅŅиŅ",
+ "term.queue": "ĐŅĐĩŅĐĩĐ´Ņ",
+ "term.history": "ĐŅŅĐžŅиŅ",
+ "term.search": "ĐОиŅĐē",
+ "term.library": "ĐĐĩдиаŅĐĩĐēа",
+ "term.listenNow": "ĐĄĐģŅŅаКŅĐĩ ŅĐĩĐšŅаŅ",
+ "term.browse": "ĐйСОŅ",
+ "term.radio": "РадиО",
+ "term.recentlyAdded": "ĐĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐž",
+ "term.songs": "ĐĐĩŅĐŊи",
+ "term.albums": "ĐĐģŅйОĐŧŅ",
+ "term.artists": "ĐŅŅиŅŅŅ",
+ "term.podcasts": "ĐОдĐēаŅŅŅ",
+ "term.playlists": "ĐĐģĐĩĐšĐģиŅŅŅ",
+ "term.playlist": "ĐĐģĐĩĐšĐģиŅŅ",
+ "term.newPlaylist": "ĐОвŅĐš ĐĐģĐĩĐšĐģиŅŅ",
+ "term.newPlaylistFolder": "ĐĐžĐ˛Đ°Ņ ĐаĐŋĐēа ĐĐģĐĩĐšĐģиŅŅа",
+ "term.createNewPlaylist": "ХОСдаŅŅ ĐŊОвŅĐš ĐŋĐģĐĩĐšĐģиŅŅ",
+ "term.createNewPlaylistFolder": "ХОСдаŅŅ ĐŊОвŅŅ ĐŋаĐŋĐēŅ",
+ "term.deletePlaylist": "ĐŅ ŅвĐĩŅĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅиŅĐĩ ŅдаĐģиŅŅ ĐŋĐģĐĩĐšĐģиŅŅ?",
+ "term.play": "ĐĐžŅĐŋŅОиСвĐĩŅŅи",
+ "term.pause": "ĐаŅСа",
+ "term.previous": "ĐŅĐĩĐ´ŅĐ´ŅŅиК",
+ "term.next": "ĐĄĐģĐĩĐ´ŅŅŅиК",
+ "term.shuffle": "ĐĐĩŅĐĩĐŧĐĩŅаŅŅ",
+ "term.repeat": "ĐОвŅĐžŅŅŅŅ",
+ "term.volume": "ĐŅĐžĐŧĐēĐžŅŅŅ",
+ "term.mute": "ĐĐ°ĐŗĐģŅŅиŅŅ",
+ "term.unmute": "ĐĐēĐģŅŅиŅŅ ĐˇĐ˛ŅĐē",
+ "term.share": "ĐОдĐĩĐģиŅŅŅŅ",
+ "term.share.success": "ĐĄĐēĐžĐŋиŅОваĐŊĐž в ĐąŅŅĐĩŅ ĐžĐąĐŧĐĩĐŊа",
+ "term.settings": "ĐаŅŅŅОКĐēи",
+ "term.seeAll": "ĐĄĐŧĐžŅŅĐĩŅŅ Đ˛ŅĐĩ",
+ "term.sortBy": "ĐĄĐžŅŅиŅОваŅŅ ĐŋĐž",
+ "term.sortBy.album": "ĐĐģŅйОĐŧ",
+ "term.sortBy.artist": "ĐŅŅиŅŅ",
+ "term.sortBy.name": "ĐĐŧŅ",
+ "term.sortBy.genre": "ĐаĐŊŅ",
+ "term.sortBy.releaseDate": "ĐаŅа вŅŅ
Ода",
+ "term.sortBy.duration": "ĐĐģиŅĐĩĐģŅĐŊĐžŅŅŅ",
+ "term.sortBy.dateAdded": "ĐаŅа дОйавĐģĐĩĐŊиŅ",
+ "term.sortOrder": "Đ-Đ¯",
+ "term.sortOrder.ascending": "ĐĐž вОСŅаŅŅаĐŊиŅ",
+ "term.sortOrder.descending": "ĐĐž ŅĐąŅваĐŊиŅ",
+ "term.viewAs": "ĐĐžĐēаСŅваŅŅ",
+ "term.viewAs.coverArt": "ĐĐąĐģĐžĐļĐēи",
+ "term.viewAs.list": "ĐĄĐŋиŅĐžĐē",
+ "term.size": "РаСĐŧĐĩŅ",
+ "term.size.normal": "ĐĐąŅŅĐŊŅĐš",
+ "term.size.compact": "ĐĐžĐŧĐŋаĐēŅĐŊŅĐš",
+ "term.enable": "ĐĐēĐģŅŅиŅŅ",
+ "term.disable": "ĐŅĐēĐģŅŅиŅŅ",
+ "term.enabled": "ĐĐēĐģŅŅĐĩĐŊĐž",
+ "term.disabled": "ĐŅĐēĐģŅŅĐĩĐŊĐž",
+ "term.connect": "ĐОдĐēĐģŅŅиŅŅ",
+ "term.connecting": "ĐОдĐēĐģŅŅĐĩĐŊиĐĩ",
+ "term.disconnect": "ĐŅĐēĐģŅŅиŅŅ",
+ "term.authed": "ĐвŅĐžŅиСОваĐŊĐž",
+ "term.confirm": "ĐОдŅвĐĩŅдиŅŅ?",
+ "term.more": "ĐĐžĐģŅŅĐĩ",
+ "term.less": "ĐĐĩĐŊŅŅĐĩ",
+ "term.showMore": "ĐĐžĐēаСаŅŅ ĐąĐžĐģŅŅĐĩ",
+ "term.showLess": "ĐĐžĐēаСаŅŅ ĐŧĐĩĐŊŅŅĐĩ",
+ "term.topSongs": "ĐŅŅŅиĐĩ ĐŋĐĩŅĐŊи",
+ "term.latestReleases": "ĐĐžŅĐģĐĩĐ´ĐŊиĐĩ ŅĐĩĐģиСŅ",
+ "term.time.added": "ĐОйавĐģĐĩĐŊĐž",
+ "term.time.released": "Đ ĐĩĐģиС: ",
+ "term.time.updated": "ĐĐąĐŊОвĐģĐĩĐŊĐž",
+ "term.time.hour": {
+ "one": "ŅаŅ",
+ "few": "ŅаŅа",
+ "other": "ŅаŅОв"
+ },
+ "term.time.minute": {
+ "one": "ĐŧиĐŊŅŅа",
+ "few": "ĐŧиĐŊŅŅŅ",
+ "other": "ĐŧиĐŊŅŅ"
+ },
+ "term.time.second": {
+ "one": "ŅĐĩĐēŅĐŊĐ´",
+ "few": "ŅĐĩĐēŅĐŊĐ´Ņ",
+ "other": "ŅĐĩĐēŅĐŊĐ´"
+ },
+ "term.fullscreenView": "ĐĐžĐģĐŊĐžŅĐēŅаĐŊĐŊĐžĐĩ ĐžŅОйŅаĐļĐĩĐŊиĐĩ",
+ "term.defaultView": "ĐĄŅаĐŊдаŅŅĐŊĐžĐĩ ĐžŅОйŅаĐļĐĩĐŊиĐĩ",
+ "term.audioSettings": "ĐаŅŅŅОКĐēи СвŅĐēа",
+ "term.audioControls": "ĐаŅŅŅОКĐēа ĐŗŅĐžĐŧĐēĐžŅŅи",
+ "term.clearAll": "ĐŅиŅŅиŅŅ",
+ "term.recentStations": "ĐŅ ĐŊĐĩдавĐŊĐž ŅĐģŅŅаĐģи",
+ "term.language": "Đ¯ĐˇŅĐē",
+ "term.funLanguages": "ĐайавĐŊŅĐĩ",
+ "term.noLyrics": "ĐĸĐĩĐēŅŅ ĐŋĐĩŅĐŊи ĐŊĐĩ ĐŊаКдĐĩĐŊ.",
+ "term.copyright": "ĐвŅĐžŅŅĐēĐžĐĩ ĐŋŅавО",
+ "term.rightsReserved": "ĐŅĐĩ ĐŋŅава СаŅиŅĐĩĐŊŅ.",
+ "term.sponsor": "ĐОддĐĩŅĐļаŅŅ ĐŋŅĐžĐĩĐēŅ",
+ "term.ciderTeam": "ĐĐžĐŧаĐŊда Cider",
+ "term.developer": "РаСŅайОŅŅиĐē",
+ "term.socialTeam": "ĐĄĐžŅиаĐģŅĐŊĐ°Ņ ĐēĐžĐŧаĐŊда",
+ "term.socials": "ĐĄĐžŅиаĐģŅĐŊŅĐĩ ŅĐĩŅи",
+ "term.contributors": "ĐĐŊĐĩŅĐģи вĐēĐģад",
+ "term.equalizer": "ĐĐēваĐģаКСĐĩŅ",
+ "term.reset": "ĐĄĐąŅĐžŅиŅŅ",
+ "term.tracks": {
+ "one": "ĐŋĐĩŅĐŊŅ",
+ "few": "ĐŋĐĩŅĐŊи",
+ "other": "ĐŋĐĩŅĐĩĐŊ"
+ },
+ "term.videos": "ĐидĐĩĐž",
+ "term.menu": "ĐĐĩĐŊŅ",
+ "term.check": "ĐŅОвĐĩŅиŅŅ",
+ "term.aboutArtist": "Đ {{artistName}}",
+ "term.topResult": "ĐĸĐžĐŋ ŅĐĩСŅĐģŅŅаŅОв",
+ "term.sharedPlaylists": "ĐĐąŅиĐĩ ĐŋĐģĐĩĐšĐģиŅŅŅ",
+ "term.people": "ĐŅди",
+ "term.newpreset.name": "ĐаСваĐŊиĐĩ ĐŊĐžĐ˛ĐžĐŗĐž ĐŋŅĐĩŅĐĩŅа ŅĐēваĐģаКСĐĩŅа",
+ "term.addedpreset": "ĐŅĐĩŅĐĩŅ Đ´ĐžĐąĐ°Đ˛ĐģĐĩĐŊ",
+ "term.deletepreset.warn": "ĐŅ ŅвĐĩŅĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅиŅĐĩ ŅдаĐģиŅŅ ĐŋŅĐĩŅĐĩŅ?",
+ "term.deletedpreset": "ĐŅĐĩŅĐĩŅ ŅдаĐģĐĩĐŊ",
+ "term.defaultPresets": "ĐŅĐĩĐ´ŅŅŅаĐŊОвĐēи ĐŋĐž ŅĐŧĐžĐģŅаĐŊиŅ",
+ "term.userPresets": "ĐŅĐĩĐ´ŅŅŅаĐŊОвĐēи ĐŋĐžĐģŅСОваŅĐĩĐģŅ",
+ "term.requestError": "ĐОСĐŊиĐēĐģа ĐŋŅОйĐģĐĩĐŧа Ņ ĐˇĐ°ĐŋŅĐžŅĐžĐŧ.",
+ "term.song.link.generate": "ĐĐžĐģŅŅĐĩĐŊиĐĩ ŅŅŅĐģĐēи Ņ song.link...",
+ "term.musicVideos": "ĐŅСŅĐēаĐģŅĐŊŅĐĩ видĐĩĐž",
+ "term.stations": "ĐĄŅаĐŊŅии",
+ "term.curators": "ĐŅŅаŅĐžŅŅ",
+ "term.appleCurators": "ĐŅŅаŅĐžŅŅ Apple",
+ "term.radioShows": "РадиОŅĐžŅ",
+ "term.recordLabels": "ĐĐĩКйĐģŅ ĐˇĐ˛ŅĐēОСаĐŋиŅи",
+ "term.videoExtras": "ĐŅŅ",
+ "term.top": "Top",
+ "term.version": "ĐĐĩŅŅиŅ",
+ "term.noVideos": "ĐидĐĩĐž ĐŊĐĩ ĐŊаКдĐĩĐŊĐž.",
+ "home.title": "ĐĐģавĐŊаŅ",
+ "home.recentlyPlayed": "ĐĐĩдавĐŊĐž ĐŋŅĐžŅĐģŅŅаĐŊĐŊŅĐĩ",
+ "home.recentlyAdded": "ĐĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅĐĩ",
+ "home.artistsFeed": "ĐĐĩĐŊŅа иŅĐŋĐžĐģĐŊиŅĐĩĐģĐĩĐš",
+ "home.artistsFeed.noArtist": "ĐОдĐŋиŅиŅĐĩŅŅ ĐŊа ĐŊĐĩĐēĐžŅĐžŅŅŅ
аŅŅиŅŅОв, и иŅ
ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ ŅĐĩĐģĐ¸ĐˇŅ ĐąŅĐ´ŅŅ ĐˇĐ´ĐĩŅŅ",
+ "home.madeForYou": "ĐĄĐŋĐĩŅиаĐģŅĐŊĐž Đ´ĐģŅ Đ˛Đ°Ņ",
+ "home.friendsListeningTo": "ЧŅĐž ŅĐģŅŅаŅŅ Đ´ŅŅСŅŅ",
+ "home.followedArtists": "ĐŅŅĐģĐĩĐļиваĐĩĐŧŅĐĩ аŅŅиŅŅŅ",
+ "error.appleMusicSubRequired": "ĐĐģŅ ĐŋŅĐžŅĐģŅŅиваĐŊĐ¸Ņ Apple Music ŅŅĐĩĐąŅĐĩŅŅŅ ĐŋОдĐŋиŅĐēа.",
+ "error.connectionError": "ĐОСĐŊиĐēĐģа ĐŋŅОйĐģĐĩĐŧа Ņ ĐŋОдĐēĐģŅŅĐĩĐŊиĐĩĐŧ Đē Apple Music.",
+ "error.noResults": "ĐĐĩŅ ŅĐĩСŅĐģŅŅаŅОв.",
+ "error.noResults.description": "ĐĐžĐŋŅОйŅĐšŅĐĩ ĐĩŅŅ ŅаС.",
+ "podcast.followOnCider": "ĐŅŅĐģĐĩĐļиваŅŅ Đ˛ Cider",
+ "podcast.followedOnCider": "ĐŅŅĐģĐĩĐļиваĐĩĐŧŅĐĩ в Cider",
+ "podcast.subscribeOnItunes": "ĐОдĐŋиŅаŅŅŅŅ Đ˛ iTunes",
+ "podcast.subscribedOnItunes": "ĐОдĐŋиŅаĐŊ в iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "ĐŅĐŋŅŅĐēи ŅадиОŅĐžŅ",
+ "podcast.playEpisode": "ĐĐžŅĐŋŅОиСвĐĩŅŅи",
+ "podcast.website": "ĐĐĩĐą-ŅаКŅ",
+ "action.addToLibrary": "ĐОйавиŅŅ Đ˛ ĐŧĐĩдиаŅĐĩĐēŅ",
+ "action.addToLibrary.success": "ĐОйавĐģĐĩĐŊĐž в ĐŧĐĩдиаŅĐĩĐēŅ",
+ "action.addToLibrary.error": "ĐŅийĐēа ĐОйавĐģĐĩĐŊĐ¸Ņ Đ˛ ĐŧĐĩдиаŅиĐēŅ",
+ "action.removeFromLibrary": "ĐŖĐąŅаŅŅ Đ¸Đˇ ĐŧĐĩдиаŅĐĩĐēи",
+ "action.removeFromLibrary.success": "ĐŖĐ´Đ°ĐģĐĩĐŊĐž иС ĐŧĐĩдиаŅĐĩĐēи",
+ "action.addToQueue": "ĐĐžŅĐŋŅОиСвĐĩŅŅи даĐģĐĩĐĩ",
+ "action.addToQueue.success": "ĐОйавĐģĐĩĐŊĐž в ĐžŅĐĩŅĐĩĐ´Ņ",
+ "action.addToQueue.error": "ĐŅийĐēа дОйавĐģĐĩĐŊĐ¸Ņ Đ˛ ĐžŅĐĩŅĐĩĐ´Ņ",
+ "action.removeFromQueue": "ĐŖĐąŅаŅŅ Đ¸Đˇ ĐžŅĐĩŅĐĩди",
+ "action.removeFromQueue.success": "ĐŖĐ´Đ°ĐģĐĩĐŊĐž иС ĐžŅĐĩŅĐĩди",
+ "action.removeFromQueue.error": "ĐŅийĐēа ŅдаĐģĐĩĐŊĐ¸Ņ Đ¸Đˇ ĐžŅĐĩŅĐĩди",
+ "action.createPlaylist": "ХОСдаŅŅ ĐŊОвŅĐš ĐŋĐģĐĩĐšĐģиŅŅ",
+ "action.addToPlaylist": "ĐОйавиŅŅ Đ˛ ĐŋĐģĐĩĐšĐģиŅŅ",
+ "action.removeFromPlaylist": "ĐŖĐ´Đ°ĐģиŅŅ Đ¸Đˇ ĐŋĐģĐĩĐšĐģиŅŅа",
+ "action.addToFavorites": "ĐОйавиŅŅ Đ˛ иСйŅаĐŊĐŊĐžĐĩ",
+ "action.follow": "ĐŅŅĐģĐĩĐļиваŅŅ",
+ "action.follow.success": "Đ ĐžŅŅĐģĐĩĐļиваĐĩĐŧŅŅ
",
+ "action.follow.error": "ĐŅийĐēа ĐžŅŅĐģĐĩĐļиваĐŊиŅ",
+ "action.unfollow": "ĐŅĐŋиŅаŅŅŅŅ",
+ "action.unfollow.success": "ĐŅĐŋиŅаĐŊ",
+ "action.unfollow.error": "ĐŅийĐēа ĐžŅĐŋиŅĐēи",
+ "action.playNext": "ĐĐžŅĐŋŅОиСвĐĩŅŅи даĐģĐĩĐĩ",
+ "action.playLater": "ĐĐžŅĐŋŅОиСвĐĩŅŅи ĐŋОСĐļĐĩ",
+ "action.startRadio": "ХОСдаŅŅ ŅŅаĐŊŅиŅ",
+ "action.goToArtist": "ĐĐĩŅĐĩĐšŅи Đē аŅŅиŅŅŅ",
+ "action.goToAlbum": "ĐĐĩŅĐĩĐšŅи Đē аĐģŅйОĐŧŅ",
+ "action.moveToTop": "ĐĐĩŅĐĩĐŧĐĩŅŅиŅŅ ĐŊавĐĩŅŅ
",
+ "action.share": "ĐОдĐĩĐģиŅŅŅŅ",
+ "action.rename": "ĐĐĩŅĐĩиĐŧĐĩĐŊОваŅŅ",
+ "action.love": "ĐŅавиŅŅŅ",
+ "action.unlove": "ĐĐžĐģŅŅĐĩ ĐŊĐĩ ĐŊŅавиŅŅŅ",
+ "action.dislike": "ĐĐĩĐŊŅŅĐĩ ĐŋОдОйĐŊŅŅ
ŅĐĩĐēĐžĐŧĐĩĐŊдаŅиК",
+ "action.undoDislike": "ĐĐĩŅĐŊŅŅŅ ĐŋОдОйĐŊŅĐĩ ŅĐĩĐēĐžĐŧĐĩĐŊдаŅии",
+ "action.showWebRemoteQR": "ĐĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅ",
+ "action.playTracksNext": "ĐĐžŅĐŋŅОиСвĐĩŅŅи ${app.selectedMediaItems.length} ĐŋĐĩŅĐĩĐŊ ŅĐģĐĩĐ´ŅŅŅиĐŧи",
+ "action.playTracksLater": "ĐĐžŅĐŋŅОиСвĐĩŅŅи ${app.selectedMediaItems.length} ĐŋĐĩŅĐĩĐŊ ĐŋОСĐļĐĩ",
+ "action.removeTracks": "ĐŖĐ´Đ°ĐģиŅŅ ${self.selectedItems.length} ĐŋĐĩŅĐĩĐŊ иС ĐžŅĐĩŅĐĩди",
+ "action.import": "ĐĐŧĐŋĐžŅŅ",
+ "action.export": "ĐĐēŅĐŋĐžŅŅ",
+ "action.showAlbum": "ĐĐžĐēаСаŅŅ Đ˛ĐĩŅŅ Đ°ĐģŅйОĐŧ",
+ "action.tray.minimize": "ХвĐĩŅĐŊŅŅŅ Đ˛ ŅŅĐĩĐš",
+ "action.tray.quit": "ĐŅĐšŅи",
+ "action.tray.show": "ĐĐžĐēаСаŅŅ",
+ "action.update": "ĐĐąĐŊОвиŅŅ",
+ "action.copy": "ĐĄĐēĐžĐŋиŅОваŅŅ",
+ "action.newpreset": "ĐОвŅĐš ĐŋŅĐĩŅĐĩŅ...",
+ "action.deletepreset": "ĐŖĐ´Đ°ĐģиŅŅ ĐŋŅĐĩŅĐĩŅ",
+ "action.open": "ĐŅĐēŅŅŅŅ",
+ "settings.header.general": "ĐĐąŅиĐĩ",
+ "settings.header.general.description": "ĐаŅŅŅОКĐēа ОйŅиŅ
ĐŋаŅаĐŧĐĩŅŅОв Cider.",
+ "settings.option.general.language": "Đ¯ĐˇŅĐē",
+ "settings.option.general.language.main": "Đ¯ĐˇŅĐēи",
+ "settings.option.general.language.fun": "ĐайавĐŊŅĐĩ ŅСŅĐēи",
+ "settings.option.general.language.unsorted": "ĐĐĩĐžŅŅĐžŅŅиŅОваĐŊĐŊŅĐĩ",
+ "settings.option.general.updateCider": "ĐĐąĐŊОвиŅŅ Cider",
+ "settings.option.general.updateCider.branch": "ĐĐĩŅĐēа ОйĐŊОвĐģĐĩĐŊĐ¸Ņ Cider",
+ "settings.option.general.updateCider.branch.description": "ĐŅĐąĐĩŅиŅĐĩ вĐĩŅĐēŅ ĐžĐąĐŊОвĐģĐĩĐŊĐ¸Ņ Cider",
+ "settings.option.general.updateCider.branch.main": "ĐĄŅайиĐģŅĐŊаŅ",
+ "settings.option.general.updateCider.branch.develop": "ĐĐĩŅŅайиĐģŅĐŊаŅ",
+ "settings.header.audio": "ĐвŅĐē",
+ "settings.header.audio.description": "ĐаŅŅŅОКĐēа СвŅĐēа Cider.",
+ "settings.option.audio.volumeStep": "Đ¨Đ°Đŗ ĐŗŅĐžĐŧĐēĐžŅŅи",
+ "settings.option.audio.maxVolume": "ĐаĐēŅиĐŧаĐģŅĐŊĐ°Ņ ĐŗŅĐžĐŧĐēĐžŅŅŅ",
+ "settings.option.audio.quality": "ĐаŅĐĩŅŅвО СвŅĐēа",
+ "settings.header.audio.quality.hireslossless": "ĐŅŅĐžĐēĐžĐĩ ŅаСŅĐĩŅĐĩĐŊиĐĩ, ĐąĐĩС ĐŋĐžŅĐĩŅŅ",
+ "settings.header.audio.quality.hireslossless.description": "ALAC Đ´Đž 24 йиŅ/192 ĐēĐŅ",
+ "settings.header.audio.quality.lossless": "ĐĐĩС ĐŋĐžŅĐĩŅŅ",
+ "settings.header.audio.quality.lossless.description": "ALAC Đ´Đž 24 йиŅ/48 ĐēĐŅ",
+ "settings.header.audio.quality.high": "ĐŅŅĐžĐēĐžĐĩ ĐēаŅĐĩŅŅвО",
+ "settings.header.audio.quality.high.description": "AAC 256 ĐēĐą/Ņ",
+ "settings.header.audio.quality.standard": "ĐŅŅĐžĐēĐ°Ņ ŅŅŅĐĩĐēŅивĐŊĐžŅŅŅ",
+ "settings.header.audio.quality.standard.description": "ĐĐ-ĐĐĐĄ Đ´ĐģŅ ŅĐēĐžĐŊĐžĐŧии ŅŅаŅиĐēа(64 ĐēĐą/Ņ)",
+ "settings.option.audio.seamlessTransition": "ĐĐģавĐŊŅĐš ĐŋĐĩŅĐĩŅ
Од ĐŧĐĩĐļĐ´Ņ ĐŋĐĩŅĐŊŅĐŧи",
+ "settings.option.audio.enableAdvancedFunctionality": "ĐĐēĐģŅŅиŅŅ ŅаŅŅиŅĐĩĐŊĐŊŅĐš ŅŅĐŊĐēŅиОĐŊаĐģ",
+ "settings.option.audio.enableAdvancedFunctionality.description": "ĐĐēĐģŅŅĐĩĐŊиĐĩ ŅŅĐŊĐēŅии AudioContext ĐŋОСвОĐģĐ¸Ņ Đ¸ŅĐŋĐžĐģŅСОваŅŅ ŅаŅŅиŅĐĩĐŊĐŊŅĐĩ ŅŅĐŊĐēŅии СвŅĐēа, ŅаĐēиĐĩ ĐēаĐē ĐŊĐžŅĐŧаĐģиСаŅĐ¸Ņ ĐˇĐ˛ŅĐēа, ŅĐēваĐģаКСĐĩŅŅ Đ¸ виСŅаĐģиСаŅĐžŅŅ, ОдĐŊаĐēĐž в ĐŊĐĩĐēĐžŅĐžŅŅŅ
ŅиŅŅĐĩĐŧаŅ
ŅŅĐž ĐŧĐžĐļĐĩŅ Đ˛ŅСваŅŅ ĐˇĐ°Đ¸ĐēаĐŊиĐĩ СвŅĐēОвŅŅ
Đ´ĐžŅĐžĐļĐĩĐē.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "ĐŅиŅ
ОаĐēŅŅŅиŅĐĩŅĐēиĐĩ ŅĐģŅŅŅĐĩĐŊиŅ, ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅŅ ĐēĐžŅĐžŅŅĐŧ вŅĐĩ СвŅŅĐ¸Ņ ĐąĐžĐŗĐ°ŅĐĩ и ĐļивĐĩĐĩ | РаСŅайОŅаĐŊĐž Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP ĐŊĐĩ ŅОвĐŧĐĩŅŅиĐŧ Ņ ĐŋŅĐžŅŅŅаĐŊŅŅвĐĩĐŊĐŊŅĐŧ СвŅŅаĐŊиĐĩĐŧ. ĐĐžĐļаĐģŅĐšŅŅа, ĐžŅĐēĐģŅŅиŅĐĩ ĐŋŅĐžŅŅŅаĐŊŅŅвĐĩĐŊĐŊĐžĐĩ СвŅŅаĐŊиĐĩ, ŅŅĐžĐąŅ ĐŋŅОдОĐģĐļиŅŅ.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Đ ĐĩĐļиĐŧ CAP",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "ĐСĐŧĐĩĐŊŅĐĩŅ ŅĐĩĐļиĐŧ ОйŅайОŅĐēи СвŅĐēа. (Đ ĐĩĐļиĐŧ Đ°ĐŗŅĐĩŅŅии ĐŧĐžĐļĐĩŅ ĐŋŅивĐĩŅŅи Đē ĐŊĐĩĐļĐĩĐģаĐĩĐŧŅĐŧ ŅĐĩСŅĐģŅŅаŅаĐŧ)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "ĐĄŅаĐŊдаŅŅĐŊŅĐš",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "ĐĐŗŅĐĩŅŅивĐŊŅĐš",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ĐĐžŅĐŧаĐģиСаŅĐ¸Ņ ĐˇĐ˛ŅĐēа",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "ĐĐžŅĐŧаĐģиСŅĐĩŅ ĐŋиĐēОвŅŅ ĐŗŅĐžĐŧĐēĐžŅŅŅ Đ´ĐģŅ ĐžŅĐ´ĐĩĐģŅĐŊŅŅ
ŅŅĐĩĐēОв, ŅŅĐžĐąŅ ŅОСдаŅŅ ĐąĐžĐģĐĩĐĩ ОдĐŊĐžŅОдĐŊĐžĐĩ вĐŋĐĩŅаŅĐģĐĩĐŊиĐĩ ĐžŅ ĐŋŅĐžŅĐģŅŅиваĐŊиŅ.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ĐŅĐžŅŅŅаĐŊŅŅвĐĩĐŊĐŊĐžĐĩ СвŅŅаĐŊиĐĩ",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ĐŅĐžŅŅŅаĐŊŅŅвĐĩĐŊĐŊĐžĐĩ аŅдиО; ŅĐ´ĐĩĐģаŅŅ ĐˇĐ˛ŅĐē йОĐģĐĩĐĩ ŅŅĐĩŅ
ĐŧĐĩŅĐŊŅĐŧ (ĐŋŅиĐŧĐĩŅаĐŊиĐĩ: ŅŅĐž ĐŊĐĩ Dolby Atmos)",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "ĐŅĐžŅŅŅаĐŊŅŅвĐĩĐŊĐŊĐ°Ņ ĐžĐąŅайОŅĐēа ĐŊĐĩŅОвĐŧĐĩŅŅиĐŧа Ņ CAP. ĐĐžĐļаĐģŅĐšŅŅа, ĐžŅĐēĐģŅŅиŅĐĩ CAP, ŅŅĐžĐąŅ ĐŋŅОдОĐģĐļиŅŅ.",
+ "settings.header.visual": "ĐĐŊĐĩŅĐŊиК вид",
+ "settings.header.visual.description": "ĐаŅŅŅОКĐēа вĐŊĐĩŅĐŊĐĩĐŗĐž вида Cider.",
+ "settings.option.visual.windowBackgroundStyle": "ĐĄŅиĐģŅ ŅĐžĐŊа Cider",
+ "settings.header.visual.windowBackgroundStyle.none": "ĐŅŅŅŅŅŅвŅĐĩŅ",
+ "settings.header.visual.windowBackgroundStyle.artwork": "ĐĐąĐģĐžĐļĐēа",
+ "settings.header.visual.windowBackgroundStyle.image": "ĐСОйŅаĐļĐĩĐŊиĐĩ",
+ "settings.option.visual.animatedArtwork": "ĐĐŊиĐŧиŅОваĐŊĐŊĐ°Ņ ĐžĐąĐģĐžĐļĐēа",
+ "settings.header.visual.animatedArtwork.always": "ĐŅĐĩĐŗĐ´Đ°",
+ "settings.header.visual.animatedArtwork.limited": "ĐĐŗŅаĐŊиŅĐĩĐŊĐž ŅĐŋĐĩŅиаĐģŅĐŊŅĐŧи ŅŅŅаĐŊиŅаĐŧи",
+ "settings.header.visual.animatedArtwork.disable": "ĐŅĐēĐģŅŅĐĩĐŊĐž вĐĩСдĐĩ",
+ "settings.option.visual.animatedArtworkQuality": "ĐаŅĐĩŅŅвО аĐŊиĐŧиŅОваĐŊĐŊОК ОйĐģĐžĐļĐēи",
+ "settings.header.visual.animatedArtworkQuality.low": "ĐиСĐēĐžĐĩ",
+ "settings.header.visual.animatedArtworkQuality.medium": "ĐĄŅĐĩĐ´ĐŊĐĩĐĩ",
+ "settings.header.visual.animatedArtworkQuality.high": "ĐŅŅĐžĐēĐžĐĩ",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "ĐŅĐĩĐŊŅ Đ˛ŅŅĐžĐēĐžĐĩ",
+ "settings.header.visual.animatedArtworkQuality.extreme": "ĐаивŅŅŅĐĩĐĩ",
+ "settings.option.visual.animatedWindowBackground": "ĐĐŊиĐŧиŅОваĐŊĐŊŅĐš ŅĐžĐŊ ĐžĐēĐŊа Cider",
+ "settings.option.visual.hardwareAcceleration": "ĐĐŋĐŋаŅаŅĐŊĐžĐĩ ŅŅĐēĐžŅĐĩĐŊиĐĩ",
+ "settings.option.visual.hardwareAcceleration.description": "ĐĸŅĐĩĐąŅĐĩŅ ĐŋĐĩŅĐĩĐˇĐ°ĐŗŅŅСĐēи ĐŋŅиĐģĐžĐļĐĩĐŊиŅ",
+ "settings.header.visual.hardwareAcceleration.default": "ĐĐž ŅĐŧĐžĐģŅаĐŊиŅ",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "ĐĸĐĩĐŧа",
+ "settings.option.visual.theme.github.download": "ĐŖŅŅаĐŊОвиŅŅ Ņ GitHub",
+ "settings.option.visual.theme.github.explore": "ĐŅŅĐģĐĩдОваŅŅ ŅĐĩĐŧŅ Ņ GitHub",
+ "settings.option.visual.theme.github.install.confirm": "ĐŅ ŅвĐĩŅĐĩĐŊŅ, ŅŅĐž Ņ
ĐžŅиŅĐĩ ŅŅŅаĐŊОвиŅŅ {{ repo }}?",
+ "settings.prompt.visual.theme.github.URL": "ĐвĐĩдиŅĐĩ URL ŅĐĩĐŧŅ, ĐēĐžŅĐžŅŅŅ Ņ
ĐžŅиŅĐĩ ŅŅŅаĐŊОвиŅŅ",
+ "settings.notyf.visual.theme.install.success": "ĐĸĐĩĐŧа ŅŅĐŋĐĩŅĐŊĐž ŅŅŅаĐŊОвĐģĐĩĐŊа",
+ "settings.notyf.visual.theme.install.error": "ĐĐĩ ŅдаĐģĐžŅŅ ŅŅŅаĐŊОвиŅŅ ŅĐĩĐŧŅ",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "ĐĸŅĐŧĐŊаŅ",
+ "settings.option.visual.showPersonalInfo": "ĐĐžĐēаСаŅŅ ĐģиŅĐŊŅŅ Đ¸ĐŊŅĐžŅĐŧаŅиŅ",
+ "settings.header.lyrics": "ĐĸĐĩĐēŅŅ ĐŋĐĩŅĐŊи",
+ "settings.header.lyrics.description": "ĐаŅŅŅОКĐēа ŅĐĩĐēŅŅа ĐŋĐĩŅĐĩĐŊ.",
+ "settings.option.lyrics.enableMusixmatch": "ĐĐžĐģŅŅаŅŅ ŅĐĩĐēŅŅ ĐŋĐĩŅĐĩĐŊ иС Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "ĐĐēĐģŅŅиŅŅ ŅĐĩĐļиĐŧ ĐēаŅаОĐēĐĩ (ŅĐžĐģŅĐēĐž Ņ Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "ĐŅĐĩĐ´ĐŋĐžŅŅиŅĐĩĐģŅĐŊŅĐš ŅСŅĐē ĐŋĐĩŅĐĩвОда Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "ĐĐēĐģŅŅиŅŅ Youtube Lyrics Đ´ĐģŅ ĐŧŅСŅĐēаĐģŅĐŊŅŅ
ĐēĐģиĐŋОв",
+ "settings.header.connectivity": "ĐŅĐžŅĐĩĐĩ",
+ "settings.header.connectivity.description": "ĐаŅŅŅОКĐēа ĐŋŅĐžŅиŅ
ĐŋаŅаĐŧĐĩŅŅОв Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ Đž вОŅĐŋŅОиСвĐĩĐ´ĐĩĐŊии",
+ "settings.header.connectivity.discordRPC.cider": "ĐŅОйŅаĐļаŅŅ ĐēаĐē 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "ĐŅОйŅаĐļаŅŅ ĐēаĐē 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "ĐŅĐēĐģŅŅаŅŅ Discord Rich Presence ĐŊа ĐŋаŅСĐĩ",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm cĐēŅОййĐģиĐŊĐŗ",
+ "settings.option.connectivity.lastfmScrobble.delay": "ЧаŅŅĐžŅа ŅĐēŅОййĐģиĐŊĐŗĐ° Last.fm (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "ĐĐēĐģŅŅиŅŅ Last.fm ĐĄĐĩĐšŅĐ°Ņ Đ¸ĐŗŅаĐĩŅ",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "ĐŖĐ´Đ°ĐģŅŅŅ ŅиŅ-иŅĐŋĐžĐģĐŊиŅĐĩĐģĐĩĐš иС ĐŊаСваĐŊĐ¸Ņ ĐŋĐĩŅĐŊи (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "ФиĐģŅŅŅОваŅŅ ĐˇĐ°ŅиĐēĐģĐĩĐŊĐŊŅĐš ŅŅĐĩĐē (Last.fm)",
+ "settings.header.debug": "Debug",
+ "settings.option.debug.copy_log": "ĐĐžĐŋиŅОваŅŅ ĐģĐžĐŗĐ¸ в ĐąŅŅĐĩŅ ĐžĐąĐŧĐĩĐŊа",
+ "settings.option.debug.openAppData": "ĐŅĐēŅŅŅŅ ĐŋаĐŋĐēŅ Cider",
+ "settings.header.experimental": "ĐĐēŅĐŋĐĩŅиĐŧĐĩĐŊŅаĐģŅĐŊŅĐĩ",
+ "settings.header.experimental.description": "ĐаŅŅŅОКĐēа ŅĐēŅĐŋĐĩŅиĐŧĐĩĐŊŅаĐģŅĐŊŅŅ
ŅŅĐŊĐēŅиК Cider.",
+ "settings.option.experimental.compactUI": "ĐĐžĐŧĐŋаĐēŅĐŊŅĐš иĐŊŅĐĩŅŅĐĩĐšŅ",
+ "settings.option.experimental.close_button_hide": "ĐĐŊĐžĐŋĐēа ÂĢĐаĐēŅŅŅŅÂģ ŅĐēŅŅваĐĩŅ ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ",
+ "settings.option.experimental.inline_playlists": "ĐŅŅŅĐžĐĩĐŊĐŊŅĐĩ ĐŋĐģĐĩĐšĐģиŅŅŅ Đ¸ аĐģŅйОĐŧŅ",
+ "spatial.notTurnedOn": "ĐŅĐžŅŅŅаĐŊŅŅвĐĩĐŊĐŊĐžĐĩ аŅдиО ĐžŅĐēĐģŅŅĐĩĐŊĐž. ЧŅĐžĐąŅ Đ¸ŅĐŋĐžĐģŅСОваŅŅ, ŅĐŊаŅаĐģа вĐēĐģŅŅиŅĐĩ ĐĩĐŗĐž.",
+ "spatial.spatialProperties": "ĐаŅŅŅОКĐēа ĐŋŅĐžŅŅŅаĐŊŅŅвĐĩĐŊĐŊĐžĐŗĐž аŅдиО",
+ "spatial.width": "ШиŅиĐŊа",
+ "spatial.height": "ĐŅŅĐžŅа",
+ "spatial.depth": "ĐĐģŅйиĐŊа",
+ "spatial.gain": "ĐŖŅиĐģĐĩĐŊиĐĩ",
+ "spatial.roomMaterials": "ĐаŅĐĩŅиаĐģŅ ĐēĐžĐŧĐŊаŅŅ",
+ "spatial.roomDimensions": "РаСĐŧĐĩŅŅ ĐēĐžĐŧĐŊаŅŅ",
+ "spatial.roomPositions": "ĐОСиŅии ĐēĐžĐŧĐŊаŅŅ",
+ "spatial.setDimensions": "ĐŖŅŅаĐŊОвиŅŅ ŅаСĐŧĐĩŅŅ",
+ "spatial.setPositions": "ĐŖŅŅаĐŊОвиŅŅ ĐŋОСиŅии",
+ "spatial.up": "ХвĐĩŅŅ
Ņ",
+ "spatial.front": "ĐĄĐŋĐĩŅĐĩди",
+ "spatial.left": "ĐĄĐģĐĩва",
+ "spatial.right": "ĐĄĐŋŅава",
+ "spatial.back": "ХСади",
+ "spatial.down": "ĐĄĐŊиСŅ",
+ "spatial.listener": "ĐĄĐģŅŅаŅĐĩĐģŅ",
+ "spatial.audioSource": "ĐŅŅĐžŅĐŊиĐē СвŅĐēа",
+ "settings.header.unfinished": "ĐĐĩ СавĐĩŅŅĐĩĐŊĐž",
+ "remote.web.title": "ĐĐĩĐą-иĐŊŅĐĩŅŅĐĩĐšŅ",
+ "remote.web.description": "ĐŅŅĐēаĐŊиŅŅĐšŅĐĩ QR-ĐēОд, ŅŅĐžĐąŅ ĐŋОдĐēĐģŅŅиŅŅ ŅĐĩĐģĐĩŅĐžĐŊ Đē Cider Remote",
+ "about.thanks": "ĐĐžĐģŅŅĐžĐĩ ŅĐŋаŅийО ĐēĐžĐŧаĐŊĐ´Đĩ Cider Collective и вŅĐĩĐŧ ĐŊаŅиĐŧ вĐēĐģадŅиĐēаĐŧ."
+}
diff --git a/src/i18n/sk_SK.json b/src/i18n/sk_SK.json
new file mode 100644
index 00000000..a16df361
--- /dev/null
+++ b/src/i18n/sk_SK.json
@@ -0,0 +1,276 @@
+{
+ "i18n.languageName": "SlovenÄina (SK)",
+ "i18n.languageNameEnglish": "Slovak (SK)",
+ "i18n.category": "main",
+ "i18n.authors": "@jurosic-JurajJanosik",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "ZruÅĄit",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Aktualizujem pesniÄky v kniÅžnici...",
+ "notification.updatingLibraryAlbums": "Aktualizujem albumy v kniÅžnici...",
+ "notification.updatingLibraryArtists": "Aktualizujem tvorcov v kniÅžnici...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "ZistiÅĨ viac",
+ "term.accountSettings": "Nastavenia ÃēÄtu",
+ "term.logout": "OdhlÃĄsiÅĨ",
+ "term.login": "PrihlÃĄsiÅĨ",
+ "term.about": "About",
+ "term.privateSession": "Skuromn PoÄÃēvanie",
+ "term.queue": "Poradie",
+ "term.search": "VyhlÃĄdavaÅĨ",
+ "term.library": "KniÅžnica",
+ "term.listenNow": "PoÄÃēvaÅĨ teraz",
+ "term.browse": "PrehliadÃĄvaÅĨ",
+ "term.radio": "RÃĄdio",
+ "term.recentlyAdded": "NedÃĄvno PridanÊ",
+ "term.songs": "PesniÄky",
+ "term.albums": "Albumy",
+ "term.artists": "Tvorcovia",
+ "term.podcasts": "Podcasty",
+ "term.playlists": "Playlisty",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "NovÃŊ Playlist",
+ "term.newPlaylistFolder": "NovÃŊ PrieÄinok Playlistov",
+ "term.createNewPlaylist": "UrobiÅĨ NovÃŊ Playlist",
+ "term.createNewPlaylistFolder": "UrobiÅĨ NovÃŊ PrieÄinok Playlistov",
+ "term.deletePlaylist": "Ste si istÃŊ Åže chcete zmazat tento playlist?",
+ "term.play": "Play",
+ "term.pause": "Pause",
+ "term.previous": "Previous",
+ "term.next": "Next",
+ "term.shuffle": "Shuffle",
+ "term.repeat": "Repeat",
+ "term.volume": "HlasitosÅĨ",
+ "term.mute": "ZtlmiÅĨ",
+ "term.unmute": "VypnÃēÅĨ Ztlmenie",
+ "term.share": "ZdielaÅĨ",
+ "term.settings": "Nastavenia",
+ "term.seeAll": "VidieÅĨ VÅĄetko",
+ "term.sortBy": "ZodariÅĨ PodÄža",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Tvorca",
+ "term.sortBy.name": "NÃĄzov",
+ "term.sortBy.genre": "ÅŊÃĄner",
+ "term.sortBy.releaseDate": "DÃĄtum Vydania",
+ "term.sortBy.duration": "DÄēÅžka",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Vzostupne",
+ "term.sortOrder.descending": "Zostupne",
+ "term.viewAs": "ZobraziÅĨ Ako",
+ "term.viewAs.coverArt": "NÃĄhÄžadovka",
+ "term.viewAs.list": "List",
+ "term.size": "VelkosÅĨ",
+ "term.size.normal": "NormÃĄlny",
+ "term.size.compact": "KompaktnÃŊ",
+ "term.enable": "ZapnÃēÅĨ",
+ "term.disable": "VypnÃēÅĨ",
+ "term.enabled": "ZapnutÊ",
+ "term.disabled": "VypnutÊ",
+ "term.connect": "PripojiÅĨ",
+ "term.connecting": "PripÃĄjam",
+ "term.disconnect": "OdpojiÅĨ",
+ "term.authed": "AuthentikovanÃŊ",
+ "term.confirm": "PodvrdiÅĨ ?",
+ "term.more": "Viac",
+ "term.less": "Menej",
+ "term.showMore": "UkÃĄzaÅĨ viac",
+ "term.showLess": "UkÃĄzaÅĨ menej",
+ "term.topSongs": "Top PesniÄky",
+ "term.latestReleases": "NajnovÅĄie vydania",
+ "term.time.added": "PridanÊ",
+ "term.time.released": "VydanÊ",
+ "term.time.updated": "AktualizovanÊ",
+ "term.time.hours": "hodÃn",
+ "term.time.hour": "hodina",
+ "term.time.minutes": "minÃēt",
+ "term.time.minute": "minÃēta",
+ "term.time.seconds": "sekÃēnd",
+ "term.time.second": "sekunda",
+ "term.fullscreenView": "Zobrazenie na celej obrazovke",
+ "term.defaultView": "Default View",
+ "term.audioSettings": "Nastavenia Zvuku",
+ "term.clearAll": "VyÄistiÅĨ VÅĄetko",
+ "term.recentStations": "NedÃĄvne Stanice",
+ "term.language": "Jazyk",
+ "term.funLanguages": "ZÃĄbava",
+ "term.noLyrics": "NaÄÃtavam... / Text nebol najdenÃŊ./ Instrumental.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "All Rights Reserved.",
+ "term.sponsor": "Sponzoruj tento projekt",
+ "term.ciderTeam": "Cider Team",
+ "term.developer": "Developer",
+ "term.socialTeam": "Social Team",
+ "term.socials": "Socials",
+ "term.contributors": "Contributors",
+ "term.equalizer": "Equalizer",
+ "term.reset": "ResetovaÅĨ",
+ "term.tracks": "pesniÄiek",
+ "term.videos": "VideÃĄ",
+ "term.menu": "Menu",
+ "term.check": "SkontrolovaÅĨ",
+ "term.aboutArtist": "Viac o {{artistName}}",
+ "home.title": "Domov",
+ "home.recentlyPlayed": "NedÃĄvno PrehranÊ",
+ "home.recentlyAdded": "NedÃĄvno PridanÊ",
+ "home.artistsFeed": "Feed Tvojho Tvorcu",
+ "home.artistsFeed.noArtist": "Najprv sleduj niektorÃŊch tvorcov, ich pesniÄky potom budÃē tu",
+ "home.madeForYou": "RobenÊ Pre Teba",
+ "home.friendsListeningTo": "KamarÃĄti poÄÃēvajÃē",
+ "home.followedArtists": "SledovanÃŊ Tvorcovia",
+ "error.appleMusicSubRequired": "Apple Music potrebuje subscription.",
+ "error.connectionError": "Pri pripojovanà ku Apple Music sa vyskytol problÊm",
+ "error.noResults": "ÅŊiadne vÃŊsledky",
+ "error.noResults.description": "SkÃēs novÊ vyhÄžÃĄdavanie",
+ "podcast.followOnCider": "Sleduj na Cider",
+ "podcast.followedOnCider": "SledovanÊ na Cider",
+ "podcast.subscribeOnItunes": "Odoberaj na iTunes",
+ "podcast.subscribedOnItunes": "Odoberane na iTunes",
+ "podcast.itunesStore": "iTunes Obchod",
+ "podcast.episodes": "EpizÃŗdy",
+ "podcast.playEpisode": "Prehraj EpizÃŗdu",
+ "podcast.website": "StrÃĄnka Podcastu",
+ "action.addToLibrary": "Pridaj do KniÅžnice",
+ "action.addToLibrary.success": "PridanÊ do KniŞnice",
+ "action.addToLibrary.error": "Pri pridÃĄvani do KniÅžnice sa vzskytol problÊm",
+ "action.removeFromLibrary": "OdstrÃĄniÅĨ z KniÅžnice",
+ "action.removeFromLibrary.success": "OdstrÃĄnene z KniÅžnice",
+ "action.addToQueue": "PridaÅĨ do Poradia",
+ "action.addToQueue.success": "PridanÊ do Poradia",
+ "action.addToQueue.error": "Pri pridÃĄvanà do Poradia sa vyskytol problÊm",
+ "action.removeFromQueue": "OdstrÃĄniÅĨ z Poradia",
+ "action.removeFromQueue.success": "OdstrÃĄnenÊ z Poradia",
+ "action.removeFromQueue.error": "Pri odstranovanà z Poradia sa vyskytol probÊm",
+ "action.createPlaylist": "UrobiÅĨ novÃŊ Playlist",
+ "action.addToPlaylist": "PridaÅĨ do Playlistu",
+ "action.removeFromPlaylist": "OdstrÃĄniÅĨ z Playlistu",
+ "action.addToFavorites": "PridaÅĨ do ObÄžubÊnÃŊch",
+ "action.follow": "SledovaÅĨ",
+ "action.follow.success": "SledujeÅĄ",
+ "action.follow.error": "Pri Sledovanà sa vyskytol problÊm",
+ "action.unfollow": "ZruÅĄit Sledovanie",
+ "action.unfollow.success": "Sledovanie ZruÅĄenÊ",
+ "action.unfollow.error": "Pri zruÅĄenà sledovania sa vyskytol problÊm",
+ "action.playNext": "HraÅĨ ÄalÅĄie",
+ "action.playLater": "HraÅĨ Neskor",
+ "action.startRadio": "ZapnÃēÅĨ RÃĄdio",
+ "action.goToArtist": "Ku Tvorcovi",
+ "action.goToAlbum": "Ku Albumu",
+ "action.moveToTop": "PremiestniÅĨ Hore",
+ "action.share": "ZdielaÅĨ",
+ "action.rename": "PremenovaÅĨ",
+ "action.love": "Love",
+ "action.unlove": "Unlove",
+ "action.dislike": "Dislike",
+ "action.undoDislike": "ZruÅĄiÅĨ dislike",
+ "action.showWebRemoteQR": "Web Remote",
+ "action.playTracksNext": "HraÅĨ ${app.selectedMediaItems.length} pesniÄiek Äalej",
+ "action.playTracksLater": "HraÅĨ ${app.selectedMediaItems.length} pesniÄiek neskôr",
+ "action.removeTracks": "OdstrÃĄniÅĨ ${self.selectedItems.length} pesniÄiek z poradia",
+ "action.import": "ImportovaÅĨ",
+ "action.export": "ExportovaÅĨ",
+ "action.showAlbum": "ZobraziÅĨ CelÃŊ Album",
+ "action.tray.minimize": "MinimaizovaÅĨ",
+ "action.tray.quit": "OdÃsÅĨ",
+ "action.tray.show": "UkÃĄzaÅĨ",
+ "action.update": "AktualizovaÅĨ",
+ "settings.header.general": "VÅĄeobecnÊ",
+ "settings.header.general.description": "ZmeniÅĨ vÅĄeobecnÊ nastavenia pre Cider.",
+ "settings.option.general.language": "Jazyk",
+ "settings.option.general.language.main": "Jazyky",
+ "settings.option.general.language.fun": "ZÃĄbanve Jazyky",
+ "settings.option.general.language.unsorted": "NepotriedenÊ",
+ "settings.option.general.updateCider": "AktualizovaÅĨ Cider",
+ "settings.header.audio": "Zvuk",
+ "settings.header.audio.description": "ZmeniÅĨ nastavenia zvuku pre Cider.",
+ "settings.option.audio.quality": "Kvalita zvuku",
+ "settings.header.audio.quality.high": "VysokÃĄ",
+ "settings.header.audio.quality.low": "NizkÃĄ",
+ "settings.header.audio.quality.auto": "AutomatickÊ",
+ "settings.option.audio.seamlessTransition": "HladkÃŊ Prevod Zvuku",
+ "settings.option.audio.enableAdvancedFunctionality": "ZapnÃēt PokroÄilÊ Nastavenia Zvuku",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Zapnutie AudioContext funkcionality dovolà rozÅĄÃrenÊ funkcie zvuku ako ZvukovÃĄ NormalizÃĄvia , EqualizÊry a VisualÃzery, ale na niektorÃŊch systÊmoch to moÅže spôsobiÅĨ problÊmy so zvukom.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "PsychoakustickÊ VylepÅĄenia ktorÊ urobia zvuk viac bohatÃŊ a ÅživÃŊ | Urobil Maikiwi.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Sila",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Zmenà silu CAP (AgresÃvnÃĄ môŞe spôsobiÅĨ neÅžiadanÊ vÃŊsledky)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Å tandardnÃĄ",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "AgresÃvnÃĄ",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "NormalÃzacia Zvuku",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizuje silu zvuku v pesniÄkÃĄch pre hÄžadÅĄÃ poÄÃēvacà zÃĄÅžitok",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "PriestorovÃŊ Zvuk",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "PriestorovÃŊ zvuk urobà zvuk 3-dimenzionÃĄlny (poznÃĄmka: Toto nie je Dolby Atmos)",
+ "settings.header.visual": "VisuÃĄlne",
+ "settings.header.visual.description": "Zmenit VisuÃĄlne nastavenia pre Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Å tÃŊl pozadia okna",
+ "settings.header.visual.windowBackgroundStyle.none": "ÅŊiadne",
+ "settings.header.visual.windowBackgroundStyle.artwork": "NÃĄhÄžadovka",
+ "settings.header.visual.windowBackgroundStyle.image": "ObrÃĄtok",
+ "settings.option.visual.animatedArtwork": "AnimovanÊ NÃĄhÄžadovky",
+ "settings.header.visual.animatedArtwork.always": "VÅždy",
+ "settings.header.visual.animatedArtwork.limited": "LimitovanÊ pre strÃĄnky a ÅĄpecialne vydania",
+ "settings.header.visual.animatedArtwork.disable": "VypnuÅĨ VÅĄade",
+ "settings.option.visual.animatedArtworkQuality": "Kvalita Animovanej NÃĄhÄžadovky",
+ "settings.header.visual.animatedArtworkQuality.low": "NÃzka",
+ "settings.header.visual.animatedArtworkQuality.medium": "StrednÃĄ",
+ "settings.header.visual.animatedArtworkQuality.high": "VysokÃĄ",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "VeÄžmi VysokÃĄ",
+ "settings.header.visual.animatedArtworkQuality.extreme": "ExtrÊmna",
+ "settings.option.visual.animatedWindowBackground": "Pozadie AnimovÃĄneho Okna",
+ "settings.option.visual.hardwareAcceleration": "HardvÊrova AkcelerÃĄcia",
+ "settings.option.visual.hardwareAcceleration.description": "VyÅžaduje ReÅĄtart",
+ "settings.header.visual.hardwareAcceleration.default": "PredvoÄžba",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Theme",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Dark",
+ "settings.option.visual.showPersonalInfo": "ZobraziÅĨ osobnÊ informÃĄcie",
+ "settings.header.lyrics": "Text",
+ "settings.header.lyrics.description": "Zmenit nastavenia textu pre Cider.",
+ "settings.option.lyrics.enableMusixmatch": "ZapnÃēÅĨ Musixmatch Texty",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "ZapnÃēÅĨ Karaoke ReÅžim (Iba pre Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "PredvolenÃŊ jazyk pre Musixmatch prekladanie",
+ "settings.option.lyrics.enableYoutubeLyrics": "ZapnÃēÅĨ Youtube Lyrics pre videÃĄ",
+ "settings.header.connectivity": "Konektivita",
+ "settings.header.connectivity.description": "ZmeniÅĨ nastavenia konektivity pre Cider.",
+ "settings.option.connectivity.discordRPC": "ZobraziÅĨ status v Discord",
+ "settings.option.connectivity.playbackNotifications": "NotifikÃĄcie",
+ "settings.header.connectivity.discordRPC.cider": "ZobraziÅĨ ako 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "ZobraziÅĨ ako 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "VypnÃēt Discord status pri Pauze",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm zaznamenanie poÄÃēvanej hudby",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Oneskorenie (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "ZapnÃēÅĨ Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "OdstrÃĄniÅĨ tvorcov z poÄÃēvanej pesniÄky (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "FiltrovaÅĨ loopovanÊ pesniÄky (Last.fm)",
+ "settings.header.experimental": "ExperimentÃĄlne",
+ "settings.header.experimental.description": "ZmeniÅĨ experimentÃĄlne nastavenia pre Cider.",
+ "spatial.notTurnedOn": "PriestorovÃŊ Zvuk je vypnutÃŊ. ProsÃm najprv ho zapnite.",
+ "spatial.spatialProperties": "Å peciÃĄlne Nastavenia",
+ "spatial.width": "Å Ãrka",
+ "spatial.height": "VÃŊÅĄka",
+ "spatial.depth": "HÄēbka",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "MateriÃĄly Priestoru",
+ "spatial.roomDimensions": "VelkosÅĨ Priestoru",
+ "spatial.roomPositions": "Pozicia v Priestoru",
+ "spatial.setDimensions": "NastaviÅĨ Rozmery",
+ "spatial.setPositions": "Nastavit PozÃciu",
+ "spatial.up": "Hore",
+ "spatial.front": "V predu",
+ "spatial.left": "V Äžavo",
+ "spatial.right": "V pravo",
+ "spatial.back": "V zadu",
+ "spatial.down": "Dole",
+ "spatial.listener": "Listener",
+ "spatial.audioSource": "Zdroj zvuku",
+ "settings.header.unfinished": "NedokonÄenÊ",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "Naskenujte QR kÃŗd aby ste si spÃĄrovali telefÃŗn s touto Cider session",
+ "about.thanks": "Äakujeme Cider TÃmu, Komunite a KontribÃētorom, bez vÃĄs by to nebolo moÅžnÊ."
+}
\ No newline at end of file
diff --git a/src/i18n/source/en_US.json b/src/i18n/source/en_US.json
new file mode 100644
index 00000000..5d437392
--- /dev/null
+++ b/src/i18n/source/en_US.json
@@ -0,0 +1,395 @@
+{
+ "i18n.languageName": "English (US)",
+ "i18n.languageNameEnglish": "English (US)",
+ "i18n.category": "main",
+ "i18n.authors": "@maikirakiwi @kyw504100 @nosh118",
+ "app.name": "Cider",
+ "date.format": "${m} ${d}, ${y}",
+ "dialog.cancel": "Cancel",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Updating library songs...",
+ "notification.updatingLibraryAlbums": "Updating library albums...",
+ "notification.updatingLibraryArtists": "Updating library artists...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "Learn more",
+ "term.accountSettings": "Account Settings",
+ "term.logout": "Logout",
+ "term.login": "Log In",
+ "term.about": "About",
+ "term.privateSession": "Private Session",
+ "term.queue": "Queue",
+ "term.history": "History",
+ "term.search": "Search",
+ "term.library": "Library",
+ "term.listenNow": "Listen Now",
+ "term.browse": "Browse",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "Recently Added",
+ "term.songs": "Songs",
+ "term.albums": "Albums",
+ "term.artists": "Artists",
+ "term.podcasts": "Podcasts",
+ "term.playlists": "Playlists",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "New Playlist",
+ "term.newPlaylistFolder": "New Playlist Folder",
+ "term.createNewPlaylist": "Create New Playlist",
+ "term.createNewPlaylistFolder": "Create New Playlist Folder",
+ "term.deletePlaylist": "Are you sure you want to delete this playlist?",
+ "term.play": "Play",
+ "term.pause": "Pause",
+ "term.previous": "Previous",
+ "term.next": "Next",
+ "term.shuffle": "Shuffle",
+ "term.repeat": "Repeat",
+ "term.volume": "Volume",
+ "term.mute": "Mute",
+ "term.unmute": "Unmute",
+ "term.share": "Share",
+ "term.share.success": "Copied to clipboard",
+ "term.settings": "Settings",
+ "term.seeAll": "See All",
+ "term.sortBy": "Sort By",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Artist",
+ "term.sortBy.name": "Name",
+ "term.sortBy.genre": "Genre",
+ "term.sortBy.releaseDate": "Release Date",
+ "term.sortBy.duration": "Duration",
+ "term.sortBy.dateAdded": "Date Added",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "Ascending",
+ "term.sortOrder.descending": "Descending",
+ "term.viewAs": "View As",
+ "term.viewAs.coverArt": "Cover Art",
+ "term.viewAs.list": "List",
+ "term.size": "Size",
+ "term.size.normal": "Normal",
+ "term.size.compact": "Compact",
+ "term.enable": "Enable",
+ "term.disable": "Disable",
+ "term.enabled": "Enabled",
+ "term.disabled": "Disabled",
+ "term.connect": "Connect",
+ "term.connecting": "Connecting",
+ "term.disconnect": "Disconnect",
+ "term.authed": "Authed",
+ "term.confirm": "Confirm?",
+ "term.more": "More",
+ "term.less": "Less",
+ "term.showMore": "Show more",
+ "term.showLess": "Show less",
+ "term.topSongs": "Top Songs",
+ "term.latestReleases": "Latest Releases",
+ "term.time.added": "Added",
+ "term.time.released": "Released",
+ "term.time.updated": "Updated",
+ "term.time.days": "days",
+ "term.time.day": "day",
+ "term.time.hours": "hours",
+ "term.time.hour": "hour",
+ "term.time.minutes": "minutes",
+ "term.time.minute": "minute",
+ "term.time.seconds": "seconds",
+ "term.time.second": "second",
+ "term.fullscreenView": "Fullscreen View",
+ "term.defaultView": "Default View",
+ "term.audioSettings": "Audio Settings",
+ "term.audioControls": "Volume Controls",
+ "term.clearAll": "Clear All",
+ "term.recentStations": "Recent Stations",
+ "term.language": "Language",
+ "term.funLanguages": "Fun",
+ "term.noLyrics": "Loading... / Lyrics not found./ Instrumental.",
+ "term.copyright": "Copyright",
+ "term.rightsReserved": "All Rights Reserved.",
+ "term.sponsor": "Sponsor this project",
+ "term.ciderTeam": "Cider Team",
+ "term.developer": "Developer",
+ "term.socialTeam": "Social Team",
+ "term.socials": "Socials",
+ "term.contributors": "Contributors",
+ "term.equalizer": "Equalizer",
+ "term.reset": "Reset",
+ "term.tracks": "tracks",
+ "term.track": {
+ "one" : "track",
+ "other" : "tracks"
+ },
+ "term.videos": "Videos",
+ "term.menu": "Menu",
+ "term.check": "Check",
+ "term.aboutArtist": "About {{artistName}}",
+ "term.topResult": "Top Result",
+ "term.sharedPlaylists": "Shared Playlists",
+ "term.people": "People",
+ "term.newpreset.name": "New EQ Preset Name",
+ "term.addedpreset": "Added Preset",
+ "term.deletepreset.warn": "Are you sure you want to delete this preset?",
+ "term.deletedpreset": "Removed preset",
+ "term.defaultPresets": "Default Presets",
+ "term.userPresets": "User Presets",
+ "term.requestError": "There was a problem with the request.",
+ "term.song.link.generate": "Getting song.link share URL...",
+ "term.musicVideos": "Music Videos",
+ "term.stations": "Stations",
+ "term.curators": "Curators",
+ "term.appleCurators": "Apple Curators",
+ "term.radioShows": "Radio Shows",
+ "term.recordLabels": "Record Labels",
+ "term.videoExtras": "Video Extras",
+ "term.top": "Top",
+ "term.version": "Version",
+ "term.noVideos": "No videos found.",
+ "term.plugin": "Plug-in",
+ "term.pluginMenu": "Plug-in Menu",
+ "term.pluginMenu.none": "No interactive plugins",
+ "term.replay": "Replay",
+ "term.uniqueAlbums": "Unique Albums",
+ "term.uniqueArtists": "Unique Artists",
+ "term.uniqueSongs": "Unique Songs",
+ "term.topArtists": "Top Artists",
+ "term.listenedTo": "Listened to:",
+ "term.times": "times",
+ "term.topAlbums": "Top Albums",
+ "term.plays": "Plays",
+ "term.topGenres": "Top Genres",
+ "term.confirmLogout": "Are you sure you want to logout?",
+ "home.title": "Home",
+ "home.recentlyPlayed": "Recently Played",
+ "home.recentlyAdded": "Recently Added",
+ "home.artistsFeed": "Your Artists Feed",
+ "home.artistsFeed.noArtist": "Follow some artists to see their latest releases",
+ "home.madeForYou": "Made For You",
+ "home.friendsListeningTo": "Friends Listening To",
+ "home.followedArtists": "Followed Artists",
+ "error.appleMusicSubRequired": "Apple Music requires a subscription.",
+ "error.connectionError": "There was a problem connecting to Apple Music.",
+ "error.noResults": "No Results.",
+ "error.noResults.description": "Try a new search.",
+ "podcast.followOnCider": "Follow On Cider",
+ "podcast.followedOnCider": "Following On Cider",
+ "podcast.subscribeOnItunes": "Subscribe On iTunes",
+ "podcast.subscribedOnItunes": "Subscribed On iTunes",
+ "podcast.itunesStore": "iTunes Store",
+ "podcast.episodes": "Episodes",
+ "podcast.playEpisode": "Play Episode",
+ "podcast.website": "Podcast Website",
+ "action.addToLibrary": "Add to Library",
+ "action.addToLibrary.success": "Added to Library",
+ "action.addToLibrary.error": "Error Adding to Library",
+ "action.removeFromLibrary": "Remove from Library",
+ "action.removeFromLibrary.success": "Removed from Library",
+ "action.addToQueue": "Add to Queue",
+ "action.addToQueue.success": "Added to Queue",
+ "action.addToQueue.error": "Error Adding to Queue",
+ "action.removeFromQueue": "Remove from Queue",
+ "action.removeFromQueue.success": "Removed from Queue",
+ "action.removeFromQueue.error": "Error Removing from Queue",
+ "action.createPlaylist": "Create a New Playlist",
+ "action.addToPlaylist": "Add to Playlist",
+ "action.removeFromPlaylist": "Remove from Playlist",
+ "action.addToFavorites": "Add to Favorites",
+ "action.follow": "Follow",
+ "action.follow.success": "Followed",
+ "action.follow.error": "Error Following",
+ "action.unfollow": "Unfollow",
+ "action.unfollow.success": "Unfollowed",
+ "action.unfollow.error": "Error Unfollowing",
+ "action.playNext": "Play Next",
+ "action.playLater": "Play Later",
+ "action.startRadio": "Start Radio",
+ "action.goToArtist": "Go to Artist",
+ "action.goToAlbum": "Go to Album",
+ "action.showInPlaylist": "Show in Playlist",
+ "action.showInAppleMusic": "Show in Apple Music",
+ "action.moveToTop": "Move out of Folder",
+ "action.share": "Share",
+ "action.rename": "Rename",
+ "action.love": "Love",
+ "action.unlove": "Unlove",
+ "action.dislike": "Dislike",
+ "action.undoDislike": "Undo dislike",
+ "action.showWebRemoteQR": "Web Remote",
+ "action.playTracksNext": "Play ${app.selectedMediaItems.length} tracks next",
+ "action.playTracksLater": "Play ${app.selectedMediaItems.length} tracks later",
+ "action.removeTracks": "Remove ${self.selectedItems.length} tracks from queue",
+ "action.import": "Import",
+ "action.export": "Export",
+ "action.showAlbum": "Show Complete Album",
+ "action.tray.minimize": "Minimize to Tray",
+ "action.tray.quit": "Quit",
+ "action.tray.show": "Show",
+ "action.update": "Update",
+ "action.install": "Install",
+ "action.copy": "Copy",
+ "action.newpreset": "New Preset...",
+ "action.deletepreset": "Delete Preset",
+ "action.open": "Open",
+ "action.relaunch.confirm": "Do you want to relaunch Cider?",
+ "settings.header.general": "General",
+ "settings.header.general.description": "Adjust the general settings for Cider.",
+ "settings.option.general.language": "Language",
+ "settings.option.general.resumebehavior": "Resume behavior",
+ "settings.option.general.resumebehavior.description": "Resume behavior affects how Cider will resume your session when you return to the app.",
+ "settings.option.general.resumebehavior.locally": "Locally",
+ "settings.option.general.resumebehavior.locally.description": "Cider will resume your last session on this machine.",
+ "settings.option.general.resumebehavior.history": "History",
+ "settings.option.general.resumebehavior.history.description": "Cider will queue the last song from your overall Apple Music history, across devices.",
+ "settings.option.general.language.main": "Languages",
+ "settings.option.general.language.fun": "Fun Languages",
+ "settings.option.general.language.unsorted": "Unsorted",
+ "settings.option.general.updateCider": "Update Cider",
+ "settings.option.general.updateCider.branch": "Cider Update Branch",
+ "settings.option.general.updateCider.branch.description": "Select the branch to update Cider to",
+ "settings.option.general.updateCider.branch.main": "Stable",
+ "settings.option.general.updateCider.branch.develop": "Development",
+ "settings.notyf.updateCider.update-not-available": "No update available",
+ "settings.notyf.updateCider.update-downloaded": "Update has been downloaded, restart to apply",
+ "settings.notyf.updateCider.update-error": "Error updating Cider",
+ "settings.notyf.updateCider.update-timeout": "Update timed out",
+ "settings.header.audio": "Audio",
+ "settings.header.audio.description": "Adjust the audio settings for Cider.",
+ "settings.option.audio.volumeStep": "Volume Step",
+ "settings.option.audio.maxVolume": "Max Volume",
+ "settings.option.audio.quality": "Audio Quality",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "up to 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "up to 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "High",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standard",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "Seamless Audio Transition",
+ "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization, Equalizers and Visualizers - however on some systems this may cause stuttering in audio tracks.",
+ "settings.option.audio.audioLab": "Cider Audio Lab",
+ "settings.option.audio.audioLab.description": "An assortment of in-house developed audio effects for Cider.",
+ "settings.warn.audioLab.withoutAF": "AudioContext (Advanced Functionality) is required to enable Cider Audio Laboratory.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Analog Warmth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simulates the analog warmth modelled after the Korg Nutube 6P1",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Analog Warmth intensity",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Changes the intensity of the Analog Warmth Module processing.",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Smooth",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Warm",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively | Designed by Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is not compatible with Spatialization. Please disable Spatialization to continue.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressive",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialize audio and make audio more 3-dimensional (note: This is not Dolby Atmos)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned Spatializing Effect, disables the customizable settings of Audio Spatialization. Spatialization must be enabled as a prerequisite.",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider Spatialization Profile",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tuning Profile of the Spatialization. (Requires App Restart)",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standard",
+ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.",
+ "settings.header.visual": "Visual",
+ "settings.header.visual.description": "Adjust the visual settings for Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Window Background Style",
+ "settings.header.visual.windowBackgroundStyle.none": "None",
+ "settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
+ "settings.header.visual.windowBackgroundStyle.image": "Image",
+ "settings.option.visual.animatedArtwork": "Animated Artwork",
+ "settings.header.visual.animatedArtwork.always": "Always",
+ "settings.header.visual.animatedArtwork.limited": "Limited to pages and special entries",
+ "settings.header.visual.animatedArtwork.disable": "Disable everywhere",
+ "settings.option.visual.animatedArtworkQuality": "Animated Artwork Quality",
+ "settings.header.visual.animatedArtworkQuality.low": "Low",
+ "settings.header.visual.animatedArtworkQuality.medium": "Medium",
+ "settings.header.visual.animatedArtworkQuality.high": "High",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "Very High",
+ "settings.header.visual.animatedArtworkQuality.extreme": "Extreme",
+ "settings.option.visual.animatedWindowBackground": "Animated Window Background",
+ "settings.option.visual.hardwareAcceleration": "Hardware Acceleration",
+ "settings.option.visual.hardwareAcceleration.description": "Requires relaunch",
+ "settings.header.visual.hardwareAcceleration.default": "Default",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Theme",
+ "settings.option.visual.theme.github.download": "Install from GitHub URL",
+ "settings.option.visual.theme.github.explore": "Explore GitHub Themes",
+ "settings.header.visual.theme.github.page": "Themes from GitHub",
+ "settings.option.visual.theme.github.install.confirm": "Are you sure you want to install {{ repo }}?",
+ "settings.prompt.visual.theme.github.URL": "Enter the URL of the theme you want to install",
+ "settings.notyf.visual.theme.install.success": "Theme installed successfully",
+ "settings.notyf.visual.theme.install.error": "Theme installation failed",
+ "settings.header.visual.plugin": "Plugin",
+ "settings.option.visual.plugin.github.download": "Install from GitHub URL",
+ "settings.option.visual.plugin.github.explore": "Explore GitHub Plugins",
+ "settings.header.visual.plugin.github.page": "Plugins from GitHub",
+ "settings.option.visual.plugin.github.install.confirm": "Are you sure you want to install {{ repo }}?",
+ "settings.prompt.visual.plugin.github.URL": "Enter the URL of the plugin you want to install",
+ "settings.prompt.visual.plugin.github.success": "Plugin installed successfully, Press OK to relaunch Cider",
+ "settings.notyf.visual.plugin.install.success": "Plugin installed successfully",
+ "settings.notyf.visual.plugin.install.error": "Plugin installation failed",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Dark",
+ "settings.option.visual.showPersonalInfo": "Show Personal Info",
+ "settings.header.lyrics": "Lyrics",
+ "settings.header.lyrics.description": "Adjust the lyrics settings for Cider.",
+ "settings.option.lyrics.enableMusixmatch": "Enable Musixmatch Lyrics",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Enable Karaoke Mode (Musixmatch only)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Translation Preferred Language",
+ "settings.option.lyrics.enableYoutubeLyrics": "Enable Youtube Lyrics for Music Videos",
+ "settings.header.connectivity": "Connectivity",
+ "settings.header.connectivity.description": "Adjust the connectivity settings for Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Playback Notifications",
+ "settings.header.connectivity.discordRPC.cider": "Display as 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Display as 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "Clear Discord Rich Presence on Pause",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
+ "settings.header.debug": "Debug",
+ "settings.option.debug.copy_log": "Copy logs to clipboard",
+ "settings.option.debug.openAppData": "Open Cider Folder",
+ "settings.header.experimental": "Experimental",
+ "settings.header.experimental.description": "Adjust the experimental settings for Cider.",
+ "settings.option.experimental.unknownPlugin": "Unknown Sources",
+ "settings.option.experimental.unknownPlugin.description": "Allow installation of plugins from repos other than the Cider Plugin Repository",
+ "settings.option.experimental.compactUI": "Compact UI",
+ "settings.option.experimental.close_button_hide": "Close Button Should Hide the Application",
+ "settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
+ "settings.option.advanced.playlistTrackMapping": "Playlist Track Mapping",
+ "settings.option.advanced.playlistTrackMapping.description": "Enables deep scanning of playlists to determine which tracks are in which playlists. Playlist cache build times can increase significantly.",
+ "settings.option.visual.transparent": "Transparent frame",
+ "settings.option.visual.transparent.description": "Transparent frame (needs Theme Support , requires relaunch)",
+ "spatial.notTurnedOn": "Audio Spatialization is disabled. To use, please enable it first.",
+ "spatial.spatialProperties": "Spatial Properties",
+ "spatial.width": "Width",
+ "spatial.height": "Height",
+ "spatial.depth": "Depth",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "Room Materials",
+ "spatial.roomDimensions": "Room Dimensions",
+ "spatial.roomPositions": "Room Positions",
+ "spatial.setDimensions": "Set Dimensions",
+ "spatial.setPositions": "Set Positions",
+ "spatial.up": "Up",
+ "spatial.front": "Front",
+ "spatial.left": "Left",
+ "spatial.right": "Right",
+ "spatial.back": "Back",
+ "spatial.down": "Down",
+ "spatial.listener": "Listener",
+ "spatial.audioSource": "Audio Source",
+ "settings.header.unfinished": "Unfinished",
+ "remote.web.title": "Cider Remote",
+ "remote.web.description": "Scan the QR code to pair your phone up with this Cider instance",
+ "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors."
+}
diff --git a/src/i18n/sv_SE.jsonc b/src/i18n/sv_SE.json
similarity index 85%
rename from src/i18n/sv_SE.jsonc
rename to src/i18n/sv_SE.json
index 22953aee..302a2684 100644
--- a/src/i18n/sv_SE.jsonc
+++ b/src/i18n/sv_SE.json
@@ -1,25 +1,15 @@
-{ // Base File
-
- // i18n Info
- "i18n.languageName": "Svenska (SE)", // name of language in native language
- "i18n.languageNameEnglish": "Swedish (SE)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@thisismemeboi", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+{
+ "i18n.languageName": "Svenska (SE)",
+ "i18n.languageNameEnglish": "Swedish (SE)",
+ "i18n.category": "main",
+ "i18n.authors": "@thisismemeboi",
"app.name": "Cider",
-
"date.format": "${d} ${m}, ${y}",
-
- // Dialogs
"dialog.cancel": "Avbryt",
"dialog.ok": "OK",
-
- // Notification
"notification.updatingLibrarySongs": "Uppdaterar lÃĨtar i biblioteket...",
"notification.updatingLibraryAlbums": "Uppdaterar album i biblioteket...",
"notification.updatingLibraryArtists": "Uppdaterar artister i biblioteket...",
- // Terms
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
@@ -91,10 +81,10 @@
"term.less": "Mindre",
"term.showMore": "Visa mer",
"term.showLess": "Visa mindre",
- "term.topSongs" : "TopplÃĨtar",
+ "term.topSongs": "TopplÃĨtar",
"term.latestReleases": "Senaste releaserna",
"term.time.added": "Tillagd",
- "term.time.released": "Tillagd den",
+ "term.time.released": "Tillagd den",
"term.time.updated": "Uppdaterad",
"term.time.hours": "timmar",
"term.time.hour": "timme",
@@ -120,14 +110,11 @@
"term.contributors": "Bidrag",
"term.equalizer": "EQ",
"term.reset": "Ã
terställ",
- "term.tracks": "lÃĨtar", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "Videor",
+ "term.tracks": "lÃĨtar",
+ "term.videos": "Videor",
"term.menu": "Meny",
"term.check": "SÃļk efter uppdateringar",
- "term.aboutArtist": "Om {{artistName}}", // e.g. 'About Doja Cat'
- "term.updateCider": "Uppdatera Cider",
-
- // Home
+ "term.aboutArtist": "Om {{artistName}}",
"home.title": "Hem",
"home.recentlyPlayed": "Senast spelade",
"home.recentlyAdded": "Senast tillagda",
@@ -136,13 +123,10 @@
"home.madeForYou": "Skapat fÃļr dig",
"home.friendsListeningTo": "Vänner lyssnar pÃĨ",
"home.followedArtists": "FÃļljda artister",
- // Errors
"error.appleMusicSubRequired": "Apple Music kräver en prenumeration.",
"error.connectionError": "OjdÃĨ. Det gick inte att ansluta till Apple Music.",
"error.noResults": "Inga träffar.",
"error.noResults.description": "Prova en ny sÃļkning.",
-
- //Podcasts
"podcast.followOnCider": "FÃļlj pÃĨ Cider",
"podcast.followedOnCider": "FÃļljer pÃĨ Cider",
"podcast.subscribeOnItunes": "FÃļlj pÃĨ iTunes",
@@ -151,8 +135,6 @@
"podcast.episodes": "Avsnitt",
"podcast.playEpisode": "Spela avsnitt",
"podcast.website": "Ãppna webbsida",
-
- // Actions
"action.addToLibrary": "Lägg till i bibliotek",
"action.addToLibrary.success": "Tillagd i biblioteket",
"action.addToLibrary.error": "Kunde inte lägga till i biblioteket",
@@ -197,88 +179,70 @@
"action.tray.quit": "Avsluta",
"action.tray.show": "Visa Cider",
"action.update": "Uppdatera",
-
- // Settings - General
"settings.header.general": "Allmänt",
"settings.header.general.description": "Ãndra Ciders allmänna inställningar.",
"settings.option.general.language": "SprÃĨk",
-
- // Language optgroups
"settings.option.general.language.main": "SprÃĨk",
"settings.option.general.language.fun": "Roliga sprÃĨk",
"settings.option.general.language.unsorted": "Osorterade",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "Uppdatera Cider",
"settings.header.audio": "Ljud",
"settings.header.audio.description": "Ãndra Ciders ljudinställningar.",
- "settings.option.audio.quality": "Ljudkvalitet", // Dropdown
+ "settings.option.audio.quality": "Ljudkvalitet",
"settings.header.audio.quality.high": "HÃļg",
"settings.header.audio.quality.low": "LÃĨg",
"settings.header.audio.quality.auto": "Automatisk",
- "settings.option.audio.seamlessTransition": "SÃļmlÃļsa ljudÃļvergÃĨngar", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "Aktivera avancerade ljudfunktioner", // Toggle
+ "settings.option.audio.seamlessTransition": "SÃļmlÃļsa ljudÃļvergÃĨngar",
+ "settings.option.audio.enableAdvancedFunctionality": "Aktivera avancerade ljudfunktioner",
"settings.option.audio.enableAdvancedFunctionality.description": "Om du aktiverar avancerade ljudfunktioner kommer funktioner som ljudnormalisering, EQ och virtualisering aktiveras, men pÃĨ nÃĨgra system kan detta orsaka ljudproblem.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Ljudnormalisering", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Ljudnormalisering",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliserar hÃļga ljudnivÃĨer fÃļr att fÃļrbättra ljudkvaliteten.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spiralljud", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spiralljud",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "GÃļr ljudet mer 3D (Ej Dolby Atmos)",
- // Settings - Visual
- "settings.header.visual": "Visuellt",
+ "settings.header.visual": "Visuellt",
"settings.header.visual.description": "Ãndra Ciders visuella inställningar.",
- "settings.option.visual.windowBackgroundStyle": "Stil fÃļr bakgrunden", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "Stil fÃļr bakgrunden",
"settings.header.visual.windowBackgroundStyle.none": "Ingen",
"settings.header.visual.windowBackgroundStyle.artwork": "FrÃĨn omslagsbilden",
"settings.header.visual.windowBackgroundStyle.image": "Bild",
- "settings.option.visual.animatedArtwork": "Animerad omslagsbild", // Dropdown
+ "settings.option.visual.animatedArtwork": "Animerad omslagsbild",
"settings.header.visual.animatedArtwork.always": "Alltid",
"settings.header.visual.animatedArtwork.limited": "Endast pÃĨ sidor där det behÃļvs",
"settings.header.visual.animatedArtwork.disable": "Aldrig",
- "settings.option.visual.animatedArtworkQuality": "Kvalitet fÃļr animerad omslagsbild", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "Kvalitet fÃļr animerad omslagsbild",
"settings.header.visual.animatedArtworkQuality.low": "LÃĨg",
"settings.header.visual.animatedArtworkQuality.medium": "Standard",
"settings.header.visual.animatedArtworkQuality.high": "HÃļg",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Väldigt hÃļg",
"settings.header.visual.animatedArtworkQuality.extreme": "Okomprimerat",
- "settings.option.visual.animatedWindowBackground": "Animerad fÃļnsterbakgrund", // Toggle
- "settings.option.visual.hardwareAcceleration": "HÃĨrdvaruacceleration", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "Animerad fÃļnsterbakgrund",
+ "settings.option.visual.hardwareAcceleration": "HÃĨrdvaruacceleration",
"settings.option.visual.hardwareAcceleration.description": "kräver omstart",
- "settings.header.visual.hardwareAcceleration.default": "Standard",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "Visa personlig information", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "Standard",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.option.visual.showPersonalInfo": "Visa personlig information",
"settings.header.lyrics": "LÃĨttext",
"settings.header.lyrics.description": "Ãndra Ciders lÃĨttextsinställningar.",
- "settings.option.lyrics.enableMusixmatch": "Använd Musixmatch istället fÃļr Apple Lyrics", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Aktivera karaokeläge (Endast Musixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "SprÃĨk fÃļr lÃĨttextsÃļversättning (Endast Musixmatch)", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "Använd YouTube Lyrcis fÃļr videor", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "Använd Musixmatch istället fÃļr Apple Lyrics",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Aktivera karaokeläge (Endast Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "SprÃĨk fÃļr lÃĨttextsÃļversättning (Endast Musixmatch)",
+ "settings.option.lyrics.enableYoutubeLyrics": "Använd YouTube Lyrcis fÃļr videor",
"settings.header.connectivity": "Anslutning",
"settings.header.connectivity.description": "Ãndra Ciders anslutningsinställningar.",
- "settings.option.connectivity.discordRPC": "Discord integration (discordRPC)", // Dropdown
- "settings.option.connectivity.playbackNotifications": "Uppspelningsnotiser", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord integration (discordRPC)",
+ "settings.option.connectivity.playbackNotifications": "Uppspelningsnotiser",
"settings.header.connectivity.discordRPC.cider": "PÃĨ, visa som 'Cider'",
"settings.header.connectivity.discordRPC.appleMusic": "PÃĨ, visa som 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "Rensa Discord notiser frÃĨn Cider när du pausar", // Toggle
- "settings.option.connectivity.lastfmScrobble": "Last.fm integration", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "Last.fm fÃļrdrÃļjning i %",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Visa vad som spelas nu i Last.fm",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "Visa inte extraartister i Last.fm",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrera bort loopade lÃĨtar i Last.fm",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "Rensa Discord notiser frÃĨn Cider när du pausar",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm integration",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm fÃļrdrÃļjning i %",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Visa vad som spelas nu i Last.fm",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Visa inte extraartister i Last.fm",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrera bort loopade lÃĨtar i Last.fm",
"settings.header.experimental": "Experimentellt",
"settings.header.experimental.description": "Ãndra Ciders experimentella inställningar.",
- "settings.option.experimental.compactUI": "Kompakt gränssnitt", // Toggle
+ "settings.option.experimental.compactUI": "Kompakt gränssnitt",
"settings.option.experimental.close_button_hide": "Stängknappen gÃļmmer Cider istället",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
"spatial.notTurnedOn": "Spiralljud är av. Akrtivera det fÃļrst.",
"spatial.spatialProperties": "Spiralljudsintällningar",
"spatial.width": "Bredd",
@@ -298,14 +262,8 @@
"spatial.down": "Ner",
"spatial.listener": "Lyssnare",
"spatial.audioSource": "Ljudkälla",
-
- // Settings - Unfinished
"settings.header.unfinished": "Ej tillgängligt",
-
- // Web Remote
"remote.web.title": "Cider fjärrkontroll",
"remote.web.description": "Skanna QR koden fÃļr att ansluta din telefon till Cider.",
-
- // About
"about.thanks": "Stort tack till Ciders Collective Team och alla som har bidragit!"
-}
+}
\ No newline at end of file
diff --git a/src/i18n/tr_TR.jsonc b/src/i18n/tr_TR.json
similarity index 71%
rename from src/i18n/tr_TR.jsonc
rename to src/i18n/tr_TR.json
index ead8ddfd..bda10a82 100644
--- a/src/i18n/tr_TR.jsonc
+++ b/src/i18n/tr_TR.json
@@ -1,28 +1,18 @@
{
- // i18n Info
- "i18n.languageName": "TÃŧrkçe", // name of language in native language
- "i18n.languageNameEnglish": "Turkish", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@gms10ur", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+ "i18n.languageName": "TÃŧrkçe",
+ "i18n.languageNameEnglish": "Turkish",
+ "i18n.category": "main",
+ "i18n.authors": "@gms10ur",
"app.name": "Cider",
-
"date.format": "${d} ${m}, ${y}",
-
- // Dialogs
"dialog.cancel": "İptal",
"dialog.ok": "Tamam",
-
- // Notification
"notification.updatingLibrarySongs": "ArÅiv'deki ÅarkÄąlar alÄąnÄąyor...",
"notification.updatingLibraryAlbums": "ArÅiv'deki albÃŧmler alÄąnÄąyor...",
"notification.updatingLibraryArtists": "ArÅiv'deki sanatÃ§Äąlar alÄąnÄąyor...",
-
- // Terms
"term.appleInc": "Apple",
- "term.appleMusic": "Apple MÃŧzik",
- "term.applePodcasts": "Apple Podcastler",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
"term.itunes": "iTunes",
"term.github": "GitHub",
"term.discord": "Discord",
@@ -91,10 +81,10 @@
"term.less": "Daha Az",
"term.showMore": "Daha Fazla GÃļster",
"term.showLess": "Daha Az GÃļster",
- "term.topSongs" : "PopÃŧler Parçalar",
+ "term.topSongs": "PopÃŧler Parçalar",
"term.latestReleases": "Yeni ÃÄąkan",
"term.time.added": "Åu tarihte eklendi: ",
- "term.time.released": "Åu tarihte yayÄąnalndÄą: ",
+ "term.time.released": "Åu tarihte yayÄąnalndÄą: ",
"term.time.updated": "Åu tarihte gÃŧncellendi: ",
"term.fullscreenView": "Tam Ekrana Geç",
"term.defaultView": "Normal GÃļrÃŧnÃŧme DÃļn",
@@ -115,17 +105,34 @@
"term.contributors": "KatkÄąda Bulunanlar",
"term.equalizer": "Ekolayzer",
"term.reset": "SÄąfÄąrla",
- "term.tracks": "adet ÅarkÄą", // Assume x amount of tracks. e.g. 50 tracks
+ "term.tracks": "adet ÅarkÄą",
"term.time.hours": "saat",
"term.time.hour": "saat",
"term.time.minutes": "dakika",
"term.time.minute": "dakika",
"term.time.seconds": "saniye",
"term.time.second": "saniye",
- "term.videos": "Video Klipler",
+ "term.videos": "Video Klipler",
"term.menu": "MenÃŧ",
-
- // Home
+ "term.check": "Åimdi Kontrol Et",
+ "term.aboutArtist": "About {{artistName}}",
+ "term.updateCider": "GÃŧncellemeleri Denetle",
+ "term.share.success": "Panoya KopyalandÄą",
+ "term.topResult": "En İyi Sonuç",
+ "term.sharedPlaylists": "PaylaÅÄąlan Listeler",
+ "term.people": "KiÅiler",
+ "term.newpreset.name": "Yeni Ãnayar İsmi",
+ "term.addedpreset": "Ãnayar Kaydedildi",
+ "term.deletepreset.warn": "Bu ÃļnayarÄą silmek istediÄinize emin misiniz?",
+ "term.deletedpreset": "Ãnayar Silindi",
+ "term.musicVideos": "Video Klipler",
+ "term.stations": "İstasyonlar",
+ "term.curators": "EditÃļrler",
+ "term.appleCurators": "Apple EditÃļrleri",
+ "term.radioShows": "Radio ÅovlarÄą",
+ "term.recordLabels": "KayÄąt StÃŧdyolarÄą",
+ "term.videoExtras": "Ekstra Videolar",
+ "term.top": "En İyi",
"home.title": "Ana Sayfa",
"home.recentlyPlayed": "Son OynatÄąlanlar",
"home.recentlyAdded": "Son Eklenenler",
@@ -134,14 +141,10 @@
"home.madeForYou": "Sadece Size Ãzel",
"home.friendsListeningTo": "ArkadaÅlarÄąnÄązÄąn Dinledikleri",
"home.followedArtists": "Takip Edilen SanatÃ§Äąlar",
-
- // Errors
"error.appleMusicSubRequired": "Apple MÃŧzik, aktif bir abonelik gerektirir.",
"error.connectionError": "Apple MÃŧzik ile baÄlantÄą kurulamadÄą.",
"error.noResults": "Hiç sonuç yok",
"error.noResults.description": "Tekrar deneyin.",
-
- //Podcasts
"podcast.followOnCider": "Cider'de Takip Et",
"podcast.followedOnCider": "Cider'de Takip Ediliyor",
"podcast.subscribeOnItunes": "itunes'de Abone Ol",
@@ -150,8 +153,6 @@
"podcast.episodes": "BÃļlÃŧmler",
"podcast.playEpisode": "BÃļlÃŧmÃŧ Oynat",
"podcast.website": "Web SayfasÄą",
-
- // Actions
"action.addToLibrary": "ArÅiv'e Ekle",
"action.addToLibrary.success": "ArÅiv'e Eklendi",
"action.addToLibrary.error": "ArÅiv'e Eklenemedi",
@@ -193,122 +194,118 @@
"action.export": "Export",
"action.showAlbum": "TÃŧm AlbÃŧmÃŧ GÃļster",
"action.tray.minimize": "GÃļrev ÃubuÄuna KÃŧçÃŧlt",
- "action.tray.quit": "'den ÃÄąk",
- "action.tray.show": "'i GÃļster",
-
- // Settings - General
+ "action.tray.quit": "ÃÄąk",
+ "action.tray.show": "GÃļster",
+ "action.update": "GÃŧncelle",
+ "action.copy": "Kopyala",
+ "action.newpreset": "Yeni Ãnayar...",
+ "action.deletepreset": "ÃnayarÄą Sil",
"settings.header.general": "Genel Ayarlar",
"settings.header.general.description": "Genel ayarlarÄą buradan dÃŧzenleyin.",
"settings.option.general.language": "Dil SeçeneÄi",
-
- // Language optgroups
"settings.option.general.language.main": "Gerçek Diller",
"settings.option.general.language.fun": "Mizahi Diller",
"settings.option.general.language.unsorted": "HenÃŧz TamamlanmamÄąÅ Diller",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "GÃŧncellemeleri Kontrol Et",
+ "settings.option.general.updateCider.branch": "Seçilen GitHub Versiyonu",
+ "settings.option.general.updateCider.branch.description": "Cider'in hangi versiyonuna gÃŧncelleneceÄini seçin",
+ "settings.option.general.updateCider.branch.main": "Stabil",
+ "settings.option.general.updateCider.branch.develop": "Deneysel",
"settings.header.audio": "Ãalma / Oynatma",
"settings.header.audio.description": "Cider'in sizin için en iyi dinleme deneyimini saÄlayabilmesi için ses ayarlarÄąnÄązÄą yapÄąn.",
- "settings.option.audio.quality": "Ses Kalitesi", // Dropdown
+ "settings.option.audio.quality": "Ses Kalitesi",
+ "settings.header.audio.quality.hireslossless": "YÃŧksek ÃÃļzÃŧnÃŧrlÃŧklÃŧ KayÄąpsÄąz",
+ "settings.header.audio.quality.hireslossless.description": "24-bit/192 kHz'e kadar",
+ "settings.header.audio.quality.lossless": "KayÄąpsÄąz",
+ "settings.header.audio.quality.lossless.description": "24-bit/48 kHz'e kadar",
"settings.header.audio.quality.high": "YÃŧksek Kalite",
- "settings.header.audio.quality.low": "YÃŧksek Verimlilik",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "Standart",
+ "settings.header.audio.quality.standard.description": "64 kbps",
"settings.header.audio.quality.auto": "Otomatik",
- "settings.option.audio.seamlessTransition": "Kesintisiz Ses GeçiÅi", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "GeliÅmiÅ Ses Deneyimi", // Toggle
+ "settings.option.audio.seamlessTransition": "Kesintisiz Ses GeçiÅi",
+ "settings.option.audio.enableAdvancedFunctionality": "GeliÅmiÅ Ses Deneyimi",
"settings.option.audio.enableAdvancedFunctionality.description": "GeliÅmiÅ ses deneyiminin etkinleÅtirilmesi, Ses NormalleÅtirme, Ekolayzer ve GÃļrselleÅtirici gibi geniÅletilmiÅ ses Ãļzelliklerine izin verir, ancak bu durum bazÄą sistemlerde seste bozulmalara neden olabilir.",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Ses NormalleÅtirme", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenalin ProsesÃļrÃŧâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "MÃŧziÄin hem daha zengin hem de daha canlÄą duyulmasÄąnÄą saÄlayan Psikoakustik GeliÅtirme Sistemi | Maikiwi tarafÄąndan tasarlanmÄąÅtÄąr.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Kuvveti",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Sese yapÄąlan iÅlemin gÃŧcÃŧnÃŧ deÄiÅtirir. (Agresif istenmeyen sonuçlar doÄurabilir)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standart",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Ses NormalleÅtirme",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Ses normalleÅtirme alçak ve yÃŧksek sesli ÅarkÄąlarÄą dengeler ve daha dÃŧzgÃŧn bir dinleme deneyimi saÄlar.",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Uzamsal Ses", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Uzamsal Ses",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Sesi uzamsallaÅtÄąrÄąn ve sesi daha 3 boyutlu hale getirin (not: Bu Dolby Atmos deÄildir)",
-
- // Settings - Visual
"settings.header.visual": "GÃļrÃŧnÃŧm",
"settings.header.visual.description": "Cider'in nasÄąl gÃļzÃŧkmesini istediÄinizi ayarlayÄąn",
- "settings.option.visual.windowBackgroundStyle": "Uygulama Arka Plan Stili", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "Uygulama Arka Plan Stili",
"settings.header.visual.windowBackgroundStyle.image": "GÃļrsel",
"settings.header.visual.windowBackgroundStyle.none": "KaranlÄąk",
"settings.header.visual.windowBackgroundStyle.artwork": "AlbÃŧm KapaÄÄą",
- "settings.option.visual.animatedArtwork": "Hareketli AlbÃŧm KapaklarÄą", // Dropdown
+ "settings.option.visual.animatedArtwork": "Hareketli AlbÃŧm KapaklarÄą",
"settings.header.visual.animatedArtwork.always": "Her Zaman AÃ§Äąk",
"settings.header.visual.animatedArtwork.limited": "BazÄą Sayfalara ve Ãzel BÃļlgelerle SÄąnÄąrlÄą",
"settings.header.visual.animatedArtwork.disable": "Her Zaman KapalÄą",
- "settings.option.visual.animatedArtworkQuality": "Hareketli AlbÃŧm KapaÄÄą Kalitesi", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "Hareketli AlbÃŧm KapaÄÄą Kalitesi",
"settings.header.visual.animatedArtworkQuality.low": "DÃŧÅÃŧk",
"settings.header.visual.animatedArtworkQuality.medium": "Orta",
"settings.header.visual.animatedArtworkQuality.high": "YÃŧksek",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Daha YÃŧksek",
"settings.header.visual.animatedArtworkQuality.extreme": "Ekstrem",
- "settings.option.visual.animatedWindowBackground": "Hareketli Uygulama Arka PlanÄą", // Toggle
- "settings.option.visual.hardwareAcceleration": "DonanÄąm HÄązlandÄąrmasÄą", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "Hareketli Uygulama Arka PlanÄą",
+ "settings.option.visual.hardwareAcceleration": "DonanÄąm HÄązlandÄąrmasÄą",
"settings.option.visual.hardwareAcceleration.description": "Etki etmesi için uygulamayÄą yeniden baÅlatmak gerekir.",
- "settings.header.visual.hardwareAcceleration.default": "VarsayÄąlan",
- "settings.header.visual.hardwareAcceleration.webGPU": "GeliÅmiÅ",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "KullanÄącÄą AdÄąmÄą GÃļster", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "VarsayÄąlan",
+ "settings.header.visual.hardwareAcceleration.webGPU": "GeliÅmiÅ",
+ "settings.header.visual.theme": "Tema",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "KaranlÄąk",
+ "settings.option.visual.showPersonalInfo": "KullanÄącÄą AdÄąmÄą GÃļster",
"settings.header.lyrics": "ÅarkÄą SÃļzleri",
"settings.header.lyrics.description": "Cider'in ÅarkÄą sÃļzlerini nasÄąl gÃļrÃŧntÃŧlemesini istediÄini buradan ayarlayÄąn.",
- "settings.option.lyrics.enableMusixmatch": "Musixmatch Kullan", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "Karaoke Modunu EtkinleÅtir (Sadece Musixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch için Otomatik Ãeviri Dili", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "MÃŧzik VideolarÄą için ÅarkÄą SÃļzÃŧnÃŧ YouTube'dan Al", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "Musixmatch Kullan",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Karaoke Modunu EtkinleÅtir (Sadece Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch için Otomatik Ãeviri Dili",
+ "settings.option.lyrics.enableYoutubeLyrics": "MÃŧzik VideolarÄą için ÅarkÄą SÃļzÃŧnÃŧ YouTube'dan Al",
"settings.header.connectivity": "DiÄer Servisler",
"settings.header.connectivity.description": "Cider'i diÄer servislere baÄlayarak deneyiminizi zenginleÅtirin.",
- "settings.option.connectivity.discordRPC": "Ne DinlediÄimi Discord'da GÃļster", // Dropdown
- "settings.option.connectivity.playbackNotifications": "OynatÄąlan deÄiÅtiÄinde bildirim gÃļster", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Ne DinlediÄimi Discord'da GÃļster",
+ "settings.option.connectivity.playbackNotifications": "OynatÄąlan deÄiÅtiÄinde bildirim gÃļster",
"settings.header.connectivity.discordRPC.cider": "'Cider' Olarak",
"settings.header.connectivity.discordRPC.appleMusic": "'Apple Music' Olarak",
- "settings.option.connectivity.discordRPC.clearOnPause": "DuraklatÄąldÄąÄÄąnda Discord'da GÃļsterme", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM BaÄlantÄąsÄą", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobblalma YÃŧzdesi (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "Åimdi çalan ÅarkÄąyÄą LastFM'de gÃļster",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "AlbÃŧm sanatÃ§ÄąsÄąnÄą Scrobbledan kaldÄąr(LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Tekrar edilen ÅarkÄąyÄą filtrele (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "DuraklatÄąldÄąÄÄąnda Discord'da GÃļsterme",
+ "settings.option.connectivity.lastfmScrobble": "LastFM BaÄlantÄąsÄą",
+ "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobblalma YÃŧzdesi (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Åimdi çalan ÅarkÄąyÄą LastFM'de gÃļster",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "AlbÃŧm sanatÃ§ÄąsÄąnÄą Scrobbledan kaldÄąr(LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Tekrar edilen ÅarkÄąyÄą filtrele (LastFM)",
"settings.header.experimental": "Deneysel",
"settings.header.experimental.description": "Cider'deki deneysel Ãļzelliklere eriÅim saÄlayÄąn. (Not: BazÄą Ãļzellikler dÃŧzgÃŧn çalÄąÅmayabilir.)",
- "settings.option.experimental.compactUI": "Kompakt ArayÃŧz", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "Kapat dÃŧÄmesi davranÄąÅÄą",
- "settings.option.experimental.closeButtonBehaviour.quit": "Cider'den Ã§Äąk",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Simge durumuna kÃŧçÃŧlt",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "GÃļrev çubuÄuna kÃŧçÃŧlt",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
+ "settings.option.experimental.compactUI": "Kompakt ArayÃŧz",
+ "settings.option.experimental.close_button_hide": "Kapatma DÃŧÄmesi Cider'i KÃŧçÃŧltÃŧr",
+ "settings.option.experimental.copy_log": "GÃŧnlÃŧÄÃŧ Panoya Kopyala",
+ "settings.option.experimental.inline_playlists": "Listeleri ve AlbÃŧmleri AÃ§ÄąlÄąr Pencere İle gÃļster",
"spatial.notTurnedOn": "Uzamsal ses devre dÄąÅÄą. Kullanabilmek için lÃŧtfen Ãļnce etkinleÅtirin.",
- "spatial.spatialProperties" : "Uzamsal Ãzellikler",
- "spatial.width" : "GeniÅlik",
- "spatial.height" : "YÃŧkseklik",
- "spatial.depth" : "Derinlik",
- "spatial.roomMaterials" : "Oda Materyalleri",
- "spatial.roomDimensions" : "Oda ÃlçÃŧleri",
- "spatial.roomPositions" : "Oda Pozisyonu",
- "spatial.setDimensions" : "ÃlçÃŧleri Ayarla",
- "spatial.setPositions" : "Pozisyonu Ayarla",
- "spatial.up" : "Ãst",
- "spatial.front" : "Ãn",
- "spatial.left" : "Sol",
- "spatial.right" : "SaÄ",
- "spatial.back" : "Arka",
- "spatial.down" : "AÅaÄÄą",
- "spatial.listener" : "Dinleyici",
- "spatial.audioSource" : "Ses KaynaÄÄą",
- "spatial.gain" : "Kazanç",
-
- // Settings - Unfinished
+ "spatial.spatialProperties": "Uzamsal Ãzellikler",
+ "spatial.width": "GeniÅlik",
+ "spatial.height": "YÃŧkseklik",
+ "spatial.depth": "Derinlik",
+ "spatial.gain": "Kazanç",
+ "spatial.roomMaterials": "Oda Materyalleri",
+ "spatial.roomDimensions": "Oda ÃlçÃŧleri",
+ "spatial.roomPositions": "Oda Pozisyonu",
+ "spatial.setDimensions": "ÃlçÃŧleri Ayarla",
+ "spatial.setPositions": "Pozisyonu Ayarla",
+ "spatial.up": "Ãst",
+ "spatial.front": "Ãn",
+ "spatial.left": "Sol",
+ "spatial.right": "SaÄ",
+ "spatial.back": "Arka",
+ "spatial.down": "AÅaÄÄą",
+ "spatial.listener": "Dinleyici",
+ "spatial.audioSource": "Ses KaynaÄÄą",
"settings.header.unfinished": "GeliÅtirme AÅamasÄąnda",
-
- // Web Remote
"remote.web.title": "Cider'e BaÄlan",
"remote.web.description": "Telefonunuzu Bu Cider Oturumuyla EÅleÅtirmek için QR Kodunu TarayÄąn",
-
- //About
"about.thanks": "Cider Collective Ekibine ve tÃŧm katkÄąda bulunanlara çok teÅekkÃŧr ederiz."
-
}
\ No newline at end of file
diff --git a/src/i18n/vi_VN.json b/src/i18n/vi_VN.json
new file mode 100644
index 00000000..ff6986d5
--- /dev/null
+++ b/src/i18n/vi_VN.json
@@ -0,0 +1,314 @@
+{
+ "i18n.languageName": "Tiáēŋng Viáģt",
+ "i18n.languageNameEnglish": "Vietnamese",
+ "i18n.category": "main",
+ "i18n.authors": "@vapormusic",
+ "app.name": "Cider",
+ "date.format": "${d} ${m}, ${y}",
+ "dialog.cancel": "Cancel",
+ "dialog.ok": "OK",
+ "notification.updatingLibrarySongs": "Cáēp nháēt bà i hÃĄt trong thư viáģn...",
+ "notification.updatingLibraryAlbums": "Cáēp nháēt album trong thư viáģn...",
+ "notification.updatingLibraryArtists": "Cáēp nháēt ca sÄŠ trong thư viáģn...",
+ "term.appleInc": "Apple Inc.",
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
+ "term.learnMore": "TÃŦm hiáģu thÃĒm",
+ "term.accountSettings": "Cà i Äáēˇt tà i khoáēŖn",
+ "term.logout": "ÄÄng xuáēĨt",
+ "term.login": "ÄÄng nháēp",
+ "term.about": "Giáģi thiáģu",
+ "term.privateSession": "PhiÃĒn dÚng riÃĒng tư",
+ "term.queue": "HÃ ng ÄáģŖi",
+ "term.history": "Láģch sáģ",
+ "term.search": "TÃŦm kiáēŋm",
+ "term.library": "Thư viáģn",
+ "term.listenNow": "Nghe ngay",
+ "term.browse": "KhÃĄm phÃĄ",
+ "term.radio": "Radio",
+ "term.recentlyAdded": "VáģĢa ÄÆ°áģŖc thÃĒm",
+ "term.songs": "BÃ i hÃĄt",
+ "term.albums": "Album",
+ "term.artists": "Ngháģ sÄŠ",
+ "term.podcasts": "Podcast",
+ "term.playlists": "Playlist",
+ "term.playlist": "Playlist",
+ "term.newPlaylist": "Playlist máģi",
+ "term.newPlaylistFolder": "CáģĨm playlist máģi",
+ "term.createNewPlaylist": "TáēĄo playlist",
+ "term.createNewPlaylistFolder": "TáēĄo cáģĨm playlist",
+ "term.deletePlaylist": "BáēĄn cÃŗ muáģn xoÃĄ playlist nà y?",
+ "term.play": "PhÃĄt",
+ "term.pause": "DáģĢng",
+ "term.previous": "Trưáģc ÄÃŗ",
+ "term.next": "Tiáēŋp theo",
+ "term.shuffle": "XÃĄo tráģn",
+ "term.repeat": "Láēˇp",
+ "term.volume": "Ãm lưáģŖng",
+ "term.mute": "Táē¯t tiáēŋng",
+ "term.unmute": "Huáģˇ táē¯t tiáēŋng",
+ "term.share": "Chia sáēģ",
+ "term.share.success": "ÄÃŖ lưu và o báģ nháģ táēĄm",
+ "term.settings": "Cà i Äáēˇt",
+ "term.seeAll": "Xem táēĨt cáēŖ",
+ "term.sortBy": "Xáēŋp theo",
+ "term.sortBy.album": "Album",
+ "term.sortBy.artist": "Ngháģ sÄŠ",
+ "term.sortBy.name": "TÃĒn",
+ "term.sortBy.genre": "DÃ˛ng nháēĄc",
+ "term.sortBy.releaseDate": "Ngà y phÃĄt hà nh",
+ "term.sortBy.duration": "Tháģi lưáģŖng",
+ "term.sortBy.dateAdded": "Ngà y thÃĒm và o",
+ "term.sortOrder": "A-Z",
+ "term.sortOrder.ascending": "TÄng dáē§n",
+ "term.sortOrder.descending": "GiáēŖm dáē§n",
+ "term.viewAs": "Xem theo kiáģu",
+ "term.viewAs.coverArt": "áēĸnh bÃŦa",
+ "term.viewAs.list": "Danh sÃĄch",
+ "term.size": "CáģĄ",
+ "term.size.normal": "VáģĢa",
+ "term.size.compact": "Thu gáģn",
+ "term.enable": "Báēt",
+ "term.disable": "Táē¯t",
+ "term.enabled": "ÄÃŖ báēt",
+ "term.disabled": "ÄÃŖ táē¯t",
+ "term.connect": "Káēŋt náģi",
+ "term.connecting": "Äang káēŋt náģi",
+ "term.disconnect": "DáģĢng káēŋt náģi",
+ "term.authed": "ÄÃŖ ÄÄng nháēp",
+ "term.confirm": "BáēĄn cÃŗ chÄc không?",
+ "term.more": "ThÃĒm",
+ "term.less": "Ãt hÆĄn",
+ "term.showMore": "Hiáģn thÃĒm",
+ "term.showLess": "Hiáģn Ãt hÆĄn",
+ "term.topSongs": "CÃĄc bà i hÃĄt náģi báēt",
+ "term.latestReleases": "Máģi nháēĨt",
+ "term.time.added": "ThÃĒm và o ngà y",
+ "term.time.released": "PhÃĄt hà nh và o ngà y",
+ "term.time.updated": "Cáēp nháēt và o ngà y",
+ "term.time.hours": "giáģ",
+ "term.time.hour": "giáģ",
+ "term.time.minutes": "phÃēt",
+ "term.time.minute": "phÃēt",
+ "term.time.seconds": "giÃĸy",
+ "term.time.second": "giÃĸy",
+ "term.fullscreenView": "Xem toà n mà n hÃŦnh",
+ "term.defaultView": "Xem gáģc",
+ "term.audioSettings": "Cà i Äáēˇt Ãĸm thanh",
+ "term.clearAll": "XoÃĄ táēĨt cáēŖ",
+ "term.recentStations": "CÃĄc ÄÃ i gáē§n ÄÃĸy",
+ "term.language": "Ngôn ngáģ¯",
+ "term.funLanguages": "Vui váēģ",
+ "term.noLyrics": "Äang tÃŦm... / Không cÃŗ láģi bà i hÃĄt.",
+ "term.copyright": "BáēŖn quyáģn",
+ "term.rightsReserved": "Máģi quyáģn thuáģc váģ cÃĄc cháģ§ sáģ háģ¯u.",
+ "term.sponsor": "Tà i tráģŖ cho dáģą ÃĄn nà y",
+ "term.ciderTeam": "Cider Team",
+ "term.developer": "Láēp trÃŦnh viÃĒn",
+ "term.socialTeam": "Social Team",
+ "term.socials": "PR",
+ "term.contributors": "CÃĄc ÄÃŗng gÃŗp viÃĒn",
+ "term.equalizer": "EQ",
+ "term.reset": "Äáēˇt váģ máēˇc Äáģnh",
+ "term.tracks": "bà i",
+ "term.videos": "Video",
+ "term.menu": "Menu",
+ "term.check": "Kiáģm tra",
+ "term.aboutArtist": "Váģ {{artistName}}",
+ "term.topResult": "Káēŋt quáēŖ gáē§n nháēĨt",
+ "term.sharedPlaylists": "Playlist ÄÆ°áģŖc chia sáēģ",
+ "term.people": "Ngưáģi dÚng",
+ "term.newpreset.name": "TáēĄo thiÊt láēp EQ",
+ "term.addedpreset": "CÃĄc thiÊt láēp EQ ÄÃŖ ÄÆ°áģŖc thÃĒm",
+ "term.deletepreset.warn": "BáēĄn cÃŗ muáģn xoÃĄ thiáēŋt láēp nà y?",
+ "term.deletedpreset": "Thiáēŋt láēp ÄÃŖ báģ xoÃĄ",
+ "term.requestError": "CÃŗ váēĨn Äáģ khi tháģąc hiáģn yÃĒu cáē§u.",
+ "term.song.link.generate": "TÃŦm URL danh máģĨc trÃĒn song.link ...",
+ "term.musicVideos": "Video ca nháēĄc",
+ "term.stations": "CÃĄc ÄÃ i",
+ "term.curators": "Nhà tuyáģn cháģn",
+ "term.appleCurators": "Tuyáģn cháģn táģĢ Apple",
+ "term.radioShows": "CÃĄc chÆ°ÆĄng trÃŦnh radio",
+ "term.recordLabels": "Nhà phÃĄt hà nh Ãĸm nháēĄc",
+ "term.videoExtras": "Video khÃĄc",
+ "term.top": "Top",
+ "home.title": "ChÃnh",
+ "home.recentlyPlayed": "Máģi phÃĄt",
+ "home.recentlyAdded": "Máģi thÃĒm và o",
+ "home.artistsFeed": "Theo dÃĩi",
+ "home.artistsFeed.noArtist": "Theo dÃĩi cÃĄc nháēĄc sÄŠ mà báēĄn yÃĒu thÃch và nháēn thông bÃĄo khi cÃŗ bà i hÃĄt máģi.",
+ "home.madeForYou": "Dà nh cho báēĄn",
+ "home.friendsListeningTo": "BáēĄn bè Äang nghe",
+ "home.followedArtists": "CÃĄc ngháģ sÄŠ Äang theo dÃĩi",
+ "error.appleMusicSubRequired": "Apple Music yÃĒu cáē§u báēĄn ÄÄng kÃ.",
+ "error.connectionError": "CÃŗ váēĨn Äáģ káēŋt náģi táģi Apple Music.",
+ "error.noResults": "Không cÃŗ káēŋt quáēŖ.",
+ "error.noResults.description": "HÃŖy tháģ tÃŦm kiáēŋm báēŗng táģĢ khoÃĄ khÃĄc.",
+ "podcast.followOnCider": "Theo dÃĩi trÃĒn Cider",
+ "podcast.followedOnCider": "Äang theo dÃĩi trÃĒn Cider",
+ "podcast.subscribeOnItunes": "Theo dÃĩi trÃĒn iTunes",
+ "podcast.subscribedOnItunes": "Äang theo dÃĩi trÃĒn iTunes",
+ "podcast.itunesStore": "Cáģa hà ng iTunes",
+ "podcast.episodes": "CÃĄc táēp",
+ "podcast.playEpisode": "PhÃĄt",
+ "podcast.website": "Trang cháģ§",
+ "action.addToLibrary": "ThÃĒm và o thư viáģn",
+ "action.addToLibrary.success": "ÄÃŖ thÃĒm và o thư viáģn",
+ "action.addToLibrary.error": "CÃŗ láģi khi thÃĒm và o thư viáģn",
+ "action.removeFromLibrary": "XoÃĄ kháģi thư viáģn",
+ "action.removeFromLibrary.success": "ÄÃŖ xoÃĄ kháģi thư viáģn",
+ "action.addToQueue": "ThÃĒm và o hà ng ÄáģŖi",
+ "action.addToQueue.success": "ÄÃŖ thÃĒm và o hà ng ÄáģŖi",
+ "action.addToQueue.error": "CÃŗ láģi khi thÃĒm và o hà ng ÄáģŖi",
+ "action.removeFromQueue": "XoÃĄ kháģi hà ng ÄáģŖi",
+ "action.removeFromQueue.success": "ÄÃŖ xoÃĄ kháģi hà ng ÄáģŖi",
+ "action.removeFromQueue.error": "CÃŗ láģi khi xoÃĄ kháģi hà ng ÄáģŖi",
+ "action.createPlaylist": "TáēĄo playlist",
+ "action.addToPlaylist": "ThÃĒm và o playlist",
+ "action.removeFromPlaylist": "XoÃĄ kháģi playlist",
+ "action.addToFavorites": "ThÃĒm và o YÃĒu thÃch",
+ "action.follow": "Theo dÃĩi",
+ "action.follow.success": "ÄÃŖ theo dÃĩi",
+ "action.follow.error": "CÃŗ láģi khi theo dÃĩi",
+ "action.unfollow": "NgáģĢng theo dÃĩi",
+ "action.unfollow.success": "ÄÃŖ ngáģĢng theo dÃĩi",
+ "action.unfollow.error": "CÃŗ láģi khi ngáģĢng theo dÃĩi",
+ "action.playNext": "PhÃĄt tiáēŋp theo",
+ "action.playLater": "PhÃĄt cuáģi cÚng",
+ "action.startRadio": "TáēĄo Äà i phÃĄt",
+ "action.goToArtist": "Äi Äáēŋn ngháģ sÄŠ",
+ "action.goToAlbum": "Äi Äáēŋn album",
+ "action.moveToTop": "ÄÆ°a lÃĒn Äáē§u",
+ "action.share": "Chia sáēģ",
+ "action.rename": "Äáģi tÃĒn",
+ "action.love": "YÃĒu thÃch",
+ "action.unlove": "Báģ yÃĒu thÃch",
+ "action.dislike": "Không thÃch",
+ "action.undoDislike": "Báģ không thÃch",
+ "action.showWebRemoteQR": "Äiáģu khiáģn táģĢ xa",
+ "action.playTracksNext": "PhÃĄt ${app.selectedMediaItems.length} bà i tiáēŋp theo",
+ "action.playTracksLater": "PhÃĄt ${app.selectedMediaItems.length} bà i cuáģi cÚng",
+ "action.removeTracks": "Báģ ${self.selectedItems.length} bà i kháģi hà ng ÄáģŖi",
+ "action.import": "Nháēp",
+ "action.export": "XuáēĨt",
+ "action.showAlbum": "Hiáģn album Äáē§y Äáģ§",
+ "action.tray.minimize": "Thu nháģ xuáģng khay háģ tháģng",
+ "action.tray.quit": "ThoÃĄt",
+ "action.tray.show": "Hiáģn",
+ "action.update": "Cáēp nháēt",
+ "action.copy": "Sao chÊp",
+ "action.newpreset": "Thiáēŋp láēp máģi...",
+ "action.deletepreset": "XoÃĄ thiÃĒt láēp",
+ "settings.header.general": "Cà i Äáēˇt chung",
+ "settings.header.general.description": "Thay Äáģi cÃĄc cà i Äáēˇt chung cáģ§a Cider.",
+ "settings.option.general.language": "Ngôn ngáģ¯",
+ "settings.option.general.language.main": "Ngôn ngáģ¯ chÃnh",
+ "settings.option.general.language.fun": "Ngôn ngáģ¯ hư cáēĨu",
+ "settings.option.general.language.unsorted": "Ngôn ngáģ¯ khÃĄc",
+ "settings.option.general.updateCider": "Cáēp nháēt Cider",
+ "settings.option.general.updateCider.branch": "NhÃĄnh cáēp nháēt",
+ "settings.option.general.updateCider.branch.description": "Cháģn nhÃĄnh cáēp nháēt cáģ§a Cider:",
+ "settings.option.general.updateCider.branch.main": "áģn Äáģnh",
+ "settings.option.general.updateCider.branch.develop": "Tháģ nghiáģm",
+ "settings.header.audio": "Ãm thanh",
+ "settings.header.audio.description": "Thay Äáģi cÃĄc cà i Äáēˇt Ãĸm thanh cáģ§a Cider.",
+ "settings.option.audio.quality": "CháēĨt lưáģŖng Ãĸm thanh",
+ "settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
+ "settings.header.audio.quality.hireslossless.description": "lÃĒn táģi 24-bit/192 kHz",
+ "settings.header.audio.quality.lossless": "Lossless",
+ "settings.header.audio.quality.lossless.description": "lÃĒn táģi 24-bit/48 kHz",
+ "settings.header.audio.quality.high": "Cao",
+ "settings.header.audio.quality.high.description": "256 kbps",
+ "settings.header.audio.quality.standard": "TiÃĒu chuáēŠn",
+ "settings.header.audio.quality.standard.description": "64 kbps",
+ "settings.option.audio.seamlessTransition": "Gapless playback",
+ "settings.option.audio.enableAdvancedFunctionality": "KÃch hoáēĄt chÃnh nÄng nÃĸng cao",
+ "settings.option.audio.enableAdvancedFunctionality.description": "Báēt cÃĄc cháģŠc nÄng nÃĸng cao sáēŊ kÃch hoáēĄt cÃĄc cháģŠc nÄng như EQ, ChuáēŠn hoÃĄ Ãĸm lưáģŖng hay Visualizer, tuy nhiÃĒn cÃŗ tháģ sáēŊ áēŖnh hưáģng táģi cháēĨt lưáģŖng Ãĸm thanh",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processorâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "CÃĄc tinh cháģnh váģ Ãĸm thanh giÃēp cho nháēĄc cáģ§a báēĄn áēĨm và rÃĩ hÆĄn | TáēĄo báģi Maikiwi.",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP không tÆ°ÆĄng thÃch váģi Ãm thanh Äa chiáģu. HÃŖy táē¯t Ãm thanh Äa chiáģu Äáģ kÃch hoáēĄt.",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Cháģnh máģŠc Äáģ áēŖnh hưáģng cáģ§a CAP Äáēŋn Ãĸm thanh. (Cháēŋ Äáģ MáēĄnh cÃŗ tháģ áēŖnh hưáģng Äáēŋn Ãĸm thanh cáģ§a báēĄn)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "TiÃĒu chuáēŠn",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "MáēĄnh",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ChuáēŠn hoÃĄ Ãĸm lưáģŖng",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Äáēˇt cÚng máģŠc Ãĸm lưáģŖng cho máģi bà i hÃĄt",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "TáēĄo Ãm thanh Äa chiáģu ",
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Là m cho Ãĸm thanh tráģ nÃĒn nhiáģu chiáģu hÆĄn (Ghi chÃē: ÄÃĸy không pháēŖi là Dolby Atmos)",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Ãm thanh Äa chiáģu không tÆ°ÆĄng thÃch váģi CAP. HÃŖy táē¯t CAP Äáģ kÃch hoáēĄt.",
+ "settings.header.visual": "Hiáģn tháģ",
+ "settings.header.visual.description": "Thay Äáģi cÃĄc cà i Äáēˇt hiáģn tháģ cáģ§a Cider.",
+ "settings.option.visual.windowBackgroundStyle": "Cháēŋ Äáģ áēŖnh náģn",
+ "settings.header.visual.windowBackgroundStyle.none": "Không",
+ "settings.header.visual.windowBackgroundStyle.artwork": "áēĸnh bÃŦa",
+ "settings.header.visual.windowBackgroundStyle.image": "áēĸnh",
+ "settings.option.visual.animatedArtwork": "áēĸnh bÃŦa Äáģng",
+ "settings.header.visual.animatedArtwork.always": "Luôn báēt",
+ "settings.header.visual.animatedArtwork.limited": "Cháģ hiáģn áģ máģt sáģ trang cÃĄ nhÃĸn",
+ "settings.header.visual.animatedArtwork.disable": "Táē¯t",
+ "settings.option.visual.animatedArtworkQuality": "CháēĨt lưáģŖng áēŖnh bÃŦa Äáģng",
+ "settings.header.visual.animatedArtworkQuality.low": "TháēĨp",
+ "settings.header.visual.animatedArtworkQuality.medium": "Trung bÃŦnh",
+ "settings.header.visual.animatedArtworkQuality.high": "Cao",
+ "settings.header.visual.animatedArtworkQuality.veryHigh": "RáēĨt cao",
+ "settings.header.visual.animatedArtworkQuality.extreme": "RáēĨt ráēĨt cao",
+ "settings.option.visual.animatedWindowBackground": "HÃŦnh náģn chuyáģn Äáģng",
+ "settings.option.visual.hardwareAcceleration": "Cháēŋ Äáģ Hiáģn tháģ",
+ "settings.option.visual.hardwareAcceleration.description": "YÃĒu cáē§u restart láēĄi Cider Äáģ kÃch hoáēĄt",
+ "settings.header.visual.hardwareAcceleration.default": "Gáģc",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "Cháģ§ Äáģ",
+ "settings.option.visual.theme.default": "Cider",
+ "settings.option.visual.theme.dark": "Táģi hÆĄn",
+ "settings.option.visual.showPersonalInfo": "Hiáģn thông tin cÃĄ nhÃĸn",
+ "settings.header.lyrics": "Láģi bà i hÃĄt",
+ "settings.header.lyrics.description": "Thay Äáģi cÃĄc cà i Äáēˇt láģi bà i hÃĄt cáģ§a Cider.",
+ "settings.option.lyrics.enableMusixmatch": "DÚng láģi táģĢ Musixmatch",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "Báēt cháēŋ Äáģ karaoke (cháģ trÃĒn láģi táģĢ Musixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Ngôn ngáģ¯ dáģch cáģ§a Musixmatch",
+ "settings.option.lyrics.enableYoutubeLyrics": "DÚng láģi táģĢ Youtube cho cÃĄc Video ca nháēĄc",
+ "settings.header.connectivity": "Káēŋt náģi",
+ "settings.header.connectivity.description": "Thay Äáģi cÃĄc cà i Äáēˇt láģi káēŋt náģi cáģ§a Cider.",
+ "settings.option.connectivity.discordRPC": "Discord Rich Presence",
+ "settings.option.connectivity.playbackNotifications": "Thông bÃĄo chuyáģn bà i",
+ "settings.header.connectivity.discordRPC.cider": "Hiáģn là 'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "Hiáģn là 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "XoÃĄ Discord Rich Presence khi dáģĢng nháēĄc",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Báēt Last.fm Now Playing",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "XoÃĄ cÃĄc ngháģ sÄŠ pháģi háģŖp áģ tÃĒn bà i hÃĄt (Last.fm)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Láģc cÃĄc bà i trÚng (Last.fm)",
+ "settings.header.experimental": "Tháģ nghiáģm",
+ "settings.header.experimental.description": "Thay Äáģi cÃĄc cà i Äáēˇt láģi tháģ nghiáģm cáģ§a Cider.",
+ "settings.option.experimental.compactUI": "UI thu gáģn",
+ "settings.option.experimental.close_button_hide": "NÃēt thoÃĄt cáģa sáģ sáēŊ áēŠn Cider xuáģng khay háģ tháģng",
+ "settings.option.experimental.copy_log": "Sao chÊp logs ra báģ nháģ táēĄm",
+ "settings.option.experimental.inline_playlists": "Playlists and Albums hiáģn náģi lÃĒn trÃĒn",
+ "spatial.notTurnedOn": "Ãm thanh Äa chiáģu chưa ÄÆ°áģŖc kÃch hoáēĄt. HÃŖy kÃch hoáēĄt nÃŗ trưáģc",
+ "spatial.spatialProperties": "Tinh cháģnh cho Ãm thanh Äa chiáģu",
+ "spatial.width": "Chiáģu ráģng",
+ "spatial.height": "Chiáģu cao",
+ "spatial.depth": "Chiáģu sÃĸu",
+ "spatial.gain": "Gain",
+ "spatial.roomMaterials": "CháēĨt liáģu phÃ˛ng",
+ "spatial.roomDimensions": "KÃch thưáģc phÃ˛ng",
+ "spatial.roomPositions": "Váģ trà phÃ˛ng",
+ "spatial.setDimensions": "Cháģnh kÃch thưáģc",
+ "spatial.setPositions": "Cháģnh váģ trÃ",
+ "spatial.up": "TrÃĒn",
+ "spatial.front": "Trưáģc",
+ "spatial.left": "TrÃĄi",
+ "spatial.right": "PháēŖi",
+ "spatial.back": "Sau",
+ "spatial.down": "Dưáģi",
+ "spatial.listener": "Ngưáģi nghe",
+ "spatial.audioSource": "Nguáģn Ãĸm thanh",
+ "settings.header.unfinished": "Chưa hoà n thiáģn",
+ "remote.web.title": "Äiáģu khiáģn táģĢ xa cáģ§a Cider",
+ "remote.web.description": "QuÊt mÃŖ QR Äáģ káēŋt náģi thiáēŋt báģ cáģ§a báēĄn váģi Cider",
+ "about.thanks": "TrÃĸn tráģng cáēŖm ÆĄn Cider Collective Team và táēĨt cáēŖ cÃĄc ÄÃŗng gÃŗp viÃĒn cáģ§a chÃēng tôi."
+}
\ No newline at end of file
diff --git a/src/i18n/zh_CN.jsonc b/src/i18n/zh_CN.json
similarity index 63%
rename from src/i18n/zh_CN.jsonc
rename to src/i18n/zh_CN.json
index 1adbf1ae..c1bf7bc3 100644
--- a/src/i18n/zh_CN.jsonc
+++ b/src/i18n/zh_CN.json
@@ -1,37 +1,29 @@
-{
- // App info
+{
+ "i18n.languageName": "įŽäŊ䏿īŧä¸åŊīŧ",
+ "i18n.languageNameEnglish": "Simp. Chinese (China)",
+ "i18n.category": "main",
+ "i18n.authors": "@maikirakiwi @BillKerman",
"app.name": "Cider",
-
"date.format": "${y}åš´${m}æ${d}æĨ",
-
- // i18n Info
- "i18n.languageName": "įŽäŊ䏿īŧä¸åŊīŧ", // name of language in native language
- "i18n.languageNameEnglish": "Simp. Chinese (China)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@maikirakiwi @BillKerman", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // Dialogs
"dialog.cancel": "åæļ",
"dialog.ok": "įĄŽåŽ",
-
- // Notification
"notification.updatingLibrarySongs": "æŖå¨æ´æ°čĩæåēįææ˛äŋĄæ¯...",
"notification.updatingLibraryAlbums": "æŖå¨æ´æ°čĩæåēįä¸čžäŋĄæ¯...",
"notification.updatingLibraryArtists": "æŖå¨æ´æ°čĩæåēįčēäēēäŋĄæ¯...",
- // Terms
"term.appleInc": "Apple Inc.",
- "term.appleMusic": "Apple Music", // Follows brand term
- "term.applePodcasts": "Apple Podcasts", // Follows brand term
- "term.itunes": "iTunes", // Follows brand term
- "term.github": "GitHub", // Follows brand term
- "term.discord": "Discord", // Follows brand term
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
"term.learnMore": "æ´å¤äŋĄæ¯",
"term.accountSettings": "č´ĻæˇčŽžįŊŽ",
"term.logout": "įģåē",
"term.login": "įģåŊ",
"term.about": "å
ŗäē",
"term.privateSession": "į§äēēčåŦ",
- "term.queue": "åž
ææ¸
å",
+ "term.queue": "éå",
+ "term.history": "ææžåå˛",
"term.search": "æį´ĸ",
"term.library": "čĩæåē",
"term.listenNow": "į°å¨å°ąåŦ",
@@ -59,6 +51,7 @@
"term.mute": "ééŗ",
"term.unmute": "č§Ŗé¤ééŗ",
"term.share": "åäēĢ",
+ "term.share.success": "厞å¤åļå°åĒč´´æŋ",
"term.settings": "莞įŊŽ",
"term.seeAll": "æĨįå
¨é¨",
"term.sortBy": "æåē",
@@ -90,10 +83,10 @@
"term.less": "čžå°",
"term.showMore": "æžį¤ēæ´å¤",
"term.showLess": "æžį¤ēæ´å°",
- "term.topSongs" : "į鍿æ˛",
+ "term.topSongs": "į鍿æ˛",
"term.latestReleases": "ææ°åčĄ",
"term.time.added": "æˇģå äē",
- "term.time.released": "åčĄäē",
+ "term.time.released": "åčĄäē",
"term.time.updated": "æ´æ°äē",
"term.time.hours": "å°æļ",
"term.time.hour": "å°æļ",
@@ -109,24 +102,40 @@
"term.recentStations": "æčŋææžįéĸé",
"term.language": "č¯č¨",
"term.funLanguages": "æļæ",
- "term.noLyrics": "å čŊŊä¸... / æį´ĸæ įģæ / įē¯éŗäš",
+ "term.noLyrics": "å čŊŊä¸... / æ æį´ĸįģæ / įē¯éŗäš",
"term.copyright": "įæææ",
"term.rightsReserved": "äŋįæææåŠã",
"term.sponsor": "čĩåŠ",
"term.ciderTeam": "Cider åĸé",
"term.developer": "åŧåč
",
"term.socialTeam": "åĒäŊåĸé",
+ "term.socials": "åĒäŊ",
"term.contributors": "č´ĄįŽč
",
"term.equalizer": "å襥å¨",
"term.reset": "éįŊŽ",
- "term.tracks": "éĻææ˛", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "č§éĸ",
+ "term.tracks": "éĻææ˛",
+ "term.videos": "č§éĸ",
"term.menu": "čå",
"term.check": "æŖæĨ",
- "term.aboutArtist": "å
ŗäē{{artistName}}", // e.g. 'About Doja Cat'
+ "term.aboutArtist": "å
ŗäē{{artistName}}",
"term.updateCider": "æ´æ° Cider",
-
- // Home
+ "term.topResult": "į鍿į´ĸįģæ",
+ "term.sharedPlaylists": "åäēĢææžå襨",
+ "term.people": "ä¸ĒäēēæĄŖæĄ",
+ "term.newpreset.name": "æ°å襥å¨éĸ莞å",
+ "term.addedpreset": "éĸčŽžåˇ˛æˇģå ",
+ "term.deletepreset.warn": "äŊ įĄŽåŽčĻå 餿¤éĸ莞å?",
+ "term.deletedpreset": "éĸčŽžåˇ˛å é¤",
+ "term.defaultPresets": "éģ莤éĸ莞",
+ "term.userPresets": "፿ˇéĸ莞",
+ "term.requestError": "蝎æąåēį°ä¸ä¸ĒéŽéĸã",
+ "term.song.link.generate": "čˇå song.link å
ąäēĢéžæĨ...",
+ "term.musicVideos": "éŗäšč§éĸ",
+ "term.stations": "įĩå°",
+ "term.radioShows": "åšŋæåé",
+ "term.recordLabels": "åąįå
Ŧå¸",
+ "term.videoExtras": "č§éĸįščž",
+ "term.version": "įæŦ",
"home.title": "ä¸ģéĄĩ",
"home.recentlyPlayed": "æčŋææž",
"home.recentlyAdded": "æčŋæˇģå ",
@@ -135,36 +144,29 @@
"home.madeForYou": "ä¸å࿍č",
"home.friendsListeningTo": "æåæŖå¨åŦ",
"home.followedArtists": "å
ŗæŗ¨įčēäēē",
-
- // Errors
"error.appleMusicSubRequired": "éčĻčŽĸé
Apple Music äģĨäŊŋ፠Cider",
"error.connectionError": "æ æŗčŋæĨå° Apple Musicã",
"error.noResults": "æ˛Ąæįģæã",
"error.noResults.description": "å°č¯æ´æšæį´ĸæĄäģļã",
-
- //Podcasts
"podcast.followOnCider": "å¨ Cider ä¸å
ŗæŗ¨",
"podcast.followedOnCider": "厞å
ŗæŗ¨",
"podcast.subscribeOnItunes": "å¨ iTunes ä¸čŽĸé
",
"podcast.subscribedOnItunes": "厞čŽĸé
",
- "podcast.itunesStore": "iTunes Store", // Follow brand term
+ "podcast.itunesStore": "iTunes Store",
"podcast.episodes": "åé",
"podcast.playEpisode": "ææžåé",
"podcast.website": "Podcast įŊįĢ",
-
-
- // Actions
"action.addToLibrary": "å å
Ĩčĩæåē",
"action.addToLibrary.success": "æåå å
Ĩčĩæåē",
"action.addToLibrary.error": "å å
Ĩčĩæåēįčŋį¨åįäēé蝝",
"action.removeFromLibrary": "äģčĩæåēä¸į§ģé¤",
"action.removeFromLibrary.success": "厞äģčĩæåēä¸į§ģé¤",
"action.addToQueue": "å å
Ĩåž
ææ¸
å",
- "action.addToQueue.success": "æåå å
Ĩåž
ææ¸
å",
- "action.addToQueue.error": "å å
Ĩåž
ææ¸
åįčŋį¨åįäēé蝝",
- "action.removeFromQueue": "äģåž
ææ¸
åä¸į§ģé¤",
- "action.removeFromQueue.success": "厞äģåž
ææ¸
åä¸į§ģé¤",
- "action.removeFromQueue.error": "äģåž
ææ¸
åä¸į§ģé¤įčŋį¨åįäēé蝝",
+ "action.addToQueue.success": "æåå å
Ĩå å
Ĩåž
ææ¸
å",
+ "action.addToQueue.error": "å å
Ĩå å
Ĩåž
ææ¸
åįčŋį¨åįäēé蝝",
+ "action.removeFromQueue": "äģå å
Ĩåž
ææ¸
åä¸į§ģé¤",
+ "action.removeFromQueue.success": "厞äģå å
Ĩåž
ææ¸
åä¸į§ģé¤",
+ "action.removeFromQueue.error": "äģå å
Ĩåž
ææ¸
åä¸į§ģé¤įčŋį¨åįäēé蝝",
"action.createPlaylist": "æ°åģēææžå襨",
"action.addToPlaylist": "å å
Ĩææžå襨",
"action.removeFromPlaylist": "äģææžå襨ä¸į§ģé¤",
@@ -198,109 +200,120 @@
"action.tray.quit": "éåē",
"action.tray.show": "æžį¤ē",
"action.update": "æ´æ°",
-
-
- // Settings - Audio
+ "action.copy": "å¤åļ",
+ "action.newpreset": "æ°åģēéĸ莞...",
+ "action.deletepreset": "å é¤éĸ莞",
+ "settings.header.general": "éį¨",
+ "settings.header.general.description": "č°æ´ Cider įéį¨čŽžįŊŽ",
+ "settings.option.general.language": "č¯č¨",
+ "settings.option.general.language.main": "č¯č¨",
+ "settings.option.general.language.fun": "æļæč¯č¨",
+ "settings.option.general.language.unsorted": "æĒåįąģ",
+ "settings.option.general.updateCider": "æ´æ° Cider",
+ "settings.option.general.updateCider.branch": "Cider æ´æ°éé",
+ "settings.option.general.updateCider.branch.description": "éæŠæĨå Cider æ´æ°įéé",
+ "settings.option.general.updateCider.branch.main": "፺åŽ",
+ "settings.option.general.updateCider.branch.develop": "æĩč¯",
"settings.header.audio": "éŗéĸ",
"settings.header.audio.description": "č°æ´ Cider įéŗéĸ莞įŊŽ",
- "settings.option.audio.quality": "éŗč´¨", // Dropdown
+ "settings.option.audio.quality": "éŗč´¨",
+ "settings.header.audio.quality.hireslossless": "éĢč§ŖæåēĻæ æ",
+ "settings.header.audio.quality.hireslossless.description": "(æéĢ 24 äŊ/192 kHz)",
+ "settings.header.audio.quality.lossless": "æ æ",
+ "settings.header.audio.quality.lossless.description": "(æéĢ 24 äŊ/48 kHz)",
+ "settings.header.audio.quality.enhanced": "æ°ååĸåŧē",
"settings.header.audio.quality.high": "éĢéŗč´¨",
- "settings.header.audio.quality.low": "éĢæį",
+ "settings.header.audio.quality.standard": "éĢæį",
"settings.header.audio.quality.auto": "čĒå¨",
- "settings.option.audio.seamlessTransition": "æ įŧææž", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "čŋéļåčŊ", // Toggle
+ "settings.option.audio.seamlessTransition": "æ įŧææž",
+ "settings.option.audio.enableAdvancedFunctionality": "čŋéļåčŊ",
"settings.option.audio.enableAdvancedFunctionality.description": "å¯į¨ AudioContext å°č§ŖéäžåĻéŗéæ åååéŗéĸįŠēé´åįåčŊīŧäŊå¯čŊäŧå¨å°é¨å莞å¤ä¸åēį°éŗéĸä¸įåĄéĄŋã",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗéæ åå", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider æ°ååĸåŧēåŧæâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "å°æŦēéĒæ¨į大čæĨæįĨå°čŋäŧŧæ æéŗéĸįææã",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "æ°ååĸåŧēåŧæåŧēåēĻ",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "æšåéŗéĸå¤įįåŧēåēĻã(æŋčŋé饚å¯čŊäē§įæéŗ)",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗéæ åå",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "äŊŋææįĨå°įéŗéĸååēĻįģä¸",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "éŗéĸįŠēé´å", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "éŗéĸįŠēé´å",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "äŊŋææįĨå°įéŗéĸæ´æįĢäŊæ (æŗ¨: čŋ䏿¯ææ¯å
¨æ¯åŖ°)",
- // Settings - Visual
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "æ å",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "æŋčŋ",
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "įŠēé´éŗéĸ䏿°ååĸåŧēåŧæä¸å
ŧ厚īŧ蝎å
å፿°ååĸåŧēåŧæ",
"settings.header.visual": "å¤č§",
"settings.header.visual.description": "č°æ´ Cider įå¤č§",
- "settings.option.visual.windowBackgroundStyle": "įĒåŖčæ¯æ ˇåŧ", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "įĒåŖčæ¯æ ˇåŧ",
"settings.header.visual.windowBackgroundStyle.none": "æ ",
"settings.header.visual.windowBackgroundStyle.artwork": "ä¸čžå°éĸ",
- "settings.header.visual.windowBackgroundStyle.image": "åžå",
- "settings.option.visual.animatedArtwork": "卿ä¸čžå°éĸ", // Dropdown
+ "settings.header.visual.windowBackgroundStyle.image": "åžå",
+ "settings.option.visual.animatedArtwork": "卿ä¸čžå°éĸ",
"settings.header.visual.animatedArtwork.always": "æģæ¯æžį¤ē",
"settings.header.visual.animatedArtwork.limited": "åĒå¨čēäēēéĄĩéĸåä¸čžå°éĸæžį¤ē",
"settings.header.visual.animatedArtwork.disable": "å
ŗé",
- "settings.option.visual.animatedArtworkQuality": "卿ä¸čžå°éĸįģč´¨", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "卿ä¸čžå°éĸįģč´¨",
"settings.header.visual.animatedArtworkQuality.low": "äŊ",
"settings.header.visual.animatedArtworkQuality.medium": "ä¸",
"settings.header.visual.animatedArtworkQuality.high": "éĢ",
"settings.header.visual.animatedArtworkQuality.veryHigh": "é常éĢ",
"settings.header.visual.animatedArtworkQuality.extreme": "æéĢ",
- "settings.option.visual.animatedWindowBackground": "卿įĒåŖčæ¯", // Toggle
- "settings.option.visual.hardwareAcceleration": "įĄŦäģļå é", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "卿įĒåŖčæ¯",
+ "settings.option.visual.hardwareAcceleration": "įĄŦäģļå é",
"settings.option.visual.hardwareAcceleration.description": "éčĻéå¯ Cider æäŧįæ",
- "settings.header.visual.hardwareAcceleration.default": "éģ莤",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "æžį¤ēä¸Ēäēēčĩæ", // Toggle
- // Settings - General (Reserved)
- "settings.header.general": "éį¨",
- "settings.header.general.description": "č°æ´ Cider įéį¨čŽžįŊŽ",
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "éģ莤",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "ä¸ģéĸ",
+ "settings.option.visual.theme.github.download": "éčŋGitHub URLåŽčŖ
",
+ "settings.option.visual.theme.github.explore": "æĩč§ GitHub ä¸įä¸ģéĸ",
+ "settings.option.visual.theme.github.install.confirm": "įĄŽåŽčĻåŽčŖ
{{ repo }}?",
+ "settings.prompt.visual.theme.github.URL": "蝎čžå
ĨæŦ˛åŽčŖ
ä¸ģéĸįURL",
+ "settings.notyf.visual.theme.install.success": "ä¸ģéĸåŽčŖ
æå",
+ "settings.notyf.visual.theme.install.error": "ä¸ģéĸåŽčŖ
å¤ąč´Ĩ",
+ "settings.option.visual.theme.default": "éģ莤",
+ "settings.option.visual.theme.dark": "åå¤éģ",
+ "settings.option.visual.showPersonalInfo": "æžį¤ēä¸Ēäēēčĩæ",
"settings.header.lyrics": "æč¯",
"settings.header.lyrics.description": "č°æ´ Cider įæč¯čŽžįŊŽ",
- "settings.option.lyrics.enableMusixmatch": "å¯į¨ Musixmatch æč¯", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "å¯į¨åĄæ OK æ¨Ąåŧīŧäģ
Musixmatchīŧ", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æč¯č¯č¨ååĨŊ", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "ææž MV æļäŊŋ፠YouTube æč¯", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "å¯į¨ Musixmatch æč¯",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "å¯į¨åĄæ OK æ¨Ąåŧīŧäģ
Musixmatchīŧ",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æč¯č¯č¨ååĨŊ",
+ "settings.option.lyrics.enableYoutubeLyrics": "ææž MV æļäŊŋ፠YouTube æč¯",
"settings.header.connectivity": "å¤é¨čŋæĨ",
"settings.header.connectivity.description": "č°æ´Ciderä¸å¤é¨åēį¨įäē¤äē莞įŊŽ",
- "settings.option.connectivity.discordRPC": "Discord 卿", // Dropdown
- "settings.option.connectivity.playbackNotifications": "ææžéįĨ", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "æžį¤ēæŖå¨ 'Cider' ä¸čåŦ",
- "settings.header.connectivity.discordRPC.appleMusic": "æžį¤ēæŖå¨ 'Apple Music' ä¸čåŦ",
- "settings.option.connectivity.discordRPC.clearOnPause": "æåæļæ¸
é¤ Discord 卿", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 莰åŊ", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble åģļčŋ (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "å¯į¨ LastFM æŖå¨ææž",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "äģæåéåģé¤åäŊč
(LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "ä¸čްåŊ忞åžĒᝠ(LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC": "Discord 卿",
+ "settings.option.connectivity.playbackNotifications": "ææ˛ææžéįĨ",
+ "settings.header.connectivity.discordRPC.cider": "æžį¤ēæŖå¨äŊŋ፠'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "æžį¤ēæŖå¨äŊŋ፠'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "æåæļæ¸
é¤ Discord 卿",
+ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 莰åŊ",
+ "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble åģļčŋ (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "å¯į¨ LastFM æŖå¨ææž",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "äģæåéåģé¤åäŊč
(LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "ä¸čްåŊ忞åžĒᝠ(LastFM)",
"settings.header.experimental": "åŽéĒæ§åčŊ",
- "settings.header.experimental.description": "č°æ´CiderįåŽéĒæ§åčŊ",
- "settings.option.experimental.compactUI": "į´§åå UI", // Toggle
+ "settings.header.experimental.description": "č°æ´ Cider įåŽéĒæ§åčŊ",
+ "settings.option.experimental.compactUI": "į´§åå UI",
"settings.option.experimental.close_button_hide": "įšåģå
ŗéæéŽæļäģ
éčįĒåŖ",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.notTurnedOn": "éŗéĸįŠēé´ååčŊčĸĢįĻį¨īŧäŊŋį¨å蝎å
å¯į¨ã",
- "spatial.spatialProperties" : "įŠēé´åąæ§",
- "spatial.width" : "åŽŊåēĻ",
- "spatial.height" : "éĢåēĻ",
- "spatial.depth" : "æˇąåēĻ",
+ "settings.option.experimental.copy_log": "å¤åļæĨåŋčŗåĒč´´æŋ",
+ "spatial.notTurnedOn": "蝎å¨čŽžåŽä¸åŧå¯įŠēé´éŗéĸã",
+ "spatial.spatialProperties": "įŠēé´åąæ§",
+ "spatial.width": "åŽŊåēĻ",
+ "spatial.height": "éĢåēĻ",
+ "spatial.depth": "æˇąåēĻ",
"spatial.gain": "åĸį",
- "spatial.roomMaterials" : "įŠēé´æč´¨",
- "spatial.roomDimensions" : "įŠēé´å°ē寸",
- "spatial.roomPositions" : "įŠēé´äŊįŊŽ",
- "spatial.setDimensions" : "莞įŊŽå°ē寸",
- "spatial.setPositions" : "莞įŊŽäŊįŊŽ",
- "spatial.up" : "ä¸",
- "spatial.front" : "å",
- "spatial.left" : "åˇĻ",
- "spatial.right" : "åŗ",
- "spatial.back" : "å",
- "spatial.down" : "ä¸",
- "spatial.listener" : "æ¨",
- "spatial.audioSource" : "éŗæē",
-
- // Settings - Unfinished
+ "spatial.roomMaterials": "įŠēé´æč´¨",
+ "spatial.roomDimensions": "įŠēé´å°ē寸",
+ "spatial.roomPositions": "įŠēé´äŊįŊŽ",
+ "spatial.setDimensions": "莞įŊŽå°ē寸",
+ "spatial.setPositions": "莞įŊŽäŊįŊŽ",
+ "spatial.up": "ä¸",
+ "spatial.front": "å",
+ "spatial.left": "åˇĻ",
+ "spatial.right": "åŗ",
+ "spatial.back": "å",
+ "spatial.down": "ä¸",
+ "spatial.listener": "æ¨",
+ "spatial.audioSource": "éŗæē",
"settings.header.unfinished": "æĒåŽæ",
-
- // Web Remote
"remote.web.title": "Cider čŋ፿§åļ",
"remote.web.description": "æĢæäģĨä¸įäēįģ´į äģĨæ§åļ Cider",
-
- //About
"about.thanks": "ééæč°ĸ Cider Collective äģĨåä¸ēčŋä¸ĒéĄšįŽæäžæ¯æįč´ĄįŽč
ã"
}
diff --git a/src/i18n/zh_HK.jsonc b/src/i18n/zh_HK.json
similarity index 62%
rename from src/i18n/zh_HK.jsonc
rename to src/i18n/zh_HK.json
index f15099cf..8c063187 100644
--- a/src/i18n/zh_HK.jsonc
+++ b/src/i18n/zh_HK.json
@@ -1,31 +1,21 @@
{
-
- // i18n Info
- "i18n.languageName": "įšéĢ䏿īŧéĻæ¸¯īŧ", // name of language in native language
- "i18n.languageNameEnglish": "Trad. Chinese (Hong Kong)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@kyw504100 @maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+ "i18n.languageName": "įšéĢ䏿īŧéĻæ¸¯īŧ",
+ "i18n.languageNameEnglish": "Trad. Chinese (Hong Kong)",
+ "i18n.category": "main",
+ "i18n.authors": "@kyw504100 @maikirakiwi @BillKerman",
"app.name": "Cider",
-
- "date.format": "${y}åš´${m}æ${d}æĨ",
-
- // Dialogs
+ "date.format": "${y}åš´${m}æ${d}æĨ",
"dialog.cancel": "åæļ",
"dialog.ok": "įĸēčĒ",
-
- // Notification
"notification.updatingLibrarySongs": "æŖå¨æ´æ°čŗæåēĢįææ˛...",
"notification.updatingLibraryAlbums": "æŖå¨æ´æ°čŗæåēĢįå°čŧ¯...",
"notification.updatingLibraryArtists": "æŖå¨æ´æ°čŗæåēĢįčäēē...",
- // Terms
"term.appleInc": "Apple Inc.",
- "term.appleMusic": "Apple Music", // Follows brand term
- "term.applePodcasts": "Apple Podcasts", // Follows brand term
- "term.itunes": "iTunes", // Follows brand term
- "term.github": "GitHub", // Follows brand term
- "term.discord": "Discord", // Follows brand term
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
"term.learnMore": "äēč§Ŗæ´å¤",
"term.accountSettings": "叺čč¨åŽ",
"term.logout": "įģåē",
@@ -47,9 +37,9 @@
"term.playlist": "ææžå襨",
"term.newPlaylist": "æ°ææžå襨",
"term.newPlaylistFolder": "æ°ææžåčĄ¨čŗæå¤ž",
- "term.createNewPlaylist": "æ°åģēææžå襨",
- "term.createNewPlaylistFolder": "æ°åģēææžåčĄ¨čŗæå¤ž",
- "term.deletePlaylist": "æ¨įĄŽåŽčĻå é¤č¯Ĩææžå襨å?",
+ "term.createNewPlaylist": "æ°åĸææžå襨",
+ "term.createNewPlaylistFolder": "æ°åĸææžåčĄ¨čŗæå¤ž",
+ "term.deletePlaylist": "äŊ įĸēčĒčĻåĒé¤éåææžå襨īŧ",
"term.play": "ææž",
"term.pause": "æĢå",
"term.previous": "ä¸ä¸éĻ",
@@ -69,6 +59,7 @@
"term.sortBy.genre": "éŗæ¨éĸ¨æ ŧ",
"term.sortBy.releaseDate": "įŧčĄæĨæ",
"term.sortBy.duration": "æéˇ",
+ "term.sortBy.dateAdded": "å å
ĨæĨæ",
"term.sortOrder": "忝æåē",
"term.sortOrder.ascending": "é åē",
"term.sortOrder.descending": "ååē",
@@ -91,10 +82,10 @@
"term.less": "čŧå°",
"term.showMore": "éĄ¯į¤ēæ´å¤",
"term.showLess": "éĄ¯į¤ēčŧå°",
- "term.topSongs" : "įąéææ˛",
+ "term.topSongs": "įąéææ˛",
"term.latestReleases": "ææ°įŧčĄ",
"term.time.added": "å å
Ĩæŧ",
- "term.time.released": "įŧčĄæŧ",
+ "term.time.released": "įŧčĄæŧ",
"term.time.updated": "æ´æ°æŧ",
"term.time.hours": "å°æ",
"term.time.hour": "å°æ",
@@ -105,6 +96,7 @@
"term.fullscreenView": "å
¨čĸåšæĒĸčĻ",
"term.defaultView": "ä¸čŦæĒĸčĻ",
"term.audioSettings": "éŗč¨č¨åŽ",
+ "term.audioControls": "éŗéæ§åļ",
"term.clearAll": "æ¸
įŠē",
"term.recentStations": "æčŋææžįé ģé",
"term.language": "čĒč¨",
@@ -120,12 +112,31 @@
"term.contributors": "č˛ĸįģč
",
"term.equalizer": "å襥å¨",
"term.reset": "éč¨",
- "term.tracks": "éĻææ˛", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "åŊąį",
- "term.menu": "é¸é
",
- "term.showAlbum": "éĄ¯į¤ēåŽæ´įå°čŧ¯",
-
- // Home
+ "term.tracks": "éĻææ˛",
+ "term.videos": "åŊąį",
+ "term.menu": "é¸é
",
+ "term.check": "æĒĸæĨ",
+ "term.aboutArtist": "éæŧ {{artistName}}",
+ "term.topResult": "įąéæå°įĩæ",
+ "term.sharedPlaylists": "ææžå襨",
+ "term.people": "åäēēæĒæĄ",
+ "term.newpreset.name": "æ°å襥å¨į¯æŦåį¨ą",
+ "term.addedpreset": "厞æ°åĸ",
+ "term.deletepreset.warn": "äŊ įĸēčĒčĻåĒé¤éå᝿Ŧīŧ",
+ "term.deletedpreset": "厞åĒé¤",
+ "term.defaultPresets": "é č¨į¯æŦ",
+ "term.userPresets": "čĒč¨į¯æŦ",
+ "term.requestError": "čįčĢæąæįŧįé¯čǤ",
+ "term.song.link.generate": "æŖå¨įæ song.link åäēĢéŖįĩ...",
+ "term.musicVideos": "MV",
+ "term.stations": "éģå°",
+ "term.radioShows": "åģŖæåŽé",
+ "term.recordLabels": "åąįå
Ŧå¸",
+ "term.videoExtras": "åŊąįįščŧ¯",
+ "term.version": "įæŦ",
+ "term.noVideos": "æ˛æåŊąį",
+ "term.plugin": "夿į¨åŧ",
+ "term.pluginMenu": "夿į¨åŧé¸åŽ",
"home.title": "ä¸ģé ",
"home.recentlyPlayed": "æčŋææž",
"home.recentlyAdded": "æčŋå å
Ĩ",
@@ -134,13 +145,10 @@
"home.madeForYou": "į翍æ¨čĻ",
"home.friendsListeningTo": "æåæŖå¨ččŊ",
"home.followedArtists": "čŋŊ蚤įčäēē",
- // Errors
"error.appleMusicSubRequired": "éčĻč¨éąApple MusicäģĨäŊŋį¨Cider",
"error.connectionError": "įĄæŗéŖæĨå° Apple Musicã",
"error.noResults": "æ˛æįĩæ",
"error.noResults.description": "čĢåčŠĻæ°įæå°å
§åŽšã",
-
- //Podcasts
"podcast.followOnCider": "å¨Ciderä¸čŋŊ蚤",
"podcast.followedOnCider": "厞å¨Ciderä¸čŋŊ蚤",
"podcast.subscribeOnItunes": "å¨iTunesä¸č¨éą",
@@ -149,8 +157,6 @@
"podcast.episodes": "åŽé",
"podcast.playEpisode": "ææžåŽé",
"podcast.website": "Podcast įļ˛é ",
-
- // Actions
"action.addToLibrary": "å å
ĨčŗæåēĢ",
"action.addToLibrary.success": "æåå å
ĨčŗæåēĢ",
"action.addToLibrary.error": "å å
ĨčŗæåēĢįéį¨įŧįé¯čǤ",
@@ -190,118 +196,129 @@
"action.removeTracks": "åžåž
ææ¸
åŽåĒé¤ ${self.selectedItems.length} éĻææ˛",
"action.import": "å¯å
Ĩ",
"action.export": "å¯åē",
-
- // Settings - General
+ "action.showAlbum": "éĄ¯į¤ēåŽæ´įå°čŧ¯",
+ "action.tray.minimize": "į¸Žå°čŗįŗģįĩąæį¤",
+ "action.tray.quit": "įĩæ",
+ "action.tray.show": "éĄ¯į¤ē",
+ "action.update": "æ´æ°",
+ "action.copy": "č¤čŖŊ",
+ "action.newpreset": "æ°åĸ᝿Ŧ",
+ "action.deletepreset": "åĒé¤į¯æŦ",
+ "action.open": "éå",
"settings.header.general": "ä¸čŦ",
"settings.header.general.description": "čĒŋæ´Ciderįä¸čŦč¨åŽ",
"settings.option.general.language": "čĒč¨",
-
- // Language optgroups
"settings.option.general.language.main": "čĒč¨",
"settings.option.general.language.fun": "æĄæčĒč¨",
"settings.option.general.language.unsorted": "æĒåéĄ",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "æ´æ° Cider",
+ "settings.option.general.updateCider.branch": "Cider æ´æ°éé",
+ "settings.option.general.updateCider.branch.description": "鏿äŊ æŗčĻæĨæļäžčĒåĒåééįæ´æ°",
+ "settings.option.general.updateCider.branch.main": "įŠŠåŽ",
+ "settings.option.general.updateCider.branch.develop": "æ¸ŦčŠĻ",
"settings.header.audio": "éŗč¨",
"settings.header.audio.description": "čĒŋæ´Ciderįéŗč¨č¨åŽ",
- "settings.option.audio.quality": "éŗč¨éŗčŗĒ", // Dropdown
+ "settings.option.audio.volumeStep": "éŗéæščŽé",
+ "settings.option.audio.maxVolume": "æéĢéŗé",
+ "settings.option.audio.quality": "éŗč¨éŗčŗĒ",
+ "settings.header.audio.quality.hireslossless": "éĢæ¸
įĄæåŖį¸Ž",
+ "settings.header.audio.quality.hireslossless.description": "īŧéĢé 24-bit/192 kHzīŧ",
+ "settings.header.audio.quality.lossless": "įĄæåŖį¸Ž",
+ "settings.header.audio.quality.lossless.description": "īŧéĢé 24-bit/48 kHzīŧ",
"settings.header.audio.quality.high": "éĢį´ čŗĒ",
- "settings.header.audio.quality.low": "éĢæį",
- "settings.header.audio.quality.auto": "čĒå",
- "settings.option.audio.seamlessTransition": "įĄį¸Ģææž", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "é˛éåčŊ", // Toggle
+ "settings.header.audio.quality.standard": "éĢæį",
+ "settings.option.audio.seamlessTransition": "įĄį¸Ģææž",
+ "settings.option.audio.enableAdvancedFunctionality": "é˛éåčŊ",
"settings.option.audio.enableAdvancedFunctionality.description": "å፠AudioContext å°č§ŖééĄäŧŧéŗéåšŗčĄĄåå襥å¨įé˛éåčŊãäŊæ¯æå¨ä¸äēéģč
Ļé æéŗæ¨åĄé ã",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗéåšŗčĄĄ", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider æ¸įĸŧéŗč¨åĸåŧˇčįâĸī¸",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "čŊå¤ æŦēé¨äŊ į大č
ĻčŽäŊ æåå°čŋäŧŧįĄæåŖį¸ŽįéŗčŗĒ | įą Maikiwi č¨č¨",
+ "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "éŗč¨åĸåŧˇčįä¸å
ŧ厚æŧįŠēééŗč¨īŧčĢå
åį¨įŠēééŗč¨ã",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "æ¸įĸŧéŗč¨åĸåŧˇčįč¨åŽ",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "å°æ´æšéŗč¨čįįæŋé˛į¨åēĻīŧæŋé˛åé¸é
æå¯čŊæåŧčĩˇéč¨īŧ",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "æ¨æēå",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "æŋé˛å",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗéåšŗčĄĄ",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "å°åšŗčĄĄčŧæåéŋäēŽįææ˛īŧåģēįĢæ´įĩąä¸įččŊéĢéŠã",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "įŠēééŗč¨", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "įŠēééŗč¨",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "å°éŗč¨é˛čĄįŠēéåčįäžčŖŊé ä¸åæ´įĢéĢįččŊéĢéŠīŧæŗ¨īŧæ¤åčŊ䏿¯åŽæšįææ¯å
¨æ¯č˛īŧ",
- // Settings - Visual
+ "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "įŠēééŗč¨ä¸å
ŧ厚æŧéŗč¨åĸåŧˇčįīŧčĢå
åį¨éŗč¨åĸåŧˇčįã",
"settings.header.visual": "å¤č§",
"settings.header.visual.description": "čĒŋæ´Ciderįå¤č§",
- "settings.option.visual.windowBackgroundStyle": "įĒåŖčæ¯æ¨Ŗåŧ", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "įĒåŖčæ¯æ¨Ŗåŧ",
"settings.header.visual.windowBackgroundStyle.none": "įŠēįŊ",
"settings.header.visual.windowBackgroundStyle.artwork": "å°čŧ¯å°éĸ",
"settings.header.visual.windowBackgroundStyle.image": "åį",
- "settings.option.visual.animatedArtwork": "åæ
å°čŧ¯å°éĸ", // Dropdown
+ "settings.option.visual.animatedArtwork": "åæ
å°čŧ¯å°éĸ",
"settings.header.visual.animatedArtwork.always": "į¸Ŋæ¯éĄ¯į¤ē",
"settings.header.visual.animatedArtwork.limited": "åĒå¨čäēēé éĸåå°čŧ¯å°éĸéĄ¯į¤ē",
"settings.header.visual.animatedArtwork.disable": "éé",
- "settings.option.visual.animatedArtworkQuality": "åæ
å°čŧ¯å°éĸåčŗĒ", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "åæ
å°čŧ¯å°éĸåčŗĒ",
"settings.header.visual.animatedArtworkQuality.low": "äŊ",
"settings.header.visual.animatedArtworkQuality.medium": "ä¸",
"settings.header.visual.animatedArtworkQuality.high": "éĢ",
"settings.header.visual.animatedArtworkQuality.veryHigh": "é常éĢ",
"settings.header.visual.animatedArtworkQuality.extreme": "æĨĩéĢ",
- "settings.option.visual.animatedWindowBackground": "åæ
įĒåŖčæ¯", // Toggle
- "settings.option.visual.hardwareAcceleration": "įĄŦéĢå é", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "åæ
įĒåŖčæ¯",
+ "settings.option.visual.hardwareAcceleration": "įĄŦéĢå é",
"settings.option.visual.hardwareAcceleration.description": "éčĻéå Cider æčŊįæ",
- "settings.header.visual.hardwareAcceleration.default": "é č¨",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "éĄ¯į¤ēåäēēæĒæĄ", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "é č¨",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "ä¸ģéĄ",
+ "settings.option.visual.theme.github.download": "äŊŋ፠Github įļ˛ååŽčŖ",
+ "settings.option.visual.theme.github.explore": "æĸį´ĸæ´å¤ä¸ģéĄ",
+ "settings.option.visual.theme.github.install.confirm": "äŊ įĸēčĒčĻåŽčŖ {{ repo }}?",
+ "settings.prompt.visual.theme.github.URL": "čĢčŧ¸å
ĨäŊ æŗčĻåŽčŖįä¸ģéĄįįļ˛å",
+ "settings.notyf.visual.theme.install.success": "æååŽčŖä¸ģéĄ",
+ "settings.notyf.visual.theme.install.error": "ä¸ģéĄåŽčŖå¤ąæ",
+ "settings.option.visual.theme.default": "é č¨",
+ "settings.option.visual.theme.dark": "å夿",
+ "settings.option.visual.showPersonalInfo": "éĄ¯į¤ēåäēēæĒæĄ",
"settings.header.lyrics": "æčŠ",
"settings.header.lyrics.description": "čĒŋæ´CiderįæčŠč¨åŽ",
- "settings.option.lyrics.enableMusixmatch": "å፠Musixmatch æčŠ", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "åį¨åĄæOKæ¨Ąåŧīŧå
éMusixmatchīŧ", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æčŠčĒč¨ååĨŊ", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "ææž MV æäŊŋ፠YouTube æčŠ", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "å፠Musixmatch æčŠ",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "åį¨åĄæOKæ¨Ąåŧīŧå
éMusixmatchīŧ",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æčŠčĒč¨ååĨŊ",
+ "settings.option.lyrics.enableYoutubeLyrics": "ææž MV æäŊŋ፠YouTube æčŠ",
"settings.header.connectivity": "å¤é¨éŖįĩ",
"settings.header.connectivity.description": "čĒŋæ´Ciderčå¤é¨įéŖįĩ",
- "settings.option.connectivity.discordRPC": "Discord įæ
", // Dropdown
- "settings.option.connectivity.playbackNotifications": "ææžéįĨ", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord įæ
",
+ "settings.option.connectivity.playbackNotifications": "ææžéįĨ",
"settings.header.connectivity.discordRPC.cider": "éĄ¯į¤ēįē'Cider'",
"settings.header.connectivity.discordRPC.appleMusic": "éĄ¯į¤ēįē'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "æĢåææ¸
é¤ Discord įæ
", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling č¨é", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble åģļé˛ (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "å፠LastFM æŖå¨ææž",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "åžæåä¸į§ģé¤åŽĸ串čäēē (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "ä¸č¨éåŽæ˛åžĒį° (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "æĢåææ¸
é¤ Discord įæ
",
+ "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling č¨é",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble åģļé˛ (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "å፠Last.fm æŖå¨ææž",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "åžæåä¸į§ģé¤åŽĸ串čäēēīŧLast.fmīŧ",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "ä¸č¨éåŽæ˛åžĒį°īŧLast.fmīŧ",
+ "settings.header.debug": "é¤é¯",
+ "settings.option.debug.copy_log": "č¤čŖŊéčĄč¨éæĒčŗåĒč˛ŧį°ŋ",
+ "settings.option.debug.openAppData": "éå Cider į¨åŧčŗæå¤ž",
"settings.header.experimental": "å¯ĻéŠæ§åčŊ",
"settings.header.experimental.description": "čĒŋæ´Ciderįå¯ĻéŠæ§åčŊ",
- "settings.option.experimental.compactUI": "įˇåå UI", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "ééæéčĄįē",
- "settings.option.experimental.closeButtonBehaviour.quit": "įĩæ Cider",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "į¸Žå°čŗåˇĨäŊå",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "į¸Žå°čŗįŗģįĩąæį¤",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.notTurnedOn": "įŠēééŗč¨åčŊčĸĢįĻį¨īŧäŊŋį¨åčĢå
åį¨ã",
- "spatial.spatialProperties" : "įŠēééŗč¨åąŦæ§",
- "spatial.width" : "éåēĻ",
- "spatial.height" : "éĢåēĻ",
- "spatial.depth" : "æˇąåēĻ",
- "spatial.gain" : "åĸį",
- "spatial.roomMaterials" : "įŠēéæčŗĒ",
- "spatial.roomDimensions" : "įŠēé大å°",
- "spatial.roomPositions" : "įŠēéäŊįŊŽ",
- "spatial.setDimensions" : "大å°č¨åŽ",
- "spatial.setPositions" : "äŊįŊŽč¨åŽ",
- "spatial.up" : "䏿š",
- "spatial.front" : "åæš",
- "spatial.left" : "åˇĻæš",
- "spatial.right" : "åŗæš",
- "spatial.back" : "åžæš",
- "spatial.down" : "䏿š",
- "spatial.listener" : "č§įž",
- "spatial.audioSource" : "éŗæē",
-
- // Settings - Unfinished
+ "settings.option.experimental.compactUI": "įˇåå UI",
+ "settings.option.experimental.close_button_hide": "äģĨééæéäžéąč Cider",
+ "spatial.notTurnedOn": "čĢå
å¨č¨åŽä¸åį¨įŠēééŗč¨ã",
+ "spatial.spatialProperties": "įŠēééŗč¨åąŦæ§",
+ "spatial.width": "éåēĻ",
+ "spatial.height": "éĢåēĻ",
+ "spatial.depth": "æˇąåēĻ",
+ "spatial.gain": "åĸį",
+ "spatial.roomMaterials": "įŠēéæčŗĒ",
+ "spatial.roomDimensions": "įŠēé大å°",
+ "spatial.roomPositions": "įŠēéäŊįŊŽ",
+ "spatial.setDimensions": "大å°č¨åŽ",
+ "spatial.setPositions": "äŊįŊŽč¨åŽ",
+ "spatial.up": "䏿š",
+ "spatial.front": "åæš",
+ "spatial.left": "åˇĻæš",
+ "spatial.right": "åŗæš",
+ "spatial.back": "åžæš",
+ "spatial.down": "䏿š",
+ "spatial.listener": "č§įž",
+ "spatial.audioSource": "éŗæē",
"settings.header.unfinished": "æĒåŽæ",
-
- // Web Remote
"remote.web.title": "é莿§åļ Cider",
"remote.web.description": "ææäģĨä¸įäēįļįĸŧäģĨæ§åļ Cider",
-
- //About
"about.thanks": "æčŦ Cider Collective äģĨåææč˛ĸįģč
æäŊåēįč˛ĸįģã"
}
\ No newline at end of file
diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.json
similarity index 78%
rename from src/i18n/zh_TW.jsonc
rename to src/i18n/zh_TW.json
index 2a608063..652c4517 100644
--- a/src/i18n/zh_TW.jsonc
+++ b/src/i18n/zh_TW.json
@@ -1,31 +1,20 @@
{
-
- // i18n Info
- "i18n.languageName": "įšéĢ䏿īŧå°įŖīŧ", // name of language in native language
- "i18n.languageNameEnglish": "Trad. Chinese (Taiwan)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@maikirakiwi @jay900604 @kyw504100", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+ "i18n.languageName": "įšéĢ䏿īŧå°įŖīŧ",
+ "i18n.languageNameEnglish": "Trad. Chinese (Taiwan)",
+ "i18n.category": "main",
+ "i18n.authors": "@maikirakiwi @jay900604 @kyw504100 @BillKerman",
"app.name": "Cider",
-
"date.format": "${y}åš´${m}æ${d}æĨ",
-
- // Dialogs
"dialog.cancel": "åæļ",
"dialog.ok": "įĸēåŽ",
-
- // Notification
"notification.updatingLibrarySongs": "æŖå¨æ´æ°čŗæåēĢįææ˛...",
"notification.updatingLibraryAlbums": "æŖå¨æ´æ°čŗæåēĢįå°čŧ¯...",
"notification.updatingLibraryArtists": "æŖå¨æ´æ°čŗæåēĢįčäēē...",
-
- // Terms
- "term.appleMusic": "Apple Music", // Follows brand term
- "term.applePodcasts": "Apple Podcasts", // Follows brand term
- "term.itunes": "iTunes", // Follows brand term
- "term.github": "GitHub", // Follows brand term
- "term.discord": "Discord", // Follows brand term
+ "term.appleMusic": "Apple Music",
+ "term.applePodcasts": "Apple Podcasts",
+ "term.itunes": "iTunes",
+ "term.github": "GitHub",
+ "term.discord": "Discord",
"term.learnMore": "æ´å¤å
厚",
"term.accountSettings": "叺æļč¨åŽ",
"term.logout": "įģåē",
@@ -33,6 +22,7 @@
"term.about": "éæŧ",
"term.privateSession": "į§äēēææŽĩ",
"term.queue": "åž
ææ¸
åŽ",
+ "term.history": "ææžæˇå˛",
"term.search": "æå°",
"term.library": "čŗæåēĢ",
"term.listenNow": "įĢåŗččŊ",
@@ -49,7 +39,7 @@
"term.newPlaylistFolder": "æ°ææžåčĄ¨čŗæå¤ž",
"term.createNewPlaylist": "æ°åĸææžå襨",
"term.createNewPlaylistFolder": "æ°åĸææžåčĄ¨čŗæå¤ž",
- "term.deletePlaylist": "æ¨įĄŽåŽčĻå é¤č¯Ĩææžå襨å?",
+ "term.deletePlaylist": "æ¨įĸēåŽčĻåĒ餿¤ææžå襨åīŧ",
"term.play": "ææž",
"term.pause": "æĢå",
"term.previous": "ä¸ä¸éĻ",
@@ -60,7 +50,7 @@
"term.mute": "ééŗ",
"term.unmute": "åæļééŗ",
"term.share": "åäēĢ",
- "term.share.success": "厞č¤čŖŊčŗåĒč˛ŧį°ŋ",
+ "term.share.success": "厞č¤čŖŊå°åĒč˛ŧį°ŋ",
"term.settings": "č¨åŽ",
"term.seeAll": "éĄ¯į¤ēå
¨é¨",
"term.sortBy": "æåē",
@@ -70,6 +60,7 @@
"term.sortBy.genre": "éŗæ¨éĸ¨æ ŧ",
"term.sortBy.releaseDate": "įŧčĄæĨæ",
"term.sortBy.duration": "æéˇ",
+ "term.sortBy.dateAdded": "æ°åĸæĨæ",
"term.sortOrder": "忝æåē",
"term.sortOrder.ascending": "ååē",
"term.sortOrder.descending": "éåē",
@@ -106,11 +97,12 @@
"term.fullscreenView": "å
¨čĸåšéĄ¯į¤ē",
"term.defaultView": "é č¨éĄ¯į¤ē",
"term.audioSettings": "éŗč¨č¨åŽ",
+ "term.audioControls": "éŗč¨æ§åļ",
"term.spacializedAudioSetting": "įŠēééŗč¨č¨åŽ",
"term.clearAll": "æ¸
įŠē",
"term.recentStations": "æčŋæļčŊįåģŖæ",
"term.language": "čĒč¨",
- "term.noLyrics": "æŖå¨čŧå
Ĩãã/ įĄæčŠįĩæ / į´éŗæ¨",
+ "term.noLyrics": "æŖå¨čŧå
Ĩ... / įĄæčŠįĩæ / į´éŗæ¨",
"term.copyright": "įæŦ螿",
"term.rightsReserved": "äŋįæææŦåŠã",
"term.sponsor": "č´åŠæå",
@@ -121,13 +113,18 @@
"term.contributors": "č˛ĸįģč
",
"term.equalizer": "įåå¨",
"term.reset": "éč¨",
- "term.tracks": "éĻææ˛", // Assume x amount of tracks. e.g. 50 tracks
+ "term.track": {
+ "one": "éĻææ˛",
+ "other": "éĻææ˛"
+ },
+ "term.tracks": "éĻææ˛",
"term.videos": "åŊąį",
"term.menu": "é¸åŽ",
"term.check": "æĒĸæĨ",
- "term.aboutArtist": "éæŧ{{artistName}}", // e.g. 'About Doja Cat'
-
- // Home
+ "term.aboutArtist": "éæŧ{{artistName}}",
+ "term.requestError": "čĢæąįŧįé¯čǤã",
+ "term.song.link.generate": "æŖå¨ååž song.link įåäēĢįļ˛å...",
+ "term.version": "įæŦ",
"home.title": "éĻé ",
"home.recentlyPlayed": "æčŋææž",
"home.recentlyAdded": "æčŋå å
Ĩ",
@@ -136,24 +133,18 @@
"home.madeForYou": "į翍æ¨čĻ",
"home.friendsListeningTo": "æåæŖå¨ččŊ",
"home.followedArtists": "čŋŊ蚤įčäēē",
-
- // Errors
"error.appleMusicSubRequired": "éčĻč¨éą Apple Music äģĨäŊŋ፠Cider",
"error.connectionError": "įĄæŗéŖæĨå° Apple Musicã",
"error.noResults": "æ˛æįĩæ",
"error.noResults.description": "åčŠĻæ°įæå°é
įŽã",
-
- // Podcasts
"podcast.followOnCider": "å¨ Cider ä¸čŋŊ蚤",
"podcast.followedOnCider": "厞čŋŊ蚤",
"podcast.subscribeOnItunes": "å¨ iTunes ä¸č¨éą",
"podcast.subscribedOnItunes": "厞č¨éą",
- "podcast.itunesStore": "iTunes Store", // Follows brand term
+ "podcast.itunesStore": "iTunes Store",
"podcast.episodes": "åŽé",
"podcast.playEpisode": "ææžåŽé",
"podcast.website": "Podcast įļ˛įĢ",
-
- // Actions
"action.addToLibrary": "å å
ĨčŗæåēĢ",
"action.addToLibrary.success": "æåå å
ĨčŗæåēĢ",
"action.addToLibrary.error": "å å
ĨčŗæåēĢįéį¨įŧįé¯čǤ",
@@ -165,7 +156,6 @@
"action.removeFromQueue": "åžåž
ææ¸
åŽåĒé¤",
"action.removeFromQueue.success": "厞åžåž
ææ¸
åŽåĒé¤",
"action.removeFromQueue.error": "åžåž
ææ¸
åŽåĒé¤įéį¨įŧįé¯čǤ",
- "action.createPlaylist": "æ°åĸææžå襨",
"action.addToPlaylist": "å å
Ĩææžå襨",
"action.removeFromPlaylist": "åžææžå襨åĒé¤",
"action.addToFavorites": "å å
Ĩæįææ",
@@ -199,29 +189,24 @@
"action.tray.show": "éĄ¯į¤ē",
"action.update": "æ´æ°",
"action.copy": "č¤čŖŊ",
- "action.newpreset": "æ°åĸé č¨", // Equalizer Preset
- "action.deletepreset": "åĒé¤é č¨", // Equalizer Preset
-
- // Settings - General
+ "action.newpreset": "æ°åĸé č¨",
+ "action.deletepreset": "åĒé¤é č¨",
+ "action.open": "éå",
"settings.header.general": "ä¸čŦ",
"settings.header.general.description": "čĒŋæ´ Cider įä¸čŦč¨åŽ",
-
- // Language optgroups
"settings.option.general.language.main": "čĒč¨",
"settings.option.general.language.fun": "įšæŽčĒč¨",
"settings.option.general.language.unsorted": "æĒåéĄ",
-
- // Update Cider
- "settings.option.general.updateCider": "æ´æ° Cider", // Button
- "settings.option.general.updateCider.branch": "Cider æ´æ°éé", // Dropdown
+ "settings.option.general.updateCider": "æ´æ° Cider",
+ "settings.option.general.updateCider.branch": "Cider æ´æ°éé",
"settings.option.general.updateCider.branch.description": "鏿æ¨čĻæĨæļ Cider čģéĢæ´æ°įéé",
"settings.option.general.updateCider.branch.main": "įŠŠåŽį(åģēč°)",
"settings.option.general.updateCider.branch.develop": "éįŧč
æ¸ŦčŠĻį(ä¸įŠŠåŽ)",
-
- // Settings - Audio
"settings.header.audio": "éŗč¨",
"settings.header.audio.description": "čĒŋæ´ Cider įéŗč¨č¨åŽ",
- "settings.option.audio.quality": "éŗč¨åčŗĒ", // Dropdown
+ "settings.option.audio.volumeStep": "éŗéæščŽé",
+ "settings.option.audio.maxVolume": "æå¤§éŗé",
+ "settings.option.audio.quality": "éŗč¨åčŗĒ",
"settings.header.audio.quality.hireslossless": "éĢåčŗĒįĄæåŖį¸Ž",
"settings.header.audio.quality.hireslossless.description": "īŧéĢé 24-bit/192 kHzīŧ",
"settings.header.audio.quality.lossless": "įĄæåŖį¸Ž",
@@ -230,113 +215,97 @@
"settings.header.audio.quality.high": "éĢåčŗĒ",
"settings.header.audio.quality.standard": "éĢæį",
"settings.header.audio.quality.auto": "čĒå",
- "settings.option.audio.seamlessTransition": "įĄéæˇææž", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "é˛ééŗč¨åčŊ", // Toggle
+ "settings.option.audio.seamlessTransition": "įĄéæˇææž",
+ "settings.option.audio.enableAdvancedFunctionality": "é˛ééŗč¨åčŊ",
"settings.option.audio.enableAdvancedFunctionality.description": "å፠AudioContext å°éåéĄäŧŧéŗč¨åšŗčĄĄåįåå¨įé˛éč¨åŽãäŊéä¸Ļä¸ä¸åŽéŠåæ¯é¨éģč
Ļīŧå¯čŊæįŧįéŗæ¨åĄé ã",
- "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider æ¸äŊåĸåŧˇéŗč¨čįâĸī¸", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider æ¸äŊåĸåŧˇéŗč¨čįâĸī¸",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "å°æŦē鍿¨į大č
ĻčŽæ¨æåå°čŋäŧŧäŋįåŖį¸ŽįéŗčŗĒã| įą Maikiwi č¨č¨",
- "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "æ¸äŊåĸåŧˇéŗč¨čįč¨åŽ", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "æ¸äŊåĸåŧˇéŗč¨čįč¨åŽ",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "å°æ´æšéŗč¨čįįæŋé˛/æ¯åĨŽį¨åēĻīŧåĸåŧˇé¸é
æå¯čŊæåŧčĩˇéč¨īŧ",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "æ¨æē",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "åĸåŧˇ",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗč¨åšŗčĄĄ", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗč¨åšŗčĄĄ",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "å°åšŗčĄĄčŧæåéŋäēŽįææ˛īŧåģēįĢæ´įĩąä¸čéŠįččŊéĢéŠã",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "įŠēééŗč¨", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "įŠēééŗč¨",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "å°éŗč¨é˛čĄįŠēéåčįäžčŖŊé ä¸åæ´įĢéĢįččŊéĢéŠīŧč¨ģīŧæ¤åčŊ䏿¯åŽæšįææ¯å
¨æ¯č˛īŧ",
-
- // Settings - Visual
"settings.header.visual": "å¤č§",
"settings.header.visual.description": "čĒŋæ´ Cider įå¤č§",
- "settings.option.visual.windowBackgroundStyle": "čĻįĒčæ¯æ¨Ŗåŧ", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "čĻįĒčæ¯æ¨Ŗåŧ",
"settings.header.visual.windowBackgroundStyle.none": "įŠēįŊ",
"settings.header.visual.windowBackgroundStyle.artwork": "å°čŧ¯å°éĸ",
"settings.header.visual.windowBackgroundStyle.image": "åį",
- "settings.option.visual.animatedArtwork": "åæ
å°čŧ¯å°éĸ", // Dropdown
+ "settings.option.visual.animatedArtwork": "åæ
å°čŧ¯å°éĸ",
"settings.header.visual.animatedArtwork.always": "į¸Ŋæ¯éĄ¯į¤ē",
"settings.header.visual.animatedArtwork.limited": "åĒå¨čäēēé éĸåå°čŧ¯å°éĸéĄ¯į¤ē",
"settings.header.visual.animatedArtwork.disable": "éé",
- "settings.option.visual.animatedArtworkQuality": "åæ
å°čŧ¯å°éĸåčŗĒ", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "åæ
å°čŧ¯å°éĸåčŗĒ",
"settings.header.visual.animatedArtworkQuality.low": "äŊ",
"settings.header.visual.animatedArtworkQuality.medium": "ä¸",
"settings.header.visual.animatedArtworkQuality.high": "éĢ",
"settings.header.visual.animatedArtworkQuality.veryHigh": "é常éĢ",
"settings.header.visual.animatedArtworkQuality.extreme": "æĨĩéĢ",
- "settings.option.visual.animatedWindowBackground": "åæ
čĻįĒ违", // Toggle
- "settings.option.visual.hardwareAcceleration": "įĄŦéĢå é", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "åæ
čĻįĒ违",
+ "settings.option.visual.hardwareAcceleration": "įĄŦéĢå é",
"settings.option.visual.hardwareAcceleration.description": "éčĻéæ°åå Cider ææåĨį¨",
"settings.header.visual.hardwareAcceleration.default": "é č¨",
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
"settings.header.visual.theme": "ä¸ģéĄ",
-
- // Settings - Visual - Theme name
+ "settings.option.visual.theme.github.download": "åž GitHub įļ˛ååŽčŖ",
+ "settings.option.visual.theme.github.explore": "įčĻŊ GitHub ä¸įä¸ģéĄ",
+ "settings.prompt.visual.theme.github.URL": "čŧ¸å
ĨäŊ čĻåŽčŖįä¸ģéĄįļ˛å",
+ "settings.notyf.visual.theme.install.success": "ä¸ģéĄæååŽčŖ",
+ "settings.notyf.visual.theme.install.error": "ä¸ģéĄåŽčŖå¤ąæ",
"settings.option.visual.theme.default": "Cider",
"settings.option.visual.theme.dark": "æé쿍Ąåŧ",
-
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "éĄ¯į¤ēåäēēæĒæĄ", // Toggle
-
- // Settings - Lyrics
+ "settings.option.visual.showPersonalInfo": "éĄ¯į¤ēåäēēæĒæĄ",
"settings.header.lyrics": "æčŠ",
"settings.header.lyrics.description": "čĒŋæ´ Cider įæčŠč¨åŽ",
- "settings.option.lyrics.enableMusixmatch": "å፠Musixmatch æčŠ", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "åį¨Kææ¨Ąåŧīŧå
éMusixmatchīŧ", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æčŠčĒč¨ååĨŊ", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "ææž MV æäŊŋ፠YouTube æčŠ", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "å፠Musixmatch æčŠ",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "åį¨Kææ¨Ąåŧīŧå
éMusixmatchīŧ",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æčŠčĒč¨ååĨŊ",
+ "settings.option.lyrics.enableYoutubeLyrics": "ææž MV æäŊŋ፠YouTube æčŠ",
"settings.header.connectivity": "å¤é¨éŖæĨ",
"settings.header.connectivity.description": "čĒŋæ´ Cider čå¤é¨įéŖæĨ",
- "settings.option.connectivity.discordRPC": "Discord åæ
", // Dropdown
- "settings.option.connectivity.playbackNotifications": "ææ˛ææžéįĨ", // Toggle
- // Refer to term.disabled for the disabled option
- "settings.header.connectivity.discordRPC.cider": "éĄ¯į¤ēæŖå¨įŠ 'Cider'",
- "settings.header.connectivity.discordRPC.appleMusic": "éĄ¯į¤ēæŖå¨įŠ 'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "æĢåææ¸
é¤ Discord åæ
", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling č¨é", // Option to Connect
+ "settings.option.connectivity.discordRPC": "Discord åæ
",
+ "settings.option.connectivity.playbackNotifications": "ææ˛ææžéįĨ",
+ "settings.header.connectivity.discordRPC.cider": "éĄ¯į¤ēæŖå¨äŊŋ፠'Cider'",
+ "settings.header.connectivity.discordRPC.appleMusic": "éĄ¯į¤ēæŖå¨äŊŋ፠'Apple Music'",
+ "settings.option.connectivity.discordRPC.clearOnPause": "æĢåææ¸
é¤ Discord åæ
",
+ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling č¨é",
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble åģļé˛ (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "å፠LastFM įŽåččŊ", // Toggle
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "åžæåä¸į§ģé¤åŽĸ串čäēē (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "ä¸č¨éåŽæ˛åžĒį° (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "å፠LastFM įŽåččŊ",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "åžæåä¸į§ģé¤åŽĸ串čäēē (LastFM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "ä¸č¨éåŽæ˛åžĒį° (LastFM)",
+ "settings.header.debug": "é¤é¯",
+ "settings.option.debug.copy_log": "č¤čŖŊåˇčĄį´éæĒčŗåĒč˛ŧį°ŋ",
+ "settings.option.debug.openAppData": "æé Cider čŗæå¤ž",
"settings.header.experimental": "å¯ĻéŠæ§åčŊ",
"settings.header.experimental.description": "čĒŋæ´ Cider įå¯ĻéŠæ§åčŊ",
- "settings.option.experimental.compactUI": "äŊŋį¨įˇå¯įäģéĸč¨č¨", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "ééæéæäŊ", // Dropdown
+ "settings.option.experimental.compactUI": "äŊŋį¨įˇå¯įäģéĸč¨č¨",
+ "settings.option.experimental.closeButtonBehaviour": "ééæéæäŊ",
"settings.option.experimental.close_button_hide": "ééæéå° Cider éąččŗįŗģįĩąå",
- "settings.option.experimental.copy_log": "č¤čŖŊåˇčĄį´éæĒčŗåĒč˛ŧį°ŋ",
"settings.option.experimental.inline_playlists": "å°ææžå襨åįēčĄå
å
į´ éĄ¯į¤ē",
-
- // Refer to term.disabled & term.enabled
- // Spatialization Menu
"spatial.notTurnedOn": "įŠēééŗč¨įŽåæ¯ééįæ
īŧčĢå
åį¨åäŊŋį¨ã",
- "spatial.spatialProperties" : "įŠēééŗč¨åąŦæ§č¨åŽ",
- "spatial.width" : "å¯ŦåēĻ",
- "spatial.height" : "éĢåēĻ",
- "spatial.depth" : "æˇąåēĻ",
- "spatial.gain" : "åĸį",
- "spatial.roomMaterials" : "įŠēéæčŗĒ",
- "spatial.roomDimensions" : "įŠēéå°ē寸",
- "spatial.roomPositions" : "įŠēéäŊįŊŽ",
- "spatial.setDimensions" : "č¨åŽå°ē寸",
- "spatial.setPositions" : "åĨį¨č¨åŽ",
- "spatial.up" : "ä¸",
- "spatial.front" : "å",
- "spatial.left" : "åˇĻ",
- "spatial.right" : "åŗ",
- "spatial.back" : "åž",
- "spatial.down" : "ä¸",
- "spatial.listener" : "čŊčĄ",
- "spatial.audioSource" : "éŗč¨äžæē",
-
- // Settings - Unfinished
+ "spatial.spatialProperties": "įŠēééŗč¨åąŦæ§č¨åŽ",
+ "spatial.width": "å¯ŦåēĻ",
+ "spatial.height": "éĢåēĻ",
+ "spatial.depth": "æˇąåēĻ",
+ "spatial.gain": "åĸį",
+ "spatial.roomMaterials": "įŠēéæčŗĒ",
+ "spatial.roomDimensions": "įŠēéå°ē寸",
+ "spatial.roomPositions": "įŠēéäŊįŊŽ",
+ "spatial.setDimensions": "č¨åŽå°ē寸",
+ "spatial.setPositions": "åĨį¨č¨åŽ",
+ "spatial.up": "ä¸",
+ "spatial.front": "å",
+ "spatial.left": "åˇĻ",
+ "spatial.right": "åŗ",
+ "spatial.back": "åž",
+ "spatial.down": "ä¸",
+ "spatial.listener": "čŊčĄ",
+ "spatial.audioSource": "éŗč¨äžæē",
"settings.header.unfinished": "æĒéįŧåŽæįåčŊ",
-
- // Web Remote
"remote.web.title": "Cider é įĢ¯ææ§",
"remote.web.description": "ææäģĨä¸įčĄåæĸįĸŧäģĨææ§ Cider",
-
- //About
"about.thanks": "čéæčŦ Cider Collective įæåĄäģĨåææįēé
įŽäģåēįč˛ĸįģč
ã"
}
diff --git a/src/i18n/zh_yue.jsonc b/src/i18n/zh_yue.json
similarity index 74%
rename from src/i18n/zh_yue.jsonc
rename to src/i18n/zh_yue.json
index 41abc873..0e3bbe24 100644
--- a/src/i18n/zh_yue.jsonc
+++ b/src/i18n/zh_yue.json
@@ -1,25 +1,15 @@
{
-
- // i18n Info
- "i18n.languageName": "åģŖæąčŠąīŧéĻæ¸¯īš", // name of language in native language
- "i18n.languageNameEnglish": "Cantonese (Hong Kong)", // name of language in English
- "i18n.category": "main", // main = real language, fun = fun community languages
- "i18n.authors": "@tszngaiyip @strikesnc", // Authors, if you contribute to this file feel free to add your name seperated with a space
-
- // App info
+ "i18n.languageName": "åģŖæąčŠąīŧéĻæ¸¯īŧ",
+ "i18n.languageNameEnglish": "Cantonese (Hong Kong)",
+ "i18n.category": "main",
+ "i18n.authors": "@tszngaiyip @strikesnc",
"app.name": "Cider",
-
"date.format": "${y}åš´${m}æ${d}æĨ",
-
- // Dialogs
"dialog.cancel": "åæļ",
"dialog.ok": "įĸēčĒ",
-
- // Notification
"notification.updatingLibrarySongs": "æ´æ°įˇčŗæåēĢå
ææ˛...",
"notification.updatingLibraryAlbums": "æ´æ°įˇčŗæåēĢå
å°čŧ¯...",
"notification.updatingLibraryArtists": "æ´æ°įˇčŗæåēĢå
čäēē...",
- // Terms
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
@@ -33,6 +23,7 @@
"term.about": "éæŧ",
"term.privateSession": "įĄįæ¨Ąåŧ",
"term.queue": "åž
ææ¸
åŽ",
+ "term.history": "ææžæˇå˛",
"term.search": "æĩé",
"term.library": "čŗæåēĢ",
"term.listenNow": "åŗåģčŊ",
@@ -45,6 +36,11 @@
"term.podcasts": "Podcasts",
"term.playlists": "ææžæ¸
åŽ",
"term.playlist": "ææžæ¸
åŽ",
+ "term.newPlaylist": "æ°ææžæ¸
åŽ",
+ "term.newPlaylistFolder": "æ°čŗæå¤ž",
+ "term.createNewPlaylist": "æ°åĸææžæ¸
åŽ",
+ "term.createNewPlaylistFolder": "æ°åĸčŗæå¤ž",
+ "term.deletePlaylist": "äŊ äŋåĒčĻåĒé¤åĸåææžæ¸
åŽīŧ",
"term.play": "ææž",
"term.pause": "æĢå",
"term.previous": "åä¸éĻ",
@@ -55,6 +51,7 @@
"term.mute": "ééŗ",
"term.unmute": "åæļééŗ",
"term.share": "åäēĢ",
+ "term.share.success": "č¤čŖŊååēåĒč˛ŧį°ŋ",
"term.settings": "č¨åŽ",
"term.seeAll": "įåå
¨é¨",
"term.sortBy": "æåē",
@@ -86,10 +83,10 @@
"term.less": "å°å˛",
"term.showMore": "éĄ¯į¤ēå¤å˛",
"term.showLess": "éĄ¯į¤ēå°å˛",
- "term.topSongs" : "įąéææ˛",
+ "term.topSongs": "įąéææ˛",
"term.latestReleases": "ææ°åēå
",
"term.time.added": "å å
Ĩæŧ",
- "term.time.released": "įŧčĄæŧ",
+ "term.time.released": "įŧčĄæŧ",
"term.time.updated": "æ´æ°æŧ",
"term.time.hours": "į˛é",
"term.time.hour": "į˛é",
@@ -115,12 +112,23 @@
"term.contributors": "åäŊäēē",
"term.equalizer": "åčĄĄå¨ (EQ)",
"term.reset": "éč¨",
- "term.tracks": "éĻæ", // Assume x amount of tracks. e.g. 50 tracks
- "term.videos": "åŊąį",
- "term.menu": "é¸é
",
- "term.showAlbum": "éĄ¯į¤ēåŽæ´å
å°čŧ¯",
-
- // Home
+ "term.tracks": "éĻæ",
+ "term.videos": "åŊąį",
+ "term.menu": "é¸é
",
+ "term.check": "æĒĸæĨ",
+ "term.aboutArtist": "éæŧ {{artistName}}",
+ "term.topResult": "įąéæå°įĩæ",
+ "term.sharedPlaylists": "ææžæ¸
åŽ",
+ "term.people": "åäēēæĒæĄ",
+ "term.newpreset.name": "æ°EQ᝿Ŧå
å",
+ "term.addedpreset": "æ°åĸå",
+ "term.deletepreset.warn": "äŊ äŋåĒčĻåĒé¤åĸå᝿Ŧīŧ",
+ "term.deletedpreset": "åĒé¤å",
+ "term.musicVideos": "MV",
+ "term.stations": "éģå°",
+ "term.radioShows": "éģå°åŽé",
+ "term.recordLabels": "åąįå
Ŧå¸",
+ "term.videoExtras": "į¸éå
į",
"home.title": "ä¸ģé ",
"home.recentlyPlayed": "åĸææåˇĻ",
"home.recentlyAdded": "åĸæå å
",
@@ -129,13 +137,10 @@
"home.madeForYou": "įēäŊ čæ´",
"home.friendsListeningTo": "äŊ å˛FriendčŊįˇ",
"home.followedArtists": "FollowåˇĻå
čäēē",
- // Errors
"error.appleMusicSubRequired": "éčĻč¨éąApple Musicå
å¯äģĨį¨Ciderã",
"error.connectionError": "éŖæĨåå°Apple Musicã",
"error.noResults": "åįĩæã",
"error.noResults.description": "éæ°æĩéåĻã",
-
- //Podcasts
"podcast.followOnCider": "åēCiderä¸Follow",
"podcast.followedOnCider": "åēCiderä¸FollowåˇĻ",
"podcast.subscribeOnItunes": "åēiTunesä¸č¨éą",
@@ -144,8 +149,6 @@
"podcast.episodes": "åŽé",
"podcast.playEpisode": "æåĸé",
"podcast.website": "Podcast įļ˛é ",
-
- // Actions
"action.addToLibrary": "å å
ĨčŗæåēĢ",
"action.addToLibrary.success": "å å
ĨåčŗæåēĢ",
"action.addToLibrary.error": "å å
Ĩåå°čŗæåēĢ",
@@ -185,117 +188,103 @@
"action.removeTracks": "åēåž
ææ¸
åŽå°åĒé¤ ${self.selectedItems.length} éĻææ˛",
"action.import": "å¯å
Ĩ",
"action.export": "å¯åē",
-
- // Settings - General
+ "action.showAlbum": "éĄ¯į¤ēåŽæ´å
å°čŧ¯",
+ "action.tray.minimize": "æļååēįŗģįĩąæį¤",
+ "action.tray.quit": "įĩæ",
+ "action.tray.show": "éĄ¯į¤ē",
+ "action.update": "æ´æ°",
+ "action.copy": "č¤čŖŊ",
+ "action.newpreset": "æ°åĸ᝿Ŧ",
+ "action.deletepreset": "åĒé¤į¯æŦ",
"settings.header.general": "ä¸čŦ",
"settings.header.general.description": "čĒŋæ´Ciderå
ä¸čŦč¨åŽ",
"settings.option.general.language": "čĒč¨",
-
- // Language optgroups
"settings.option.general.language.main": "čĒč¨",
"settings.option.general.language.fun": "æĄæčĒč¨",
"settings.option.general.language.unsorted": "æĒåéĄ",
-
- // Settings - Audio
+ "settings.option.general.updateCider": "æ´æ° Cider",
"settings.header.audio": "éŗč¨",
"settings.header.audio.description": "čĒŋæ´Ciderå
éŗč¨č¨åŽ",
- "settings.option.audio.quality": "éŗčŗĒ", // Dropdown
+ "settings.option.audio.quality": "éŗčŗĒ",
"settings.header.audio.quality.high": "čŗĒį´ åĒå
",
"settings.header.audio.quality.low": "æĩæĸåēĻåĒå
",
"settings.header.audio.quality.auto": "čĒå",
- "settings.option.audio.seamlessTransition": "įĄį¸Ģææž", // Toggle
- "settings.option.audio.enableAdvancedFunctionality": "é˛éåčŊ", // Toggle
+ "settings.option.audio.seamlessTransition": "įĄį¸Ģææž",
+ "settings.option.audio.enableAdvancedFunctionality": "é˛éåčŊ",
"settings.option.audio.enableAdvancedFunctionality.description": "åį¨AudioContextīŧč§ŖééĄäŧŧéŗéåšŗčĄĄåå襥å¨å
é˛éåčŊīŧäŊäŋæåēé¨åéģč
Ļé æéŗæ¨LagæŠã",
- "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗéåšŗčĄĄ", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "éŗéåšŗčĄĄ",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "åšŗčĄĄčŧæåéŋäēŽå
ææ˛īŧäģ¤äŊ æįĩąä¸å
ččŊéĢéŠã",
- "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "įŠēééŗč¨", // Toggle
+ "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "įŠēééŗč¨",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "įŠēéåéŗč¨īŧčŖŊé ä¸åæ´įĢéĢå
ččŊéĢéŠīŧæŗ¨æīŧåĸååčŊåäŋåŽæšå
ææ¯å
¨æ¯č˛īŧ",
- // Settings - Visual
- "settings.header.visual": "å¤č§",
+ "settings.header.visual": "å¤č§",
"settings.header.visual.description": "čĒŋæ´Ciderå
å¤č§",
- "settings.option.visual.windowBackgroundStyle": "čĻįĒčæ¯æ¨Ŗåŧ", // Toggle
+ "settings.option.visual.windowBackgroundStyle": "čĻįĒčæ¯æ¨Ŗåŧ",
"settings.header.visual.windowBackgroundStyle.none": "įŠēįŊ",
"settings.header.visual.windowBackgroundStyle.artwork": "å°čŧ¯å°éĸ",
"settings.header.visual.windowBackgroundStyle.image": "åį",
- "settings.option.visual.animatedArtwork": "åæ
å°čŧ¯å°éĸ", // Dropdown
+ "settings.option.visual.animatedArtwork": "åæ
å°čŧ¯å°éĸ",
"settings.header.visual.animatedArtwork.always": "į¸Ŋæ¯éĄ¯į¤ē",
"settings.header.visual.animatedArtwork.limited": "æˇ¨äŋåēčäēēé éĸåå°čŧ¯å°éĸéĄ¯į¤ē",
"settings.header.visual.animatedArtwork.disable": "įåˇĻäŊĸ",
- "settings.option.visual.animatedArtworkQuality": "åæ
å°čŧ¯å°éĸåčŗĒ", // Dropdown
+ "settings.option.visual.animatedArtworkQuality": "åæ
å°čŧ¯å°éĸåčŗĒ",
"settings.header.visual.animatedArtworkQuality.low": "äŊ",
"settings.header.visual.animatedArtworkQuality.medium": "ä¸",
"settings.header.visual.animatedArtworkQuality.high": "éĢ",
"settings.header.visual.animatedArtworkQuality.veryHigh": "é常éĢ",
"settings.header.visual.animatedArtworkQuality.extreme": "æĨĩéĢ",
- "settings.option.visual.animatedWindowBackground": "åæ
čĻįĒ违", // Toggle
- "settings.option.visual.hardwareAcceleration": "įĄŦéĢå é", // Dropdown
+ "settings.option.visual.animatedWindowBackground": "åæ
čĻįĒ违",
+ "settings.option.visual.hardwareAcceleration": "įĄŦéĢå é",
"settings.option.visual.hardwareAcceleration.description": "éčĻééCiderå
æįæ",
- "settings.header.visual.hardwareAcceleration.default": "é č¨",
- "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
- // Refer to term.disabled for the disabled option
- "settings.option.visual.showPersonalInfo": "éĄ¯į¤ēåäēēæĒæĄ", // Toggle
-
- // Settings - Lyrics
+ "settings.header.visual.hardwareAcceleration.default": "é č¨",
+ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
+ "settings.header.visual.theme": "ä¸ģéĄ",
+ "settings.option.visual.theme.default": "é č¨",
+ "settings.option.visual.theme.dark": "éģč˛",
+ "settings.option.visual.showPersonalInfo": "éĄ¯į¤ēåäēēæĒæĄ",
"settings.header.lyrics": "æčŠ",
"settings.header.lyrics.description": "čĒŋæ´Ciderå
æčŠč¨åŽ",
- "settings.option.lyrics.enableMusixmatch": "å፠Musixmatch æčŠ", // Toggle
- "settings.option.lyrics.enableMusixmatchKaraoke": "éååąKæ¨Ąåŧīŧå
éMusixmatch)", // Toggle
- "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æčŠčĒč¨ååĨŊ", // Dropdown
- "settings.option.lyrics.enableYoutubeLyrics": "ææžMVå
æåį¨YouTubeååš", // Toggle
-
- // Settings - Connectivity
+ "settings.option.lyrics.enableMusixmatch": "å፠Musixmatch æčŠ",
+ "settings.option.lyrics.enableMusixmatchKaraoke": "éååąKæ¨Ąåŧīŧå
éMusixmatch)",
+ "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch æčŠčĒč¨ååĨŊ",
+ "settings.option.lyrics.enableYoutubeLyrics": "ææžMVå
æåį¨YouTubeååš",
"settings.header.connectivity": "å¤é¨éŖįĩ",
"settings.header.connectivity.description": "čĒŋæ´Cideråå¤é¨å
éŖįĩ",
- "settings.option.connectivity.discordRPC": "Discord įæ
", // Dropdown
- "settings.option.connectivity.playbackNotifications": "åēææå
æåéįĨäŊ ", // Toggle
- // Refer to term.disabled for the disabled option
+ "settings.option.connectivity.discordRPC": "Discord įæ
",
+ "settings.option.connectivity.playbackNotifications": "åēææå
æåéįĨäŊ ",
"settings.header.connectivity.discordRPC.cider": "éĄ¯į¤ēįē'Cider'",
"settings.header.connectivity.discordRPC.appleMusic": "éĄ¯į¤ēįē'Apple Music'",
- "settings.option.connectivity.discordRPC.clearOnPause": "æĢåææ¸
é¤ Discord įæ
", // Toggle
- "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling č¨é", // Option to Connect
- "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble åģļé˛ (%)",
- "settings.option.connectivity.lastfmScrobble.nowPlaying": "å፠LastFM æŖå¨ææž",
- "settings.option.connectivity.lastfmScrobble.removeFeatured": "åžæåä¸į§ģé¤čäē翍čĻ (LastFM)",
- "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (LastFM)",
- // Refer to term.connect for the connect button
-
- // Settings - Experimental
+ "settings.option.connectivity.discordRPC.clearOnPause": "æĢåææ¸
é¤ Discord įæ
",
+ "settings.option.connectivity.lastfmScrobble": "Last.FM Scrobbling č¨é",
+ "settings.option.connectivity.lastfmScrobble.delay": "Last.FM Scrobble åģļé˛ (%)",
+ "settings.option.connectivity.lastfmScrobble.nowPlaying": "å፠Last.FM æŖå¨ææž",
+ "settings.option.connectivity.lastfmScrobble.removeFeatured": "åžæåä¸į§ģé¤čäē翍čĻ (Last.FM)",
+ "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.FM)",
"settings.header.experimental": "å¯ĻéŠæ§åčŊ",
"settings.header.experimental.description": "čĒŋæ´Ciderå
å¯ĻéŠæ§åčŊ",
- "settings.option.experimental.compactUI": "éŧ垿ĸ UI", // Toggle
- "settings.option.experimental.closeButtonBehaviour": "ééæéčĄįē",
- "settings.option.experimental.closeButtonBehaviour.quit": "įåˇĻCideräŊĸ",
- "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "æļåCideråēåˇĨäŊå",
- "settings.option.experimental.closeButtonBehaviour.minimizeTray": "æļåCideråēįŗģįĩąæį¤",
- // Refer to term.disabled & term.enabled
-
- // Spatialization Menu
- "spatial.spatialProperties" : "įŠēééŗč¨åąŦæ§",
- "spatial.width" : "åšžé",
- "spatial.height" : "åšžéĢ",
- "spatial.depth" : "åšžæˇą",
- "spatial.gain" : "åĸį",
- "spatial.roomMaterials" : "įŠēéæčŗĒ",
- "spatial.roomDimensions" : "įŠēé大å°",
- "spatial.roomPositions" : "įŠēéäŊįŊŽ",
- "spatial.setDimensions" : "大å°č¨åŽ",
- "spatial.setPositions" : "äŊįŊŽč¨åŽ",
- "spatial.up" : "ä¸éĸ",
- "spatial.front" : "åéĸ",
- "spatial.left" : "åˇĻé",
- "spatial.right" : "åŗé",
- "spatial.back" : "åžéĸ",
- "spatial.down" : "ä¸éĸ",
- "spatial.listener" : "č§įž",
- "spatial.audioSource" : "éŗæē",
-
- // Settings - Unfinished
+ "settings.option.experimental.compactUI": "éŧ垿ĸ UI",
+ "settings.option.experimental.close_button_hide": "ãŠäē¤ååļåéąč Cider",
+ "settings.option.experimental.copy_log": "å°logč¤čŖŊåēåĒč˛ŧį°ŋ",
+ "spatial.notTurnedOn": "å芲åēč¨åŽå
Ĩéĸåį¨åˇĻįŠēééŗč¨å
ã",
+ "spatial.spatialProperties": "įŠēééŗč¨åąŦæ§",
+ "spatial.width": "åšžé",
+ "spatial.height": "åšžéĢ",
+ "spatial.depth": "åšžæˇą",
+ "spatial.gain": "åĸį",
+ "spatial.roomMaterials": "įŠēéæčŗĒ",
+ "spatial.roomDimensions": "įŠēé大å°",
+ "spatial.roomPositions": "įŠēéäŊįŊŽ",
+ "spatial.setDimensions": "大å°č¨åŽ",
+ "spatial.setPositions": "äŊįŊŽč¨åŽ",
+ "spatial.up": "ä¸éĸ",
+ "spatial.front": "åéĸ",
+ "spatial.left": "åˇĻé",
+ "spatial.right": "åŗé",
+ "spatial.back": "åžéĸ",
+ "spatial.down": "ä¸éĸ",
+ "spatial.listener": "č§įž",
+ "spatial.audioSource": "éŗæē",
"settings.header.unfinished": "æĒææ",
-
- // Web Remote
"remote.web.title": "é莿§åļ Cider",
"remote.web.description": "Scan åĸå QR Code åģæ§åļ Cider",
-
- // About
"about.thanks": "å¤čŦ Cider Collective ååææåäŊäēēäŊåēå
č˛ĸįģã"
}
diff --git a/src/main/base/app.ts b/src/main/base/app.ts
index b6415152..4ce18bd9 100644
--- a/src/main/base/app.ts
+++ b/src/main/base/app.ts
@@ -1,7 +1,15 @@
-import {app, Menu, nativeImage, Tray} from 'electron';
+import {app, Menu, nativeImage, Tray, ipcMain, clipboard, shell} from 'electron';
+import {readFileSync} from "fs";
import * as path from 'path';
-import {utils} from './utils'
+import * as log from 'electron-log';
+import {utils} from './utils';
+/**
+ * @file Creates App instance
+ * @author CiderCollective
+ */
+
+/** @namespace */
export class AppEvents {
private protocols: string[] = [
"ame",
@@ -15,6 +23,7 @@ export class AppEvents {
private tray: any = undefined;
private i18n: any = undefined;
+ /** @constructor */
constructor() {
this.start();
}
@@ -24,6 +33,7 @@ export class AppEvents {
* @returns {void}
*/
private start(): void {
+ AppEvents.initLogging()
console.info('[AppEvents] App started');
/**********************************************************************************************************************
@@ -87,6 +97,7 @@ export class AppEvents {
/***********************************************************************************************************************
* Protocols
**********************************************************************************************************************/
+ /** */
if (process.defaultApp) {
if (process.argv.length >= 2) {
this.protocols.forEach((protocol: string) => {
@@ -120,6 +131,13 @@ export class AppEvents {
}
})
+ if (process.platform === "darwin") {
+ app.setUserActivity('8R23J2835D.com.ciderapp.webremote.play', {
+ title: 'Web Remote',
+ description: 'Connect to your Web Remote',
+ }, "https://webremote.cider.sh")
+ }
+
this.InstanceHandler()
this.InitTray()
}
@@ -169,6 +187,18 @@ export class AppEvents {
let url = arg.split('//')[1]
console.warn(`[LinkHandler] Attempting to load url: ${url}`);
utils.getWindow().webContents.send('play', 'url', url)
+ } else if (arg.includes('/debug/appdata')) {
+ shell.openPath(app.getPath('userData'))
+ } else if (arg.includes('/debug/logs')) {
+ shell.openPath(app.getPath('logs'))
+ } else if (arg.includes('/discord')) {
+ shell.openExternal('https://discord.gg/applemusic')
+ } else if (arg.includes('/github')) {
+ shell.openExternal('https://github.com/ciderapp/cider')
+ } else if (arg.includes('/donate')) {
+ shell.openExternal('https://opencollective.com/ciderapp')
+ } else if (arg.includes('/beep')) {
+ shell.beep()
}
}
@@ -197,6 +227,7 @@ export class AppEvents {
app.quit()
} else if (utils.getWindow()) {
if (utils.getWindow().isMinimized()) utils.getWindow().restore()
+ utils.getWindow().show()
utils.getWindow().focus()
}
})
@@ -264,7 +295,7 @@ export class AppEvents {
const menu = Menu.buildFromTemplate([
{
- label: (visible ? this.i18n['action.tray.minimize'] : this.i18n['action.tray.show'].includes("{appName}") ? `${this.i18n['action.tray.show'].replace("{appName}", app.getName())}` : `${this.i18n['action.tray.show']} ${app.getName()}`),
+ label: (visible ? this.i18n['action.tray.minimize'] : `${this.i18n['action.tray.show']} ${app.getName()}`),
click: () => {
if (utils.getWindow()) {
if (visible) {
@@ -284,4 +315,18 @@ export class AppEvents {
])
this.tray.setContextMenu(menu)
}
+
+ /**
+ * Initializes logging in the application
+ * @private
+ */
+ private static initLogging() {
+ log.transports.console.format = '[{h}:{i}:{s}.{ms}] [{level}] {text}';
+ Object.assign(console, log.functions);
+
+ ipcMain.on('fetch-log', (_event) => {
+ const data = readFileSync(log.transports.file.getFile().path, {encoding: 'utf8', flag: 'r'});
+ clipboard.writeText(data)
+ })
+ }
}
diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts
index d7729c16..48936ec7 100644
--- a/src/main/base/browserwindow.ts
+++ b/src/main/base/browserwindow.ts
@@ -1,43 +1,221 @@
-import * as path from "path";
-import {app, BrowserWindow as bw, ipcMain, shell} from "electron";
+import {join} from "path";
+import {app, BrowserWindow as bw, ipcMain, ShareMenu, shell} from "electron";
import * as windowStateKeeper from "electron-window-state";
import * as express from "express";
import * as getPort from "get-port";
-import * as yt from "youtube-search-without-api-key";
-import * as fs from "fs";
+import {search} from "youtube-search-without-api-key";
+import {existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, statSync} from "fs";
import {Stream} from "stream";
-import * as qrcode from "qrcode-terminal";
-import * as os from "os";
+import {networkInterfaces} from "os";
import * as mm from 'music-metadata';
import fetch from 'electron-fetch'
import {wsapi} from "./wsapi";
-import {jsonc} from "jsonc";
-import {NsisUpdater} from "electron-updater";
-import {utils} from './utils'
+import {AppImageUpdater, NsisUpdater} from "electron-updater";
+import {utils} from './utils';
+import {Plugins} from "./plugins";
+const fileWatcher = require('chokidar');
+const AdmZip = require("adm-zip");
+
+/**
+ * @file Creates the BrowserWindow
+ * @author CiderCollective
+ */
+
+/** @namespace */
export class BrowserWindow {
public static win: any | undefined = null;
private devMode: boolean = !app.isPackaged;
- private paths: any = {
- srcPath: path.join(__dirname, "../../src"),
- resourcePath: path.join(__dirname, "../../resources"),
- ciderCache: path.resolve(app.getPath("userData"), "CiderCache"),
- themes: path.resolve(app.getPath("userData"), "Themes"),
- plugins: path.resolve(app.getPath("userData"), "Plugins"),
- };
private audioStream: any = new Stream.PassThrough();
+ private headerSent: any = false;
+ private chromecastIP: any = [];
private clientPort: number = 0;
private remotePort: number = 6942;
private EnvironmentVariables: object = {
env: {
platform: process.platform,
dev: app.isPackaged,
+ components: [
+ "pages/podcasts",
+ "pages/apple-account-settings",
+ "pages/library-songs",
+ "pages/library-albums",
+ "pages/browse",
+ "pages/settings",
+ "pages/listen_now",
+ "pages/home",
+ "pages/artist-feed",
+ "pages/cider-playlist",
+ "pages/playlist-inline",
+ "pages/recordLabel",
+ "pages/collection-list",
+ "pages/apple-curator",
+ "pages/artist",
+ "pages/search",
+ "pages/about",
+ "pages/library-videos",
+ "pages/remote-pair",
+ "pages/themes-github",
+ "pages/plugins-github",
+ "pages/replay",
+ "pages/audiolabs",
+ "pages/zoo",
+ "pages/plugin-renderer",
+ "components/mediaitem-artwork",
+ "components/artwork-material",
+ "components/menu-panel",
+ "components/sidebar-playlist",
+ "components/spatial-properties",
+ "components/audio-settings",
+ "components/plugin-menu",
+ "components/audio-controls",
+ "components/qrcode-modal",
+ "components/equalizer",
+ "components/add-to-playlist",
+ "components/queue",
+ "components/mediaitem-scroller-horizontal",
+ "components/mediaitem-scroller-horizontal-large",
+ "components/mediaitem-scroller-horizontal-sp",
+ "components/mediaitem-scroller-horizontal-mvview",
+ "components/mediaitem-list-item",
+ "components/mediaitem-hrect",
+ "components/mediaitem-square",
+ "components/mediaitem-mvview",
+ "components/libraryartist-item",
+ "components/listennow-child",
+ "components/mediaitem-mvview-sp",
+ "components/animatedartwork-view",
+ "components/listitem-horizontal",
+ "components/lyrics-view",
+ "components/fullscreen",
+ "components/miniplayer",
+ "components/castmenu",
+ "components/artist-chip",
+ "components/hello-world",
+ ],
+ appRoutes: [
+ {
+ page: "plugin-renderer",
+ component: ` `,
+ condition: "page == 'plugin-renderer'"
+ },
+ {
+ page: "zoo",
+ component: " ",
+ condition: "page == 'zoo'"
+ },
+ {
+ page: "podcasts",
+ component: ` `,
+ condition: `page == 'podcasts'`
+ }, {
+ page: "library-videos",
+ component: ` `,
+ condition: `page == 'library-videos'`
+ }, {
+ page: "apple-account-settings",
+ component: ` `,
+ condition: `page == 'apple-account-settings'`
+ }, {
+ page: "about",
+ component: ` `,
+ condition: `page == 'about'`
+ }, {
+ page: "cider-artist",
+ component: ` `,
+ condition: `page == 'artist-page' && artistPage.data.attributes`
+ }, {
+ page: "collection-list",
+ component: ` `,
+ condition: `page == 'collection-list'`
+ }, {
+ page: "home",
+ component: ` `,
+ condition: `page == 'home'`
+ }, {
+ page: "artist-feed",
+ component: ` `,
+ condition: `page == 'artist-feed'`
+ }, {
+ page: "playlist-inline",
+ component: ` `,
+ condition: `modals.showPlaylist`
+ }, {
+ page: "playlist_",
+ component: ` `,
+ condition: `page.includes('playlist_')`
+ }, {
+ page: "album_",
+ component: ` `,
+ condition: `page.includes('album_')`
+ }, {
+ page: "recordLabel_",
+ component: ` `,
+ condition: `page.includes('recordLabel_')`
+ }, {
+ page: "curator_",
+ component: ` `,
+ condition: `page.includes('curator_')`
+ }, {
+ page: "browsepage",
+ component: ` `,
+ condition: `page == 'browse'`,
+ onEnter: `getBrowsePage();`
+ }, {
+ page: "listen_now",
+ component: ` `,
+ condition: `page == 'listen_now'`,
+ onEnter: `getListenNow()`
+ }, {
+ page: "settings",
+ component: ` `,
+ condition: `page == 'settings'`
+ }, {
+ page: "search",
+ component: ` `,
+ condition: `page == 'search'`
+ }, {
+ page: "library-songs",
+ component: ` `,
+ condition: `page == 'library-songs'`,
+ onEnter: `getLibrarySongsFull()`
+ }, {
+ page: "library-albums",
+ component: ` `,
+ condition: `page == 'library-albums'`,
+ onEnter: `getLibraryAlbumsFull(null, 1); getAlbumSort(); searchLibraryAlbums(1);`
+ }, {
+ page: "appleCurator",
+ component: ` `,
+ condition: `page.includes('appleCurator')`
+ }, {
+ page: "themes-github",
+ component: ` `,
+ condition: `page == 'themes-github'`
+ }, {
+ page: "plugins-github",
+ component: ` `,
+ condition: `page == 'plugins-github'`
+ }, {
+ page: "remote-pair",
+ component: ` `,
+ condition: `page == 'remote-pair'`
+ }, {
+ page: "audiolabs",
+ component: ` `,
+ condition: `page == 'audiolabs'`
+ }, {
+ page: "replay",
+ component: ` `,
+ condition: `page == 'replay'`
+ }
+ ]
},
};
private options: any = {
- icon: path.join(
- this.paths.resourcePath,
+ icon: join(
+ utils.getPath('resourcePath'),
`icons/icon.` + (process.platform === "win32" ? "ico" : "png")
),
width: 1024,
@@ -48,12 +226,12 @@ export class BrowserWindow {
minHeight: 390,
frame: false,
title: "Cider",
- vibrancy: "dark",
- transparent: process.platform === "darwin",
- hasShadow: false,
show: false,
- backgroundColor: "#1E1E1E",
+ // backgroundColor: "#1E1E1E",
+ titleBarStyle: 'hidden',
+ trafficLightPosition: {x: 15, y: 20},
webPreferences: {
+ experimentalFeatures: true,
nodeIntegration: true,
sandbox: true,
allowRunningInsecureContent: true,
@@ -62,30 +240,102 @@ export class BrowserWindow {
plugins: true,
nodeIntegrationInWorker: false,
webSecurity: false,
- preload: path.join(this.paths.srcPath, "./preload/cider-preload.js"),
+ preload: join(utils.getPath('srcPath'), "./preload/cider-preload.js"),
},
};
+ StartWatcher(path: string) {
+ var chokidar = require("chokidar");
+
+ var watcher = chokidar.watch(path, {
+ ignored: /[\/\\]\./,
+ persistent: true
+ });
+
+ function onWatcherReady() {
+ console.info('From here can you check for real changes, the initial scan has been completed.');
+ }
+
+ // Declare the listeners of the watcher
+ watcher
+ .on('add', function (path: string) {
+ // console.log('File', path, 'has been added');
+ })
+ .on('addDir', function (path: string) {
+ // console.log('Directory', path, 'has been added');
+ })
+ .on('change', function (path: string) {
+ console.log('File', path, 'has been changed');
+ BrowserWindow.win.webContents.send("theme-update", "")
+ })
+ .on('unlink', function (path: string) {
+ // console.log('File', path, 'has been removed');
+ })
+ .on('unlinkDir', function (path: string) {
+ // console.log('Directory', path, 'has been removed');
+ })
+ .on('error', function (error: string) {
+ // console.log('Error happened', error);
+ })
+ .on('ready', onWatcherReady)
+ .on('raw', function (event: any, path: any, details: any) {
+ // This event should be triggered everytime something happens.
+ // console.log('Raw event info:', event, path, details);
+ });
+ }
+
/**
* Creates the browser window
+ * @generator
+ * @function createWindow
+ * @yields {object} Electron browser window
*/
async createWindow(): Promise {
this.clientPort = await getPort({port: 9000});
- this.verifyFiles();
+ BrowserWindow.verifyFiles();
+ this.StartWatcher(utils.getPath('themes'));
// Load the previous state with fallback to defaults
const windowState = windowStateKeeper({
defaultWidth: 1024,
defaultHeight: 600,
+ fullScreen: false
});
this.options.width = windowState.width;
this.options.height = windowState.height;
+ switch (process.platform) {
+ default:
+
+ break;
+ case "win32":
+ if (!(utils.getStoreValue('visual.transparent') ?? false)){
+ this.options.backgroundColor = "#1E1E1E";} else {
+ this.options.transparent = true;}
+ break;
+ case "linux":
+ this.options.backgroundColor = "#1E1E1E";
+ this.options.autoHideMenuBar = true
+ this.options.frame = true
+ break;
+ case "darwin":
+ this.options.transparent = true;
+ this.options.vibrancy = "dark";
+ this.options.hasShadow = true;
+ break;
+ }
+
// Start the webserver for the browser window to load
this.startWebServer();
BrowserWindow.win = new bw(this.options);
+ // cant be built in CI
+ // if (process.platform === "win32" && (utils.getStoreValue('visual.transparent') ?? false)) {
+ // var electronVibrancy = require('electron-vibrancy-updated');
+ // electronVibrancy.SetVibrancy(BrowserWindow.win, 0);
+
+ // }
const ws = new wsapi(BrowserWindow.win)
ws.InitWebSockets()
// and load the renderer.
@@ -101,7 +351,7 @@ export class BrowserWindow {
/**
* Verifies the files for the renderer to use (Cache, library info, etc.)
*/
- private verifyFiles(): void {
+ private static verifyFiles(): void {
const expectedDirectories = ["CiderCache"];
const expectedFiles = [
"library-songs.json",
@@ -112,19 +362,19 @@ export class BrowserWindow {
];
for (let i = 0; i < expectedDirectories.length; i++) {
if (
- !fs.existsSync(
- path.join(app.getPath("userData"), expectedDirectories[i])
+ !existsSync(
+ join(app.getPath("userData"), expectedDirectories[i])
)
) {
- fs.mkdirSync(
- path.join(app.getPath("userData"), expectedDirectories[i])
+ mkdirSync(
+ join(app.getPath("userData"), expectedDirectories[i])
);
}
}
for (let i = 0; i < expectedFiles.length; i++) {
- const file = path.join(this.paths.ciderCache, expectedFiles[i]);
- if (!fs.existsSync(file)) {
- fs.writeFileSync(file, JSON.stringify([]));
+ const file = join(utils.getPath('ciderCache'), expectedFiles[i]);
+ if (!existsSync(file)) {
+ writeFileSync(file, JSON.stringify([]));
}
}
}
@@ -135,8 +385,8 @@ export class BrowserWindow {
private startWebServer(): void {
const app = express();
- app.use(express.static(path.join(this.paths.srcPath, "./renderer/")));
- app.set("views", path.join(this.paths.srcPath, "./renderer/views"));
+ app.use(express.static(join(utils.getPath('srcPath'), "./renderer/")));
+ app.set("views", join(utils.getPath('srcPath'), "./renderer/views"));
app.set("view engine", "ejs");
let firstRequest = true;
app.use((req, res, next) => {
@@ -144,7 +394,7 @@ export class BrowserWindow {
console.error('Req not defined')
return
}
- if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && (this.devMode || req.headers["user-agent"].includes("Electron")))) {
+ if (req.url.includes("audio.wav") || (req.headers.host.includes("localhost") && (this.devMode || req.headers["user-agent"].includes("Electron")))) {
next();
} else {
res.redirect("https://discord.gg/applemusic");
@@ -155,16 +405,97 @@ export class BrowserWindow {
res.render("main", this.EnvironmentVariables);
});
- app.get("/audio.webm", (req, res) => {
+ app.get("/api/playback/:action", (req, res) => {
+ const action = req.params.action;
+ switch (action) {
+ case "playpause":
+ BrowserWindow.win.webContents.executeJavaScript("wsapi.togglePlayPause()")
+ res.send("Play/Pause toggle")
+ break;
+ case "play":
+ BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().play()")
+ res.send("Playing")
+ break;
+ case "pause":
+ BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().pause()")
+ res.send("Paused")
+ break;
+ case "stop":
+ BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().stop()")
+ res.send("Stopped")
+ break;
+ case "next":
+ BrowserWindow.win.webContents.executeJavaScript("if (MusicKit.getInstance().queue.nextPlayableItemIndex != -1 && MusicKit.getInstance().queue.nextPlayableItemIndex != null) {MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.nextPlayableItemIndex);}")
+ res.send("Next")
+ break;
+ case "previous":
+ BrowserWindow.win.webContents.executeJavaScript("if (MusicKit.getInstance().queue.previousPlayableItemIndex != -1 && MusicKit.getInstance().queue.previousPlayableItemIndex != null) {MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.previousPlayableItemIndex);}")
+ res.send("Previous")
+ break;
+ default: {
+ res.send("Invalid action")
+ }
+ }
+ })
+
+ app.get("/themes/:theme", (req, res) => {
+ const theme = req.params.theme;
+ const themePath = join(utils.getPath('srcPath'), "./renderer/themes/", theme);
+ const userThemePath = join(utils.getPath('themes'), theme);
+ if (existsSync(userThemePath)) {
+ res.sendFile(userThemePath);
+ } else if (existsSync(themePath)) {
+ res.sendFile(themePath);
+ } else {
+ res.send(`// Theme not found - ${userThemePath}`);
+ }
+ });
+
+ app.get("/themes/:theme/*", (req: {params: {theme: string, 0: string}}, res) => {
+ const theme = req.params.theme;
+ const file = req.params[0];
+ const themePath = join(utils.getPath('srcPath'), "./renderer/themes/", theme);
+ const userThemePath = join(utils.getPath('themes'), theme);
+ if (existsSync(userThemePath)) {
+ res.sendFile(join(userThemePath, file));
+ } else if (existsSync(themePath)) {
+ res.sendFile(join(themePath, file));
+ } else {
+ res.send(`// File not found - ${userThemePath}`);
+ }
+ });
+
+ app.get("/plugins/:plugin/*", (req: {params: {plugin: string, 0: string}}, res) => {
+ let plugin = req.params.plugin;
+ if(Plugins.getPluginFromMap(plugin)) {
+ plugin = Plugins.getPluginFromMap(plugin)
+ }
+ const file = req.params[0];
+ const pluginPath = join(utils.getPath('plugins'), plugin);
+ console.log(pluginPath)
+ if (existsSync(pluginPath)) {
+ res.sendFile(join(pluginPath, file));
+ } else {
+ res.send(`// Plugin not found - ${pluginPath}`);
+ }
+ });
+
+ app.get("/audio.wav", (req, res) => {
try {
+ const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
+ if (!this.chromecastIP.includes(ip)) {
+ this.headerSent = false;
+ this.chromecastIP.push(ip)
+ }
req.socket.setTimeout(Number.MAX_SAFE_INTEGER);
// CiderBase.requests.push({req: req, res: res});
// var pos = CiderBase.requests.length - 1;
- // req.on("close", () => {
- // console.info("CLOSED", CiderBase.requests.length);
- // requests.splice(pos, 1);
- // console.info("CLOSED", CiderBase.requests.length);
- // });
+ req.on("close", () => {
+ console.log('disconnected')
+ this.headerSent = false
+ this.chromecastIP = this.chromecastIP.filter((item: any) => item !== ip);
+ });
+
this.audioStream.on("data", (data: any) => {
try {
res.write(data);
@@ -183,13 +514,12 @@ export class BrowserWindow {
});
/*
- * Remote Client (I had no idea how to add it to our existing express server, so I just made another one) -@quacksire
- * TODO: Broadcast the remote so that /web-remote/ can connect
- * https://github.com/ciderapp/Apple-Music-Electron/blob/818ed18940ff600d76eb59d22016723a75885cd5/resources/functions/handler.js#L1173
+ * Remote Client -@quacksire
+ * https://github.com/ciderapp/Apple-Music-Electron/blob/818189ed40ff600d76eb59d22016723a75885cd5/resources/functions/handler.js#L1173
*/
const remote = express();
- remote.use(express.static(path.join(this.paths.srcPath, "./web-remote/")))
- remote.set("views", path.join(this.paths.srcPath, "./web-remote/views"));
+ remote.use(express.static(join(utils.getPath('srcPath'), "./web-remote/")))
+ remote.set("views", join(utils.getPath('srcPath'), "./web-remote/views"));
remote.set("view engine", "ejs");
getPort({port: 6942}).then((port) => {
this.remotePort = port;
@@ -197,17 +527,6 @@ export class BrowserWindow {
this.broadcastRemote()
remote.listen(this.remotePort, () => {
console.log(`Cider remote port: ${this.remotePort}`);
- if (firstRequest) {
- console.log("---- Ignore Me ;) ---");
- qrcode.generate(`http://${os.hostname}:${this.remotePort}`);
- console.log("---- Ignore Me ;) ---");
- /*
- *
- * USING https://www.npmjs.com/package/qrcode-terminal for terminal
- * WE SHOULD USE https://www.npmjs.com/package/qrcode for the remote (or others) for showing to user via an in-app dialog
- * -@quacksire
- */
- }
firstRequest = false;
})
remote.get("/", (_req, res) => {
@@ -281,20 +600,185 @@ export class BrowserWindow {
event.returnValue = process.platform;
});
+ ipcMain.handle("get-github-plugin", async (event, url) => {
+ const returnVal = {
+ success: true,
+ theme: null,
+ message: ""
+ }
+ try {
+ if (!existsSync(utils.getPath("plugins"))) {
+ mkdirSync(utils.getPath("plugins"));
+ }
+ if (url.endsWith("/")) url = url.slice(0, -1);
+ let response = await fetch(
+ `${url}/archive/refs/heads/main.zip`
+ );
+ let repo = url.split("/").slice(-2).join("/");
+ let apiRepo = await fetch(
+ `https://api.github.com/repos/${repo}`
+ ).then((res) => res.json());
+ console.debug(`REPO ID: ${apiRepo.id}`);
+ // extract the files from the first folder in the zip response
+ let zip = new AdmZip(await response.buffer());
+ let entry = zip.getEntries()[0];
+ if (!existsSync(join(utils.getPath("plugins"), "gh_" + apiRepo.id))) {
+ mkdirSync(join(utils.getPath("plugins"), "gh_" + apiRepo.id));
+ }
+ console.log(join(utils.getPath("plugins"), "gh_" + apiRepo.id))
+ zip.extractEntryTo(entry, join(utils.getPath("plugins"), "gh_" + apiRepo.id), false, true);
+ let commit = await fetch(
+ `https://api.github.com/repos/${repo}/commits`
+ ).then((res) => res.json());
+ console.debug(`COMMIT SHA: ${commit[0].sha}`);
+ let theme = JSON.parse(
+ readFileSync(join(utils.getPath("plugins"), "gh_" + apiRepo.id, "package.json"), "utf8")
+ );
+ theme.id = apiRepo.id
+ theme.commit = commit[0].sha
+ writeFileSync(
+ join(utils.getPath("plugins"), "gh_" + apiRepo.id, "package.json"),
+ JSON.stringify(theme, null, 4),
+ "utf8"
+ );
+ } catch (e) {
+ returnVal.success = false;
+ }
+ BrowserWindow.win.webContents.send("plugin-installed", returnVal);
+ });
+
+ ipcMain.handle("get-github-theme", async (event, url) => {
+ const returnVal = {
+ success: true,
+ theme: null,
+ message: ""
+ }
+ try {
+ if (!existsSync(utils.getPath("themes"))) {
+ mkdirSync(utils.getPath("themes"));
+ }
+ if (url.endsWith("/")) url = url.slice(0, -1);
+ let response = await fetch(
+ `${url}/archive/refs/heads/main.zip`
+ );
+ let repo = url.split("/").slice(-2).join("/");
+ let apiRepo = await fetch(
+ `https://api.github.com/repos/${repo}`
+ ).then((res) => res.json());
+ console.debug(`REPO ID: ${apiRepo.id}`);
+ // extract the files from the first folder in the zip response
+ let zip = new AdmZip(await response.buffer());
+ let entry = zip.getEntries()[0];
+ if (!existsSync(join(utils.getPath("themes"), "gh_" + apiRepo.id))) {
+ mkdirSync(join(utils.getPath("themes"), "gh_" + apiRepo.id));
+ }
+ console.log(join(utils.getPath("themes"), "gh_" + apiRepo.id))
+ zip.extractEntryTo(entry, join(utils.getPath("themes"), "gh_" + apiRepo.id), false, true);
+ let commit = await fetch(
+ `https://api.github.com/repos/${repo}/commits`
+ ).then((res) => res.json());
+ console.debug(`COMMIT SHA: ${commit[0].sha}`);
+ let theme = JSON.parse(
+ readFileSync(join(utils.getPath("themes"), "gh_" + apiRepo.id, "theme.json"), "utf8")
+ );
+ theme.id = apiRepo.id
+ theme.commit = commit[0].sha;
+ writeFileSync(
+ join(utils.getPath("themes"), "gh_" + apiRepo.id, "theme.json"),
+ JSON.stringify(theme, null, 4),
+ "utf8"
+ );
+ } catch (e) {
+ returnVal.success = false;
+ }
+ BrowserWindow.win.webContents.send("theme-installed", returnVal);
+ });
+
+ ipcMain.on("get-themes", (event, _key) => {
+ if (existsSync(utils.getPath("themes"))) {
+ let files = readdirSync(utils.getPath("themes"));
+ let themes = [];
+ for (let file of files) {
+ if (file.endsWith(".less")) {
+ themes.push(file);
+ } else if (statSync(join(utils.getPath("themes"), file)).isDirectory()) {
+ let subFiles = readdirSync(join(utils.getPath("themes"), file));
+ for (let subFile of subFiles) {
+ if (subFile.endsWith(".less")) {
+ themes.push(join(file, subFile));
+ }
+ }
+ }
+ }
+ let themeObjects = [];
+ for (let theme of themes) {
+ let themePath = join(utils.getPath("themes"), theme);
+ let themeName = theme;
+ let themeDescription = "";
+ if (theme.includes("/")) {
+ themeName = theme.split("/")[1];
+ themeDescription = theme.split("/")[0];
+ }
+ if (themePath.endsWith("index.less")) {
+ themePath = themePath.slice(0, -10);
+ }
+ if (existsSync(join(themePath, "theme.json"))) {
+ let themeJson = JSON.parse(readFileSync(join(themePath, "theme.json"), "utf8"));
+ themeObjects.push({
+ name: themeJson.name || themeName,
+ description: themeJson.description || themeDescription,
+ path: themePath,
+ file: theme,
+ github_repo: themeJson.github_repo || "",
+ commit: themeJson.commit || ""
+ });
+ } else {
+ themeObjects.push({
+ name: themeName,
+ description: themeDescription,
+ path: themePath,
+ file: theme,
+ github_repo: "",
+ commit: ""
+ });
+ }
+ }
+ event.returnValue = themeObjects;
+
+ } else {
+ event.returnValue = [];
+ }
+ });
+
+ ipcMain.handle("open-path", async (event, path) => {
+ switch(path) {
+ default:
+ case "plugins":
+ shell.openPath(utils.getPath("plugins"));
+ break;
+ case "userdata":
+ shell.openPath(app.getPath("userData"));
+ break;
+ case "themes":
+ shell.openPath(utils.getPath("themes"));
+ break;
+ }
+ });
+
ipcMain.on("get-i18n", (event, key) => {
event.returnValue = utils.getLocale(key);
});
ipcMain.on("get-i18n-listing", event => {
- let i18nFiles = fs.readdirSync(path.join(__dirname, "../../src/i18n")).filter(file => file.endsWith(".jsonc"));
+ let i18nFiles = readdirSync(join(__dirname, "../../src/i18n")).filter(file => file.endsWith(".json"));
// read all the files and parse them
let i18nListing = []
for (let i = 0; i < i18nFiles.length; i++) {
- const i18n: { [index: string]: Object } = jsonc.parse(fs.readFileSync(path.join(__dirname, `../../src/i18n/${i18nFiles[i]}`), "utf8"));
+ const i18n: { [index: string]: Object } = JSON.parse(readFileSync(join(__dirname, `../../src/i18n/${i18nFiles[i]}`), "utf8"));
i18nListing.push({
- "code": i18nFiles[i].replace(".jsonc", ""),
- "nameNative": i18n["i18n.languageName"] ?? i18nFiles[i].replace(".jsonc", ""),
- "nameEnglish": i18n["i18n.languageNameEnglish"] ?? i18nFiles[i].replace(".jsonc", ""),
+ "code": i18nFiles[i].replace(".json", ""),
+ "nameNative": i18n["i18n.languageName"] ?? i18nFiles[i].replace(".json", ""),
+ "nameEnglish": i18n["i18n.languageNameEnglish"] ?? i18nFiles[i].replace(".json", ""),
"category": i18n["i18n.category"] ?? "",
"authors": i18n["i18n.authors"] ?? ""
})
@@ -310,91 +794,34 @@ export class BrowserWindow {
event.returnValue = this.devMode;
});
- ipcMain.on("put-library-songs", (_event, arg) => {
- fs.writeFileSync(
- path.join(this.paths.ciderCache, "library-songs.json"),
- JSON.stringify(arg)
+ ipcMain.handle("put-cache", (_event, arg) => {
+ writeFileSync(
+ join(utils.getPath('ciderCache'), `${arg.file}.json`),
+ arg.data
);
});
- ipcMain.on("put-library-artists", (_event, arg) => {
- fs.writeFileSync(
- path.join(this.paths.ciderCache, "library-artists.json"),
- JSON.stringify(arg)
- );
- });
-
- ipcMain.on("put-library-albums", (_event, arg) => {
- fs.writeFileSync(
- path.join(this.paths.ciderCache, "library-albums.json"),
- JSON.stringify(arg)
- );
- });
-
- ipcMain.on("put-library-playlists", (_event, arg) => {
- fs.writeFileSync(
- path.join(this.paths.ciderCache, "library-playlists.json"),
- JSON.stringify(arg)
- );
- });
-
- ipcMain.on("put-library-recentlyAdded", (_event, arg) => {
- fs.writeFileSync(
- path.join(this.paths.ciderCache, "library-recentlyAdded.json"),
- JSON.stringify(arg)
- );
- });
-
- ipcMain.on("get-library-songs", (event) => {
- let librarySongs = fs.readFileSync(
- path.join(this.paths.ciderCache, "library-songs.json"),
- "utf8"
- );
- event.returnValue = JSON.parse(librarySongs);
- });
-
- ipcMain.on("get-library-artists", (event) => {
- let libraryArtists = fs.readFileSync(
- path.join(this.paths.ciderCache, "library-artists.json"),
- "utf8"
- );
- event.returnValue = JSON.parse(libraryArtists);
- });
-
- ipcMain.on("get-library-albums", (event) => {
- let libraryAlbums = fs.readFileSync(
- path.join(this.paths.ciderCache, "library-albums.json"),
- "utf8"
- );
- event.returnValue = JSON.parse(libraryAlbums);
- });
-
- ipcMain.on("get-library-playlists", (event) => {
- let libraryPlaylists = fs.readFileSync(
- path.join(this.paths.ciderCache, "library-playlists.json"),
- "utf8"
- );
- event.returnValue = JSON.parse(libraryPlaylists);
- });
-
- ipcMain.on("get-library-recentlyAdded", (event) => {
- let libraryRecentlyAdded = fs.readFileSync(
- path.join(this.paths.ciderCache, "library-recentlyAdded.json"),
- "utf8"
- );
- event.returnValue = JSON.parse(libraryRecentlyAdded);
+ ipcMain.on("get-cache", (event, arg) => {
+ let read = ""
+ if (existsSync(join(utils.getPath('ciderCache'), `${arg}.json`))) {
+ read = readFileSync(
+ join(utils.getPath('ciderCache'), `${arg}.json`),
+ "utf8"
+ );
+ }
+ event.returnValue = read;
});
ipcMain.handle("getYTLyrics", async (_event, track, artist) => {
const u = track + " " + artist + " official video";
- return await yt.search(u);
+ return await search(u);
});
- ipcMain.on("close", () => {
+ ipcMain.on("close", (_event) => {
BrowserWindow.win.close();
});
- ipcMain.on("maximize", () => {
+ ipcMain.on("maximize", (_event) => {
// listen for maximize event
if (BrowserWindow.win.isMaximized()) {
BrowserWindow.win.unmaximize();
@@ -435,26 +862,161 @@ export class BrowserWindow {
ipcMain.on('setFullScreen', (_event, flag) => {
BrowserWindow.win.setFullScreen(flag)
})
+
//Fullscreen
ipcMain.on('detachDT', (_event, _) => {
BrowserWindow.win.webContents.openDevTools({mode: 'detach'});
+ })
+
+ ipcMain.handle('relaunchApp',(_event, _) => {
+ app.relaunch()
+ app.exit()
})
ipcMain.on('play', (_event, type, id) => {
BrowserWindow.win.webContents.executeJavaScript(`
- MusicKit.getInstance().setQueue({ ${type}: '${id}'}).then(function(queue) {
- MusicKit.getInstance().play();
- });
- `)
- })
+ MusicKit.getInstance().setQueue({ ${type}: '${id}', parameters : {l : app.mklang}}).then(function(queue) {
+ MusicKit.getInstance().play();
+ });
+ `)
+ });
+
+ ipcMain.on('writeWAV', (event, leftpcm, rightpcm, bufferlength) => {
+
+ function interleave16(leftChannel: any, rightChannel: any) {
+ var length = leftChannel.length + rightChannel.length;
+ var result = new Int16Array(length);
+
+ var inputIndex = 0;
+
+ for (var index = 0; index < length;) {
+ result[index++] = leftChannel[inputIndex];
+ result[index++] = rightChannel[inputIndex];
+ inputIndex++;
+ }
+ return result;
+ }
+
+ //https://github.com/HSU-ANT/jsdafx
+
+ function quantization(audiobufferleft: any, audiobufferright: any) {
+
+ let h = Float32Array.from([1]);
+ let nsState = new Array(0);
+ let ditherstate = new Float32Array(0);
+ let qt = Math.pow(2, 1 - 16);
+
+ //noise shifting order 3
+ h = Float32Array.from([1.623, -0.982, 0.109]);
+ for (let i = 0; i < nsState.length; i++) {
+ nsState[i] = new Float32Array(h.length);
+ }
+
+
+ function setChannelCount(nc: any) {
+ if (ditherstate.length !== nc) {
+ ditherstate = new Float32Array(nc);
+ }
+ if (nsState.length !== nc) {
+ nsState = new Array(nc);
+ for (let i = 0; i < nsState.length; i++) {
+ nsState[i] = new Float32Array(h.length);
+ }
+ }
+ }
+
+ function hpDither(channel: any) {
+ const rnd = Math.random() - 0.5;
+ const d = rnd - ditherstate[channel];
+ ditherstate[channel] = rnd;
+ return d;
+ }
+
+
+ setChannelCount(2);
+ const inputs = [audiobufferleft, audiobufferright];
+ const outputs = [audiobufferleft, audiobufferright];
+
+ for (let channel = 0; channel < inputs.length; channel++) {
+ const inputData = inputs[channel];
+ const outputData = outputs[channel];
+ for (let sample = 0; sample < bufferlength; sample++) {
+ let input = inputData[sample];
+ // console.log('a2',inputData.length);
+ for (let i = 0; i < h.length; i++) {
+ input -= h[i] * nsState[channel][i];
+ }
+ // console.log('a3',input);
+ let d_rand = 0.0;
+ // ditherstate = new Float32Array(h.length);
+ // d_rand = hpDither(channel);
+ const tmpOutput = qt * Math.round(input / qt + d_rand);
+ for (let i = h.length - 1; i >= 0; i--) {
+ nsState[channel][i] = nsState[channel][i - 1];
+ }
+ nsState[channel][0] = tmpOutput - input;
+ outputData[sample] = tmpOutput;
+ }
+ }
+ return outputs;
+ }
+
+
+ function convert(n: any) {
+ var v = n < 0 ? n * 32768 : n * 32767; // convert in range [-32768, 32767]
+ return Math.max(-32768, Math.min(32768, v)); // clamp
+ }
+
+ let newaudio = quantization(leftpcm, rightpcm);
+ //let newaudio = [leftpcm, rightpcm];
+ // console.log(newaudio.length);
+ let pcmData = Buffer.from(new Int8Array(interleave16(Int16Array.from(newaudio[0], x => convert(x)), Int16Array.from(newaudio[1], x => convert(x))).buffer));
+
+ if (!this.headerSent) {
+ console.log('new header')
+ const header = Buffer.alloc(44)
+ header.write('RIFF', 0)
+ header.writeUInt32LE(2147483600, 4)
+ header.write('WAVE', 8)
+ header.write('fmt ', 12)
+ header.writeUInt8(16, 16)
+ header.writeUInt8(1, 20)
+ header.writeUInt8(2, 22)
+ header.writeUInt32LE(48000, 24)
+ header.writeUInt32LE(16, 28)
+ header.writeUInt8(4, 32)
+ header.writeUInt8(16, 34)
+ header.write('data', 36)
+ header.writeUInt32LE(2147483600 + 44 - 8, 40)
+ this.audioStream.write(Buffer.concat([header, pcmData]));
+ this.headerSent = true;
+ } else {
+ this.audioStream.write(pcmData);
+ }
+
+ });
//QR Code
- ipcMain.handle('showQR', async (event, _) => {
+ ipcMain.handle('showQR', async (_event, _) => {
let url = `http://${BrowserWindow.getIP()}:${this.remotePort}`;
shell.openExternal(`https://cider.sh/pair-remote?url=${Buffer.from(encodeURI(url)).toString('base64')}`).catch(console.error);
- })
+ });
+ ipcMain.on('get-remote-pair-url', (_event, _) => {
+ let url = `http://${BrowserWindow.getIP()}:${this.remotePort}`;
+ //if (app.isPackaged) {
+ BrowserWindow.win.webContents.send('send-remote-pair-url', (`https://cider.sh/pair-remote?url=${Buffer.from(encodeURI(url)).toString('base64')}`).toString());
+ //} else {
+ // BrowserWindow.win.webContents.send('send-remote-pair-url', (`http://127.0.0.1:5500/pair-remote.html?url=${Buffer.from(encodeURI(url)).toString('base64')}`).toString());
+ //}
+
+ });
+ if (process.platform === "darwin") {
+ app.setUserActivity('com.CiderCollective.remote.pair', {
+ ip: `${BrowserWindow.getIP()}`
+ }, `http://${BrowserWindow.getIP()}:${this.remotePort}`);
+ }
// Get previews for normalization
ipcMain.on("getPreviewURL", (_event, url) => {
@@ -470,15 +1032,45 @@ export class BrowserWindow {
});
});
- ipcMain.on('check-for-update', async (_event, url) => {
- const options: any = {
- provider: 'generic',
- url: 'https://43-429851205-gh.circle-artifacts.com/0/%7E/Cider/dist/artifacts' //Base URL
+ ipcMain.on('check-for-update', async (_event) => {
+ await utils.checkForUpdate();
+ });
+
+
+ ipcMain.on('disable-update', (event) => {
+ // Check if using app store builds so people don't get pissy wen button go bonk
+ if (app.isPackaged && !process.mas || !process.windowsStore) {
+ event.returnValue = false
+ } else {
+ event.returnValue = true
}
- const autoUpdater = new NsisUpdater(options) //Windows Only (for now) -q
- await autoUpdater.checkForUpdatesAndNotify()
})
+
+
+ ipcMain.on('share-menu', async (_event, url) => {
+ if (process.platform != 'darwin') return;
+ //https://www.electronjs.org/docs/latest/api/share-menu
+ console.log('[Share Sheet - App.ts]', url)
+ const options = {
+ title: 'Share',
+ urls: [url]
+ };
+ const shareMenu = new ShareMenu(options);
+ shareMenu.popup();
+ })
+
+ ipcMain.on('get-version', (_event) => {
+ if (app.isPackaged) {
+ _event.returnValue = app.getVersion()
+ } else {
+ _event.returnValue = `Experimental running on Electron ${app.getVersion()}`
+ }
+
+ });
+ ipcMain.on('open-appdata', (_event) => {
+ shell.openPath(app.getPath('userData'));
+ });
/* *********************************************************************************************
* Window Events
* **********************************************************************************************/
@@ -545,10 +1137,14 @@ export class BrowserWindow {
});
}
+ /**
+ * Gets ip
+ * @private
+ */
private static getIP(): string {
let ip: string = '';
let alias = 0;
- const ifaces: any = os.networkInterfaces();
+ const ifaces: any = networkInterfaces();
for (let dev in ifaces) {
ifaces[dev].forEach((details: any) => {
if (details.family === 'IPv4') {
diff --git a/src/main/base/castcontroller.js b/src/main/base/castcontroller.js
new file mode 100644
index 00000000..d6f3319d
--- /dev/null
+++ b/src/main/base/castcontroller.js
@@ -0,0 +1,24 @@
+var util = require('util');
+var castv2Cli = require('castv2-client');
+var RequestResponseController = castv2Cli.RequestResponseController;
+
+function CiderCastController(client, sourceId, destinationId) {
+ RequestResponseController.call(this, client, sourceId, destinationId, 'urn:x-cast:com.ciderapp.customdata');
+ this.once('close', onclose);
+ var self = this;
+ function onclose() {
+ self.stop();
+ }
+}
+
+util.inherits(CiderCastController, RequestResponseController);
+
+CiderCastController.prototype.sendIp = function(ip) {
+ // TODO: Implement Callback
+ let data = {
+ ip : ip
+ }
+ this.request(data);
+};
+
+module.exports = CiderCastController;
\ No newline at end of file
diff --git a/src/main/base/castreceiver.js b/src/main/base/castreceiver.js
new file mode 100644
index 00000000..134699c0
--- /dev/null
+++ b/src/main/base/castreceiver.js
@@ -0,0 +1,77 @@
+//@ts-nocheck
+var util = require('util');
+// var debug = require('debug')('castv2-client');
+var Application = require('castv2-client').Application;
+var MediaController = require('castv2-client').MediaController;
+var CiderCastController = require('./castcontroller');
+
+function CiderReceiver(client, session) {
+ Application.apply(this, arguments);
+
+ this.media = this.createController(MediaController);
+ this.mediaReceiver = this.createController(CiderCastController);
+
+ this.media.on('status', onstatus);
+
+ var self = this;
+
+ function onstatus(status) {
+ self.emit('status', status);
+ }
+
+}
+// FE96A351
+// 27E1334F
+CiderReceiver.APP_ID = 'FE96A351';
+
+util.inherits(CiderReceiver, Application);
+
+CiderReceiver.prototype.getStatus = function(callback) {
+ this.media.getStatus.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.load = function(media, options, callback) {
+ this.media.load.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.play = function(callback) {
+ this.media.play.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.pause = function(callback) {
+ this.media.pause.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.stop = function(callback) {
+ this.media.stop.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.seek = function(currentTime, callback) {
+ this.media.seek.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.queueLoad = function(items, options, callback) {
+ this.media.queueLoad.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.queueInsert = function(items, options, callback) {
+ this.media.queueInsert.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.queueRemove = function(itemIds, options, callback) {
+ this.media.queueRemove.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.queueReorder = function(itemIds, options, callback) {
+ this.media.queueReorder.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.queueUpdate = function(items, callback) {
+ this.media.queueUpdate.apply(this.media, arguments);
+};
+
+CiderReceiver.prototype.sendIp = function(opts){
+ this.mediaReceiver.sendIp.apply(this.mediaReceiver, arguments);
+};
+
+module.exports = CiderReceiver;
diff --git a/src/main/base/plugins.ts b/src/main/base/plugins.ts
index 4ffb1042..c3d11233 100644
--- a/src/main/base/plugins.ts
+++ b/src/main/base/plugins.ts
@@ -3,15 +3,36 @@ import * as path from 'path';
import * as electron from 'electron'
import {utils} from './utils';
+//
+// Hello, this our loader for the various plugins that the Cider Development Team built for our
+// numerous plugins internally and ones made by the community
+//
+// To learn how to make your own, visit https://github.com/ciderapp/Cider/wiki/Plugins
+//
+/**
+ * @class
+ * Plugin Loading
+ * @author booploops#7139
+ * @see {@link https://github.com/ciderapp/Cider/wiki/Plugins|Documentation}
+ */
export class Plugins {
private basePluginsPath = path.join(__dirname, '../plugins');
- private userPluginsPath = path.join(electron.app.getPath('userData'), 'plugins');
+ private userPluginsPath = path.join(electron.app.getPath('userData'), 'Plugins');
private readonly pluginsList: any = {};
+ private static PluginMap: any = {};
constructor() {
this.pluginsList = this.getPlugins();
}
+ public static getPluginFromMap(plugin: string): any {
+ if(Plugins.PluginMap[plugin]) {
+ return Plugins.PluginMap[plugin];
+ }else{
+ return plugin;
+ }
+ }
+
public getPlugins(): any {
let plugins: any = {};
@@ -32,13 +53,46 @@ export class Plugins {
if (fs.existsSync(this.userPluginsPath)) {
fs.readdirSync(this.userPluginsPath).forEach(file => {
+ // Plugins V1
if (file.endsWith('.ts') || file.endsWith('.js')) {
- const plugin = require(path.join(this.userPluginsPath, file)).default;
- file = file.replace('.ts', '').replace('.js', '');
- if (plugins[file] || plugin in plugins) {
- console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`);
+ if (!electron.app.isPackaged) {
+ const plugin = require(path.join(this.userPluginsPath, file)).default;
+ file = file.replace('.ts', '').replace('.js', '');
+ if (plugins[file] || plugin in plugins) {
+ console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`);
+ } else {
+ plugins[file] = new plugin(electron.app, utils.getStore());
+ }
} else {
- plugins[file] = new plugin(electron.app, utils.getStore());
+ const plugin = require(path.join(this.userPluginsPath, file));
+ file = file.replace('.ts', '').replace('.js', '');
+ if (plugins[file] || plugin in plugins) {
+ console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`);
+ } else {
+ plugins[file] = new plugin(electron.app, utils.getStore());
+ }
+ }
+ }
+ // Plugins V2
+ else if (fs.lstatSync(path.join(this.userPluginsPath, file)).isDirectory()) {
+ const pluginPath = path.join(this.userPluginsPath, file);
+ if (fs.existsSync(path.join(pluginPath, 'package.json'))) {
+ const pluginPackage = require(path.join(pluginPath, "package.json"));
+ const plugin = require(path.join(pluginPath, pluginPackage.main));
+ if (plugins[plugin.name] || plugin.name in plugins) {
+ console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`);
+ } else {
+ Plugins.PluginMap[pluginPackage.name] = file;
+ const pluginEnv = {
+ app: electron.app,
+ store: utils.getStore(),
+ utils: utils,
+ win: utils.getWindow(),
+ dir: pluginPath,
+ dirName: file
+ }
+ plugins[plugin.name] = new plugin(pluginEnv);
+ }
}
}
});
diff --git a/src/main/base/store.ts b/src/main/base/store.ts
index 54ca5ba9..f1ea8dc2 100644
--- a/src/main/base/store.ts
+++ b/src/main/base/store.ts
@@ -6,12 +6,24 @@ export class Store {
private defaults: any = {
"general": {
- "close_button_hide": true,
+ "close_button_hide": false,
"open_on_startup": false,
"discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music
"discord_rpc_clear_on_pause": true,
"language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future
- "playbackNotifications": true
+ "playbackNotifications": true,
+ "update_branch": "main",
+ "resumeOnStartupBehavior": "local",
+ "privateEnabled": false,
+ "themeUpdateNotification": true,
+ "sidebarItems": {
+ "recentlyAdded": true,
+ "songs": true,
+ "albums": true,
+ "artists": true,
+ "videos": true,
+ "podcasts": true
+ }
},
"home": {
"followedArtists": [],
@@ -22,20 +34,37 @@ export class Store {
"sort": "name",
"sortOrder": "asc",
"size": "normal"
- }
+ },
+ "albums": {
+ "sort": "name",
+ "sortOrder": "asc",
+ "viewAs": "covers"
+ },
},
"audio": {
"volume": 1,
+ "volumeStep": 0.1,
+ "maxVolume": 1,
"lastVolume": 1,
"muted": false,
- "quality": "256",
+ "quality": "HIGH",
"seamless_audio": true,
"normalization": false,
+ "maikiwiAudio": {
+ "ciderPPE": false,
+ "ciderPPE_value": 0.5,
+ "analogWarmth": false,
+ "analogWarmth_value": 1.25,
+ "spatial": false,
+ "spatialType": 0,
+ "vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts
+ 'multiplier': 0,
+ 'frequencies': [17.182, 42.169, 53.763, 112.69, 119.65, 264.59, 336.57, 400.65, 505.48, 612.7, 838.7, 1155.3, 1175.6, 3406.8, 5158.6, 5968.1, 6999.9, 7468.6, 8862.9, 9666, 10109],
+ 'Q': [2.5, 0.388, 5, 5, 2.5, 7.071, 14.14, 10, 7.071, 14.14, 8.409, 0.372, 7.071, 10, 16.82, 7.071, 28.28, 20, 8.409, 40, 40],
+ 'gain': [-0.34, 2.49, 0.23, -0.49, 0.23, -0.12, 0.32, -0.29, 0.33, 0.19, -0.18, -1.27, -0.11, 0.25, -0.18, -0.53, 0.34, 1.32, 1.78, 0.41, -0.28]
+ }
+ },
"spatial": false,
- "maxVolume": 1,
- "volumePrecision": 0.1,
- "volumeRoundMax": 0.9,
- "volumeRoundMin": 0.1,
"spatial_properties": {
"presets": [],
"gain": 0.8,
@@ -59,19 +88,12 @@ export class Store {
'preset': "default",
'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],
'gain': [0,0,0,0,0,0,0,0,0,0],
- 'Q' : [1,1,1,1,1,1,1,1,1,1],
- 'preamp' : 0,
- 'mix' : 1,
- 'vibrantBass' : 0,
+ 'Q': [1,1,1,1,1,1,1,1,1,1],
+ 'mix': 1,
+ 'vibrantBass': 0,
'presets': [],
'userGenerated': false
},
- "vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts
- 'multiplier': 0,
- 'frequencies': [17.182, 42.169, 53.763, 112.69, 119.65, 264.59, 336.57, 400.65, 505.48, 612.7, 838.7, 1155.3, 1175.6, 3406.8, 5158.6, 5968.1, 6999.9, 7468.6, 8862.9, 9666, 10109],
- 'Q': [2.5, 0.388, 5, 5, 2.5, 7.071, 14.14, 10, 7.071, 14.14, 8.409, 0.372, 7.071, 10, 16.82, 7.071, 28.28, 20, 8.409, 40, 40],
- 'gain': [-0.34, 2.49, 0.23, -0.49, 0.23, -0.12, 0.32, -0.29, 0.33, 0.19, -0.18, -1.27, -0.11, 0.25, -0.18, -0.53, 0.34, 1.32, 1.78, 0.41, -0.28]
- }
},
"visual": {
"theme": "",
@@ -83,7 +105,11 @@ export class Store {
"bg_artwork_rotation": false,
"hw_acceleration": "default", // default, webgpu, disabled
"showuserinfo": true,
- "miniplayer_top_toggle": true
+ "transparent": false,
+ "miniplayer_top_toggle": true,
+ "directives": {
+ "windowLayout": "default"
+ }
},
"lyrics": {
"enable_mxm": false,
@@ -101,7 +127,8 @@ export class Store {
},
"advanced": {
"AudioContext": false,
- "experiments": []
+ "experiments": [],
+ "playlistTrackMapping": true
}
}
private migrations: any = {}
@@ -142,11 +169,11 @@ export class Store {
* IPC Handler
*/
private ipcHandler(): void {
- electron.ipcMain.handle('getStoreValue', (event, key, defaultValue) => {
+ electron.ipcMain.handle('getStoreValue', (_event, key, defaultValue) => {
return (defaultValue ? Store.cfg.get(key, true) : Store.cfg.get(key));
});
- electron.ipcMain.handle('setStoreValue', (event, key, value) => {
+ electron.ipcMain.handle('setStoreValue', (_event, key, value) => {
Store.cfg.set(key, value);
});
@@ -154,7 +181,7 @@ export class Store {
event.returnValue = Store.cfg.store
})
- electron.ipcMain.on('setStore', (event, store) => {
+ electron.ipcMain.on('setStore', (_event, store) => {
Store.cfg.store = store
})
}
diff --git a/src/main/base/utils.ts b/src/main/base/utils.ts
index 89301c0f..103f772f 100644
--- a/src/main/base/utils.ts
+++ b/src/main/base/utils.ts
@@ -1,11 +1,38 @@
import * as fs from "fs";
import * as path from "path";
-import {jsonc} from "jsonc";
import {Store} from "./store";
import {BrowserWindow as bw} from "./browserwindow";
+import {app, dialog, ipcMain, Notification, shell } from "electron";
+import fetch from "electron-fetch";
+import {AppImageUpdater, NsisUpdater} from "electron-updater";
+import * as log from "electron-log";
export class utils {
+ /**
+ * Paths for the application to use
+ */
+ private static paths: any = {
+ srcPath: path.join(__dirname, "../../src"),
+ rendererPath: path.join(__dirname, "../../src/renderer"),
+ mainPath: path.join(__dirname, "../../src/main"),
+ resourcePath: path.join(__dirname, "../../resources"),
+ i18nPath: path.join(__dirname, "../../src/i18n"),
+ i18nPathSrc: path.join(__dirname, "../../src/il8n/source"),
+ ciderCache: path.resolve(app.getPath("userData"), "CiderCache"),
+ themes: path.resolve(app.getPath("userData"), "Themes"),
+ plugins: path.resolve(app.getPath("userData"), "Plugins"),
+ };
+
+ /**
+ * Get the path
+ * @returns {string}
+ * @param name
+ */
+ static getPath(name: string): string {
+ return this.paths[name];
+ }
+
/**
* Fetches the i18n locale for the given language.
* @param language {string} The language to fetch the locale for.
@@ -13,10 +40,10 @@ export class utils {
* @returns {string | Object} The locale value.
*/
static getLocale(language: string, key?: string): string | object {
- let i18n: { [index: string]: Object } = jsonc.parse(fs.readFileSync(path.join(__dirname, "../../src/i18n/en_US.jsonc"), "utf8"));
+ let i18n: { [index: string]: Object } = JSON.parse(fs.readFileSync(path.join(this.paths.i18nPath, "en_US.json"), "utf8"));
- if (language !== "en_US" && fs.existsSync(path.join(__dirname, `../../src/i18n/${language}.jsonc`))) {
- i18n = Object.assign(i18n, jsonc.parse(fs.readFileSync(path.join(__dirname, `../../src/i18n/${language}.jsonc`), "utf8")));
+ if (language !== "en_US" && fs.existsSync(path.join(this.paths.i18nPath, `${language}.json`))) {
+ i18n = Object.assign(i18n, JSON.parse(fs.readFileSync(path.join(this.paths.i18nPath, `${language}.json`), "utf8")));
}
if (key) {
@@ -58,4 +85,110 @@ export class utils {
static getWindow(): Electron.BrowserWindow {
return bw.win
}
-}
\ No newline at end of file
+
+ static loadPluginFrontend(path: string): void {
+
+ }
+
+ static loadJSFrontend(path: string): void {
+ bw.win.webContents.executeJavaScript(fs.readFileSync(path, "utf8"));
+ }
+
+ /**
+ * Playback Functions
+ */
+ static playback = {
+ pause: () => {
+ bw.win.webContents.executeJavaScript("MusicKitInterop.pause()")
+ },
+ play: () => {
+ bw.win.webContents.executeJavaScript("MusicKitInterop.play()")
+ },
+ playPause: () => {
+ bw.win.webContents.executeJavaScript("MusicKitInterop.playPause()")
+ },
+ next: () => {
+ bw.win.webContents.executeJavaScript("MusicKitInterop.next()")
+ },
+ previous: () => {
+ bw.win.webContents.executeJavaScript("MusicKitInterop.previous()")
+ }
+ }
+
+ /**
+ * Checks the application for updates
+ */
+ static async checkForUpdate(): Promise {
+ if (!app.isPackaged) {
+ new Notification({ title: "Application Update", body: "Can't update as app is in DEV mode. Please build or grab a copy by clicking me"})
+ .on('click', () => {shell.openExternal('https://download.cider.sh/?utm_source=app&utm_medium=dev-mode-warning')})
+ .show()
+ bw.win.webContents.send('update-response', "update-error")
+ return;
+ }
+ // Get the artifacts
+ const response = await fetch(`https://circleci.com/api/v1.1/project/gh/ciderapp/Cider/latest/artifacts?branch=${utils.getStoreValue('general.update_branch')}&filter=successful`)
+ if (response.status != 200) {
+ bw.win.webContents.send('update-response', 'update-timeout')
+ return;
+ }
+
+ // Get the urls
+ const jsonResponse = await response.json()
+ let base_url = jsonResponse[0].url
+ base_url = base_url.substring(0, base_url.lastIndexOf('/'))
+
+ const options: any = {
+ provider: 'generic',
+ url: base_url,
+ allowDowngrade: true,
+ }
+
+ let autoUpdater: any = null
+ if (process.platform === 'win32') { //Windows
+ autoUpdater = await new NsisUpdater(options)
+ } else {
+ autoUpdater = await new AppImageUpdater(options) //Linux and Mac (AppImages work on macOS btw)
+ }
+
+ autoUpdater.on('checking-for-update', () => {
+ new Notification({ title: "Cider Update", body: "Cider is currently checking for updates."}).show()
+ })
+
+ autoUpdater.on('error', (error: any) => {
+ console.error(`[AutoUpdater] Error: ${error}`)
+ bw.win.webContents.send('update-response', "update-error")
+ })
+
+ autoUpdater.on('update-not-available', () => {
+ console.log('[AutoUpdater] Update not available.')
+ bw.win.webContents.send('update-response', "update-not-available");
+ })
+ autoUpdater.on('download-progress', (event: any, progress: any) => {
+ bw.win.setProgressBar(progress.percent / 100)
+ })
+
+ autoUpdater.on('update-downloaded', (info: any) => {
+ console.log('[AutoUpdater] Update downloaded.')
+ bw.win.webContents.send('update-response', "update-downloaded");
+ const dialogOpts = {
+ type: 'info',
+ buttons: ['Restart', 'Later'],
+ title: 'Application Update',
+ message: info,
+ detail: 'A new version has been downloaded. Restart the application to apply the updates.'
+ }
+
+ dialog.showMessageBox(dialogOpts).then((returnValue) => {
+ if (returnValue.response === 0) autoUpdater.quitAndInstall()
+ })
+ new Notification({ title: "Application Update", body: info}).on('click', () => {
+ bw.win.show()
+ }).show()
+ })
+
+ log.transports.file.level = "debug"
+ autoUpdater.logger = log
+ await autoUpdater.checkForUpdatesAndNotify()
+ }
+}
diff --git a/src/main/base/wsapi.ts b/src/main/base/wsapi.ts
index bb82ec49..ff211b2b 100644
--- a/src/main/base/wsapi.ts
+++ b/src/main/base/wsapi.ts
@@ -64,6 +64,9 @@ export class wsapi {
electron.ipcMain.on('wsapi-returnLyrics', (event :any, arg :any) => {
this.returnLyrics(JSON.parse(arg));
});
+ electron.ipcMain.on('wsapi-returnvolumeMax', (_event: any, arg: any) => {
+ this.returnmaxVolume(JSON.parse(arg));
+ });
this.wss = new WebSocketServer({
port: this.port,
perMessageDeflate: {
@@ -165,6 +168,10 @@ export class wsapi {
this._win.webContents.executeJavaScript(`MusicKit.getInstance().stop()`);
response.message = "Stopped";
break;
+ case "volumeMax":
+ this._win.webContents.executeJavaScript(`wsapi.getmaxVolume()`);
+ response.message = "maxVolume";
+ break;
case "volume":
this._win.webContents.executeJavaScript(`MusicKit.getInstance().volume = ${parseFloat(data.volume)}`);
response.message = "Volume";
@@ -178,11 +185,15 @@ export class wsapi {
response.message = "Unmuted";
break;
case "next":
- this._win.webContents.executeJavaScript(`MusicKit.getInstance().skipToNextItem()`);
+ this._win.webContents.executeJavaScript(`if (MusicKit.getInstance().queue.nextPlayableItemIndex != -1 && MusicKit.getInstance().queue.nextPlayableItemIndex != null) {
+ try {
+ app.prevButtonBackIndicator = false;
+ } catch (e) { }
+ MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.nextPlayableItemIndex);}`);
response.message = "Next";
break;
case "previous":
- this._win.webContents.executeJavaScript(`MusicKit.getInstance().skipToPreviousItem()`);
+ this._win.webContents.executeJavaScript(`if (MusicKit.getInstance().queue.previousPlayableItemIndex != -1 && MusicKit.getInstance().queue.previousPlayableItemIndex != null) {MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.previousPlayableItemIndex)}`);
response.message = "Previous";
break;
case "musickit-api":
@@ -290,4 +301,11 @@ export class wsapi {
client.send(JSON.stringify(response));
});
}
+
+ returnmaxVolume(vol: any) {
+ const response: standardResponse = {status: 0, data: vol, message: "OK", type: "maxVolume"};
+ this.clients.forEach(function each(client: any) {
+ client.send(JSON.stringify(response));
+ });
+ }
}
\ No newline at end of file
diff --git a/src/main/index.ts b/src/main/index.ts
index 2db1f6a9..5d181f04 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -1,19 +1,28 @@
require('v8-compile-cache');
-import {app, components, ipcMain} from 'electron';
+const {app, components, ipcMain} = require('electron');
import {join} from 'path';
-app.setPath('userData', join(app.getPath('appData'), 'Cider'));
+if (!app.isPackaged) {
+ app.setPath('userData', join(app.getPath('appData'), 'Cider'));
+}
-// Analytics for debugging fun yeah.
-import {init as Sentry} from '@sentry/electron';
import {Store} from "./base/store";
import {AppEvents} from "./base/app";
import {Plugins} from "./base/plugins";
-import {utils} from "./base/utils";
import {BrowserWindow} from "./base/browserwindow";
+import {init as Sentry} from '@sentry/electron';
+import {RewriteFrames} from "@sentry/integrations";
-Sentry({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"});
+// Analytics for debugging fun yeah.
+Sentry({
+ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214",
+ integrations: [
+ new RewriteFrames({
+ root: process.cwd(),
+ }),
+ ],
+});
new Store();
const Cider = new AppEvents();
@@ -36,10 +45,16 @@ app.on('ready', () => {
const bw = new BrowserWindow()
const win = await bw.createWindow()
+ app.getGPUInfo("complete").then(gpuInfo => {
+ console.log(gpuInfo)
+ })
+
+ console.log('[Cider][Widevine] Status:', components.status());
+ win.show();
+
win.on("ready-to-show", () => {
Cider.bwCreated();
CiderPlug.callPlugins('onReady', win);
- win.show();
});
});
@@ -49,14 +64,22 @@ app.on('ready', () => {
* Renderer Event Handlers
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-ipcMain.on('playbackStateDidChange', (event, attributes) => {
+ipcMain.handle("renderer-ready", (event) => {
+ CiderPlug.callPlugins("onRendererReady", event);
+})
+
+ipcMain.on('playbackStateDidChange', (_event, attributes) => {
CiderPlug.callPlugins('onPlaybackStateDidChange', attributes);
});
-ipcMain.on('nowPlayingItemDidChange', (event, attributes) => {
+ipcMain.on('nowPlayingItemDidChange', (_event, attributes) => {
CiderPlug.callPlugins('onNowPlayingItemDidChange', attributes);
});
+ipcMain.on('nowPlayingItemDidChangeLastFM', (_event, attributes) => {
+ CiderPlug.callPlugin('lastfm.js', 'nowPlayingItemDidChangeLastFM', attributes);
+})
+
app.on('before-quit', () => {
CiderPlug.callPlugins('onBeforeQuit');
console.warn(`${app.getName()} exited.`);
diff --git a/src/main/plugins/chromecast.ts b/src/main/plugins/chromecast.ts
new file mode 100644
index 00000000..4bdb6113
--- /dev/null
+++ b/src/main/plugins/chromecast.ts
@@ -0,0 +1,342 @@
+import * as electron from 'electron';
+import * as os from 'os';
+import {resolve} from 'path';
+import * as CiderReceiver from '../base/castreceiver';
+
+export default class ChromecastPlugin {
+
+ /**
+ * Private variables for interaction in plugins
+ */
+ private _win: any;
+ private _app: any;
+ private _lastfm: any;
+ private _store: any;
+ private _timer: any;
+ private audioClient = require('castv2-client').Client;
+ private mdns = require('mdns-js');
+
+ private devices : any = [];
+ private castDevices : any = [];
+
+ // private GCRunning = false;
+ // private GCBuffer: any;
+ // private expectedConnections = 0;
+ // private currentConnections = 0;
+ private activeConnections : any = [];
+ // private requests = [];
+ // private GCstream = new Stream.PassThrough(),
+ private connectedHosts : any = {};
+ // private port = false;
+ // private server = false;
+ // private bufcount = 0;
+ // private bufcount2 = 0;
+ // private headerSent = false;
+
+
+ private searchForGCDevices() {
+ try {
+
+ let browser = this.mdns.createBrowser(this.mdns.tcp('googlecast'));
+ browser.on('ready', browser.discover);
+
+ browser.on('update', (service :any) => {
+ if (service.addresses && service.fullname && service.fullname.includes('_googlecast._tcp')) {
+ this.ondeviceup(service.addresses[0], service.fullname.substring(0, service.fullname.indexOf("._googlecast")) + " " + (service.type[0].description ?? ""), '', 'googlecast');
+ }
+ });
+ const Client = require('node-ssdp').Client;
+ // also do a SSDP/UPnP search
+ let ssdpBrowser = new Client();
+ ssdpBrowser.on('response', (headers :any , statusCode : any, rinfo: any) => {
+ var location = getLocation(headers);
+ if (location != null) {
+ this.getServiceDescription(location, rinfo.address);
+ }
+
+ });
+
+ function getLocation(headers: any) {
+ let location = null;
+ if (headers["LOCATION"] != null ){location = headers["LOCATION"]}
+ else if (headers["Location"] != null ){location = headers["Location"]}
+ return location;
+ }
+
+ ssdpBrowser.search('urn:dial-multiscreen-org:device:dial:1');
+
+ // // actual upnp devices
+ // if (app.cfg.get("audio.enableDLNA")) {
+ // let ssdpBrowser2 = new Client();
+ // ssdpBrowser2.on('response', (headers, statusCode, rinfo) => {
+ // var location = getLocation(headers);
+ // if (location != null) {
+ // this.getServiceDescription(location, rinfo.address);
+ // }
+
+ // });
+ // ssdpBrowser2.search('urn:schemas-upnp-org:device:MediaRenderer:1');
+
+ // }
+
+
+ } catch (e) {
+ console.log('Search GC err', e);
+ }
+ }
+
+ private getServiceDescription(url:any, address:any) {
+ const request = require('request');
+ request.get(url, (error: any, response: any, body: any) => {
+ if (!error && response.statusCode === 200) {
+ this.parseServiceDescription(body, address, url);
+ }
+ });
+ }
+
+ private ondeviceup(host: any, name: any, location: any, type: any) {
+ if (this.castDevices.findIndex((item:any) => item.host === host && item.name === name && item.location === location && item.type === type) === -1) {
+ this.castDevices.push({
+ name: name,
+ host: host,
+ location: location,
+ type: type
+ });
+ if (this.devices.indexOf(host) === -1) {
+ this.devices.push(host);
+ }
+ if (name) {
+ this._win.webContents.executeJavaScript(`console.log('deviceFound','ip: ${host} name:${name}')`).catch((err: any) => console.error(err));
+ console.log("deviceFound", host, name);
+ }
+ } else {
+ this._win.webContents.executeJavaScript(`console.log('deviceFound (added)','ip: ${host} name:${name}')`).catch((err: any) => console.error(err));
+ console.log("deviceFound (added)", host, name);
+ }
+ }
+
+ private parseServiceDescription(body: any, address: any, url: any) {
+ const parseString = require('xml2js').parseString;
+ parseString(body, (err: any, result: any) => {
+ if (!err && result && result.root && result.root.device) {
+ const device = result.root.device[0];
+ console.log('device', device);
+ let devicetype = 'googlecast';
+ console.log()
+ if (device.deviceType && device.deviceType.toString() === 'urn:schemas-upnp-org:device:MediaRenderer:1') {
+ devicetype = 'upnp';
+ }
+ this.ondeviceup(address, device.friendlyName.toString(), url, devicetype);
+ }
+ });
+ }
+
+
+ private loadMedia(client: any, song: any, artist: any, album: any, albumart: any, cb?: any) {
+ // const u = 'http://' + this.getIp() + ':' + server.address().port + '/';
+ // const DefaultMediaReceiver : any = require('castv2-client').DefaultMediaReceiver;
+ client.launch(CiderReceiver, (err: any, player: any) => {
+ if (err) {
+ console.log(err);
+ return;
+ }
+ let media = {
+ // Here you can plug an URL to any mp4, webm, mp3 or jpg file with the proper contentType.
+ contentId: 'http://' + this.getIp() + ':9000/audio.wav',
+ contentType: 'audio/wav',
+ streamType: 'LIVE', // or LIVE
+
+ // Title and cover displayed while buffering
+ metadata: {
+ type: 0,
+ metadataType: 3,
+ title: song ?? "",
+ albumName: album ?? "",
+ artist: artist ?? "",
+ images: [
+ {url: albumart ?? ""}]
+ }
+ };
+
+ player.on('status', (status: any) => {
+ console.log('status broadcast playerState=%s', status);
+ });
+
+ console.log('app "%s" launched, loading media %s ...', player, media);
+
+ player.load(media, {
+ autoplay: true
+ }, (err: any, status: any) => {
+ console.log('media loaded playerState=%s', status);
+ });
+
+
+ client.getStatus((x: any, status: any) => {
+ if (status && status.volume) {
+ client.volume = status.volume.level;
+ client.muted = status.volume.muted;
+ client.stepInterval = status.volume.stepInterval;
+ }
+ })
+
+ // send websocket ip
+
+ player.sendIp("ws://"+this.getIp()+":26369");
+
+ });
+ }
+
+ private getIp() {
+ let ip = false;
+ let alias = 0;
+ let ifaces: any = os.networkInterfaces();
+ for (var dev in ifaces) {
+ ifaces[dev].forEach((details:any) => {
+ if (details.family === 'IPv4') {
+ if (!/(loopback|vmware|internal|hamachi|vboxnet|virtualbox)/gi.test(dev + (alias ? ':' + alias : ''))) {
+ if (details.address.substring(0, 8) === '192.168.' ||
+ details.address.substring(0, 7) === '172.16.' ||
+ details.address.substring(0, 3) === '10.'
+ ) {
+ ip = details.address;
+ ++alias;
+ }
+ }
+ }
+ });
+ }
+ return ip;
+ }
+
+ private stream(device: any, song: any, artist: any, album: any, albumart: any) {
+ let castMode = 'googlecast';
+ let UPNPDesc = '';
+ castMode = device.type;
+ UPNPDesc = device.location;
+
+ let client;
+ if (castMode === 'googlecast') {
+ let client = new this.audioClient();
+ client.volume = 100;
+ client.stepInterval = 0.5;
+ client.muted = false;
+
+ client.connect(device.host, () => {
+ // console.log('connected, launching app ...', 'http://' + this.getIp() + ':' + server.address().port + '/');
+ if (!this.connectedHosts[device.host]) {
+ this.connectedHosts[device.host] = client;
+ this.activeConnections.push(client);
+ }
+ this.loadMedia(client, song, artist, album, albumart);
+ });
+
+ client.on('close', () => {
+ console.info("Client Closed");
+ for (let i = this.activeConnections.length - 1; i >= 0; i--) {
+ if (this.activeConnections[i] === client) {
+ this.activeConnections.splice(i, 1);
+ return;
+ }
+ }
+ });
+
+ client.on('error', (err: any) => {
+ console.log('Error: %s', err.message);
+ client.close();
+ delete this.connectedHosts[device.host];
+ });
+
+ } else {
+ // upnp devices
+ //try {
+ // client = new MediaRendererClient(UPNPDesc);
+ // const options = {
+ // autoplay: true,
+ // contentType: 'audio/x-wav',
+ // dlnaFeatures: 'DLNA.ORG_PN=-;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+ // metadata: {
+ // title: 'Apple Music Electron',
+ // creator: 'Streaming ...',
+ // type: 'audio', // can be 'video', 'audio' or 'image'
+ // // url: 'http://' + getIp() + ':' + server.address().port + '/',
+ // // protocolInfo: 'DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000;
+ // }
+ // };
+
+ // client.load('http://' + getIp() + ':' + server.address().port + '/a.wav', options, function (err, _result) {
+ // if (err) throw err;
+ // console.log('playing ...');
+ // });
+
+ // } catch (e) {
+ // }
+ }
+ }
+
+ private async setupGCServer(){
+ return ''
+ }
+
+
+ /**
+ * Base Plugin Details (Eventually implemented into a GUI in settings)
+ */
+ public name: string = 'Chromecast';
+ public description: string = 'LastFM plugin for Cider';
+ public version: string = '0.0.1';
+ public author: string = 'vapormusic / Cider Collective';
+
+ /**
+ * Runs on plugin load (Currently run on application start)
+ */
+ constructor(app: any, store: any) {
+ this._app = app;
+ this._store = store
+
+ }
+
+ /**
+ * Runs on app ready
+ */
+ onReady(win: any): void {
+ this._win = win;
+ electron.ipcMain.on('getKnownCastDevices', (event) => {
+ event.returnValue = this.castDevices
+ });
+
+ electron.ipcMain.on('performGCCast', (event, device, song, artist, album, albumart) => {
+ // this.setupGCServer().then( () => {
+ this._win.webContents.setAudioMuted(true);
+ console.log(device);
+ this.stream(device, song, artist, album, albumart);
+ // })
+ });
+
+ electron.ipcMain.on('getChromeCastDevices', (_event, _data) => {
+ this.searchForGCDevices();
+ });
+
+ electron.ipcMain.on('stopGCast', (_event) => {
+ this._win.webContents.setAudioMuted(false);
+ this.activeConnections = [];
+ this.connectedHosts = {};
+
+ })
+ }
+
+ /**
+ * Runs on app stop
+ */
+ onBeforeQuit(): void {
+
+ }
+
+ /**
+ * Runs on song change
+ * @param attributes Music Attributes
+ */
+ onNowPlayingItemDidChange(attributes: any): void {
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/plugins/discordrpc.ts b/src/main/plugins/discordrpc.ts
index 3265320f..8997770f 100644
--- a/src/main/plugins/discordrpc.ts
+++ b/src/main/plugins/discordrpc.ts
@@ -1,4 +1,6 @@
import * as RPC from 'discord-rpc'
+import {ipcMain} from "electron";
+import fetch from 'electron-fetch'
export default class DiscordRichPresence {
@@ -6,6 +8,8 @@ export default class DiscordRichPresence {
* Private variables for interaction in plugins
*/
private static _store: any;
+ private _app : any;
+ private _attributes : any;
private static _connection: boolean = false;
/**
@@ -29,6 +33,7 @@ export default class DiscordRichPresence {
smallImageText: '',
instance: false
};
+
private _activityCache: RPC.Presence = {
details: '',
state: '',
@@ -58,7 +63,6 @@ export default class DiscordRichPresence {
// Create the client
this._client = new RPC.Client({transport: "ipc"});
-
// Runs on Ready
this._client.on('ready', () => {
console.info(`[DiscordRPC][connect] Successfully Connected to Discord. Authed for user: ${this._client.user.id}.`);
@@ -90,6 +94,44 @@ export default class DiscordRichPresence {
}).catch((e: any) => console.error(`[DiscordRPC][disconnect] ${e}`));
}
+ /**
+ * Filter the Discord activity object
+ */
+ private filterActivity(activity: any, attributes: any): Object {
+
+ // Checks if the name is greater than 128 because some songs can be that long
+ if (activity.details && activity.details.length > 128) {
+ activity.details = activity.details.substring(0, 125) + '...'
+ }
+
+ // Check large image
+ if (activity.largeImageKey == null || activity.largeImageKey === "" || activity.largeImageKey.length > 256) {
+ activity.largeImageKey = "cider";
+ }
+
+ // Timestamp
+ if (new Date(attributes.endTime).getTime() < 0) {
+ delete activity.startTime
+ delete activity.endTime
+ }
+
+ // not sure
+ if (!attributes.artistName) {
+ delete activity.state;
+ }
+
+ if (!activity.largeImageText || activity.largeImageText.length < 2) {
+ delete activity.largeImageText
+ }
+
+ activity.buttons.forEach((key: {label: string, url: string}, _v: Number) => {
+ if (key.url.includes('undefined') || key.url.includes('no-id-found')) {
+ activity.buttons.splice(key, 1);
+ }
+ })
+ return activity
+ }
+
/**
* Sets the activity of the client
* @param {object} attributes
@@ -105,23 +147,18 @@ export default class DiscordRichPresence {
this._activity = {
details: attributes.name,
state: `${attributes.artistName ? `by ${attributes.artistName}` : ''}`,
- startTimestamp: ((new Date(attributes.endTime).getTime() < 0) ? null : attributes.startTime),
- endTimestamp: ((new Date(attributes.endTime).getTime() < 0) ? null : attributes.endTime),
- largeImageKey: (attributes.artwork.url.replace('{w}', '1024').replace('{h}', '1024')) ?? 'cider',
+ startTimestamp: attributes.startTime,
+ endTimestamp: attributes.endTime,
+ largeImageKey: attributes?.artwork?.url?.replace('{w}', '1024').replace('{h}', '1024'),
largeImageText: attributes.albumName,
instance: false, // Whether the activity is in a game session
-
buttons: [
{label: "Listen on Cider", url: attributes.url.cider},
{label: "View on Apple Music", url: attributes.url.appleMusic},
- ]
+ ] //To change attributes.url => preload/cider-preload.js
};
-
- // Checks if the name is greater than 128 because some songs can be that long
- if (this._activity.details && this._activity.details.length > 128) {
- this._activity.details = this._activity.details.substring(0, 125) + '...'
- }
+ this._activity = this.filterActivity(this._activity, attributes)
// Check if its pausing (false) or playing (true)
if (!attributes.status) {
@@ -136,7 +173,6 @@ export default class DiscordRichPresence {
this._client.setActivity(this._activity)
.catch((e: any) => console.error(`[DiscordRichPresence][setActivity] ${e}`));
}
-
} else if (this._activity && this._activityCache !== this._activity && this._activity.details) {
if (!DiscordRichPresence._store.general.discord_rpc_clear_on_pause) {
this._activity.smallImageKey = 'play';
@@ -157,17 +193,37 @@ export default class DiscordRichPresence {
/**
* Runs on plugin load (Currently run on application start)
*/
- constructor(_app: any, store: any) {
+ constructor(app: any, store: any) {
DiscordRichPresence._store = store
console.debug(`[Plugin][${this.name}] Loading Complete.`);
+ this._app = app;
}
/**
* Runs on app ready
*/
onReady(_win: any): void {
+ let self = this
this.connect((DiscordRichPresence._store.general.discord_rpc == 1) ? '911790844204437504' : '886578863147192350');
console.debug(`[Plugin][${this.name}] Ready.`);
+ ipcMain.on('updateRPCImage', (_event, imageurl) => {
+ if (!DiscordRichPresence._store.general.privateEnabled){
+ fetch('https://api.cider.sh/v1/images' ,{
+
+ method: 'POST',
+ body: JSON.stringify({url : imageurl}),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'User-Agent': _win.webContents.getUserAgent()
+ },
+ })
+ .then(res => res.json())
+ .then(function(json){
+ self._attributes["artwork"]["url"] = json.url
+ self.updateActivity(self._attributes)
+ })
+ }
+ })
}
/**
@@ -179,10 +235,12 @@ export default class DiscordRichPresence {
/**
* Runs on playback State Change
- * @param attributes Music Attributes (attributes.state = current state)
+ * @param attributes Music Attributes (attributes.status = current state)
*/
onPlaybackStateDidChange(attributes: object): void {
- this.updateActivity(attributes)
+ if (!DiscordRichPresence._store.general.privateEnabled){
+ this._attributes = attributes
+ this.updateActivity(attributes)}
}
/**
@@ -190,6 +248,8 @@ export default class DiscordRichPresence {
* @param attributes Music Attributes
*/
onNowPlayingItemDidChange(attributes: object): void {
- this.updateActivity(attributes)
+ if (!DiscordRichPresence._store.general.privateEnabled){
+ this._attributes = attributes
+ this.updateActivity(attributes)}
}
}
diff --git a/src/main/plugins/lastfm.ts b/src/main/plugins/lastfm.ts
index 51ddcc34..2ac0a000 100644
--- a/src/main/plugins/lastfm.ts
+++ b/src/main/plugins/lastfm.ts
@@ -15,6 +15,7 @@ export default class LastFMPlugin {
private _app: any;
private _lastfm: any;
private _store: any;
+ private _timer: any;
private authenticateFromFile() {
let sessionData = require(this.sessionPath)
@@ -77,64 +78,52 @@ export default class LastFMPlugin {
}
}
- private async scrobbleSong(attributes: any) {
- await new Promise(resolve => setTimeout(resolve, Math.round(attributes.durationInMillis * (this._store.lastfm.scrobble_after / 100))));
- const currentAttributes = attributes;
+ private scrobbleSong(attributes: any) {
+ if (this._timer) clearTimeout(this._timer);
+ var self = this;
+ this._timer = setTimeout(async () => {
+ const currentAttributes = attributes;
- if (!this._lastfm || this._lastfm.cachedAttributes === attributes) {
- return
- }
+ if (!self._lastfm || self._lastfm.cachedAttributes === attributes) {
+ return
+ }
- if (this._lastfm.cachedAttributes) {
- if (this._lastfm.cachedAttributes.playParams.id === attributes.playParams.id) return;
- }
+ if (self._lastfm.cachedAttributes) {
+ if (self._lastfm.cachedAttributes.playParams.id === attributes.playParams.id) return;
+ }
- if (currentAttributes.status && currentAttributes === attributes) {
- if (fs.existsSync(this.sessionPath)) {
- // Scrobble playing song.
- if (attributes.status === true) {
- this._lastfm.track.scrobble({
- 'artist': this.filterArtistName(attributes.artistName),
- 'track': attributes.name,
- 'album': attributes.albumName,
- 'albumArtist': this.filterArtistName(attributes.artistName),
- 'timestamp': new Date().getTime() / 1000
- }, function (err: any, scrobbled: any) {
- if (err) {
- return console.error('[LastFM] An error occurred while scrobbling', err);
- }
+ const artist = await this.getPrimaryArtist(attributes)
+ const album = this.getAlbumName(attributes)
- console.log('[LastFM] Successfully scrobbled: ', scrobbled);
- });
- this._lastfm.cachedAttributes = attributes
+ if (currentAttributes.status && currentAttributes === attributes) {
+ if (fs.existsSync(this.sessionPath)) {
+ // Scrobble playing song.
+ if (attributes.status === true) {
+ self._lastfm.track.scrobble({
+ 'artist': artist,
+ 'track': attributes.name,
+ 'album': album,
+ 'albumArtist': artist,
+ 'timestamp': new Date().getTime() / 1000
+ }, function (err: any, scrobbled: any) {
+ if (err) {
+ return console.error('[LastFM] An error occurred while scrobbling', err);
+ }
+
+ console.log('[LastFM] Successfully scrobbled: ', scrobbled);
+ });
+ self._lastfm.cachedAttributes = attributes
+ }
+ } else {
+ self.authenticate();
}
} else {
- this.authenticate();
+ return console.log('[LastFM] Did not add ', attributes.name, 'â', artist, 'because now playing a other song.');
}
- } else {
- return console.log('[LastFM] Did not add ', attributes.name, 'â', this.filterArtistName(attributes.artistName), 'because now playing a other song.');
- }
+ }, Math.round(attributes.durationInMillis * Math.min((self._store.lastfm.scrobble_after / 100),0.8)));
}
- private filterArtistName(artist: any) {
- if (!this._store.lastfm.enabledRemoveFeaturingArtists) return artist;
-
- artist = artist.split(' ');
- if (artist.includes('&')) {
- artist.length = artist.indexOf('&');
- }
- if (artist.includes('and')) {
- artist.length = artist.indexOf('and');
- }
- artist = artist.join(' ');
- if (artist.includes(',')) {
- artist = artist.split(',')
- artist = artist[0]
- }
- return artist.charAt(0).toUpperCase() + artist.slice(1);
- }
-
- private updateNowPlayingSong(attributes: any) {
+ private async updateNowPlayingSong(attributes: any) {
if (!this._lastfm || this._lastfm.cachedNowPlayingAttributes === attributes || !this._store.lastfm.NowPlaying) {
return
}
@@ -144,13 +133,16 @@ export default class LastFMPlugin {
}
if (fs.existsSync(this.sessionPath)) {
+ const artist = await this.getPrimaryArtist(attributes)
+ const album = this.getAlbumName(attributes)
+
// update Now Playing
if (attributes.status === true) {
this._lastfm.track.updateNowPlaying({
- 'artist': this.filterArtistName(attributes.artistName),
+ 'artist': artist,
'track': attributes.name,
- 'album': attributes.albumName,
- 'albumArtist': this.filterArtistName(attributes.artistName)
+ 'album': album,
+ 'albumArtist': artist
}, function (err: any, nowPlaying: any) {
if (err) {
return console.error('[LastFM] An error occurred while updating nowPlayingSong', err);
@@ -166,6 +158,44 @@ export default class LastFMPlugin {
}
}
+ private getAlbumName(attributes: any): string {
+ return attributes.albumName.replace(/ - Single| - EP/g, '');
+ }
+
+ private async getPrimaryArtist(attributes: any) {
+ const songId = attributes.playParams.catalogId || attributes.playParams.id
+
+ if (!this._store.lastfm.enabledRemoveFeaturingArtists || !songId) return attributes.artistName;
+
+ const res = await this._win.webContents.executeJavaScript(`
+ (async () => {
+ const subMk = await MusicKit.getInstance().api.v3.music("/v1/catalog/" + MusicKit.getInstance().storefrontId + "/songs/${songId}", {
+ include: {
+ songs: ["artists"]
+ }
+ })
+ if (!subMk) console.error('[LastFM] Request failed: /v1/catalog/us/songs/${songId}')
+ return subMk.data
+ })()
+ `).catch(console.error)
+ if (!res) return attributes.artistName
+
+ const data = res.data
+ if (!data.length) {
+ console.error(`[LastFM] Unable to locate song with id of ${songId}`)
+ return attributes.artistName;
+ }
+
+ const artists = res.data[0].relationships.artists.data
+ if (!artists.length) {
+ console.error(`[LastFM] Unable to find artists related to the song with id of ${songId}`)
+ return attributes.artistName;
+ }
+
+ const primaryArtist = artists[0]
+ return primaryArtist.attributes.name
+ }
+
/**
* Base Plugin Details (Eventually implemented into a GUI in settings)
*/
@@ -229,25 +259,19 @@ export default class LastFMPlugin {
console.log('Example plugin stopped');
}
- /**
- * Runs on playback State Change
- * @param attributes Music Attributes (attributes.state = current state)
- */
- onPlaybackStateDidChange(attributes: object): void {
- this.scrobbleSong(attributes)
- this.updateNowPlayingSong(attributes)
- }
-
/**
* Runs on song change
* @param attributes Music Attributes
*/
- onNowPlayingItemDidChange(attributes: object): void {
- if (!this._store.lastfm.filterLoop){
+ nowPlayingItemDidChangeLastFM(attributes: any): void {
+ if (!this._store.general.privateEnabled){
+ attributes.status = true
+ if (!this._store.lastfm.filterLoop) {
this._lastfm.cachedNowPlayingAttributes = false;
- this._lastfm.cachedAttributes = false}
- this.scrobbleSong(attributes)
+ this._lastfm.cachedAttributes = false
+ }
this.updateNowPlayingSong(attributes)
+ this.scrobbleSong(attributes)}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts
new file mode 100644
index 00000000..ea070645
--- /dev/null
+++ b/src/main/plugins/menubar.ts
@@ -0,0 +1,254 @@
+import {app, Menu, shell} from "electron";
+
+export default class Thumbar {
+ /**
+ * Private variables for interaction in plugins
+ */
+ private _win: any;
+ private _app: any;
+ private _store: any;
+
+ /**
+ * Base Plugin Details (Eventually implemented into a GUI in settings)
+ */
+ public name: string = 'Menubar Plugin';
+ public description: string = 'Creates the menubar';
+ public version: string = '1.0.0';
+ public author: string = 'Core / Quacksire';
+
+ /**
+ * Thumbnail Toolbar Assets
+ * NATIVE-IMAGE DOESN'T SUPPORT SVG
+ private icons: { [key: string]: Electron.NativeImage } = {
+ remoteIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/smartphone.svg')).toPNG(),
+ soundIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/headphones.svg')).toPNG(),
+ aboutIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/info.svg')).toPNG(),
+ settingsIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/settings.svg')).toPNG(),
+ logoutIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/log-out.svg')).toPNG(),
+ ciderIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'assets/logocute.png')).toPNG(),
+ }
+ */
+
+ /**
+ * Menubar Assets
+ * @private
+ */
+ private isMac: boolean = process.platform === 'darwin';
+ private menubarTemplate: any = [
+ {
+ label: app.getName(),
+ submenu: [
+ {
+ label: 'About',
+ click: () => this._win.webContents.executeJavaScript(`app.appRoute('about')`)
+ },
+ { type: 'separator' },
+ {
+ label: 'Settings',
+ accelerator: 'CommandOrControl+,',
+ click: () => this._win.webContents.executeJavaScript(`app.appRoute('settings')`)
+ },
+ { type: 'separator' },
+ { role: 'services' },
+ { type: 'separator' },
+ { role: 'hide' },
+ { role: 'hideOthers' },
+ { role: 'unhide' },
+ { type: 'separator' },
+ { role: 'quit' }
+ ]
+ },
+ {
+ label: 'View',
+ submenu: [
+ {role: 'reload'},
+ {role: 'forceReload'},
+ {role: 'toggleDevTools'},
+ {type: 'separator'},
+ {role: 'resetZoom'},
+ {role: 'zoomIn'},
+ {role: 'zoomOut'},
+ {type: 'separator'},
+ {role: 'togglefullscreen'},
+ ]
+ },
+ {
+ label: 'Window',
+ submenu: [
+ {role: 'minimize'},
+ {role: 'zoom'},
+ ...(this.isMac ? [
+ {type: 'separator'},
+ {role: 'front'},
+ ] : [
+ {role: 'close'}
+ ]),
+ {
+ label: 'Edit',
+ submenu: [
+ { role: 'undo' },
+ { role: 'redo' },
+ { type: 'separator' },
+ { role: 'cut' },
+ { role: 'copy' },
+ { role: 'paste' },
+ ]
+ },
+ {type: 'separator'},
+ {
+ label: 'Web Remote',
+ accelerator: 'CommandOrControl+Shift+W',
+ sublabel: 'Opens in external window',
+ click: () => this._win.webContents.executeJavaScript(`ipcRenderer.invoke('showQR')`)
+ },
+ {
+ label: 'Audio Settings',
+ accelerator: 'CommandOrControl+Shift+A',
+ click: () => this._win.webContents.executeJavaScript(`app.modals.audioSettings = true`)
+ },
+ {
+ label: 'Plug-in Menu',
+ accelerator: 'CommandOrControl+Shift+P',
+ click: () => this._win.webContents.executeJavaScript(`app.modals.pluginMenu = true`)
+ }
+
+ ]
+ },
+ {
+ label: 'Controls',
+ submenu: [
+ {
+ label: 'Pause / Play',
+ accelerator: 'Space',
+ click: () => this._win.webContents.executeJavaScript(`app.SpacePause()`)
+ },
+ {
+ label: 'Next',
+ accelerator: 'CommandOrControl+Right',
+ click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.next()`)
+ },
+ {
+ label: 'Previous',
+ accelerator: 'CommandOrControl+Left',
+ click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.previous()`)
+ },
+ { type: 'separator' },
+ {
+ label: 'Volume Up',
+ accelerator: 'CommandOrControl+Up',
+ click: () => this._win.webContents.executeJavaScript(`app.volumeUp()`)
+ },
+ {
+ label: 'Volume Down',
+ accelerator: 'CommandOrControl+Down',
+ click: () => this._win.webContents.executeJavaScript(`app.volumeDown()`)
+ }
+ ]
+ },
+ {
+ label: 'Account',
+ submenu: [
+ {
+ label: 'Account Settings',
+ click: () => this._win.webContents.executeJavaScript(`app.appRoute('apple-account-settings')`)
+ },
+ {
+ label: 'Sign Out',
+ click: () => this._win.webContents.executeJavaScript(`app.unauthorize()`)
+ }
+ ]
+ },
+ {
+ label: 'Support',
+ role: 'help',
+ submenu: [
+ {
+ label: 'Discord',
+ click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error)
+ },
+ {
+ label: 'GitHub Wiki',
+ click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error)
+ },
+ {type: 'separator'},
+ {
+ label: 'Report a...',
+ submenu: [
+ {
+ label: 'Bug',
+ click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=bug%2Ctriage&template=bug_report.yaml&title=%5BBug%5D%3A+").catch(console.error)
+ },
+ {
+ label: 'Feature Request',
+ click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=enhancement%2Ctriage&template=feature_request.yaml&title=%5BEnhancement%5D%3A+").catch(console.error)
+ },
+ {
+ label: 'Translation Report/Request',
+ click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=%F0%9F%8C%90+Translations&template=translation.yaml&title=%5BTranslation%5D%3A+").catch(console.error)
+ },
+ ]
+ },
+ {type: 'separator'},
+ {
+ label: 'View License',
+ click: () => shell.openExternal("https://github.com/ciderapp/Cider/blob/main/LICENSE").catch(console.error)
+ },
+ {type: 'separator'},
+ {
+ label: 'Toggle Developer Tools',
+ accelerator: 'Option+CommandOrControl+I',
+ click: () => this._win.webContents.openDevTools()
+ },
+ {
+ label: 'Open Configuration File in Editor',
+ click: () => this._store.openInEditor()
+ }
+ ]
+ }
+ ]
+
+ /*******************************************************************************************
+ * Public Methods
+ * ****************************************************************************************/
+
+ /**
+ * Runs on plugin load (Currently run on application start)
+ */
+ constructor(app: any, store: any) {
+ this._app = app;
+ this._store = store
+ console.debug(`[Plugin][${this.name}] Loading Complete.`);
+ }
+
+ /**
+ * Runs on app ready
+ */
+ onReady(win: Electron.BrowserWindow): void {
+ this._win = win;
+ Menu.setApplicationMenu(Menu.buildFromTemplate(this.menubarTemplate))
+ }
+
+ /**
+ * Runs on app stop
+ */
+ onBeforeQuit(): void {
+ console.debug(`[Plugin][${this.name}] Stopped.`);
+ }
+
+ /**
+ * Runs on playback State Change
+ * @param attributes Music Attributes (attributes.status = current state)
+ */
+ onPlaybackStateDidChange(attributes: object): void {
+
+ }
+
+ /**
+ * Runs on song change
+ * @param attributes Music Attributes
+ */
+ onNowPlayingItemDidChange(attributes: object): void {
+
+ }
+
+}
diff --git a/src/main/plugins/mpris.ts b/src/main/plugins/mpris.ts
index 869cbceb..ce38c38b 100644
--- a/src/main/plugins/mpris.ts
+++ b/src/main/plugins/mpris.ts
@@ -174,7 +174,11 @@ export default class MPRIS {
*/
onBeforeQuit(): void {
console.debug(`[Plugin][${this.name}] Stopped.`);
- this.clearState()
+ try {
+ this.clearState()
+ }catch(e) {
+ console.error(e)
+ }
}
/**
diff --git a/src/main/plugins/thumbar.ts b/src/main/plugins/thumbar.ts
new file mode 100644
index 00000000..2ba1f1a9
--- /dev/null
+++ b/src/main/plugins/thumbar.ts
@@ -0,0 +1,133 @@
+import {nativeImage, nativeTheme} from "electron";
+import {utils} from "../base/utils";
+import {join} from "path";
+
+export default class Thumbar {
+ /**
+ * Private variables for interaction in plugins
+ */
+ private _win: any;
+ private _app: any;
+
+ /**
+ * Base Plugin Details (Eventually implemented into a GUI in settings)
+ */
+ public name: string = 'Thumbnail Toolbar Plugin';
+ public description: string = 'Creates and managed the thumbnail toolbar buttons and their events';
+ public version: string = '1.0.0';
+ public author: string = 'Core';
+
+ /**
+ * Thumbnail Toolbar Assets
+ */
+ private icons: { [key: string]: Electron.NativeImage } = {
+ pause: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_pause.png`)),
+ play: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_play.png`)),
+ next: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_next.png`)),
+ previous: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_previous.png`)),
+ }
+
+ /*******************************************************************************************
+ * Private Methods
+ * ****************************************************************************************/
+
+ /**
+ * Blocks non-windows systems from running this plugin
+ * @private
+ * @decorator
+ */
+ private static windowsOnly(_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
+ if (process.platform !== 'win32') {
+ descriptor.value = function () {
+ return
+ }
+ }
+ }
+
+ /**
+ * Update the thumbnail toolbar
+ */
+ @Thumbar.windowsOnly
+ private updateButtons(attributes: any) {
+
+ console.log(attributes)
+
+ if (!attributes) {
+ return
+ }
+
+ const buttons = [
+ {
+ tooltip: 'Previous',
+ icon: this.icons.previous,
+ click() {
+ utils.playback.previous()
+ }
+ },
+ {
+ tooltip: attributes.status ? 'Pause' : 'Play',
+ icon: attributes.status ? this.icons.pause : this.icons.play,
+ click() {
+ utils.playback.playPause()
+ }
+ },
+ {
+ tooltip: 'Next',
+ icon: this.icons.next,
+ click() {
+ utils.playback.next()
+ }
+ }
+ ];
+
+ if (!attributes.playParams || attributes.playParams.id === 'no-id-found') {
+ this._win.setThumbarButtons([])
+ } else {
+ this._win.setThumbarButtons(buttons);
+ }
+ }
+
+ /*******************************************************************************************
+ * Public Methods
+ * ****************************************************************************************/
+
+ /**
+ * Runs on plugin load (Currently run on application start)
+ */
+ constructor(app: any, _store: any) {
+ this._app = app;
+ console.debug(`[Plugin][${this.name}] Loading Complete.`);
+ }
+
+ /**
+ * Runs on app ready
+ */
+ onReady(win: Electron.BrowserWindow): void {
+ this._win = win;
+ console.debug(`[Plugin][${this.name}] Ready.`);
+ }
+
+ /**
+ * Runs on app stop
+ */
+ onBeforeQuit(): void {
+ console.debug(`[Plugin][${this.name}] Stopped.`);
+ }
+
+ /**
+ * Runs on playback State Change
+ * @param attributes Music Attributes (attributes.status = current state)
+ */
+ onPlaybackStateDidChange(attributes: object): void {
+ this.updateButtons(attributes)
+ }
+
+ /**
+ * Runs on song change
+ * @param attributes Music Attributes
+ */
+ onNowPlayingItemDidChange(attributes: object): void {
+ this.updateButtons(attributes)
+ }
+
+}
diff --git a/src/main/plugins/webNowPlaying.ts b/src/main/plugins/webNowPlaying.ts
new file mode 100644
index 00000000..27b5af42
--- /dev/null
+++ b/src/main/plugins/webNowPlaying.ts
@@ -0,0 +1,244 @@
+import * as WebSocket from 'ws';
+
+/**
+ * 0-pad a number.
+ * @param {Number} number
+ * @param {Number} length
+ * @returns String
+ */
+const pad = (number: number, length: number) => String(number).padStart(length, '0');
+
+/**
+ * Convert seconds to a time string acceptable to Rainmeter
+ * https://github.com/tjhrulz/WebNowPlaying-BrowserExtension/blob/master/WebNowPlaying.js#L50-L59
+ * @param {Number} timeInSeconds
+ * @returns String
+ */
+const convertTimeToString = (timeInSeconds: number) => {
+ const timeInMinutes = Math.floor(timeInSeconds / 60);
+ if (timeInMinutes < 60) {
+ return timeInMinutes + ":" + pad(Math.floor(timeInSeconds % 60), 2);
+ }
+ return Math.floor(timeInMinutes / 60) + ":" + pad(Math.floor(timeInMinutes % 60), 2) + ":" + pad(Math.floor(timeInSeconds % 60), 2);
+}
+
+export default class WebNowPlaying {
+ /**
+ * Base Plugin Details (Eventually implemented into a GUI in settings)
+ */
+ public name: string = 'WebNowPlaying';
+ public description: string = 'Song info and playback control for the Rainmeter WebNowPlaying plugin.';
+ public version: string = '1.0.1';
+ public author: string = 'Zennn ';
+
+ private _win: any;
+ private ws?: WebSocket;
+ private wsapiConn?: WebSocket;
+ private playerName: string = 'Cider';
+
+ constructor() {
+ console.debug(`[Plugin][${this.name}] Loading Complete.`);
+ }
+
+ /**
+ * Blocks non-windows systems from running this plugin
+ * @private
+ * @decorator
+ */
+ private static windowsOnly(_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
+ if (process.platform !== 'win32') {
+ descriptor.value = () => void 0;
+ }
+ }
+
+ private sendSongInfo(attributes: any) {
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;
+
+ const fields = ['STATE', 'TITLE', 'ARTIST', 'ALBUM', 'COVER', 'DURATION', 'POSITION', 'VOLUME', 'REPEAT', 'SHUFFLE'];
+ fields.forEach((field) => {
+ try {
+ let value: any = '';
+ switch (field) {
+ case 'STATE':
+ value = attributes.status ? 1 : 2;
+ break;
+ case 'TITLE':
+ value = attributes.name;
+ break;
+ case 'ARTIST':
+ value = attributes.artistName;
+ break;
+ case 'ALBUM':
+ value = attributes.albumName;
+ break;
+ case 'COVER':
+ value = attributes.artwork.url.replace('{w}', attributes.artwork.width).replace('{h}', attributes.artwork.height);
+ break;
+ case 'DURATION':
+ value = convertTimeToString(attributes.durationInMillis / 1000);
+ break;
+ case 'POSITION':
+ value = convertTimeToString((attributes.durationInMillis - attributes.remainingTime) / 1000);
+ break;
+ case 'VOLUME':
+ value = attributes.volume * 100;
+ break;
+ case 'REPEAT':
+ value = attributes.repeatMode;
+ break;
+ case 'SHUFFLE':
+ value = attributes.shuffleMode;
+ break;
+ }
+ this.ws?.send(`${field}:${value}`);
+ } catch (error) {
+ if (this.ws?.readyState === WebSocket.OPEN) {
+ this.ws.send(`Error:Error updating ${field} for ${this.playerName}`);
+ this.ws.send(`ErrorD:${error}`);
+ }
+ }
+ });
+ }
+
+ private fireEvent(evt: WebSocket.MessageEvent) {
+ if (!evt.data) return;
+ const data = evt.data;
+
+ let value: string = '';
+ if (data.split(/ (.+)/).length > 1) {
+ value = data.split(/ (.+)/)[1];
+ }
+ const eventName = data.split(' ')[0].toLowerCase();
+
+ try {
+ switch (eventName) {
+ case 'playpause':
+ this._win.webContents.executeJavaScript('MusicKitInterop.playPause()').catch(console.error);
+ break;
+ case 'next':
+ this._win.webContents.executeJavaScript('MusicKitInterop.next()').catch(console.error);
+ break;
+ case 'previous':
+ this._win.webContents.executeJavaScript('MusicKitInterop.previous()').catch(console.error);
+ break;
+ case 'setposition':
+ this._win.webContents.executeJavaScript(`MusicKit.getInstance().seekToTime(${parseFloat(value)})`);
+ break;
+ case 'setvolume':
+ this._win.webContents.executeJavaScript(`MusicKit.getInstance().volume = ${parseFloat(value) / 100}`);
+ break;
+ case 'repeat':
+ this._win.webContents.executeJavaScript('wsapi.toggleRepeat()').catch(console.error);
+ break;
+ case 'shuffle':
+ this._win.webContents.executeJavaScript('wsapi.toggleShuffle()').catch(console.error);
+ break;
+ case 'togglethumbsup':
+ // not implemented
+ break;
+ case 'togglethumbsdown':
+ // not implemented
+ break;
+ case 'rating':
+ // not implemented
+ break;
+ }
+ } catch (error) {
+ console.debug(error);
+ if (this.ws?.readyState === WebSocket.OPEN) {
+ this.ws.send(`Error:Error sending event to ${this.playerName}`);
+ this.ws.send(`ErrorD:${error}`);
+ }
+ }
+ }
+
+ /**
+ * Runs on app ready
+ */
+ @WebNowPlaying.windowsOnly
+ public onReady(win: any) {
+ this._win = win;
+
+ // Connect to Rainmeter plugin and retry on disconnect.
+ const init = () => {
+ try {
+ this.ws = new WebSocket('ws://127.0.0.1:8974/');
+ let retry: NodeJS.Timeout;
+ this.ws.onopen = () => {
+ console.info('[WebNowPlaying] Connected to Rainmeter');
+ this.ws?.send(`PLAYER:${this.playerName}`);
+ };
+
+ this.ws.onclose = () => {
+ clearTimeout(retry);
+ retry = setTimeout(init, 2000);
+ };
+
+ this.ws.onerror = () => {
+ clearTimeout(retry);
+ this.ws?.close();
+ };
+
+ this.ws.onmessage = this.fireEvent?.bind(this);
+ } catch (error) {
+ console.error(error);
+ }
+ };
+
+ init();
+
+ // Connect to wsapi. Only used to update progress.
+ try {
+ this.wsapiConn = new WebSocket('ws://127.0.0.1:26369/');
+
+ this.wsapiConn.onopen = () => {
+ console.info('[WebNowPlaying] Connected to wsapi');
+ };
+
+ this.wsapiConn.onmessage = (evt: WebSocket.MessageEvent) => {
+ const response = JSON.parse(evt.data);
+ if (response.type === 'playbackStateUpdate') {
+ this.sendSongInfo(response.data);
+ }
+ };
+ } catch (error) {
+ console.error(error);
+ }
+
+ console.debug(`[Plugin][${this.name}] Ready.`);
+ }
+
+ /**
+ * Runs on app stop
+ */
+ @WebNowPlaying.windowsOnly
+ public onBeforeQuit() {
+ if (this.ws) {
+ this.ws.send('STATE:0');
+ this.ws.onclose = () => void 0; // disable onclose handler first to stop it from retrying
+ this.ws.close();
+ }
+ if (this.wsapiConn) {
+ this.wsapiConn.close();
+ }
+ console.debug(`[Plugin][${this.name}] Stopped.`);
+ }
+
+ /**
+ * Runs on playback State Change
+ * @param attributes Music Attributes (attributes.status = current state)
+ */
+ @WebNowPlaying.windowsOnly
+ public onPlaybackStateDidChange(attributes: any) {
+ this.sendSongInfo(attributes);
+ }
+
+ /**
+ * Runs on song change
+ * @param attributes Music Attributes
+ */
+ @WebNowPlaying.windowsOnly
+ public onNowPlayingItemDidChange(attributes: any) {
+ this.sendSongInfo(attributes);
+ }
+}
diff --git a/src/preload/cider-preload.js b/src/preload/cider-preload.js
index 0f55e657..6a8d2358 100644
--- a/src/preload/cider-preload.js
+++ b/src/preload/cider-preload.js
@@ -7,9 +7,10 @@ let cache = {playParams: {id: 0}, status: null, remainingTime: 0},
const MusicKitInterop = {
init: function () {
MusicKit.getInstance().addEventListener(MusicKit.Events.playbackStateDidChange, () => {
- if (MusicKitInterop.filterTrack(MusicKitInterop.getAttributes(), true, false)) {
- global.ipcRenderer.send('playbackStateDidChange', MusicKitInterop.getAttributes())
- ipcRenderer.send('wsapi-updatePlaybackState', MusicKitInterop.getAttributes());
+ const attributes = MusicKitInterop.getAttributes()
+ if (MusicKitInterop.filterTrack(attributes, true, false)) {
+ global.ipcRenderer.send('playbackStateDidChange', attributes)
+ ipcRenderer.send('wsapi-updatePlaybackState', attributes);
// if (typeof _plugins != "undefined") {
// _plugins.execute("OnPlaybackStateChanged", {Attributes: MusicKitInterop.getAttributes()})
// }
@@ -22,9 +23,18 @@ const MusicKitInterop = {
});
/** wsapi */
- MusicKit.getInstance().addEventListener(MusicKit.Events.nowPlayingItemDidChange, () => {
- if (MusicKitInterop.filterTrack(MusicKitInterop.getAttributes(), false, true) || !app.cfg.lastfm.filterLoop) {
- global.ipcRenderer.send('nowPlayingItemDidChange', MusicKitInterop.getAttributes());
+ MusicKit.getInstance().addEventListener(MusicKit.Events.nowPlayingItemDidChange, async () => {
+ const attributes = MusicKitInterop.getAttributes()
+ const trackFilter = MusicKitInterop.filterTrack(attributes, false, true)
+
+ if (trackFilter) {
+ global.ipcRenderer.send('nowPlayingItemDidChange', attributes);
+ }
+
+ // LastFM's Custom Call
+ await MusicKitInterop.modifyNamesOnLocale();
+ if (trackFilter || !app.cfg.lastfm.filterLoop) {
+ global.ipcRenderer.send('nowPlayingItemDidChangeLastFM', attributes);
}
});
@@ -36,7 +46,28 @@ const MusicKitInterop = {
console.warn(`[mediaPlaybackError] ${e}`);
})
},
+ async modifyNamesOnLocale() {
+ if (app.mklang == '' || app.mklang == null) {
+ return;
+ }
+ const mk = MusicKit.getInstance()
+ const nowPlayingItem = mk.nowPlayingItem;
+ if ((nowPlayingItem?._songId ?? nowPlayingItem?.songId) == null){
+ return;
+ }
+ const id = nowPlayingItem?._songId ?? (nowPlayingItem?.songId ?? nowPlayingItem?.id)
+ if (id != null && id != -1) {
+ try{
+ const query = await mk.api.v3.music(`/v1${(((nowPlayingItem?._songId ?? nowPlayingItem?.songId) != null) && ((nowPlayingItem?._songId ?? nowPlayingItem?.songId) != -1)) ? `/catalog/${mk.storefrontId}/` : `/me/library/`}songs/${id}?l=${app.mklang}`);
+ if (query?.data?.data[0]){
+ let attrs = query?.data?.data[0]?.attributes;
+ if (attrs?.name) { nowPlayingItem.attributes.name = attrs?.name ?? ''}
+ if (attrs?.albumName) { nowPlayingItem.attributes.albumName = attrs?.albumName ?? ''}
+ if (attrs?.artistName) { nowPlayingItem.attributes.artistName = attrs?.artistName ?? ''}
+ }} catch (e) { return;}
+ } else {return;}
+ },
getAttributes: function () {
const mk = MusicKit.getInstance()
const nowPlayingItem = mk.nowPlayingItem;
@@ -45,14 +76,14 @@ const MusicKitInterop = {
const attributes = (nowPlayingItem != null ? nowPlayingItem.attributes : {});
attributes.status = isPlayingExport ?? false;
- attributes.name = attributes?.name ?? 'No Title Found';
+ attributes.name = attributes?.name ?? 'no-title-found';
attributes.artwork = attributes?.artwork ?? {url: ''};
attributes.artwork.url = (attributes?.artwork?.url ?? '').replace(`{f}`, "png");
attributes.playParams = attributes?.playParams ?? {id: 'no-id-found'};
attributes.playParams.id = attributes?.playParams?.id ?? 'no-id-found';
attributes.url = {
- cider: "cider://play/s/" + nowPlayingItem?._songId ?? 'no-id-found',
- appleMusic: "https://music.apple.com/"+ mk.storefrontId +"/song/" + nowPlayingItem?._songId ?? 'no-id-found'
+ cider: `https://cider.sh/link?play/s/${nowPlayingItem?._songId ?? (nowPlayingItem?.songId ??'no-id-found')}`,
+ appleMusic: attributes.websiteUrl ? attributes.websiteUrl : `https://music.apple.com/${mk.storefrontId}/song/${nowPlayingItem?._songId ?? (nowPlayingItem?.songId ??'no-id-found')}`
}
if (attributes.playParams.id === 'no-id-found') {
attributes.playParams.id = nowPlayingItem?.id ?? 'no-id-found';
@@ -69,12 +100,12 @@ const MusicKitInterop = {
attributes?.playParams?.id === cache.playParams.id
? Date.now() + attributes?.remainingTime
: attributes?.startTime + attributes?.durationInMillis
- );
+ );
return attributes;
},
filterTrack: function (a, playbackCheck, mediaCheck) {
- if (a.title === "No Title Found" || a.playParams.id === "no-id-found") {
+ if (a.name === 'no-title-found' || a.playParams.id === "no-id-found") {
return;
} else if (mediaCheck && a.playParams.id === cache.playParams.id) {
return;
@@ -88,20 +119,34 @@ const MusicKitInterop = {
return true;
},
- pausePlay: function () {
+ play: () => {
+ MusicKit.getInstance().play().then(r => console.log(`[MusicKitInterop.play] ${r}`));
+ },
+
+ pause: () => {
+ MusicKit.getInstance().pause();
+ },
+
+ playPause: () => {
if (MusicKit.getInstance().isPlaying) {
MusicKit.getInstance().pause();
} else if (MusicKit.getInstance().nowPlayingItem != null) {
- MusicKit.getInstance().play().then(r => console.log(`[MusicKitInterop] Playing ${r}`));
+ MusicKit.getInstance().play().then(r => console.log(`[MusicKitInterop.playPause] Playing ${r}`));
}
},
- nextTrack: function () {
- MusicKit.getInstance().skipToNextItem().then(r => console.log(`[MusicKitInterop] Skipping to Next ${r}`));
+ next: () => {
+ try {
+ app.prevButtonBackIndicator = false;
+ } catch (e) { }
+ if (MusicKit.getInstance().queue.nextPlayableItemIndex != -1 && MusicKit.getInstance().queue.nextPlayableItemIndex != null)
+ MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.nextPlayableItemIndex);
+ // MusicKit.getInstance().skipToNextItem().then(r => console.log(`[MusicKitInterop.next] Skipping to Next ${r}`));
},
- previousTrack: function () {
- MusicKit.getInstance().skipToPreviousItem().then(r => console.log(`[MusicKitInterop] Skipping to Previous ${r}`));
+ previous: () => {
+ if (MusicKit.getInstance().queue.previousPlayableItemIndex != -1 && MusicKit.getInstance().queue.previousPlayableItemIndex != null)
+ MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.previousPlayableItemIndex);
}
}
diff --git a/src/renderer/assets/cider-round.svg b/src/renderer/assets/cider-round.svg
new file mode 100644
index 00000000..f27dc45d
--- /dev/null
+++ b/src/renderer/assets/cider-round.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/renderer/assets/feather/external-link.svg b/src/renderer/assets/feather/external-link.svg
new file mode 100644
index 00000000..6236df3e
--- /dev/null
+++ b/src/renderer/assets/feather/external-link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/assets/github.svg b/src/renderer/assets/github.svg
new file mode 100644
index 00000000..2180f759
--- /dev/null
+++ b/src/renderer/assets/github.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/renderer/assets/music.svg b/src/renderer/assets/music.svg
new file mode 100644
index 00000000..7bee2f7e
--- /dev/null
+++ b/src/renderer/assets/music.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/assets/ppe.svg b/src/renderer/assets/ppe.svg
new file mode 100644
index 00000000..49848f52
--- /dev/null
+++ b/src/renderer/assets/ppe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js
index 56b2ad01..34740568 100644
--- a/src/renderer/audio/audio.js
+++ b/src/renderer/audio/audio.js
@@ -1,4 +1,4 @@
-var CiderAudio = {
+const CiderAudio = {
context : null,
source : null,
audioNodes : {
@@ -6,12 +6,16 @@ var CiderAudio = {
spatialNode : null,
spatialInput: null,
audioBands : null,
- preampNode : null,
vibrantbassNode: null,
+ llpw: null,
+ analogWarmth: null,
+ recorderNode: null,
},
+ ccON: false,
+ mediaRecorder: null,
init: function (cb = function () { }) {
//AudioOutputs.fInit = true;
- searchInt = setInterval(function () {
+ let searchInt = setInterval(function () {
if (document.getElementById("apple-music-player")) {
//AudioOutputs.eqReady = true;
document.getElementById("apple-music-player").crossOrigin = "anonymous";
@@ -28,15 +32,33 @@ var CiderAudio = {
CiderAudio.audioNodes.gainNode.disconnect(); } catch(e){}
try{ CiderAudio.audioNodes.spatialNode.disconnect();} catch(e){}
try{
- CiderAudio.audioNodes.preampNode.disconnect();
- CiderAudio.audioNodes.vibrantbassNode.disconnect();
- CiderAudio.audioNodes.audioBands[0].disconnect();
- CiderAudio.audioNodes.audioBands[9].disconnect();
+ for (var i of CiderAudio.audioNodes.analogWarmth){
+ i.disconnect();
+ }
+ for (var i of CiderAudio.audioNodes.llpw){
+ i.disconnect();
+ }
+ for (var i of CiderAudio.audioNodes.vibrantbassNode){
+ i.disconnect();
+ }
+ for (var i of CiderAudio.audioNodes.audioBands){
+ i.disconnect();
+ }
} catch(e){}
+ try{
+ CiderAudio.audioNodes = {
+ gainNode : null,
+ spatialNode : null,
+ spatialInput: null,
+ audioBands : null,
+ vibrantbassNode: null,
+ llpw: null,
+ analogWarmth: null
+ }
+ } catch (e) {}
CiderAudio.source.connect(CiderAudio.context.destination);} catch(e){}
},
connectContext: function (mediaElem){
-
if (!CiderAudio.context){
CiderAudio.context = new (window.AudioContext || window.webkitAudioContext);
}
@@ -54,64 +76,566 @@ var CiderAudio = {
}
CiderAudio.equalizer()
},
- normalizerOn: function (){},
+ normalizerOn: function (){
+ },
normalizerOff: function (){
CiderAudio.audioNodes.gainNode.gain.setTargetAtTime(1, CiderAudio.context.currentTime+ 1, 0.5);
},
+
spatialOn: function (){
- try{
- CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){}
- CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context);
- CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination);
- let roomDimensions = {
- width: 32,
- height: 12,
- depth: 32,
- };
- let roomMaterials = {
- // Room wall materials
- left: 'metal',
- right: 'metal',
- front: 'brick-bare',
- back: 'brick-bare',
- down: 'acoustic-ceiling-tiles',
- up: 'acoustic-ceiling-tiles',
- };
- CiderAudio.audioNodes.spatialNode.setRoomProperties(roomDimensions, roomMaterials);
- CiderAudio.audioNodes.spatialInput = CiderAudio.audioNodes.spatialNode.createSource();
- CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ CiderAudio.audioNodes.spatialNode = CiderAudio.context.createConvolver();
+ CiderAudio.audioNodes.spatialNode.normalize = true;
+ switch (app.cfg.audio.maikiwiAudio.spatialType) {
+ case 0:
+ fetch('./audio/impulses/CiderSpatial_Conv.wav').then(async (impulseData) => {
+ let bufferedImpulse = await impulseData.arrayBuffer();
+ CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
+
+ });
+ break;
+ case 1:
+ fetch('./audio/impulses/CiderSpatial_Conv_v2.wav').then(async (impulseData) => {
+ let bufferedImpulse = await impulseData.arrayBuffer();
+ CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
+
+ });
+ break;
+ default:
+ fetch('./audio/impulses/CiderSpatial_Conv.wav').then(async (impulseData) => {
+ let bufferedImpulse = await impulseData.arrayBuffer();
+ CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
+
+ });
+ app.cfg.audio.maikiwiAudio.spatialType = 0;
+ break;
+ }
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.context.destination);
+ }
+ else {
+ try{
+ CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){}
+ CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination);
+ let roomDimensions = {
+ width: 32,
+ height: 12,
+ depth: 32,
+ };
+ let roomMaterials = {
+ // Room wall materials
+ left: 'metal',
+ right: 'metal',
+ front: 'brick-bare',
+ back: 'brick-bare',
+ down: 'acoustic-ceiling-tiles',
+ up: 'acoustic-ceiling-tiles',
+ };
+ CiderAudio.audioNodes.spatialNode.setRoomProperties(roomDimensions, roomMaterials);
+ CiderAudio.audioNodes.spatialInput = CiderAudio.audioNodes.spatialNode.createSource();
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);}
},
spatialOff: function (){
- try{
- CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination);
- CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.audioNodes.spatialInput.input);} catch(e){}
- CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);
+ CiderAudio.hierarchical_loading();
},
sendAudio: function (){
- var options = {
- mimeType : 'audio/webm; codecs=opus'
- };
- var destnode = CiderAudio.context.createMediaStreamDestination();
- CiderAudio.audioNodes.gainNode.connect(destnode)
- var mediaRecorder = new MediaRecorder(destnode.stream,options);
- mediaRecorder.start(1);
- mediaRecorder.ondataavailable = function(e) {
- e.data.arrayBuffer().then(buffer => {
- ipcRenderer.send('writeAudio',buffer)
- }
- );
+ if (!CiderAudio.ccON) {
+ CiderAudio.ccON = true
+ let searchInt = setInterval(async function () {
+ if (CiderAudio.context != null && CiderAudio.audioNodes.gainNode != null) {
+ // var options = {
+ // mimeType: 'audio/webm; codecs=opus'
+ // };
+ // var destnode = CiderAudio.context.createMediaStreamDestination();
+ // CiderAudio.audioNodes.gainNode.connect(destnode)
+ // CiderAudio.mediaRecorder = new MediaRecorder(destnode.stream, options);
+ // CiderAudio.mediaRecorder.start(1);
+ // CiderAudio.mediaRecorder.ondataavailable = function (e) {
+ // e.data.arrayBuffer().then(buffer => {
+ // ipcRenderer.send('writeAudio', buffer)
+ // }
+ // );
+ // }
+ const worklet = `class RecorderWorkletProcessor extends AudioWorkletProcessor {
+ static get parameterDescriptors() {
+ return [{
+ name: 'isRecording',
+ defaultValue: 0
+ },
+ {
+ name: 'numberOfChannels',
+ defaultValue: 2
+ }
+ ];
+ }
+
+ constructor() {
+ super();
+ this._bufferSize = 1024;
+ this._buffers = null;
+ this._initBuffer();
+ }
+ _initBuffers(numberOfChannels) {
+ this._buffers = [];
+ for (let channel=0; channel < numberOfChannels; channel++) {
+ this._buffers.push(new Float32Array(this._bufferSize));
+ }
+ }
+
+ _initBuffer() {
+ this._bytesWritten = 0;
+ }
+
+ _isBufferEmpty() {
+ return this._bytesWritten === 0;
+ }
+
+ _isBufferFull() {
+ return this._bytesWritten === this._bufferSize;
+ }
+ _pushToBuffers(audioRawData, numberOfChannels) {
+ if (this._isBufferFull()) {
+ this._flush();
+ }
+ let dataLength = audioRawData[0].length;
+ for (let idx=0; idx {
+ if (this._bytesWritten < this._bufferSize) {
+ buffer = buffer.slice(0, this._bytesWritten);
+ }
+ buffers[channel] = buffer;
+ });
+ this.port.postMessage({
+ eventType: 'data',
+ audioBuffer: buffers,
+ bufferSize: this._bufferSize
+ });
+ this._initBuffer();
+ }
+
+ _recordingStopped() {
+ this.port.postMessage({
+ eventType: 'stop'
+ });
+ }
+
+ process(inputs, outputs, parameters) {
+ const isRecordingValues = parameters.isRecording;
+ const numberOfChannels = parameters.numberOfChannels[0];
+ if (this._buffers === null) {
+ this._initBuffers(numberOfChannels);
+ }
+
+ for (let dataIndex = 0; dataIndex < isRecordingValues.length; dataIndex++)
+ {
+ const shouldRecord = isRecordingValues[dataIndex] === 1;
+ if (!shouldRecord && !this._isBufferEmpty()) {
+ this._flush();
+ this._recordingStopped();
+ }
+
+ if (shouldRecord) {
+ let audioRawData = inputs[0];
+ this._pushToBuffers(audioRawData, numberOfChannels);
+ }
+ }
+ return true;
+ }
+
+ }
+
+ registerProcessor('recorder-worklet', RecorderWorkletProcessor);`
+ let blob = new Blob([worklet], { type: 'application/javascript' });
+ await CiderAudio.context.audioWorklet.addModule(URL.createObjectURL(blob))
+ .then(() => {
+
+ const channels = 2;
+ CiderAudio.audioNodes.recorderNode = new window.AudioWorkletNode(CiderAudio.context,
+ 'recorder-worklet',
+ { parameterData: { numberOfChannels: channels } });
+ CiderAudio.audioNodes.recorderNode.port.onmessage = (e) => {
+ const data = e.data;
+ switch (data.eventType) {
+ case "data":
+ const audioData = data.audioBuffer;
+ const bufferSize = data.bufferSize;
+ ipcRenderer.send('writeWAV', audioData[0], audioData[1], bufferSize);
+ break;
+ case "stop":
+ break;
+ }
+ }
+ CiderAudio.audioNodes.recorderNode.parameters.get('isRecording').setValueAtTime(1, CiderAudio.context.currentTime);
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.recorderNode);
+
+ });
+ clearInterval(searchInt);
+ }
+ }, 1000);
+ } else {if (CiderAudio.audioNodes.recorderNode != null && CiderAudio.context != null) {
+ CiderAudio.audioNodes.recorderNode.parameters.get('isRecording').setValueAtTime(1, CiderAudio.context.currentTime);
+ // CiderAudio.audioNodes.recorderNode = null;
+ // CiderAudio.ccON = false;
+ }}
+
+ },
+ stopAudio(){
+ if (CiderAudio.audioNodes.recorderNode != null && CiderAudio.context != null) {
+ CiderAudio.audioNodes.recorderNode.parameters.get('isRecording').setValueAtTime(0, CiderAudio.context.currentTime);
+ // CiderAudio.audioNodes.recorderNode = null;
+ // CiderAudio.ccON = false;
}
},
- equalizer: function (){
+ analogWarmth_h2_3: function (status, hierarchy){
+ if (status === true) { // 23 Band Adjustment
+ let WARMTH_FREQUENCIES = [10.513, 15.756, 224.01, 677.77, 1245.4, 2326.8, 2847.3, 4215.3, 11057, 12793, 16235, 16235, 17838, 18112, 18112, 19326, 19372, 19372, 20061, 20280, 20280, 20853, 22276];
+ let WARMTH_GAIN = [-4.81, 0.74, 0.55, -0.84, -1.52, 0.84, 0.66, -0.29, 0.29, 0.94, 1.67, 1.62, -0.53, -0.81, -4.98, 1.43, 0.86, 1.13, -1.06, -0.95, -1.13, 1.78, -3.86];
+ let WARMTH_Q = [0.442, 3.536, 2.102, 8.409, 0.625, 16.82, 5, 2.973, 3.536, 2.5, 2.5, 11.89, 0.625, 1.487, 1.153, 5, 5.453, 5, 2.973, 3.386, 3.386, 14.14, 8.409];
+ CiderAudio.audioNodes.analogWarmth = []
+
+
+ for (let i = 0; i < WARMTH_FREQUENCIES.length; i++) {
+ CiderAudio.audioNodes.analogWarmth[i] = CiderAudio.context.createBiquadFilter();
+ CiderAudio.audioNodes.analogWarmth[i].type = 'peaking'; // 'peaking';
+ CiderAudio.audioNodes.analogWarmth[i].frequency.value = WARMTH_FREQUENCIES[i];
+ CiderAudio.audioNodes.analogWarmth[i].Q.value = WARMTH_Q[i];
+ CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * app.cfg.audio.maikiwiAudio.analogWarmth_value;
+ }
+
+ for (let i = 1; i < WARMTH_FREQUENCIES.length; i ++) {
+ CiderAudio.audioNodes.analogWarmth[i-1].connect(CiderAudio.audioNodes.analogWarmth[i]);
+ }
+
+ switch (hierarchy) {
+ case 3:
+ try{
+ CiderAudio.audioNodes.analogWarmth[WARMTH_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.llpw[0]);} catch(e){}
+ break;
+ case 2:
+ try{
+ CiderAudio.audioNodes.analogWarmth[WARMTH_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);} catch(e){}
+ break;
+ case 1:
+ try{
+ CiderAudio.audioNodes.analogWarmth[WARMTH_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.audioBands[0]);} catch(e){}
+ break;
+ }
+
+
+ }
+ },
+ llpw_h2_2: function (status, hierarchy){
+ if (status === true) {
+ let c_LLPW_Q = [1.250, 0.131, 10, 2.5, 2.293, 0.110, 14.14, 1.552, 28.28, 7.071, 2.847, 5, 0.625, 7.071, 3.856, 3.856, 20, 28.28, 20, 14.14, 2.102, 6.698, 3.536, 10];
+ let c_LLPW_GAIN = [-0.11, 0.27, -0.8, 0.57, 1.84, -0.38, 0.47, -1.56, 0.83, 1.58, -1.79, -0.45, 0.48, 1.22, -1.58, -1.59, -2.03, 2.56, -2.2, -2.48, 4.75, 10.5, 1.43, 3.76];
+ let c_LLPW_FREQUENCIES = [400.83, 5812.8, 8360, 10413, 10658, 12079, 12899, 13205, 14848, 15591, 15778, 15783, 16716, 16891, 17255, 17496, 18555, 18622, 19219, 19448, 19664, 21341, 21353, 22595];
+ let LLPW_Q = [5, 1, 3.536, 1.25, 8.409, 1.25, 14.14, 7.071, 5, 0.625, 16.82, 20, 20, 20, 28.28, 28.28, 28.28, 20, 33.64, 33.64, 10, 28.28, 7.071, 3.856];
+ let LLPW_GAIN = [0.38, -1.81, -0.23, -0.51, 0.4, 0.84, 0.36, -0.34, 0.27, -1.2, -0.42, -0.67, 0.81, 1.31, -0.71, 0.68, -1.04, 0.79, -0.73, -1.33, 1.17, 0.57, 0.35, 6.33];
+ let LLPW_FREQUENCIES = [16.452, 24.636, 37.134, 74.483, 159.54, 308.18, 670.21, 915.81, 1200.7, 2766.4, 2930.6, 4050.6, 4409.1, 5395.2, 5901.6, 6455.5, 7164.1, 7724.1, 8449, 10573, 12368, 14198, 17910, 18916];
+ CiderAudio.audioNodes.llpw = []
+
+ if (app.cfg.audio.maikiwiAudio.ciderPPE_value === 0.55) {
+ for (let i = 0; i < c_LLPW_FREQUENCIES.length; i++) {
+ CiderAudio.audioNodes.llpw[i] = CiderAudio.context.createBiquadFilter();
+ CiderAudio.audioNodes.llpw[i].type = 'peaking'; // 'peaking';
+ CiderAudio.audioNodes.llpw[i].frequency.value = c_LLPW_FREQUENCIES[i];
+ CiderAudio.audioNodes.llpw[i].Q.value = c_LLPW_Q[i];
+ CiderAudio.audioNodes.llpw[i].gain.value = c_LLPW_GAIN[i];
+ }
+
+
+ for (let i = 1; i < c_LLPW_FREQUENCIES.length; i ++) {
+ CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]);
+ }
+
+ switch (hierarchy) {
+ case 2:
+ try{
+ CiderAudio.audioNodes.llpw[c_LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);} catch(e){}
+ break;
+ case 1:
+ try{CiderAudio.audioNodes.llpw[c_LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.audioBands[0]);} catch(e){}
+ break;
+
+ }
+
+ console.debug("[Cider][Audio] CAP - Clarity Mode");
+ }
+
+ else if (app.cfg.audio.maikiwiAudio.ciderPPE_value === 0.5) {
+ for (let i = 0; i < LLPW_FREQUENCIES.length; i++) {
+ CiderAudio.audioNodes.llpw[i] = CiderAudio.context.createBiquadFilter();
+ CiderAudio.audioNodes.llpw[i].type = 'peaking'; // 'peaking';
+ CiderAudio.audioNodes.llpw[i].frequency.value = LLPW_FREQUENCIES[i];
+ CiderAudio.audioNodes.llpw[i].Q.value = LLPW_Q[i];
+ CiderAudio.audioNodes.llpw[i].gain.value = LLPW_GAIN[i];
+ }
+
+
+ for (let i = 1; i < LLPW_FREQUENCIES.length; i ++) {
+ CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]);
+ }
+
+ switch (hierarchy) {
+ case 2:
+ try{
+ CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);} catch(e){}
+ break;
+ case 1:
+ try{CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.audioBands[0]);} catch(e){}
+ break;
+
+ }
+ console.debug("[Cider][Audio] CAP - Classic Mode");
+ }
+ }
+
+ },
+ vibrantbass_h2_1: function (status){
+ if (status === true) {
+ let VIBRANTBASSBANDS = app.cfg.audio.maikiwiAudio.vibrantBass.frequencies;
+ let VIBRANTBASSGAIN = app.cfg.audio.maikiwiAudio.vibrantBass.gain;
+ let VIBRANTBASSQ = app.cfg.audio.maikiwiAudio.vibrantBass.Q;
+ CiderAudio.audioNodes.vibrantbassNode = []
+
+ for (let i = 0; i < VIBRANTBASSBANDS.length; i++) {
+ CiderAudio.audioNodes.vibrantbassNode[i] = CiderAudio.context.createBiquadFilter();
+ CiderAudio.audioNodes.vibrantbassNode[i].type = 'peaking'; // 'peaking';
+ CiderAudio.audioNodes.vibrantbassNode[i].frequency.value = VIBRANTBASSBANDS[i];
+ CiderAudio.audioNodes.vibrantbassNode[i].Q.value = VIBRANTBASSQ[i];
+ CiderAudio.audioNodes.vibrantbassNode[i].gain.value = VIBRANTBASSGAIN[i] * app.cfg.audio.maikiwiAudio.vibrantBass.multiplier;
+ }
+
+ for (let i = 1; i < VIBRANTBASSBANDS.length; i ++) {
+ CiderAudio.audioNodes.vibrantbassNode[i-1].connect(CiderAudio.audioNodes.vibrantbassNode[i]);
+ }
+
+ CiderAudio.audioNodes.vibrantbassNode[VIBRANTBASSBANDS.length-1].connect(CiderAudio.audioNodes.audioBands[0]);
+ }
+
+ CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.audioNodes.audioBands[0])
+ },
+ hierarchical_unloading: function (){
+ try {CiderAudio.audioNodes.spatialNode.output.disconnect();} catch(e){}
+ try {CiderAudio.audioNodes.spatialNode.disconnect();} catch(e){}
+ try {CiderAudio.audioNodes.gainNode.disconnect();} catch(e){}
+ try {for (var i of CiderAudio.audioNodes.analogWarmth){i.disconnect();} CiderAudio.audioNodes.analogWarmth = null} catch(e){}
+ try {for (var i of CiderAudio.audioNodes.llpw){i.disconnect();} CiderAudio.audioNodes.llpw = null} catch(e){}
+ try {for (var i of CiderAudio.audioNodes.vibrantbassNode){i.disconnect();} CiderAudio.audioNodes.vibrantbassNode = null} catch(e){}
+
+ console.debug("[Cider][Audio] Finished hierarchical unloading");
+
+ },
+ hierarchical_loading: function (){
+ CiderAudio.hierarchical_unloading();
+
+ if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0) { // Vibrant Bass
+ CiderAudio.vibrantbass_h2_1(true)
+
+ if (app.cfg.audio.maikiwiAudio.ciderPPE === true) { // Vibrant Bass, CAP
+ CiderAudio.llpw_h2_2(true, 2);
+
+ if (app.cfg.audio.maikiwiAudio.analogWarmth === true) { // Vibrant Bass, CAP, Analog Warmth
+ CiderAudio.analogWarmth_h2_3(true, 3);
+
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) { // Vibrant Bass, CAP, Analog Warmth, Maikiwi Spatial
+ app.cfg.audio.normalization = true;
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, CAP, Analog Warmth, Maikiwi Spatial')
+ }
+ else { // Vibrant Bass, CAP, Analog Warmth, Spatial
+ app.cfg.audio.normalization = true;
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, CAP, Analog Warmth, Spatial')
+ }
+ }
+ else {
+ app.cfg.audio.normalization = true;
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, CAP, Analog Warmth')
+ }
+ }
+ else {
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]);
+ app.cfg.audio.normalization = true
+ console.debug('[Cider][Audio] Vibrant Bass, CAP, Maikiwi Spatial')
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, CAP, Spatial')
+ }
+ }
+ else {
+ app.cfg.audio.normalization = true;
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, CAP')
+ }
+ }
+ }
+ else {
+ if (app.cfg.audio.maikiwiAudio.analogWarmth === true) {
+ CiderAudio.analogWarmth_h2_3(true, 2);
+ app.cfg.audio.normalization = true;
+
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, Analog Warmth, Maikiwi Spatial')
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, Analog Warmth, Spatial')
+ }
+ }
+ else {
+ app.cfg.audio.normalization = true;
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, Analog Warmth')
+ }
+ }
+ else {
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ app.cfg.audio.normalization = true;
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, Maikiwi Spatial')
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
+ console.debug('[Cider][Audio] Vibrant Bass, Spatial')
+ }
+ }
+ else {
+ app.cfg.audio.normalization = true;
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
+ console.debug('[Cider][Audio] Vibrant Bass')
+ }
+ }
+ }
+ }
+ // Vibrant Bass ends here
+ else {
+ if (app.cfg.audio.maikiwiAudio.ciderPPE === true) {
+ CiderAudio.llpw_h2_2(true, 1);
+
+ if (app.cfg.audio.maikiwiAudio.analogWarmth === true) {
+ CiderAudio.analogWarmth_h2_3(true, 3);
+
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ app.cfg.audio.normalization = true;
+ console.debug('[Cider][Audio] CAP, Analog Warmth, Maikiwi Spatial')
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] CAP, Analog Warmth, Spatial')
+ }
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] CAP and Analog Warmth')
+ }
+ }
+ else {
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]);
+ app.cfg.audio.normalization = true;
+ console.debug('[Cider][Audio] CAP, Maikiwi Spatial')
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]);
+ console.debug('[Cider][Audio] CAP, Spatial')
+ }
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);
+ console.debug('[Cider][Audio] CAP')
+ }
+ }
+ } // CAP ends here
+ else {
+ if (app.cfg.audio.maikiwiAudio.analogWarmth === true) {
+ CiderAudio.analogWarmth_h2_3(true, 1);
+
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ app.cfg.audio.normalization = true;
+ console.debug('[Cider][Audio] Analog Warmth, Maikiwi Spatial')
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Analog Warmth, Spatial')
+ }
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]);
+ console.debug('[Cider][Audio] Analog Warmth')
+ }
+ }
+ else {
+ if (app.cfg.audio.spatial === true) {
+ if (app.cfg.audio.maikiwiAudio.spatial === true) {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
+ CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.audioBands[0]);
+ app.cfg.audio.normalization = true;
+ console.debug('[Cider][Audio] Maikiwi Spatial')
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);
+ CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]);
+ console.debug('[Cider][Audio] Spatial')
+ }
+ }
+ else {
+ CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.audioBands[0]);
+ console.debug('[Cider][Audio] Direct Mode to Equalizer')
+ }
+ }
+ }
+ }
+
+ console.debug("[Cider][Audio] Finished hierarchical loading");
+
+ },
+
+ equalizer: function (){ // h1_1
let BANDS = app.cfg.audio.equalizer.frequencies;
let GAIN = app.cfg.audio.equalizer.gain;
let Q = app.cfg.audio.equalizer.Q;
- let VIBRANTBASSBANDS = app.cfg.audio.vibrantBass.frequencies;
- let VIBRANTBASSGAIN = app.cfg.audio.vibrantBass.gain;
- let VIBRANTBASSQ = app.cfg.audio.vibrantBass.Q;
- CiderAudio.audioNodes.audioBands = []; CiderAudio.audioNodes.vibrantbassNode = [];
- for (i = 0; i < BANDS.length; i++) {
+ CiderAudio.audioNodes.audioBands = [];
+
+ for (let i = 0; i < BANDS.length; i++) {
CiderAudio.audioNodes.audioBands[i] = CiderAudio.context.createBiquadFilter();
CiderAudio.audioNodes.audioBands[i].type = 'peaking'; // 'peaking';
CiderAudio.audioNodes.audioBands[i].frequency.value = BANDS[i];
@@ -119,44 +643,14 @@ var CiderAudio = {
CiderAudio.audioNodes.audioBands[i].gain.value = GAIN[i] * app.cfg.audio.equalizer.mix;
}
- CiderAudio.audioNodes.preampNode = CiderAudio.context.createBiquadFilter();
- CiderAudio.audioNodes.preampNode.type = 'highshelf';
- CiderAudio.audioNodes.preampNode.frequency.value = 0; // allow all
- CiderAudio.audioNodes.preampNode.gain.value = app.cfg.audio.equalizer.preamp;
+ // Dynamic-ish loading
+ CiderAudio.hierarchical_loading();
- for (i = 0; i < VIBRANTBASSBANDS.length; i++) {
- CiderAudio.audioNodes.vibrantbassNode[i] = CiderAudio.context.createBiquadFilter();
- CiderAudio.audioNodes.vibrantbassNode[i].type = 'peaking'; // 'peaking';
- CiderAudio.audioNodes.vibrantbassNode[i].frequency.value = VIBRANTBASSBANDS[i];
- CiderAudio.audioNodes.vibrantbassNode[i].Q.value = VIBRANTBASSQ[i];
- CiderAudio.audioNodes.vibrantbassNode[i].gain.value = VIBRANTBASSGAIN[i] * app.cfg.audio.vibrantBass.multiplier;
- }
-
- if (app.cfg.audio.spatial) {
- try{
- CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination); } catch(e){}
- CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.preampNode);
- } else {
- try{
- CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){}
- CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.preampNode);
- }
-
- CiderAudio.audioNodes.preampNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
-
- for (i = 1; i < VIBRANTBASSBANDS.length; i ++) {
- CiderAudio.audioNodes.vibrantbassNode[i-1].connect(CiderAudio.audioNodes.vibrantbassNode[i]);
- }
- CiderAudio.audioNodes.vibrantbassNode[VIBRANTBASSBANDS.length-1].connect(CiderAudio.audioNodes.audioBands[0]);
-
- for (i = 1; i < BANDS.length; i ++) {
+ for (let i = 1; i < BANDS.length; i ++) {
CiderAudio.audioNodes.audioBands[i-1].connect(CiderAudio.audioNodes.audioBands[i]);
}
CiderAudio.audioNodes.audioBands[BANDS.length-1].connect(CiderAudio.context.destination);
}
}
-if (app.cfg.advanced.AudioContext){
- CiderAudio.init()
-
-}
\ No newline at end of file
+export {CiderAudio}
\ No newline at end of file
diff --git a/src/renderer/audio/impulses/CiderSpatial_Conv.wav b/src/renderer/audio/impulses/CiderSpatial_Conv.wav
new file mode 100644
index 00000000..06b2551e
Binary files /dev/null and b/src/renderer/audio/impulses/CiderSpatial_Conv.wav differ
diff --git a/src/renderer/audio/impulses/CiderSpatial_Conv_v2.wav b/src/renderer/audio/impulses/CiderSpatial_Conv_v2.wav
new file mode 100644
index 00000000..dad94064
Binary files /dev/null and b/src/renderer/audio/impulses/CiderSpatial_Conv_v2.wav differ
diff --git a/src/renderer/index.js b/src/renderer/index.js
index a7075497..b1f3ccc6 100644
--- a/src/renderer/index.js
+++ b/src/renderer/index.js
@@ -1,81 +1,7 @@
-Vue.use(VueObserveVisibility);
var notyf = new Notyf();
-// This is going to suck to code
-var CiderContextMenu = {
- Menu: function(event) {
- this.items = []
- },
- async Create(event, menudata) {
- var menuBackground = document.createElement("div");
- var menu = document.createElement("div");
- menu.classList.add("context-menu-body");
- menu.classList.add("context-menu-open");
- menuBackground.classList.add("context-menu");
- menu.style.left = 0 + "px";
- menu.style.top = 0 + "px";
- menu.style.position = "absolute";
- menu.style.zIndex = "99909";
- menu.addEventListener("animationend", function() {
- menu.classList.remove("context-menu-open");
- }, { once: true });
-
- function close() {
- menuBackground.style.pointerEvents = "none";
- menu.classList.add("context-menu-close");
- menu.addEventListener("animationend", function() {
- menuBackground.remove();
- menu.remove();
- }, { once: true });
- }
-
- // when menubackground is clicked, remove it
- menuBackground.addEventListener("click", close);
- menuBackground.addEventListener("contextmenu", close);
-
- // add menu to menuBackground
- menuBackground.appendChild(menu);
-
- document.body.appendChild(menuBackground);
-
- if (typeof menudata.items == "object") {
- menudata.items = Object.values(menudata.items);
- }
-
- console.log(menudata);
-
- // for each item in menudata create a menu item
- for (var i = 0; i < menudata.items.length; i++) {
- let item = document.createElement("button")
-
- if (menudata.items[i]["disabled"] === true) {
- continue
- }
- item.tabIndex = 0
- item.classList.add("context-menu-item")
- if (menudata.items[i]["icon"]) {
- item.innerHTML += ``
- }
- item.innerHTML += menudata.items[i].name
- item.onclick = menudata.items[i].action
- menu.appendChild(item)
- }
- menu.style.width = (menu.offsetWidth + 10) + "px";
- menu.style.left = event.clientX + "px";
- menu.style.top = event.clientY + "px";
- // if menu would be off the screen, move it into view, but preserve the width
- if (menu.offsetLeft + menu.offsetWidth > window.innerWidth) {
- menu.style.left = (window.innerWidth - menu.offsetWidth) + "px";
- }
- if (menu.offsetTop + menu.offsetHeight > window.innerHeight) {
- menu.style.top = (window.innerHeight - menu.offsetHeight) + "px";
- }
-
- return menuBackground;
- }
-}
const MusicKitObjects = {
- LibraryPlaylist: function() {
+ LibraryPlaylist: function () {
this.id = ""
this.type = "library-playlist-folders"
this.href = ""
@@ -87,3469 +13,11 @@ const MusicKitObjects = {
}
}
-const MusicKitTools = {
- getHeader() {
- return new Headers({
- Authorization: 'Bearer ' + MusicKit.getInstance().developerToken,
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- 'Music-User-Token': '' + MusicKit.getInstance().musicUserToken
- });
- }
-}
-
// limit an array to a certain number of items
-Array.prototype.limit = function(n) {
+Array.prototype.limit = function (n) {
return this.slice(0, n);
};
-const store = new Vuex.Store({
- state: {
- library: {
- songs: ipcRenderer.sendSync("get-library-songs"),
- albums: ipcRenderer.sendSync("get-library-albums"),
- recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"),
- playlists: ipcRenderer.sendSync("get-library-playlists")
- },
- artwork: {
- playerLCD: ""
- }
- },
- mutations: {
- setLCDArtwork(state, artwork) {
- state.artwork.playerLCD = artwork
- }
- }
-})
-
-const app = new Vue({
- el: "#app",
- store: store,
- data: {
- appMode: "player",
- ipcRenderer: ipcRenderer,
- cfg: ipcRenderer.sendSync("getStore"),
- isDev: ipcRenderer.sendSync("is-dev"),
- drawertest: false,
- platform: "",
- mk: {},
- quickPlayQuery: "",
- lz: ipcRenderer.sendSync("get-i18n", "en_US"),
- lzListing: ipcRenderer.sendSync("get-i18n-listing"),
- search: {
- term: "",
- hints: [],
- showHints: false,
- results: {},
- resultsSocial: {},
- limit: 10
- },
- fullscreenLyrics: false,
- playerLCD: {
- playbackDuration: 0,
- desiredDuration: 0,
- userInteraction: false
- },
- drawer: {
- open: false,
- panel: ""
- },
- browsepage: [],
- listennow: [],
- madeforyou: [],
- radio: {
- personal: []
- },
- webview: {
- url: "",
- title: "",
- loading: false
- },
- showingPlaylist: [],
- appleCurator: [],
- artistPage: {
- data: {},
- },
- library: {
- backgroundNotification: {
- show: false,
- message: "",
- total: 0,
- progress: 0
- },
- songs: {
- sortingOptions: {
- "albumName": "0",
- "artistName": "0",
- "name": "0",
- "genre": "0",
- "releaseDate": "0",
- "durationInMillis": "0"
- },
- sorting: "name",
- sortOrder: "asc",
- listing: [],
- meta: { total: 0, progress: 0 },
- search: "",
- displayListing: [],
- downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library
- },
- albums: {
- sortingOptions: {
- "albumName": "0",
- "artistName": "0",
- "name": "0",
- "genre": "0"
- },
- viewAs: 'covers',
- sorting: ["dateAdded", "name"], // [0] = recentlyadded page, [1] = albums page
- sortOrder: ["desc", "asc"], // [0] = recentlyadded page, [1] = albums page
- listing: [],
- meta: { total: 0, progress: 0 },
- search: "",
- displayListing: [],
- downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library
- },
- artists: {
- sortingOptions: {
- "artistName": "0",
- "name": "0",
- "genre": "0",
- "releaseDate": "0"
- },
- viewAs: 'covers',
- sorting: ["dateAdded", "name"], // [0] = recentlyadded page, [1] = albums page
- sortOrder: ["desc", "asc"], // [0] = recentlyadded page, [1] = albums page
- listing: [],
- meta: { total: 0, progress: 0 },
- search: "",
- displayListing: [],
- downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library
- },
- },
- playlists: {
- listing: [],
- details: {},
- loadingState: 0, // 0 loading, 1 loaded, 2 error
- id: ""
- },
- webremoteurl : "",
- webremoteqr: "",
- mxmtoken: "",
- mkIsReady: false,
- playerReady: false,
- animateBackground: false,
- currentArtUrl: '',
- lyricon: false,
- currentTrackID: '',
- currentTrackIDBG: '',
- lyrics: [],
- currentLyricsLine: 0,
- lyriccurrenttime: 0,
- richlyrics: [],
- lyricsMediaItem: {},
- lyricsDebug: {
- current: 0,
- start: 0,
- end: 0
- },
- v3: {
- requestBody: {
- platform: "web"
- }
- },
- tmpHeight : '',
- tmpWidth : '',
- tmpVar: [],
- notification: false,
- chrome: {
- hideUserInfo: ipcRenderer.sendSync("is-dev") || false,
- artworkReady: false,
- userinfo: {
- "id": "",
- "attributes": {
- "name": "Cider User",
- "handle": "CiderUser",
- "artwork": { "url": "./assets/logocut.png" }
- }
- },
- menuOpened: false,
- maximized: false,
- drawerOpened: false,
- drawerState: "queue",
- topChromeVisible: true,
- progresshover: false,
- windowControlPosition: "right"
- },
- collectionList: {
- response: {},
- title: "",
- type: ""
- },
- prevButtonBackIndicator: false,
- currentSongInfo: {},
- page: "",
- pageHistory: [],
- songstest: false,
- hangtimer: null,
- selectedMediaItems: [],
- routes: ["browse", "listen_now", "radio"],
- musicBaseUrl: "https://api.music.apple.com/",
- modals: {
- addToPlaylist: false,
- spatialProperties: false,
- qrcode: false,
- equalizer: false,
- audioSettings: false,
- },
- socialBadges: {
- badgeMap: {},
- version: "",
- mediaItems: [],
- mediaItemDLState: 0 // 0 = not started, 1 = in progress, 2 = complete
- },
- menuPanel: {
- visible: false,
- event: null,
- content: {
- name: "",
- items: {},
- headerItems: {}
- }
- }
- },
- watch: {
- cfg: {
- handler: function(val, oldVal) {
- console.log(`cfg changed from ${oldVal} to ${val}`);
- ipcRenderer.send("setStore", val);
- },
- deep: true
- },
- page: () => {
- document.getElementById("app-content").scrollTo(0, 0);
- app.resetState()
- },
- showingPlaylist: () => {
- document.getElementById("app-content").scrollTo(0, 0);
- app.resetState()
- },
- artistPage: () => {
- document.getElementById("app-content").scrollTo(0, 0);
- app.resetState()
- },
- },
- methods: {
- stringTemplateParser(expression, valueObj) {
- const templateMatcher = /{{\s?([^{}\s]*)\s?}}/g;
- let text = expression.replace(templateMatcher, (substring, value, index) => {
- value = valueObj[value];
- return value;
- });
- return text
- // stringTemplateParser('my name is {{name}} and age is {{age}}', {name: 'Tom', age:100})
- },
- setLz(lang) {
- if(lang == "") {
- lang = this.cfg.general.language
- }
- this.lz = ipcRenderer.sendSync("get-i18n", lang)
- },
- getLz(message) {
- if(this.lz[message]) {
- return this.lz[message]
- }else{
- return message
- }
- },
- setLzManual() {
- app.$data.library.songs.sortingOptions = {
- "albumName": app.getLz('term.sortBy.album'),
- "artistName": app.getLz('term.sortBy.artist'),
- "name": app.getLz('term.sortBy.name'),
- "genre": app.getLz('term.sortBy.genre'),
- "releaseDate": app.getLz('term.sortBy.releaseDate'),
- "durationInMillis": app.getLz('term.sortBy.duration')
- }
-
- app.$data.library.albums.sortingOptions = {
- "albumName": app.getLz('term.sortBy.album'),
- "artistName": app.getLz('term.sortBy.artist'),
- "name": app.getLz('term.sortBy.name'),
- "genre": app.getLz('term.sortBy.genre')
- }
-
- app.$data.library.artists.sortingOptions = {
- "artistName": app.getLz('term.sortBy.artist'),
- "name": app.getLz('term.sortBy.name'),
- "genre": app.getLz('term.sortBy.genre'),
- "releaseDate": app.getLz('term.sortBy.releaseDate')
- }
- },
- async showSocialListeningTo() {
- let contentIds = Object.keys(app.socialBadges.badgeMap)
- app.showCollection({ data: this.socialBadges.mediaItems }, "Friends Listening To", "albums")
- if (this.socialBadges.mediaItemDLState == 1 || this.socialBadges.mediaItemDLState == 2) {
- return
- }
- this.socialBadges.mediaItemDLState = 2
- await asyncForEach(contentIds, async(item) => {
- try {
- let type = "albums"
- if (item.includes("pl.")) {
- type = "playlists"
- }
- if (item.includes("ra.")) {
- type = "stations"
- }
- let found = await app.mk.api.v3.music(`/v1/catalog/us/${type}/${item}`)
- this.socialBadges.mediaItems.push(found.data.data[0])
- } catch (e) {
-
- }
- })
- },
- async openAppleMusicURL(url) {
- let properties = MusicKit.formattedMediaURL(url)
- let item = {
- id: properties.contentId,
- attributes: {
- playParams: {
- id: properties.contentId,
- kind: properties.kind,
- }
- },
- type: properties.kind,
- kind: properties.kind
- }
- app.routeView(item)
- },
- async showMenuPanel(data, event) {
- app.menuPanel.visible = true;
- app.menuPanel.content.name = data.name ?? "";
- app.menuPanel.content.items = data.items ?? {};
- app.menuPanel.content.headerItems = data.headerItems ?? {};
- if (event) {
- app.menuPanel.event = event;
- }
- },
- async getSvgIcon(url) {
- let response = await fetch(url);
- let data = await response.text();
- return data;
- },
- getSocialBadges(cb = () => {}) {
- let self = this
- try {
- app.mk.api.v3.music("/v1/social/badging-map").then(data => {
- self.socialBadges.badgeMap = data.data.results.badgingMap
- cb(data.data.results.badgingMap)
- })
- } catch (ex) {
- this.socialBadges.badgeMap = {}
- }
- },
- addFavorite(id, type) {
- this.cfg.home.favoriteItems.push({
- id: id,
- type: type
- });
- },
- modularUITest(val = false) {
- this.fullscreenLyrics = val;
- if (val) {
- document.querySelector("#app-main").classList.add("modular-fs")
- } else {
- document.querySelector("#app-main").classList.remove("modular-fs")
- }
- },
- navigateBack() {
- history.back()
- },
- navigateForward() {
- history.forward()
- },
- getHTMLStyle() {
- document.querySelector("html").style.background = "#222";
- document.querySelector("body").classList.add("notransparency")
- },
- resetState() {
- this.menuPanel.visible = false;
- app.selectedMediaItems = [];
- for (let key in app.modals) {
- app.modals[key] = false;
- }
- },
- promptAddToPlaylist() {
- app.modals.addToPlaylist = true;
- },
- async addSelectedToNewPlaylist() {
- let self = this
- let pl_items = []
- for (let i = 0; i < self.selectedMediaItems.length; i++) {
- if (self.selectedMediaItems[i].kind == "song" || self.selectedMediaItems[i].kind == "songs") {
- self.selectedMediaItems[i].kind = "songs"
- pl_items.push({
- id: self.selectedMediaItems[i].id,
- type: self.selectedMediaItems[i].kind
- })
- } else if ((self.selectedMediaItems[i].kind == "album" || self.selectedMediaItems[i].kind == "albums") && self.selectedMediaItems[i].isLibrary != true) {
- self.selectedMediaItems[i].kind = "albums"
- let res = await self.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/albums/${self.selectedMediaItems[i].id}/tracks`);
- let ids = res.data.data.map(function (i) {
- return {id: i.id, type: i.type}
- })
- pl_items = pl_items.concat(ids)
- } else if (self.selectedMediaItems[i].kind == "library-song" || self.selectedMediaItems[i].kind == "library-songs") {
- self.selectedMediaItems[i].kind = "library-songs"
- pl_items.push({
- id: self.selectedMediaItems[i].id,
- type: self.selectedMediaItems[i].kind
- })
- } else if ((self.selectedMediaItems[i].kind == "library-album" || self.selectedMediaItems[i].kind == "library-albums") || (self.selectedMediaItems[i].kind == "album" && self.selectedMediaItems[i].isLibrary == true)) {
- self.selectedMediaItems[i].kind = "library-albums"
- let res = await self.mk.api.v3.music(`/v1/me/library/albums/${self.selectedMediaItems[i].id}/tracks`);
- let ids = res.data.data.map(function (i) {
- return {id: i.id, type: i.type}
- })
- pl_items = pl_items.concat(ids)
- } else {
- pl_items.push({
- id: self.selectedMediaItems[i].id,
- type: self.selectedMediaItems[i].kind
- })
- }
- }
- this.modals.addToPlaylist = false
- app.newPlaylist(app.getLz('term.newPlaylist'), pl_items)
- },
- async addSelectedToPlaylist(playlist_id) {
- let self = this
- let pl_items = []
- for (let i = 0; i < self.selectedMediaItems.length; i++) {
- if (self.selectedMediaItems[i].kind == "song" || self.selectedMediaItems[i].kind == "songs") {
- self.selectedMediaItems[i].kind = "songs"
- pl_items.push({
- id: self.selectedMediaItems[i].id,
- type: self.selectedMediaItems[i].kind
- })
- } else if ((self.selectedMediaItems[i].kind == "album" || self.selectedMediaItems[i].kind == "albums") && self.selectedMediaItems[i].isLibrary != true) {
- self.selectedMediaItems[i].kind = "albums"
- let res = await self.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/albums/${self.selectedMediaItems[i].id}/tracks`);
- let ids = res.data.data.map(function(i) {
- return { id: i.id, type: i.type }
- })
- pl_items = pl_items.concat(ids)
- } else if (self.selectedMediaItems[i].kind == "library-song" || self.selectedMediaItems[i].kind == "library-songs") {
- self.selectedMediaItems[i].kind = "library-songs"
- pl_items.push({
- id: self.selectedMediaItems[i].id,
- type: self.selectedMediaItems[i].kind
- })
- } else if ((self.selectedMediaItems[i].kind == "library-album" || self.selectedMediaItems[i].kind == "library-albums") || (self.selectedMediaItems[i].kind == "album" && self.selectedMediaItems[i].isLibrary == true)) {
- self.selectedMediaItems[i].kind = "library-albums"
- let res = await self.mk.api.v3.music(`/v1/me/library/albums/${self.selectedMediaItems[i].id}/tracks`);
- let ids = res.data.data.map(function(i) {
- return { id: i.id, type: i.type }
- })
- pl_items = pl_items.concat(ids)
- } else {
- pl_items.push({
- id: self.selectedMediaItems[i].id,
- type: self.selectedMediaItems[i].kind
- })
- }
-
- }
- this.modals.addToPlaylist = false
- await app.mk.api.v3.music(
- `/v1/me/library/playlists/${playlist_id}/tracks`, {}, {
- fetchOptions: {
- method: "POST",
- body: JSON.stringify({
- data: pl_items
- })
- }
- }
- ).then(() => {
- if (this.page == 'playlist_' + this.showingPlaylist.id) {
- this.getPlaylistFromID(this.showingPlaylist.id)
- }
- })
- },
- async init() {
- let self = this
- this.setLz(this.cfg.general.language)
- this.setLzManual()
- clearTimeout(this.hangtimer)
- this.mk = MusicKit.getInstance()
- let needsReload = (typeof localStorage["music.ampwebplay.media-user-token"] == "undefined")
- this.mk.authorize().then(() => {
- self.mkIsReady = true
- if(needsReload) {
- document.location.reload()
- }
- })
- this.$forceUpdate()
- if (this.isDev) {
- this.mk.privateEnabled = true
- // Hide UserInfo if Dev mode
- this.chrome.hideUserInfo = true
- } else {
- // Get Hide User from Settings
- this.chrome.hideUserInfo = !this.cfg.visual.showuserinfo
- }
- if (this.cfg.visual.hw_acceleration == "disabled") {
- document.body.classList.add("no-gpu")
- }
- this.mk._services.timing.mode = 0
- this.platform = ipcRenderer.sendSync('cider-platform');
-
- try {
- // Set profile name
- this.chrome.userinfo = (await app.mk.api.v3.music(`/v1/me/social-profile`)).data.data[0]
- } catch (err) {}
-
- // API Fallback
- if (!this.chrome.userinfo) {
- this.chrome.userinfo = {
- "id": "",
- "attributes": {
- "name": "Cider User",
- "handle": "CiderUser",
- "artwork": { "url": "./assets/logocut.png" }
- }
- }
- }
- MusicKitInterop.init()
- // Set the volume
-
- // Check the value of this.cfg.audio.muted
- if( !this.cfg.audio.muted )
- {
- // Set the mk.volume to the last stored volume data
- this.mk.volume = this.cfg.audio.volume
- } else if( this.cfg.audio.muted ) {
- // Set mk.volume to -1 (setting to 0 wont work, so temp solution setting to -1)
- this.mk.volume = -1;
- }
- // ipcRenderer.invoke('getStoreValue', 'audio.volume').then((value) => {
- // self.mk.volume = value
- // })
-
- // load cached library
- if (localStorage.getItem("librarySongs") != null) {
- this.library.songs.listing = JSON.parse(localStorage.getItem("librarySongs"))
- this.library.songs.displayListing = this.library.songs.listing
- }
- if (localStorage.getItem("libraryAlbums") != null) {
- this.library.albums.listing = JSON.parse(localStorage.getItem("libraryAlbums"))
- this.library.albums.displayListing = this.library.albums.listing
- }
-
- window.onbeforeunload = function(e) {
- window.localStorage.setItem("currentTrack", JSON.stringify(app.mk.nowPlayingItem))
- window.localStorage.setItem("currentTime", JSON.stringify(app.mk.currentPlaybackTime))
- window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items))
- };
-
- // Load saved quality
- switch (app.cfg.audio.quality) {
- /** case "extreme":
- app.mk.bitrate = app.cfg.audio.quality = 990
- break; **/
- case "high":
- app.mk.bitrate = app.cfg.audio.quality = 256
- break;
- case "low":
- app.mk.bitrate = app.cfg.audio.quality = 64
- break;
- default:
- // app.mk.bitrate = app.cfg.audio.quality
- break;
- }
-
-
- // load last played track
- try {
- let lastItem = window.localStorage.getItem("currentTrack")
- let time = window.localStorage.getItem("currentTime")
- let queue = window.localStorage.getItem("currentQueue")
- if (lastItem != null) {
- lastItem = JSON.parse(lastItem)
- let kind = lastItem.attributes.playParams.kind;
- let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
- app.mk.setQueue({
- [truekind]: [lastItem.attributes.playParams.id]
- })
- app.mk.mute()
- setTimeout(() => {
- app.mk.play().then(() => {
- app.mk.pause().then(() => {
- if (time != null) {
- app.mk.seekToTime(time)
- }
- app.mk.unmute()
- if (queue != null) {
- queue = JSON.parse(queue)
- if (queue && queue.length > 0) {
- let ids = queue.map(e => (e.playParams ? e.playParams.id : (e.attributes.playParams ? e.attributes.playParams.id : '')))
- let i = 0;
- if (ids.length > 0) {
- for (id of ids) {
- if (!(i == 0 && ids[0] == lastItem.attributes.playParams.id)) {
- try {
- app.mk.playLater({ songs: [id] })
- } catch (err) {}
- }
- i++;
- }
- }
- }
- }
-
- })
-
- })
- }, 1500)
-
- }
-
- } catch (e) {
- console.log(e)
- }
-
- MusicKit.getInstance().videoContainerElement = document.getElementById("apple-music-video-player")
-
- ipcRenderer.on('SoundCheckTag', (event, tag) => {
- let replaygain = self.parseSCTagToRG(tag)
- try {
- CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak)))
- } catch (e) {
-
- }
- })
-
- ipcRenderer.on('play', function(_event, mode, id) {
- if (mode !== 'url'){
- self.mk.setQueue({[mode]: id}).then(() => {
- app.mk.play()
- })
- } else {
- app.openAppleMusicURL(id)
- }
- });
-
- this.mk.addEventListener(MusicKit.Events.playbackStateDidChange, ()=>{
- ipcRenderer.send('wsapi-updatePlaybackState', wsapi.getAttributes());
- })
-
- this.mk.addEventListener(MusicKit.Events.playbackTimeDidChange, (a) => {
- self.lyriccurrenttime = self.mk.currentPlaybackTime
- this.currentSongInfo = a
- self.playerLCD.playbackDuration = (self.mk.currentPlaybackTime)
- // wsapi
- ipcRenderer.send('wsapi-updatePlaybackState', wsapi.getAttributes());
- })
-
- this.mk.addEventListener(MusicKit.Events.nowPlayingItemDidChange, (a) => {
- if (self.$refs.queue) {
- self.$refs.queue.updateQueue();
- }
- this.currentSongInfo = a
-
-
- if (app.cfg.audio.normalization) {
- // get unencrypted audio previews to get SoundCheck's normalization tag
- try {
- let previewURL = null
- try {
- previewURL = app.mk.nowPlayingItem.previewURL
- } catch (e) {}
- if (!previewURL) {
- app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${app.mk.nowPlayingItem._songId ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id}`).then((response) => {
- previewURL = response.data.data[0].attributes.previews[0].url
- if (previewURL)
- ipcRenderer.send('getPreviewURL', previewURL)
- })
- } else {
- if (previewURL)
- ipcRenderer.send('getPreviewURL', previewURL)
- }
-
- } catch (e) {}
- }
-
- try {
- a = a.item.attributes;
- } catch (_) {}
- let type = (self.mk.nowPlayingItem != null) ? self.mk.nowPlayingItem["type"] ?? '' : '';
-
- if (type.includes("musicVideo") || type.includes("uploadedVideo") || type.includes("music-movie")) {
- document.getElementById("apple-music-video-container").style.display = "block";
- // app.chrome.topChromeVisible = false
- } else {
- document.getElementById("apple-music-video-container").style.display = "none";
- // app.chrome.topChromeVisible = true
- }
- self.chrome.artworkReady = false
- self.lyrics = []
- self.richlyrics = []
- app.getCurrentArtURL();
- // app.getNowPlayingArtwork(42);
- app.getNowPlayingArtworkBG(32);
- app.loadLyrics();
-
- // Playback Notifications
- if (this.cfg.general.playbackNotifications && !document.hasFocus() && a.artistName && a.artwork && a.name) {
- if (this.notification) {
- this.notification.close()
- }
- this.notification = new Notification(a.name, {
- body: a.artistName,
- icon: a.artwork.url.replace('/{w}x{h}bb', '/512x512bb').replace('/2000x2000bb', '/35x35bb'),
- silent: true,
- });
- }
-
- })
-
-
- this.mk.addEventListener(MusicKit.Events.playbackVolumeDidChange, (_a) => {
- this.cfg.audio.volume = this.mk.volume
- })
-
- this.refreshPlaylists()
- document.body.removeAttribute("loading")
- if (window.location.hash != "") {
- this.appRoute(window.location.hash)
- } else {
- this.page = "home"
- }
-
- setTimeout(() => {
- this.getSocialBadges()
- this.getBrowsePage();
- this.$forceUpdate()
- }, 500)
- },
- unauthorize() {
- this.mk.unauthorize()
- document.location.reload()
- },
- getAppClasses() {
- let classes = {}
- if (this.cfg.advanced.experiments.includes('compactui')) {
- classes.compact = true
- }
- if(this.cfg.visual.window_background_style == "none") {
- classes.simplebg = true
- }
- return classes
- },
- invokeDrawer(panel) {
- if (this.drawer.panel == panel && this.drawer.open) {
- if (panel == "lyrics") {
- this.lyricon = false
- }
- this.drawer.panel = ""
- this.drawer.open = false
- } else {
- if (panel == "lyrics") {
- this.lyricon = true
- } else {
- this.lyricon = false
- }
- this.drawer.open = true
- this.drawer.panel = panel
- }
- },
- select_removeMediaItem(id) {
- this.selectedMediaItems.filter(item => item.guid == id).forEach(item => {
- this.selectedMediaItems.splice(this.selectedMediaItems.indexOf(item), 1)
- })
- },
- select_hasMediaItem(id) {
- let found = this.selectedMediaItems.find(item => item.guid == id)
- if (found) {
- return true
- } else {
- return false
- }
- },
- select_selectMediaItem(id, kind, index, guid, library) {
- if (!this.select_hasMediaItem(guid)) {
- this.selectedMediaItems.push({
- id: id,
- kind: kind,
- index: index,
- guid: guid,
- isLibrary: library
- })
- }
- },
- getPlaylistFolderChildren(id) {
- return this.playlists.listing.filter(playlist => {
- if (playlist.parent == id) {
- return playlist
- }
- })
- },
- async refreshPlaylists() {
- let self = this
- this.apiCall('https://api.music.apple.com/v1/me/library/playlist-folders/p.playlistsroot/children/', res => {
- self.playlists.listing = res.data
- self.playlists.listing.forEach(playlist => {
- playlist.parent = "p.playlistsroot"
- })
- self.sortPlaylists()
- })
- },
- sortPlaylists() {
- this.playlists.listing.sort((a, b) => {
- if (a.type === "library-playlist-folders" && b.type !== "library-playlist-folders") {
- return -1
- } else if (a.type !== "library-playlist-folders" && b.type === "library-playlist-folders") {
- return 1
- } else {
- return 0
- }
- })
- },
- playlistHeaderContextMenu(event) {
- let menu = {
- items: [{
- name: app.getLz('term.createNewPlaylist'),
- action: () => {
- this.newPlaylist()
- }
- },
- {
- name: app.getLz('term.createNewPlaylistFolder'),
- action: () => {
- this.newPlaylistFolder()
- }
- }
- ]
- }
- this.showMenuPanel(menu, event)
- },
- async editPlaylistFolder(id, name = app.getLz('term.newPlaylist')) {
- let self = this
- this.mk.api.v3.music(
- `/v1/me/library/playlist-folders/${id}`, {}, {
- fetchOptions: {
- method: "PATCH",
- body: JSON.stringify({
- attributes: { name: name }
- })
- }
- }
- ).then(res => {
- self.refreshPlaylists()
- })
- },
- async editPlaylist(id, name = app.getLz('term.newPlaylist')) {
- let self = this
- this.mk.api.v3.music(
- `/v1/me/library/playlists/${id}`, {}, {
- fetchOptions: {
- method: "PATCH",
- body: JSON.stringify({
- attributes: { name: name }
- })
- }
- }
- ).then(res => {
- self.refreshPlaylists()
- })
- },
- copyToClipboard(str) {
- navigator.clipboard.writeText(str)
- },
- newPlaylist(name = app.getLz('term.newPlaylist'), tracks = []) {
- let self = this
- let request = {
- name: name
- }
- if (tracks.length > 0) {
- request.tracks = tracks
- }
- app.mk.api.v3.music(`/v1/me/library/playlists`, {}, {
- fetchOptions: {
- method: "POST",
- body: JSON.stringify({
- "attributes": { "name": name },
- "relationships": {
- "tracks": { "data": tracks },
- }
- })
- }
- }).then(res => {
- res = res.data.data[0]
- console.log(res)
- self.appRoute(`playlist_` + res.id);
- self.showingPlaylist = [];
- self.getPlaylistFromID(app.page.substring(9))
- self.playlists.listing.push({
- id: res.id,
- attributes: {
- name: name
- },
- parent: "p.playlistsroot"
- })
- self.sortPlaylists()
- setTimeout(() => {
- app.refreshPlaylists()
- }, 8000)
- })
- },
- deletePlaylist(id) {
- let self = this
- if (confirm(app.getLz('term.deletePlaylist'))) {
- app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, {}, {
- fetchOptions: {
- method: "DELETE"
- }
- }).then(res => {
- // remove this playlist from playlists.listing if it exists
- let found = self.playlists.listing.find(item => item.id == id)
- if (found) {
- self.playlists.listing.splice(self.playlists.listing.indexOf(found), 1)
- }
- })
- }
- },
- async showCollection(response, title, type, requestBody = {}) {
- let self = this
- console.log(response)
- this.collectionList.requestBody = {}
- this.collectionList.response = response
- this.collectionList.title = title
- this.collectionList.type = type
- this.collectionList.requestBody = requestBody
- app.appRoute("collection-list")
- },
- async showArtistView(artist, title, view) {
- let response = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists/${artist}/view/${view}`,{}, {includeResponseMeta: !0})).data
- console.log(response)
- await this.showCollection(response, title, "artists")
- },
- async showRecordLabelView(label, title, view) {
- let response = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/record-labels/${label}/view/${view}`)).data
- await this.showCollection(response, title, "record-labels")
- },
- async showSearchView(term, group, title) {
-
- let requestBody = {
- platform: "web",
- groups: group,
- types: "activities,albums,apple-curators,artists,curators,editorial-items,music-movies,music-videos,playlists,songs,stations,tv-episodes,uploaded-videos,record-labels",
- limit: 25,
- relate: {
- editorialItems: ["contents"]
- },
- include: {
- albums: ["artists"],
- songs: ["artists"],
- "music-videos": ["artists"]
- },
- extend: "artistUrl",
- fields: {
- artists: "url,name,artwork,hero",
- albums: "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url"
- },
- with: "serverBubbles,lyricHighlights",
- art: {
- "url": "cf"
- },
- omit: {
- resource: ["autos"]
- },
- groups: group
- }
- let response = await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${term}`, requestBody , {
- includeResponseMeta: !0
- })
-
- console.log('searchres', response)
- let responseFormat = {
- data: response.data.results[group].data,
- next: response.data.results[group].next,
- groups: group
- }
- await this.showCollection(responseFormat, title, "search", requestBody)
- },
- async getPlaylistContinuous(response, transient = false) {
- response = response.data.data[0]
- let self = this
- let playlistId = response.id
- if (!transient) this.playlists.loadingState = 0
- this.showingPlaylist = response
- if (!response.relationships.tracks.next) {
- this.playlists.loadingState = 1
- return
- }
-
- function getPlaylistTracks(next) {
- app.apiCall(app.musicBaseUrl + next, res => {
- if (self.showingPlaylist.id != playlistId) {
- return
- }
- self.showingPlaylist.relationships.tracks.data = self.showingPlaylist.relationships.tracks.data.concat(res.data)
- if (res.next) {
- getPlaylistTracks(res.next)
- } else {
- self.playlists.loadingState = 1
- }
- })
- }
-
- getPlaylistTracks(response.relationships.tracks.next)
-
- },
- async getPlaylistFromID(id, transient = false) {
- let self = this
- const params = {
- include: "tracks",
- platform: "web",
- "include[library-playlists]": "catalog,tracks",
- "fields[playlists]": "curatorName,playlistType,name,artwork,url,playParams",
- "include[library-songs]": "catalog,artists,albums,playParams,name,artwork,url",
- "fields[catalog]": "artistUrl,albumUrl,url",
- "fields[songs]": "artistUrl,albumUrl,playParams,name,artwork,url,artistName,albumName,durationInMillis"
- }
- if (!transient) {
- this.playlists.loadingState = 0;
- }
- app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, params).then(res => {
- self.getPlaylistContinuous(res, transient)
- }).catch((e) => {
- console.log(e);
- try {
- app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`, params).then(res => {
- self.getPlaylistContinuous(res, transient)
- })
- } catch (err) {
- console.log(err)
- }
- })
-
- },
- async getArtistFromID(id) {
- this.page = ""
- const artistData = await this.mkapi("artists", false, id, {
- "views": "featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see",
- "extend": "artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero",
- "extend[playlists]": "trackCount",
- "include[songs]": "albums",
- "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount",
- "limit[artists:top-songs]": 20,
- "art[url]": "f"
- }, { includeResponseMeta: !0 })
- console.log(artistData.data.data[0])
- this.artistPage.data = artistData.data.data[0]
- this.page = "artist-page"
- },
- progressBarStyle() {
- let val = this.playerLCD.playbackDuration
- if (this.playerLCD.desiredDuration > 0) {
- val = this.playerLCD.desiredDuration
- }
- let min = 0
- let max = this.mk.currentPlaybackDuration
- let value = (val - min) / (max - min) * 100
- return {
- 'background': ('linear-gradient(to right, var(--keyColor) 0%, var(--keyColor) ' + value + '%, #333 ' + value + '%, #333 100%)')
- }
- },
- async getRecursive(response) {
- // if response has a .next() property run it and keep running until .next is null or undefined
- // and then return the response concatenated with the results of the next() call
- function executeRequest() {
- if (response.next) {
- return response.next().then(executeRequest)
- } else {
- return response
- }
- }
-
- return executeRequest()
- },
- async getRecursive2(response, sendTo) {
- let returnData = {
- "data": [],
- "meta": {}
- }
- if (response.next) {
- console.log("has next")
- returnData.data.concat(response.data)
- returnData.meta = response.meta
- return await this.getRecursive(await response.next())
- } else {
- console.log("no next")
- returnData.data.concat(response.data)
- return returnData
- }
- },
- async getSearchHints() {
- if (this.search.term == "") {
- this.search.hints = []
- return
- }
- let hints = await (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search/hints?term=${this.search.term}`)).data.results
- this.search.hints = hints ? hints.terms : []
- },
- getSongProgress() {
- if (this.playerLCD.userInteraction) {
- return this.playerLCD.desiredDuration
- } else {
- return this.playerLCD.playbackDuration
- }
- },
- convertToMins(time) {
- let mins = Math.floor(time / 60)
- let seconds = (Math.floor(time % 60) / 100).toFixed(2)
- return `${mins}:${seconds.replace("0.", "")}`
- },
- hashCode(str) {
- let hash = 0,
- i, chr;
- if (str.length === 0) return hash;
- for (i = 0; i < str.length; i++) {
- chr = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + chr;
- hash |= 0; // Convert to 32bit integer
- }
- return hash;
- },
- appRoute(route) {
- console.log(route)
- if (route == "" || route == "#" || route == "/") {
- return;
- }
- route = route.replace(/#/g, "")
- // if the route contains does not include a / then route to the page directly
- if (route.indexOf("/") == -1) {
- this.page = route
- window.location.hash = this.page
- return
- }
- let hash = route.split("/")
- let page = hash[0]
- let id = hash[1]
- let isLibrary = hash[2] ?? false
- console.log(`page: ${page} id: ${id} isLibrary: ${isLibrary}`)
- this.routeView({
- kind: page,
- id: id,
- attributes: {
- playParams: { kind: page, id: id, isLibrary: isLibrary }
- }
- })
- },
- routeView(item) {
- let kind = (item.attributes.playParams ? (item.attributes.playParams.kind ?? (item.type ?? '')) : (item.type ?? ''));
- let id = (item.attributes.playParams ? (item.attributes.playParams.id ?? (item.id ?? '')) : (item.id ?? ''));;
- let isLibrary = item.attributes.playParams ? (item.attributes.playParams.isLibrary ?? false) : false;
- console.log(kind, id, isLibrary)
-
- if (true) {
- if (kind.includes("playlist") || kind.includes("album")) {
- app.showingPlaylist = [];
- }
- if (kind.toString().includes("apple-curator")) {
- kind = "appleCurator"
- app.getTypeFromID("appleCurator", (id), false, {
- platform: "web",
- include: "grouping,playlists",
- extend: "editorialArtwork",
- "art[url]": "f"
- });
- window.location.hash = `${kind}/${id}`
- document.querySelector("#app-content").scrollTop = 0
- } else if (kind.toString().includes("artist")) {
- app.getArtistInfo(id, isLibrary)
- window.location.hash = `${kind}/${id}${isLibrary ? "/" + isLibrary : ''}`
- document.querySelector("#app-content").scrollTop = 0
-
- } else if (kind.toString().includes("record-label") || kind.toString().includes("curator")) {
- if (kind.toString().includes("record-label")) {
- kind = "recordLabel"
- } else {
- kind = "curator"
- }
- app.page = (kind) + "_" + (id);
- app.getTypeFromID((kind), (id), (isLibrary), {
- extend: "editorialVideo",
- include: 'grouping,playlists',
- views: 'top-releases,latest-releases,top-artists'
- });
- window.location.hash = `${kind}/${id}`
- document.querySelector("#app-content").scrollTop = 0
- } else if (!kind.toString().includes("radioStation") && !kind.toString().includes("song") && !kind.toString().includes("musicVideo") && !kind.toString().includes("uploadedVideo") && !kind.toString().includes("music-movie")) {
- let params = {
- extend: "offers,editorialVideo",
- "views": "appears-on,more-by-artist,related-videos,other-versions,you-might-also-like,video-extras,audio-extras",
- }
- app.page = (kind) + "_" + (id);
- app.getTypeFromID((kind), (id), (isLibrary), params);
- window.location.hash = `${kind}/${id}${isLibrary ? "/" + isLibrary : ''}`
- document.querySelector("#app-content").scrollTop = 0
- } else {
- app.playMediaItemById((id), (kind), (isLibrary), item.attributes.url ?? '')
- }
-
- }
-
- },
- prevButton() {
- if (!app.prevButtonBackIndicator && app.mk.nowPlayingItem && app.mk.currentPlaybackTime > 2) {
- app.prevButtonBackIndicator = true;
- app.mk.seekToTime(0);
- } else {
- app.prevButtonBackIndicator = false;
- app.mk.skipToPreviousItem()
- }
- },
- async getNowPlayingItemDetailed(target) {
- let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, (app.mk.nowPlayingItem.songId == -1), (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], { "include[songs]": "albums,artists" });
- app.searchAndNavigate(u.data.data[0], target)
- },
- async searchAndNavigate(item, target) {
- let self = this
- app.tmpVar = item;
- switch (target) {
- case "artist":
- let artistId = '';
- try {
- if (item.relationships.artists && item.relationships.artists.data.length > 0 && !item.relationships.artists.data[0].type.includes("library")) {
- if (item.relationships.artists.data[0].type === "artist" || item.relationships.artists.data[0].type === "artists") {
- artistId = item.relationships.artists.data[0].id
- }
- }
- if (artistId == '') {
- const url = (item.relationships.catalog.data[0].attributes.artistUrl);
- artistId = (url).substring(url.lastIndexOf('/') + 1)
- if (artistId.includes('viewCollaboration')) {
- artistId = artistId.substring(artistId.lastIndexOf('ids=') + 4, artistId.lastIndexOf('-'))
- }
- }
- } catch (_) {}
-
- if (artistId == "") {
- let artistQuery = (await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.artistName}`, {
- limit: 1,
- types: 'artists'
- })).data.results;
- try {
- if (artistQuery.artists.data.length > 0) {
- artistId = artistQuery.artists.data[0].id;
- console.log(artistId)
- }
- } catch (e) {}
- }
- console.log(artistId);
- if (artistId != "")
- self.appRoute(`artist/${artistId}`)
- break;
- case "album":
- let albumId = '';
- try {
- if (item.relationships.albums && item.relationships.albums.data.length > 0 && !item.relationships.albums.data[0].type.includes("library")) {
- if (item.relationships.albums.data[0].type === "album" || item.relationships.albums.data[0].type === "albums") {
- albumId = item.relationships.albums.data[0].id
- }
- }
- if (albumId == '') {
- const url = (item.relationships.catalog.data[0].attributes.url);
- albumId = (url).substring(url.lastIndexOf('/') + 1)
- if (albumId.includes("?i=")) {
- albumId = albumId.substring(0, albumId.indexOf("?i="))
- }
- }
- } catch (_) {}
-
- if (albumId == "") {
- try {
- let albumQuery = (await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.albumName + " " + (item.attributes.artistName ?? "")}`, {
- limit: 1,
- types: 'albums'
- })).data.results;
- if (albumQuery.albums.data.length > 0) {
- albumId = albumQuery.albums.data[0].id;
- console.log(albumId)
- }
- } catch (e) {}
- }
- if (albumId != "") {
- self.appRoute(`album/${albumId}`)
- }
- break;
- case "recordLabel":
- let labelId = '';
- try {
- labelId = item.relationships['record-labels'].data[0].id
- } catch (_) {}
-
- if (labelId == "") {
- try {
- let labelQuery = (await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.recordLabel}`, {
- limit: 1,
- types: 'record-labels'
- })).data.results;
- if (labelQuery["record-labels"].data.length > 0) {
- labelId = labelQuery["record-labels"].data[0].id;
- console.log(labelId)
- }
- } catch (e) {}
- }
- if (labelId != "") {
- app.showingPlaylist = []
- await app.getTypeFromID("recordLabel", labelId, false, { views: 'top-releases,latest-releases,top-artists' });
- app.page = "recordLabel_" + labelId;
- }
-
- break;
- }
- },
- exitMV() {
- MusicKit.getInstance().stop()
- document.getElementById("apple-music-video-container").style.display = "none";
- },
- getArtistInfo(id, isLibrary) {
- this.getArtistFromID(id)
- //this.getTypeFromID("artist",id,isLibrary,query)
- },
- playMediaItem(item) {
- let kind = (item.attributes.playParams ? (item.attributes.playParams.kind ?? (item.type ?? '')) : (item.type ?? ''));
- let id = (item.attributes.playParams ? (item.attributes.playParams.id ?? (item.id ?? '')) : (item.id ?? ''));;
- let isLibrary = item.attributes.playParams ? (item.attributes.playParams.isLibrary ?? false) : false;
- let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
- console.log(kind, id, isLibrary)
- app.mk.stop().then(() => {
- if (kind.includes("artist")) {
- app.mk.setStationQueue({ artist: 'a-' + id }).then(() => {
- app.mk.play()
- })
- }
- // else if (kind.includes("playlist") && (id.startsWith("p.") || id.startsWith("pl."))){
- // /* Randomize array in-place using Durstenfeld shuffle algorithm */
- // function shuffleArray(array) {
- // for (var i = array.length - 1; i > 0; i--) {
- // var j = Math.floor(Math.random() * (i + 1));
- // var temp = array[i];
- // array[i] = array[j];
- // array[j] = temp;
- // }
- // }
- // app.mk.clearQueue().then(function () { {
- // app.mk.setQueue({[truekind]: [item.attributes.playParams.id ?? item.id]}).then(function () {
- // app.mk.play().then(function (){
- // app.mk.clearQueue().then(function (){
- // var playlistId = id
- // const params = {
- // include: "tracks",
- // platform: "web",
- // "include[library-playlists]": "catalog,tracks",
- // "fields[playlists]": "curatorName,playlistType,name,artwork,url",
- // "include[library-songs]": "catalog,artists,albums",
- // "fields[catalog]": "artistUrl,albumUrl",
- // "fields[songs]": "artistUrl,albumUrl"
- // }
- // var playlistId = ''
-
- // try {
- // function getPlaylist(id, params, isLibrary){
- // if (isLibrary){
- // return app.mk.api.library.playlist(id, params)
- // } else { return app.mk.api.playlist(id, params)}
- // }
- // getPlaylist(id, params, isLibrary).then(res => {
- // let query = res.relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
- // if (app.mk.shuffleMode == 1){shuffleArray(query); console.log('shf')}
- // app.mk.queue.append(query)
- // if (!res.relationships.tracks.next) {
- // return
- // } else {
- // getPlaylistTracks(res.relationships.tracks.next)
- // }
-
- // function getPlaylistTracks(next) {
- // app.apiCall(app.musicBaseUrl + next, res => {
- // if (res.id != playlistId) {
- // return
- // }
- // let query = res.data.map(item => new MusicKit.MediaItem(item))
- // if (app.mk.shuffleMode == 1){shuffleArray(query); console.log('shf')}
- // app.mk.queue.append(query)
-
- // if (res.next) {
- // getPlaylistTracks(res.next)
- // }
- // })
- // }
- // })
- // } catch (e) {}
-
-
- // })
- // })
- // })
- // }
- // })
- // }
- else {
- app.playMediaItemById((id), (kind), (isLibrary), item.attributes.url ?? '')
- }
- })
- },
- async getTypeFromID(kind, id, isLibrary = false, params = {}, params2 = {}) {
- let a;
- if (kind == "album" | kind == "albums") {
- params["include"] = "tracks,artists,record-labels,catalog";
- }
- try {
- a = await this.mkapi(kind.toString(), isLibrary, id.toString(), params, params2);
- } catch (e) {
- console.log(e);
- try {
- a = await this.mkapi(kind.toString(), !isLibrary, id.toString(), params, params2);
- } catch (err) {
- console.log(err);
- a = []
- } finally {
- if (kind == "appleCurator") {
- app.appleCurator = a.data.data[0]
- } else {
- this.getPlaylistContinuous(a)
- }
- }
- } finally {
- if (kind == "appleCurator") {
- app.appleCurator = a.data.data[0]
- } else {
- this.getPlaylistContinuous(a)
- }
- };
- },
- searchLibrarySongs() {
- let self = this
- let prefs = this.cfg.libraryPrefs.songs
-
- function sortSongs() {
- // sort this.library.songs.displayListing by song.attributes[self.library.songs.sorting] in descending or ascending order based on alphabetical order and numeric order
- // check if song.attributes[self.library.songs.sorting] is a number and if so, sort by number if not, sort by alphabetical order ignoring case
- self.library.songs.displayListing.sort((a, b) => {
- let aa = a.attributes[prefs.sort]
- let bb = b.attributes[prefs.sort]
- if (self.library.songs.sorting == "genre") {
- aa = a.attributes.genreNames[0]
- bb = b.attributes.genreNames[0]
- }
- if (aa == null) {
- aa = ""
- }
- if (bb == null) {
- bb = ""
- }
- if (prefs.sortOrder == "asc") {
- if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
- return aa - bb
- } else {
- return aa.toString().toLowerCase().localeCompare(bb.toString().toLowerCase())
- }
- } else if (prefs.sortOrder == "desc") {
- if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
- return bb - aa
- } else {
- return bb.toString().toLowerCase().localeCompare(aa.toString().toLowerCase())
- }
- }
- })
- }
-
- if (this.library.songs.search == "") {
- this.library.songs.displayListing = this.library.songs.listing
- sortSongs()
- } else {
- this.library.songs.displayListing = this.library.songs.listing.filter(item => {
- let itemName = item.attributes.name.toLowerCase()
- let searchTerm = this.library.songs.search.toLowerCase()
- let artistName = ""
- let albumName = ""
- if (item.attributes.artistName != null) {
- artistName = item.attributes.artistName.toLowerCase()
- }
- if (item.attributes.albumName != null) {
- albumName = item.attributes.albumName.toLowerCase()
- }
-
- // remove any non-alphanumeric characters and spaces from search term and item name
- searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "")
- itemName = itemName.replace(/[^a-z0-9 ]/gi, "")
- artistName = artistName.replace(/[^a-z0-9 ]/gi, "")
- albumName = albumName.replace(/[^a-z0-9 ]/gi, "")
-
- if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
- return item
- }
- })
- sortSongs()
- }
- },
- // make a copy of searchLibrarySongs except use Albums instead of Songs
- searchLibraryAlbums(index) {
- let self = this
-
- function sortAlbums() {
- // sort this.library.albums.displayListing by album.attributes[self.library.albums.sorting[index]] in descending or ascending order based on alphabetical order and numeric order
- // check if album.attributes[self.library.albums.sorting[index]] is a number and if so, sort by number if not, sort by alphabetical order ignoring case
- self.library.albums.displayListing.sort((a, b) => {
- let aa = a.attributes[self.library.albums.sorting[index]]
- let bb = b.attributes[self.library.albums.sorting[index]]
- if (self.library.albums.sorting[index] == "genre") {
- aa = a.attributes.genreNames[0]
- bb = b.attributes.genreNames[0]
- }
- if (aa == null) {
- aa = ""
- }
- if (bb == null) {
- bb = ""
- }
- if (self.library.albums.sortOrder[index] == "asc") {
- if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
- return aa - bb
- } else {
- return aa.toString().toLowerCase().localeCompare(bb.toString().toLowerCase())
- }
- } else if (self.library.albums.sortOrder[index] == "desc") {
- if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
- return bb - aa
- } else {
- return bb.toString().toLowerCase().localeCompare(aa.toString().toLowerCase())
- }
- }
- })
- }
-
- if (this.library.albums.search == "") {
- this.library.albums.displayListing = this.library.albums.listing
- sortAlbums()
- } else {
- this.library.albums.displayListing = this.library.albums.listing.filter(item => {
- let itemName = item.attributes.name.toLowerCase()
- let searchTerm = this.library.albums.search.toLowerCase()
- let artistName = ""
- let albumName = ""
- if (item.attributes.artistName != null) {
- artistName = item.attributes.artistName.toLowerCase()
- }
- if (item.attributes.albumName != null) {
- albumName = item.attributes.albumName.toLowerCase()
- }
-
- // remove any non-alphanumeric characters and spaces from search term and item name
- searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "")
- itemName = itemName.replace(/[^a-z0-9 ]/gi, "")
- artistName = artistName.replace(/[^a-z0-9 ]/gi, "")
- albumName = albumName.replace(/[^a-z0-9 ]/gi, "")
-
- if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
- return item
- }
- })
- sortAlbums()
- }
- },
- // make a copy of searchLibrarySongs except use Albums instead of Songs
- searchLibraryArtists(index) {
- let self = this
-
- function sortArtists() {
- // sort this.library.albums.displayListing by album.attributes[self.library.albums.sorting[index]] in descending or ascending order based on alphabetical order and numeric order
- // check if album.attributes[self.library.albums.sorting[index]] is a number and if so, sort by number if not, sort by alphabetical order ignoring case
- self.library.artists.displayListing.sort((a, b) => {
- let aa = a.attributes[self.library.artists.sorting[index]]
- let bb = b.attributes[self.library.artists.sorting[index]]
- if (self.library.artists.sorting[index] == "genre") {
- aa = a.attributes.genreNames[0]
- bb = b.attributes.genreNames[0]
- }
- if (aa == null) {
- aa = ""
- }
- if (bb == null) {
- bb = ""
- }
- if (self.library.artists.sortOrder[index] == "asc") {
- if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
- return aa - bb
- } else {
- return aa.toString().toLowerCase().localeCompare(bb.toString().toLowerCase())
- }
- } else if (self.library.artists.sortOrder[index] == "desc") {
- if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
- return bb - aa
- } else {
- return bb.toString().toLowerCase().localeCompare(aa.toString().toLowerCase())
- }
- }
- })
- }
-
- if (this.library.artists.search == "") {
- this.library.artists.displayListing = this.library.artists.listing
- sortArtists()
- } else {
- this.library.artists.displayListing = this.library.artists.listing.filter(item => {
- let itemName = item.attributes.name.toLowerCase()
- let searchTerm = this.library.artists.search.toLowerCase()
- let artistName = ""
- let albumName = ""
- // if (item.attributes.artistName != null) {
- // artistName = item.attributes.artistName.toLowerCase()
- // }
- // if (item.attributes.albumName != null) {
- // albumName = item.attributes.albumName.toLowerCase()
- // }
-
- // remove any non-alphanumeric characters and spaces from search term and item name
- searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "")
- itemName = itemName.replace(/[^a-z0-9 ]/gi, "")
-
-
- if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
- return item
- }
- })
- sortArtists()
- }
- },
- getSidebarItemClass(page) {
- if (this.page == page) {
- return ["active"]
- } else {
- return []
- }
- },
- async mkapi(method, library = false, term, params = {}, params2 = {}, attempts = 0) {
- if (method.includes(`recordLabel`)) { method = `record-labels` }
- if (method.includes(`appleCurator`)) { method = `apple-curators` }
- if (attempts > 3) {
- return
- }
- let truemethod = (!method.endsWith("s")) ? (method + "s") : method;
- try {
- if (library) {
- return await this.mk.api.v3.music(`v1/me/library/${truemethod}/${term.toString()}`, params, params2)
- } else {
- return await this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/${truemethod}/${term.toString()}`, params, params2)
- }
- } catch (e) {
- console.log(e)
- return await this.mkapi(method, library, term, params, params2, attempts + 1)
- }
- },
- getLibraryGenres() {
- let genres = []
- genres = []
- this.library.songs.listing.forEach((item) => {
- item.attributes.genreNames.forEach((genre) => {
- if (!genres.includes(genre)) {
- genres.push(genre)
- }
- })
- })
- return genres
- },
- async getLibrarySongsFull(force = false) {
- let self = this
- let library = []
- let downloaded = null;
- if ((this.library.songs.downloadState == 2) && !force) {
- return
- }
- if (this.library.songs.downloadState == 1) {
- return
- }
- if (localStorage.getItem("librarySongs") != null) {
- this.library.songs.listing = JSON.parse(localStorage.getItem("librarySongs"))
- this.searchLibrarySongs()
- }
- if (this.songstest) {
- return
- }
- this.library.songs.downloadState = 1
- this.library.backgroundNotification.show = true
- this.library.backgroundNotification.message = app.getLz('notification.updatingLibrarySongs')
-
- function downloadChunk() {
- const params = {
- "include[library-songs]": "catalog,artists,albums",
- "fields[artists]": "name,url,id",
- "fields[albums]": "name,url,id",
- platform: "web",
- "fields[catalog]": "artistUrl,albumUrl",
- "fields[songs]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
- limit: 100,
- }
- const safeparams = {
- "platform": "web",
- "limit": 80,
- }
- self.library.songs.downloadState = 1
- if (downloaded == null) {
- app.mk.api.v3.music(`/v1/me/library/songs/`, params).then((response) => {
- processChunk(response.data)
- }).catch((error) => {
- console.log('safe loading');
- app.mk.api.v3.music(`/v1/me/library/songs/`, safeparams).then((response) => {
- processChunk(response.data)
- }).catch((error) => {console.log('safe loading failed', error)
- app.library.songs.downloadState = 2
- app.library.backgroundNotification.show = false})
- })
- } else {
- if (downloaded.next != null) {
- app.mk.api.v3.music(downloaded.next, params).then((response) => {
- processChunk(response.data)
- }).catch((error) => {
- console.log('safe loading');
- app.mk.api.v3.music(downloaded.next, safeparams).then((response) => {
- processChunk(response.data)
- }).catch((error) => {console.log('safe loading failed', error)
- app.library.songs.downloadState = 2
- app.library.backgroundNotification.show = false})
- })
- } else {
- console.log("Download next", downloaded.next)
- }
- }
- }
-
- function processChunk(response) {
- downloaded = response
- library = library.concat(downloaded.data)
- self.library.backgroundNotification.show = true
- self.library.backgroundNotification.message = app.getLz('notification.updatingLibrarySongs')
- self.library.backgroundNotification.total = downloaded.meta.total
- self.library.backgroundNotification.progress = library.length
-
- if (downloaded.meta.total == 0) {
- self.library.songs.downloadState = 3
- return
- }
- if (typeof downloaded.next == "undefined") {
- console.log("downloaded.next is undefined")
- self.library.songs.listing = library
- self.library.songs.downloadState = 2
- self.library.backgroundNotification.show = false
- self.searchLibrarySongs()
- localStorage.setItem("librarySongs", JSON.stringify(library))
- }
- if (downloaded.meta.total > library.length || typeof downloaded.meta.next != "undefined") {
- console.log(`downloading next chunk - ${library.length} songs so far`)
- downloadChunk()
- } else {
- self.library.songs.listing = library
- self.library.songs.downloadState = 2
- self.library.backgroundNotification.show = false
- self.searchLibrarySongs()
- localStorage.setItem("librarySongs", JSON.stringify(library))
- console.log(library)
- }
- }
-
- downloadChunk()
- },
- // copy the getLibrarySongsFull function except change Songs to Albums
- async getLibraryAlbumsFull(force = false, index) {
- let self = this
- let library = []
- let downloaded = null;
- if ((this.library.albums.downloadState == 2 || this.library.albums.downloadState == 1) && !force) {
- return
- }
- if (localStorage.getItem("libraryAlbums") != null) {
- this.library.albums.listing = JSON.parse(localStorage.getItem("libraryAlbums"))
- this.searchLibraryAlbums(index)
- }
- if (this.songstest) {
- return
- }
- this.library.albums.downloadState = 1
- this.library.backgroundNotification.show = true
- this.library.backgroundNotification.message = app.getLz('notification.updatingLibraryAlbums')
-
- function downloadChunk() {
- self.library.albums.downloadState = 1
- const params = {
- "include[library-albums]": "catalog,artists,albums",
- "fields[artists]": "name,url,id",
- "fields[albums]": "name,url,id",
- platform: "web",
- "fields[catalog]": "artistUrl,albumUrl",
- "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
- limit: 100,
- }
- const safeparams = {
- platform: "web",
- limit: "60",
- "include[library-albums]": "artists",
- "include[library-artists]": "catalog",
- "include[albums]": "artists",
- "fields[artists]": "name,url",
- "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
- "includeOnly": "catalog,artists"
- }
- if (downloaded == null) {
- app.mk.api.v3.music(`/v1/me/library/albums/`, params).then((response) => {
- processChunk(response.data)
- }).catch((error) => {
- console.log('safe loading');
- app.mk.api.v3.music(`/v1/me/library/albums/`, safeparams).then((response) => {
- processChunk(response.data)
- }).catch((error) => {console.log('safe loading failed', error)
- app.library.albums.downloadState = 2
- app.library.backgroundNotification.show = false})
- })
- } else {
- if (downloaded.next != null) {
- app.mk.api.v3.music(downloaded.next, params).then((response) => {
- processChunk(response.data)
- }).catch((error) => {
- console.log('safe loading');
- app.mk.api.v3.music(downloaded.next, safeparams).then((response) => {
- processChunk(response.data)
- }).catch((error) => {console.log('safe loading failed', error);
- app.library.albums.downloadState = 2
- app.library.backgroundNotification.show = false})
- })
- } else {
- console.log("Download next", downloaded.next)
- }
- }
- }
-
- function processChunk(response) {
- downloaded = response
- library = library.concat(downloaded.data)
- self.library.backgroundNotification.show = true
- self.library.backgroundNotification.message = app.getLz('notification.updatingLibraryAlbums')
- self.library.backgroundNotification.total = downloaded.meta.total
- self.library.backgroundNotification.progress = library.length
- if (downloaded.meta.total == 0) {
- self.library.albums.downloadState = 3
- return
- }
- if (typeof downloaded.next == "undefined") {
- console.log("downloaded.next is undefined")
- self.library.albums.listing = library
- self.library.albums.downloadState = 2
- self.library.backgroundNotification.show = false
- localStorage.setItem("libraryAlbums", JSON.stringify(library))
- self.searchLibraryAlbums(index)
- }
- if (downloaded.meta.total > library.length || typeof downloaded.meta.next != "undefined") {
- console.log(`downloading next chunk - ${library.length
- } albums so far`)
- downloadChunk()
- } else {
- self.library.albums.listing = library
- self.library.albums.downloadState = 2
- self.library.backgroundNotification.show = false
- localStorage.setItem("libraryAlbums", JSON.stringify(library))
- self.searchLibraryAlbums(index)
- console.log(library)
- }
- }
-
- downloadChunk()
- },
- // copy the getLibrarySongsFull function except change Songs to Albums
- async getLibraryArtistsFull(force = false, index) {
- let self = this
- let library = []
- let downloaded = null;
- if ((this.library.artists.downloadState == 2 || this.library.artists.downloadState == 1) && !force) {
- return
- }
- if (localStorage.getItem("libraryArtists") != null) {
- this.library.artists.listing = JSON.parse(localStorage.getItem("libraryArtists"))
- this.searchLibraryArtists(index)
- }
- if (this.songstest) {
- return
- }
- this.library.artists.downloadState = 1
- this.library.backgroundNotification.show = true
- this.library.backgroundNotification.message = app.getLz('notification.updatingLibraryArtists')
-
- function downloadChunk() {
- self.library.artists.downloadState = 1
- const params = {
- include: "catalog",
- // "include[library-artists]": "catalog,artists,albums",
- // "fields[artists]": "name,url,id",
- // "fields[albums]": "name,url,id",
- platform: "web",
- // "fields[catalog]": "artistUrl,albumUrl",
- // "fields[artists]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
- limit: 100,
- }
- const safeparams = {
- include: "catalog",
- platform: "web",
- limit: 50,
- }
- if (downloaded == null) {
- app.mk.api.v3.music(`/v1/me/library/artists/`, params).then((response) => {
- processChunk(response.data)
- }).catch((error) => {
- console.log('safe loading');
- app.mk.api.v3.music(`/v1/me/library/artists/`, safeparams).then((response) => {
- processChunk(response.data)
- }).catch((error) => {console.log('safe loading failed', error)
- app.library.artists.downloadState = 2
- app.library.backgroundNotification.show = false})
- })
-
- } else {
- if (downloaded.next != null) {
- app.mk.api.v3.music(downloaded.next, params).then((response) => {
- processChunk(response.data)
- }).catch((error) => {
- console.log('safe loading');
- app.mk.api.v3.music(downloaded.next, safeparams).then((response) => {
- processChunk(response.data)
- }).catch((error) => {console.log('safe loading failed', error)
- app.library.artists.downloadState = 2
- app.library.backgroundNotification.show = false})
- })
- } else {
- console.log("Download next", downloaded.next)
- }
-
- }
- }
-
- function processChunk(response) {
- downloaded = response
- library = library.concat(downloaded.data)
- self.library.backgroundNotification.show = true
- self.library.backgroundNotification.message = app.getLz('notification.updatingLibraryArtists')
- self.library.backgroundNotification.total = downloaded.meta.total
- self.library.backgroundNotification.progress = library.length
- if (downloaded.meta.total == 0) {
- self.library.albums.downloadState = 3
- return
- }
- if (typeof downloaded.next == "undefined") {
- console.log("downloaded.next is undefined")
- self.library.artists.listing = library
- self.library.artists.downloadState = 2
- self.library.artists.show = false
- localStorage.setItem("libraryArtists", JSON.stringify(library))
- self.searchLibraryArtists(index)
- }
- if (downloaded.meta.total > library.length || typeof downloaded.meta.next != "undefined") {
- console.log(`downloading next chunk - ${library.length
- } artists so far`)
- downloadChunk()
- } else {
- self.library.artists.listing = library
- self.library.artists.downloadState = 2
- self.library.backgroundNotification.show = false
- localStorage.setItem("libraryArtists", JSON.stringify(library))
- self.searchLibraryArtists(index)
- console.log(library)
- }
- }
-
- downloadChunk()
- },
- getTotalTime() {
- try {
- if (app.showingPlaylist.relationships.tracks.data.length > 0) {
- let time = Math.round([].concat(...app.showingPlaylist.relationships.tracks.data).reduce((a, { attributes: { durationInMillis } }) => a + durationInMillis, 0) / 1000);
- let hours = Math.floor(time / 3600)
- let mins = Math.floor(time / 60) % 60
- let secs = time % 60
- return app.showingPlaylist.relationships.tracks.data.length + " " + app.getLz('term.tracks') +", " + ((hours > 0) ? (hours + (" " + ((hours > 1) ? app.getLz('term.time.hours') + ", " : app.getLz('term.time.hour') +", "))) : "") + ((mins > 0) ? (mins + ((mins > 1) ? " " + app.getLz('term.time.minutes') + ", " : " " + app.getLz('term.time.minute') + ", ")) : "") + secs + ((secs > 1) ? " " + app.getLz('term.time.seconds') + "." : " " + app.getLz('term.time.second') + ".");
- } else return ""
- } catch (err) {
- return ""
- }
- },
- async getLibrarySongs() {
- let response = await this.mkapi("songs", true, "", { limit: 100 }, { includeResponseMeta: !0 })
- this.library.songs.listing = response.data.data
- this.library.songs.meta = response.data.meta
- },
- async getLibraryAlbums() {
- let response = await this.mkapi("albums", true, "", { limit: 100 }, { includeResponseMeta: !0 })
- this.library.albums.listing = response.data.data
- this.library.albums.meta = response.data.meta
- },
- async getListenNow(attempt = 0) {
- if (this.listennow.timestamp > Date.now() - 120000) {
- return
- }
-
- if (attempt > 3) {
- return
- }
- try {
- this.listennow = (await this.mk.api.v3.music(`v1/me/recommendations?timezone=${encodeURIComponent(this.formatTimezoneOffset())}`, {
- name: "listen-now",
- with: "friendsMix,library,social",
- "art[social-profiles:url]": "c",
- "art[url]": "c,f",
- "omit[resource]": "autos",
- "relate[editorial-items]": "contents",
- extend: ["editorialCard", "editorialVideo"],
- "extend[albums]": ["artistUrl"],
- "extend[library-albums]": ["artistUrl", "editorialVideo"],
- "extend[playlists]": ["artistNames", "editorialArtwork", "editorialVideo"],
- "extend[library-playlists]": ["artistNames", "editorialArtwork", "editorialVideo"],
- "extend[social-profiles]": "topGenreNames",
- "include[albums]": "artists",
- "include[songs]": "artists",
- "include[music-videos]": "artists",
- "fields[albums]": ["artistName", "artistUrl", "artwork", "contentRating", "editorialArtwork", "editorialVideo", "name", "playParams", "releaseDate", "url"],
- "fields[artists]": ["name", "url"],
- "extend[stations]": ["airDate", "supportsAirTimeUpdates"],
- "meta[stations]": "inflectionPoints",
- types: "artists,albums,editorial-items,library-albums,library-playlists,music-movies,music-videos,playlists,stations,uploaded-audios,uploaded-videos,activities,apple-curators,curators,tv-shows,social-upsells",
- platform: "web"
- }, {
- includeResponseMeta: !0,
- reload: !0
- })).data;
- this.listennow.timestamp = Date.now()
- console.log(this.listennow)
- } catch (e) {
- console.log(e)
- this.getListenNow(attempt + 1)
- }
- },
- async getBrowsePage(attempt = 0) {
- if (this.browsepage.timestamp > Date.now() - 120000) {
- return
- }
- if (attempt > 3) {
- return
- }
- try {
- let browse = await app.mk.api.v3.music(`/v1/editorial/${app.mk.storefrontId}/groupings`, {
- platform: "web",
- name: "music",
- "omit[resource:artists]": "relationships",
- "include[albums]": "artists",
- "include[songs]": "artists",
- "include[music-videos]": "artists",
- extend: "editorialArtwork,artistUrl",
- "fields[artists]": "name,url,artwork,editorialArtwork,genreNames,editorialNotes",
- "art[url]": "f"
- });
- this.browsepage = browse.data.data[0];
- this.browsepage.timestamp = Date.now()
- console.log(this.browsepage)
- } catch (e) {
- console.log(e)
- this.getBrowsePage(attempt + 1)
- }
- },
- async getRadioStations(attempt = 0) {
- if (attempt > 3) {
- return
- }
- try {
- this.radio.personal = (await app.mk.api.v3.music(`/v1/me/recent/radio-stations`, {
- "platform": "web",
- "art[url]": "f"
- })).data.data;
- } catch (e) {
- console.log(e)
- this.getRadioStations(attempt + 1)
- }
- },
- async getMadeForYou(attempt = 0) {
- if (attempt > 3) {
- return
- }
- try {
- mfu = await app.mk.api.v3.music("/v1/me/library/playlists?platform=web&extend=editorialVideo&fields%5Bplaylists%5D=lastModifiedDate&filter%5Bfeatured%5D=made-for-you&include%5Blibrary-playlists%5D=catalog&fields%5Blibrary-playlists%5D=artwork%2Cname%2CplayParams%2CdateAdded")
- this.madeforyou = mfu.data
- } catch (e) {
- console.log(e)
- this.getMadeForYou(attempt + 1)
- }
- },
- newPlaylistFolder(name = app.getLz('term.newPlaylistFolder')) {
- let self = this
- this.mk.api.v3.music(
- "/v1/me/library/playlist-folders/", {}, {
- fetchOptions: {
- method: "POST",
- body: JSON.stringify({
- attributes: { name: name }
- })
- }
- }
- ).then((res) => {
- let playlist = (res.data.data[0])
- self.playlists.listing.push({
- id: playlist.id,
- attributes: {
- name: playlist.attributes.name
- },
- type: "library-playlist-folders",
- parent: "p.playlistsroot"
- })
- self.sortPlaylists()
- setTimeout(() => {
- app.refreshPlaylists()
- }, 13000)
- })
- },
- unauthorize() {
- this.mk.unauthorize()
- },
- showSearch() {
- this.page = "search"
- },
- loadLyrics() {
- const musicType = (MusicKit.getInstance().nowPlayingItem != null) ? MusicKit.getInstance().nowPlayingItem["type"] ?? '' : '';
- console.log("mt", musicType)
- if (musicType === "musicVideo") {
- this.loadYTLyrics();
- } else {
- if (app.cfg.lyrics.enable_mxm) {
- this.loadMXM();
- } else {
- this.loadAMLyrics();
- }
- }
- },
- loadAMLyrics() {
- const songID = (this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem["_songId"] ?? -1 : -1;
- // this.getMXM( trackName, artistName, 'en', duration);
- if (songID != -1) {
- MusicKit.getInstance().api.lyric(songID)
- .then((response) => {
- this.lyricsMediaItem = response.attributes["ttml"]
- this.parseTTML()
- })
- }
- },
- addToLibrary(id) {
- let self = this
- this.mk.addToLibrary(id).then((data) => {
- self.getLibrarySongsFull(true)
- })
- },
- removeFromLibrary(kind, id) {
- let self = this
- let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
- app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`, {}, {
- fetchOptions: {
- method: "DELETE"
- }
- }).then((data) => {
- self.getLibrarySongsFull(true)
- })
- },
- async loadYTLyrics() {
- const track = (this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.title ?? '' : '';
- const artist = (this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.artistName ?? '' : '';
- const time = (this.mk.nowPlayingItem != null) ? (Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1) : -1;
- ipcRenderer.invoke('getYTLyrics', track, artist).then((result) => {
- if (result.length > 0) {
- let ytid = result[0]['id']['videoId'];
- if (app.cfg.lyrics.enable_yt) {
- loadYT(ytid, app.cfg.lyrics.mxm_language ?? "en")
- } else {
- app.loadMXM()
- }
- } else {
- app.loadMXM()
- }
-
- function loadYT(id, lang) {
- let req = new XMLHttpRequest();
- let url = `https://www.youtube.com/watch?&v=${id}`;
- req.open('GET', url, true);
- req.onerror = function(e) {
- this.loadMXM();
- }
- req.onload = function() {
- // console.log(this.responseText);
- res = this.responseText;
- let captionurl1 = res.substring(res.indexOf(`{"playerCaptionsRenderer":{"baseUrl":"`) + (`{"playerCaptionsRenderer":{"baseUrl":"`).length);
- let captionurl = captionurl1.substring(0, captionurl1.indexOf(`"`));
- if (captionurl.includes("timedtext")) {
- let json = JSON.parse(`{"url": "${captionurl}"}`);
- let newurl = json.url + `&lang=${lang}&format=ttml`
-
- let req2 = new XMLHttpRequest();
-
- req2.open('GET', newurl, true);
- req2.onerror = function(e) {
- app.loadMXM();
- }
- req2.onload = function() {
- try {
- const ttmlLyrics = this.responseText;
- if (ttmlLyrics) {
- this.lyricsMediaItem = ttmlLyrics
- this.parseTTML()
- }
- } catch (e) {
- app.loadMXM();
- }
-
- }
- req2.send();
- } else {
-
- app.loadMXM();
-
- }
- }
- req.send();
- }
-
- })
-
- },
- loadMXM() {
- let attempt = 0;
- const track = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.title ?? '' : '');
- const artist = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.artistName ?? '' : '');
- const time = encodeURIComponent((this.mk.nowPlayingItem != null) ? (Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1) : -1);
- const id = encodeURIComponent((this.mk.nowPlayingItem != null) ? app.mk.nowPlayingItem._songId ?? '' : '');
- let lrcfile = "";
- let richsync = [];
- const lang = app.cfg.lyrics.mxm_language // translation language
- function revisedRandId() {
- return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10);
- }
-
- /* get token */
- function getToken(mode, track, artist, songid, lang, time, id) {
- if (attempt > 2) {
- app.loadAMLyrics();
- } else {
- attempt = attempt + 1;
- let url = "https://apic-desktop.musixmatch.com/ws/1.1/token.get?app_id=web-desktop-app-v1.0&t=" + revisedRandId();
- let req = new XMLHttpRequest();
- req.overrideMimeType("application/json");
- req.open('GET', url, true);
- req.setRequestHeader("authority", "apic-desktop.musixmatch.com");
- req.onload = function() {
- let jsonResponse = JSON.parse(this.responseText);
- let status2 = jsonResponse["message"]["header"]["status_code"];
- if (status2 == 200) {
- let token = jsonResponse["message"]["body"]["user_token"] ?? '';
- if (token != "" && token != "UpgradeOnlyUpgradeOnlyUpgradeOnlyUpgradeOnly") {
- console.log('200 token', mode);
- // token good
- app.mxmtoken = token;
-
- if (mode == 1) {
- getMXMSubs(track, artist, app.mxmtoken, lang, time, id);
- } else {
- getMXMTrans(songid, lang, app.mxmtoken);
- }
- } else {
- console.log('fake 200 token');
- getToken(mode, track, artist, songid, lang, time)
- }
- } else {
- console.log('token 4xx');
- getToken(mode, track, artist, songid, lang, time)
- }
-
- };
- req.onerror = function() {
- console.log('error');
- app.loadAMLyrics();
- };
- req.send();
- }
- }
-
- function getMXMSubs(track, artist, token, lang, time, id) {
- let usertoken = encodeURIComponent(token);
- let richsyncQuery = (app.cfg.lyrics.mxm_karaoke) ? "&optional_calls=track.richsync" : ""
- let timecustom = (!time || (time && time < 0)) ? '' : `&f_subtitle_length=${time}&q_duration=${time}&f_subtitle_length_max_deviation=40`;
- let itunesid = (id && id != "") ? `&track_itunes_id=${id}` : '';
- let url = "https://apic-desktop.musixmatch.com/ws/1.1/macro.subtitles.get?format=json&namespace=lyrics_richsynched" + richsyncQuery + "&subtitle_format=lrc&q_artist=" + artist + "&q_track=" + track + itunesid + "&usertoken=" + usertoken + timecustom + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId();
- let req = new XMLHttpRequest();
- req.overrideMimeType("application/json");
- req.open('GET', url, true);
- req.setRequestHeader("authority", "apic-desktop.musixmatch.com");
- req.onload = function() {
- let jsonResponse = JSON.parse(this.responseText);
- console.log(jsonResponse);
- let status1 = jsonResponse["message"]["header"]["status_code"];
-
- if (status1 == 200) {
- let id = '';
- try {
- if (jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["header"]["status_code"] == 200 && jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["header"]["status_code"] == 200) {
- id = jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["body"]["track"]["track_id"] ?? '';
- lrcfile = jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["body"]["subtitle_list"][0]["subtitle"]["subtitle_body"];
-
- try {
- lrcrich = jsonResponse["message"]["body"]["macro_calls"]["track.richsync.get"]["message"]["body"]["richsync"]["richsync_body"];
- richsync = JSON.parse(lrcrich);
- app.richlyrics = richsync;
- } catch (_) {}
- }
-
- if (lrcfile == "") {
- app.loadAMLyrics()
- } else {
- if (richsync == [] || richsync.length == 0) {
- console.log("ok");
- // process lrcfile to json here
- app.lyricsMediaItem = lrcfile
- let u = app.lyricsMediaItem.split(/[\r\n]/);
- let preLrc = []
- for (var i = u.length - 1; i >= 0; i--) {
- let xline = (/(\[[0-9.:\[\]]*\])+(.*)/).exec(u[i])
- let end = (preLrc.length > 0) ? ((preLrc[preLrc.length - 1].startTime) ?? 99999) : 99999
- preLrc.push({
- startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0,
- endTime: end,
- line: xline[2],
- translation: ''
- })
- }
- if (preLrc.length > 0)
- preLrc.push({
- startTime: 0,
- endTime: preLrc[preLrc.length - 1].startTime,
- line: "lrcInstrumental",
- translation: ''
- });
- app.lyrics = preLrc.reverse();
- } else {
- preLrc = richsync.map(function(item) {
- return {
- startTime: item.ts,
- endTime: item.te,
- line: item.x,
- translation: ''
- }
- })
- if (preLrc.length > 0)
- preLrc.unshift({
- startTime: 0,
- endTime: preLrc[0].startTime,
- line: "lrcInstrumental",
- translation: ''
- });
- app.lyrics = preLrc;
- }
- if (lrcfile != null && lrcfile != '' && lang != "disabled") {
- // load translation
- getMXMTrans(id, lang, token);
- } else {
- app.loadAMLyrics()
- }
- }
- } catch (e) {
- console.log(e);
- app.loadAMLyrics()
- }
- } else { //4xx rejected
- getToken(1, track, artist, '', lang, time);
- }
- }
- req.send();
- }
-
- function getMXMTrans(id, lang, token) {
- if (lang != "disabled" && id != '') {
- let usertoken = encodeURIComponent(token);
- let url2 = "https://apic-desktop.musixmatch.com/ws/1.1/crowd.track.translations.get?translation_fields_set=minimal&selected_language=" + lang + "&track_id=" + id + "&comment_format=text&part=user&format=json&usertoken=" + usertoken + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId();
- let req2 = new XMLHttpRequest();
- req2.overrideMimeType("application/json");
- req2.open('GET', url2, true);
- req2.setRequestHeader("authority", "apic-desktop.musixmatch.com");
- req2.onload = function() {
- let jsonResponse2 = JSON.parse(this.responseText);
- console.log(jsonResponse2);
- let status2 = jsonResponse2["message"]["header"]["status_code"];
- if (status2 == 200) {
- try {
- let preTrans = []
- let u = app.lyrics;
- let translation_list = jsonResponse2["message"]["body"]["translations_list"];
- if (translation_list.length > 0) {
- for (var i = 0; i < u.length - 1; i++) {
- preTrans[i] = ""
- for (var trans_line of translation_list) {
- if (u[i].line == " " + trans_line["translation"]["matched_line"] || u[i].line == trans_line["translation"]["matched_line"]) {
- u[i].translation = trans_line["translation"]["description"];
- break;
- }
- }
- }
- app.lyrics = u;
- }
- } catch (e) {
- /// not found trans -> ignore
- }
- } else { //4xx rejected
- getToken(2, '', '', id, lang, '');
- }
- }
- req2.send();
- }
-
- }
-
- if (track != "" & track != "No Title Found") {
- if (app.mxmtoken != null && app.mxmtoken != '') {
- getMXMSubs(track, artist, app.mxmtoken, lang, time, id)
- } else {
- getToken(1, track, artist, '', lang, time);
- }
- }
- },
- toMS(str) {
- let rawTime = str.match(/(\d+:)?(\d+:)?(\d+)(\.\d+)?/);
- let hours = (rawTime[2] != null) ? (rawTime[1].replace(":", "")) : 0;
- let minutes = (rawTime[2] != null) ? (hours * 60 + rawTime[2].replace(":", "") * 1) : ((rawTime[1] != null) ? rawTime[1].replace(":", "") : 0);
- let seconds = (rawTime[3] != null) ? (rawTime[3]) : 0;
- let milliseconds = (rawTime[4] != null) ? (rawTime[4].replace(".", "")) : 0
- return parseFloat(`${minutes * 60 + seconds * 1}.${milliseconds * 1}`);
- },
- parseTTML() {
- this.lyrics = [];
- let preLrc = [];
- let xml = this.stringToXml(this.lyricsMediaItem);
- let lyricsLines = xml.getElementsByTagName('p');
- let synced = true;
- let endTimes = [];
- if (xml.getElementsByTagName('tt')[0].getAttribute("itunes:timing") === "None") {
- synced = false;
- }
- endTimes.push(0);
- if (synced) {
- for (element of lyricsLines) {
- start = this.toMS(element.getAttribute('begin'))
- end = this.toMS(element.getAttribute('end'))
- if (start - endTimes[endTimes.length - 1] > 5 && endTimes[endTimes.length - 1] != 0) {
- preLrc.push({
- startTime: endTimes[endTimes.length - 1],
- endTime: start,
- line: "lrcInstrumental"
- });
- }
- preLrc.push({ startTime: start, endTime: end, line: element.textContent });
- endTimes.push(end);
- }
- // first line dot
- if (preLrc.length > 0)
- preLrc.unshift({ startTime: 0, endTime: preLrc[0].startTime, line: "lrcInstrumental" });
- } else {
- for (element of lyricsLines) {
- preLrc.push({ startTime: 9999999, endTime: 9999999, line: element.textContent });
- }
- }
- this.lyrics = preLrc;
-
- },
- parseLyrics() {
- let xml = this.stringToXml(this.lyricsMediaItem)
- let json = xmlToJson(xml);
- this.lyrics = json
- },
- stringToXml(st) {
- // string to xml
- let xml = (new DOMParser()).parseFromString(st, "text/xml");
- return xml;
-
- },
- getCurrentTime() {
- return parseFloat(this.hmsToSecondsOnly(this.parseTime(this.mk.nowPlayingItem.attributes.durationInMillis - app.mk.currentPlaybackTimeRemaining * 1000)));
- },
- seekTo(time) {
- this.mk.seekToTime(time);
- },
- parseTime(value) {
- let minutes = Math.floor(value / 60000);
- let seconds = ((value % 60000) / 1000).toFixed(0);
- return minutes + ":" + (seconds < 10 ? '0' : '') + seconds;
- },
- parseTimeDecimal(value) {
- let minutes = Math.floor(value / 60000);
- let seconds = ((value % 60000) / 1000).toFixed(0);
- return minutes + "." + (seconds < 10 ? '0' : '') + seconds;
- },
- hmsToSecondsOnly(str) {
- let p = str.split(':'),
- s = 0,
- m = 1;
-
- while (p.length > 0) {
- s += m * parseInt(p.pop(), 10);
- m *= 60;
- }
-
- return s;
- },
- getLyricBGStyle(start, end) {
- let currentTime = this.getCurrentTime();
- // let duration = this.mk.nowPlayingItem.attributes.durationInMillis
- let start2 = this.hmsToSecondsOnly(start)
- let end2 = this.hmsToSecondsOnly(end)
- // let currentProgress = ((100 * (currentTime)) / (end2))
- // check if currenttime is between start and end
- this.player.lyricsDebug.start = start2
- this.player.lyricsDebug.end = end2
- this.player.lyricsDebug.current = currentTime
- if (currentTime >= start2 && currentTime <= end2) {
- return {
- "--bgSpeed": `${(end2 - start2)}s`
- }
- } else {
- return {}
- }
- },
- playMediaItemById(id, kind, isLibrary, raurl = "") {
- let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
- console.log(id, truekind, isLibrary)
- try {
- if (truekind.includes("artist")) {
- app.mk.setStationQueue({ artist: 'a-' + id }).then(() => {
- app.mk.play()
- })
- } else if (truekind == "radioStations") {
- this.mk.setStationQueue({ url: raurl }).then(function(queue) {
- MusicKit.getInstance().play()
- });
- } else {
- this.mk.setQueue({
- [truekind]: [id]
- }).then(function(queue) {
- MusicKit.getInstance().play()
- })
- }
- } catch (err) {
- console.log(err)
- this.playMediaItemById(id, kind, isLibrary, raurl)
- }
- },
- queueParentandplayChild(parent, childIndex, item) {
-
- /* Randomize array in-place using Durstenfeld shuffle algorithm */
- function shuffleArray(array) {
- for (var i = array.length - 1; i > 0; i--) {
- var j = Math.floor(Math.random() * (i + 1));
- var temp = array[i];
- array[i] = array[j];
- array[j] = temp;
- }
- }
-
- let kind = parent.substring(0, parent.indexOf(":"))
- let id = parent.substring(parent.indexOf(":") + 1, parent.length)
- let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
- console.log(truekind, id)
-
- try {
- if (app.library.songs.displayListing.length > childIndex && parent == "librarysongs") {
- console.log(item)
- if (item && ((app.library.songs.displayListing[childIndex].id != item.id))) {
- childIndex = app.library.songs.displayListing.indexOf(item)
- }
-
- let query = app.library.songs.displayListing.map(item => new MusicKit.MediaItem(item));
-
-
- app.mk.stop().then(() => {
- if (item) {
- app.mk.setQueue({
- [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id
- }).then(function () {
- app.mk.play().then(() => {
- if (app.mk.shuffleMode == 1) {
- shuffleArray(query)
- } else {
- for (let i = 0; i < query.length; i++) {
- if (query[i].id == item.id) {query.splice(0, i+1);
- break;}
- }
- }
- app.mk.queue.append(query)
- })
- })
- } else {
- this.mk.clearQueue().then(function (_) {
- if (app.mk.shuffleMode == 1) {
- shuffleArray(query)
- }
- app.mk.queue.append(query)
- if (childIndex != -1) {
- app.mk.changeToMediaAtIndex(childIndex)
- } else {
- app.mk.play()
- }
- })
- }
- })
- } else {
- app.mk.stop().then(() => {
- if (truekind == "playlists" && (id.startsWith("p.") || id.startsWith("pl.u"))) {
- app.mk.setQueue({
- [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id
- }).then(function() {
- app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1).then(function() {
- if ((app.showingPlaylist && app.showingPlaylist.id == id)) {
- let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
- let u = query;
- if (app.mk.shuffleMode == 1) {
- shuffleArray(u)
- } else {
- for (let i = 0; i < app.showingPlaylist.relationships.tracks.data.length; i++) {
- if (app.showingPlaylist.relationships.tracks.data[i].id == item.id) {u.splice(0, i+1); break;}
- }
- }
- app.mk.queue.append(u)
- } else {
- app.getPlaylistFromID(id, true).then(function() {
- let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
- let u = query;
- if (app.mk.shuffleMode == 1) {
- shuffleArray(u)
- } else {
- for (let i = 0; i < app.showingPlaylist.relationships.tracks.data.length; i++) {
- if (app.showingPlaylist.relationships.tracks.data[i].id == item.id) {u.splice(0, i+1); break;}
- }
- }
- app.mk.queue.append(u)
- })
- }
- })
-
- })
- } else {
- this.mk.setQueue({
- [truekind]: [id]
- }).then(function(queue) {
- if (item && ((queue._itemIDs[childIndex] != item.id))) {
- childIndex = queue._itemIDs.indexOf(item.id)
- }
- if (childIndex != -1) {
- app.mk.changeToMediaAtIndex(childIndex)
- } else if (item) {
- app.mk.playNext({
- [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id
- }).then(function() {
- app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1)
- app.mk.play()
- })
- } else {
- app.mk.play()
- }
- })
- }
- })
- }
- } catch (err) {
- console.log(err)
- try {
- app.mk.stop()
- } catch (e) {}
- this.playMediaItemById(item.attributes.playParams.id ?? item.id, item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.url)
- }
-
- },
- friendlyTypes(type) {
- // use switch statement to return friendly name for media types "songs,artists,albums,playlists,music-videos,stations,apple-curators,curators"
- switch (type) {
- case "song":
- return "Songs"
- break;
- case "artist":
- return "Artists"
- break;
- case "album":
- return "Albums"
- break;
- case "playlist":
- return "Playlists"
- break;
- case "music_video":
- return "Music Videos"
- break;
- case "station":
- return "Stations"
- break;
- case "apple-curator":
- return "Apple Curators"
- break;
- case "radio_show":
- return "Radio Shows"
- break;
- case "record_label":
- return "Record Labels"
- break;
- case "radio_episode":
- return "Episodes"
- break;
- case "video_extra":
- return "Video Extras"
- break;
- case "curator":
- return "Curators"
- break;
- case "top":
- return "Top"
- break;
- default:
- return type
- break;
- }
- },
- async searchQuery(term = this.search.term) {
- let self = this
- if (term == "") {
- return
- }
- //this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${this.search.term}`
- this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${this.search.term}`, {
- types: "activities,albums,apple-curators,artists,curators,editorial-items,music-movies,music-videos,playlists,songs,stations,tv-episodes,uploaded-videos,record-labels",
- "relate[editorial-items]": "contents",
- "include[editorial-items]": "contents",
- "include[albums]": "artists",
- "include[artists]": "artists",
- "include[songs]": "artists,albums",
- "include[music-videos]": "artists",
- "extend": "artistUrl",
- "fields[artists]": "url,name,artwork,hero",
- "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
- "with": "serverBubbles,lyricHighlights",
- "art[url]": "c,f",
- "omit[resource]": "autos",
- "platform": "web",
- limit: 25
- }).then(function(results) {
- results.data.results["meta"] = results.data.meta
- self.search.results = results.data.results
- })
-
- await app.mk.api.v3.music(`v1/social/${app.mk.storefrontId}/search?term=${app.search.term}`, {
- types: ["playlists", "social-profiles"],
- limit: 25,
- with: ["serverBubbles", "lyricSnippet"],
- "art[url]": "f",
- "art[social-profiles:url]": "c"
- }, { includeResponseMeta: !0 }).then(function(results) {
- results.data.results["meta"] = results.data.meta
- self.search.resultsSocial = results.data.results
- })
- },
- async inLibrary(items = []) {
- let types = []
-
- for (let item of items) {
- let type = item.type
- if (type.slice(-1) != "s") {
- type += "s"
- }
- type = type.replace("library-", "")
- let id = item.attributes.playParams.catalogId ?? item.id
-
- let index = types.findIndex(function(type) {
- return type.type == this
- }, type)
- if (index == -1) {
- types.push({ type: type, id: [id] })
- } else {
- types[index].id.push(id)
- }
- }
- types2 = types.map(function(item) {
- return {
- [`ids[${item.type}]`]: [item.id]
- }
- })
- types2 = types2.reduce(function(result, item) {
- var key = Object.keys(item)[0]; //first property: a, b, c
- result[key] = item[key];
- return result;
- }, {});
- return (await this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}`, {... {
- "omit[resource]": "autos",
- relate: "library",
- fields: "inLibrary"
- },
- ...types2
- })).data.data
- },
- isInLibrary(playParams) {
- let self = this
- let id = ""
- // ugly code to check if current playback item is in library
- if (typeof playParams == "undefined") {
- return true
- }
- if (playParams["isLibrary"]) {
- return true
- } else if (playParams["catalogId"]) {
- id = playParams["catalogId"]
- } else if (playParams["id"]) {
- id = playParams["id"]
- }
- let found = this.library.songs.listing.filter((item) => {
- if (item["attributes"]) {
- if (item["attributes"]["playParams"] && (item["attributes"]["playParams"]["catalogId"] == id)) {
- return item;
- }
- }
- })
- if (found.length != 0) {
- return true
- } else {
- return false
- }
- },
- mkReady() {
- if (this.mk["nowPlayingItem"]) {
- return true
- } else {
- return false
- }
- },
- getMediaItemArtwork(url, height = 64, width) {
- if (typeof url == "undefined" || url == "") {
- return "https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg"
- }
- let newurl = `${url.replace('{w}', width ?? height).replace('{h}', height).replace('{f}', "webp").replace('{c}', ((width === 900) ? "sr" : "cc"))}`;
-
- if (newurl.includes("900x516")) {
- newurl = newurl.replace("900x516cc", "900x516sr").replace("900x516bb", "900x516sr");
- }
- return newurl
- },
- _rgbToRgb(rgb = [0, 0, 0]) {
- // if rgb
- return `rgb(${rgb[0]},${rgb[1]},${rgb[2]})`
- },
- getNowPlayingArtworkBG(size = 32, force = false) {
- let self = this
- if (typeof this.mk.nowPlayingItem === "undefined") return;
- let bginterval = setInterval(() => {
- if (!this.mkReady()) {
- return ""
- }
-
- try {
- if ((this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] != this.currentTrackID && document.querySelector('.bg-artwork')) || force) {
- if (document.querySelector('.bg-artwork')) {
- clearInterval(bginterval);
- }
- this.currentTrackID = this.mk.nowPlayingItem["id"];
- document.querySelector('.bg-artwork').src = "";
- if (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"]) {
- getBase64FromUrl(this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"].replace('{w}', size).replace('{h}', size)).then(img => {
- document.querySelectorAll('.bg-artwork').forEach(artwork => {
- artwork.src = img;
- })
- self.$store.commit("setLCDArtwork", img)
- })
-
- // Vibrant.from(this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"].replace('{w}', size).replace('{h}', size)).getPalette().then(palette=>{
- // let angle = "140deg"
- // let gradient = ""
- // let colors = Object.values(palette).filter(color=>color!=null)
- // if(colors.length > 0){
- // let stops = []
- // colors.forEach(color=>{
- // stops.push(`${self._rgbToRgb(color._rgb)} 0%`)
- // })
- // stops.push(`${self._rgbToRgb(colors[0]._rgb)} 100%`)
- // gradient = `linear-gradient(${angle}, ${stops.join(", ")}`
- // }
- //
- // document.querySelector("#app").style.setProperty("--bgColor", gradient)
- // }).setQuantizer(Vibrant.Quantizer.WebWorker)
-
- try {
- clearInterval(bginterval);
- } catch (err) {}
- } else {
- this.setLibraryArtBG()
- }
- } else if (this.mk.nowPlayingItem["id"] == this.currentTrackID) {
- try {
- clearInterval(bginterval);
- } catch (err) {}
- }
- } catch (e) {
- if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] && document.querySelector('.bg-artwork')) {
- this.setLibraryArtBG()
- try {
- clearInterval(bginterval);
- } catch (err) {}
- }
- }
- }, 200)
- },
-
- // getNowPlayingArtwork(size = 600) {
- // if (typeof this.mk.nowPlayingItem === "undefined") return;
- // let interval = setInterval(() => {
-
- // try {
- // if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] != this.currentTrackIDBG && document.querySelector('.app-playback-controls .artwork')) {
- // this.currentTrackIDBG = this.mk.nowPlayingItem["id"];
- // if (document.querySelector('.app-playback-controls .artwork') != null) {
- // clearInterval(interval);
- // }
- // if (app.mk.nowPlayingItem.attributes.artwork != null && app.mk.nowPlayingItem.attributes.artwork.url != null && app.mk.nowPlayingItem.attributes.artwork.url!= '' ) {
- // document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${decodeURI((this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"])).replace('{w}', size).replace('{h}', size)}")`);
- // try {
- // clearInterval(interval);
- // } catch (err) {
- // }
- // } else {
- // this.setLibraryArt()
- // }
- // } else if (this.mk.nowPlayingItem["id"] == this.currentTrackID) {
- // try {
- // clearInterval(interval);
- // } catch (err) {
- // }
- // }
- // } catch (e) {
- // if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] && document.querySelector('.app-playback-controls .artwork')) {
- // this.setLibraryArt()
- // try {
- // clearInterval(interval);
- // } catch (err) {
- // }
-
- // }
-
- // }
- // }, 200)
-
-
- // },
- async getCurrentArtURL() {
- try {
- this.currentArtUrl = '';
- if (app.mk.nowPlayingItem != null && app.mk.nowPlayingItem.attributes != null && app.mk.nowPlayingItem.attributes.artwork != null && app.mk.nowPlayingItem.attributes.artwork.url != null && app.mk.nowPlayingItem.attributes.artwork.url != '') {
- this.currentArtUrl = (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"] ?? '').replace('{w}', 50).replace('{h}', 50);
- try {
- document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
- } catch (e) {}
- } else {
- let data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`);
- data = data.data.data[0];
- if (data != null && data !== "" && data.attributes != null && data.attributes.artwork != null) {
- this.currentArtUrl = (data["attributes"]["artwork"]["url"] ?? '').replace('{w}', 50).replace('{h}', 50);
- // if (this.currentArtUrl != ""){
- // let attr = MusicKitInterop.getAttributes();
- // attr.artwork.url = this.currentArtUrl;
- // ipcRenderer.send('forceUpdateRPC',attr)
- // }
- try {
- document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
- } catch (e) {}
- } else {
- this.currentArtUrl = '';
- try {
- document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
- } catch (e) {}
- }
- }
- } catch (e) {
-
- }
- },
- async setLibraryArt() {
- if (typeof this.mk.nowPlayingItem === "undefined") return;
- try {
- const data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`);
- data = data.data.data[0];
-
- if (data != null && data !== "") {
- document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', 'url("' + (data["attributes"]["artwork"]["url"]).toString() + '")');
- } else {
- document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("")`);
- }
- } catch (e) {}
- },
- async setLibraryArtBG() {
- if (typeof this.mk.nowPlayingItem === "undefined") return;
- try {
- const data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`);
- data = data.data.data[0];
-
- if (data != null && data !== "") {
- getBase64FromUrl((data["attributes"]["artwork"]["url"]).toString()).then(img => {
- document.querySelector('.bg-artwork').forEach(artwork => {
- artwork.src = img;
- })
- self.$store.commit("setLCDArtwork", img)
- })
- }
- } catch (e) {}
-
- },
- quickPlay(query) {
- let self = this
- MusicKit.getInstance().api.search(query, { limit: 2, types: 'songs' }).then(function(data) {
- MusicKit.getInstance().setQueue({ song: data["songs"]['data'][0]["id"] }).then(function(queue) {
- MusicKit.getInstance().play()
- setTimeout(() => {
- self.$forceUpdate()
- }, 1000)
- })
- })
- },
- async getRating(item) {
- let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
- let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id
- if (item.id.startsWith("i.")) {
- if (!type.startsWith("library-")) {
- type = "library-" + type
- }
- id = item.id
- }
- let response = await this.mk.api.v3.music(`/v1/me/ratings/${type}?platform=web&ids=${type.includes('library') ? item.id : id}`)
- if (response.data.data.length != 0) {
- let value = response.data.data[0].attributes.value
- return value
- } else {
- return 0
- }
- },
- love(item) {
- let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
- let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id
- if (item.id.startsWith("i.")) {
- if (!type.startsWith("library-")) {
- type = "library-" + type
- }
- id = item.id
- }
- this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, {
- fetchOptions: {
- method: "PUT",
- body: JSON.stringify({
- "type": "rating",
- "attributes": {
- "value": 1
- }
- })
- }
- })
- },
- dislike(item) {
- let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
- let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id
- if (item.id.startsWith("i.")) {
- if (!type.startsWith("library-")) {
- type = "library-" + type
- }
- id = item.id
- }
- this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, {
- fetchOptions: {
- method: "PUT",
- body: JSON.stringify({
- "type": "rating",
- "attributes": {
- "value": -1
- }
- })
- }
- })
- },
- unlove(item) {
- let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
- let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id
- if (item.id.startsWith("i.")) {
- if (!type.startsWith("library-")) {
- type = "library-" + type
- }
- id = item.id
- }
- this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, {
- fetchOptions: {
- method: "DELETE",
- }
- })
- },
- volumeWheel(event) {
- if (this.cfg.audio.maxVolume < 1.0 && this.cfg.audio.maxVolume > 0.01) {
- this.cfg.audio.volumePrecision = 0.01
- this.cfg.audio.volumeRoundMax = this.cfg.audio.maxVolume - 0.01
- this.cfg.audio.volumeRoundMin = 0.01
- }
- if (event.deltaY < 0) {
- if (this.mk.volume < this.cfg.audio.maxVolume) {
- if (this.mk.volume <= this.cfg.audio.volumeRoundMax) {
- this.mk.volume += this.cfg.audio.volumePrecision
- } else {
- this.mk.volume = this.cfg.audio.maxVolume
- }
- }
- } else if (event.deltaY > 0) {
- if (this.mk.volume > 0) {
- if (this.mk.volume >= this.cfg.audio.volumeRoundMin) {
- this.mk.volume -= this.cfg.audio.volumePrecision
- } else {
- this.mk.volume = 0
- }
- }
- }
- },
- muteButtonPressed() {
- if( this.cfg.audio.muted ) {
- this.mk.volume = this.cfg.audio.lastVolume;
- this.cfg.audio.muted = false;
- } else {
- this.cfg.audio.lastVolume = this.cfg.audio.volume;
- this.mk.volume = 0;
- this.cfg.audio.muted = true;
- }
- },
- checkMuteChange() {
- if( this.cfg.audio.muted ) {
- this.cfg.audio.muted = false;
- }
- },
- async apiCall(url, callback) {
- const xmlHttp = new XMLHttpRequest();
-
- xmlHttp.onreadystatechange = (e) => {
- if (xmlHttp.readyState !== 4) {
- return;
- }
-
- if (xmlHttp.status === 200) {
- // console.log('SUCCESS', xmlHttp.responseText);
- callback(JSON.parse(xmlHttp.responseText));
- } else {
- console.warn('request_error');
- }
- };
-
- xmlHttp.open("GET", url);
- xmlHttp.setRequestHeader("Authorization", "Bearer " + MusicKit.getInstance().developerToken);
- xmlHttp.setRequestHeader("Music-User-Token", "" + MusicKit.getInstance().musicUserToken);
- xmlHttp.setRequestHeader("Accept", "application/json");
- xmlHttp.setRequestHeader("Content-Type", "application/json");
- xmlHttp.responseType = "text";
- xmlHttp.send();
- },
- fetchPlaylist(id, callback) {
- // id can be found in playlist.attributes.playParams.globalId
- // this.mk.api.
- this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`).then(res => {
- callback(res.data.data[0])
- })
-
- // tracks are found in relationship.data
- },
- windowFocus(val) {
- if (val) {
- document.querySelectorAll(".animated-artwork-video").forEach(el => {
- el.play()
- })
- this.animateBackground = true
- } else {
- document.querySelectorAll(".animated-artwork-video").forEach(el => {
- el.pause()
- })
- this.animateBackground = false
- }
- },
- async nowPlayingContextMenu(event) {
- // function revisedRandId() {
- // return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10);
- // }
- let self = this
- let data_type = this.mk.nowPlayingItem.playParams.kind
- let item_id = this.mk.nowPlayingItem.attributes.playParams.id ?? this.mk.nowPlayingItem.id
- let isLibrary = this.mk.nowPlayingItem.attributes.playParams.isLibrary ?? false
- let params = { "fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "t": "1" }
- // let res = await app.mkapi(data_type, isLibrary , item_id, params);
- // if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) {
- // item_id = res.relationships.library.data[0].id
- // }
- app.selectedMediaItems = []
- app.select_selectMediaItem(item_id, data_type, 0, '12344', isLibrary)
- let useMenu = "normal"
- let menus = {
- multiple: {
- items: []
- },
- normal: {
- headerItems: [{
- "icon": "./assets/feather/heart.svg",
- "id": "love",
- "name": app.getLz('action.love'),
- "hidden": false,
- "disabled": true,
- "action": function() {
- app.love(app.mk.nowPlayingItem)
- }
- },
- {
- "icon": "./assets/feather/heart.svg",
- "id": "unlove",
- "active": true,
- "name": app.getLz('action.unlove'),
- "hidden": true,
- "action": function() {
- app.unlove(app.mk.nowPlayingItem)
- }
- },
- {
- "icon": "./assets/feather/thumbs-down.svg",
- "id": "dislike",
- "name": app.getLz('action.dislike'),
- "hidden": false,
- "disabled": true,
- "action": function() {
- app.dislike(app.mk.nowPlayingItem)
- }
- },
- {
- "icon": "./assets/feather/thumbs-down.svg",
- "id": "undo_dislike",
- "name": app.getLz('action.undoDislike'),
- "active": true,
- "hidden": true,
- "action": function() {
- app.unlove(app.mk.nowPlayingItem)
- }
- },
- ],
- items: [{
- "icon": "./assets/feather/list.svg",
- "name": app.getLz('action.addToPlaylist')+" ...",
- "action": function() {
- app.promptAddToPlaylist()
- }
- },
- {
- "icon": "./assets/feather/plus.svg",
- "id": "addToLibrary",
- "name": app.getLz('action.addToLibrary')+" ...",
- "disabled": false,
- "action": function() {
- app.addToLibrary(app.mk.nowPlayingItem.id);
- // if (!isLibrary) {app.addToLibrary(item_id); this.mk.nowPlayingItem.attributes.playParams["isLibrary"] = true} else { app.removeFromLibrary(data_type,item_id); this.mk.nowPlayingItem.attributes.playParams["isLibrary"] = false};
- }
- },
- {
- "icon": "./assets/feather/radio.svg",
- "name": app.getLz('action.startRadio'),
- "action": function() {
- app.mk.setStationQueue({ song: app.mk.nowPlayingItem.id }).then(() => {
- app.mk.play()
- app.selectedMediaItems = []
- })
- }
- },
- ]
- }
- }
- if (this.contextExt) {
- // if this.context-ext.normal is true append all options to the 'normal' menu which is a kvp of arrays
- if (this.contextExt.normal) {
- menus.normal.items = menus.normal.items.concat(this.contextExt.normal)
- }
- }
-
- // isLibrary = await app.inLibrary([this.mk.nowPlayingItem])
- // console.warn(isLibrary)
- // if(isLibrary.length != 0) {
- // if (isLibrary[0].attributes.inLibrary) {
- // menus.normal.items.find(x => x.id == "addToLibrary").disabled = true
- // }
- // }else{
- // menus.normal.items.find(x => x.id == "addToLibrary").disabled = true
- // }
- this.showMenuPanel(menus[useMenu], event)
-
- try {
- let rating = await app.getRating(app.mk.nowPlayingItem)
- if (rating == 0) {
- menus.normal.headerItems.find(x => x.id == 'love').disabled = false
- menus.normal.headerItems.find(x => x.id == 'dislike').disabled = false
- } else if (rating == 1) {
- menus.normal.headerItems.find(x => x.id == 'unlove').hidden = false
- menus.normal.headerItems.find(x => x.id == 'love').hidden = true
- } else if (rating == -1) {
- menus.normal.headerItems.find(x => x.id == 'undo_dislike').hidden = false
- menus.normal.headerItems.find(x => x.id == 'dislike').hidden = true
- }
- } catch (err) {
-
- }
- },
- LastFMDeauthorize() {
- ipcRenderer.invoke('setStoreValue', 'lastfm.enabled', false).catch((e) => console.error(e));
- ipcRenderer.invoke('setStoreValue', 'lastfm.auth_token', '').catch((e) => console.error(e));
- app.cfg.lastfm.auth_token = "";
- app.cfg.lastfm.enabled = false;
- const element = document.getElementById('lfmConnect');
- element.innerHTML = getLz('term.connect');
- element.onclick = app.LastFMAuthenticate;
- },
- LastFMAuthenticate() {
- console.log("[LastFM] Received LastFM authentication callback")
- const element = document.getElementById('lfmConnect');
- // new key : f9986d12aab5a0fe66193c559435ede3
- window.open('https://www.last.fm/api/auth?api_key=f9986d12aab5a0fe66193c559435ede3&cb=cider://auth/lastfm');
- element.innerText = app.getLz('term.connecting') + '...';
-
- /* Just a timeout for the button */
- setTimeout(() => {
- if (element.innerText === app.getLz('term.connecting') +'...') {
- element.innerText = app.getLz('term.connect');
- console.warn('[LastFM] Attempted connection timed out.');
- }
- }, 20000);
-
- ipcRenderer.on('LastfmAuthenticated', function(_event, lfmAuthKey) {
- app.cfg.lastfm.auth_token = lfmAuthKey;
- app.cfg.lastfm.enabled = true;
- element.innerHTML = `${app.getLz('term.disconnect')}\n(${app.getLz('term.authed')}: ${lfmAuthKey})
`;
- element.onclick = app.LastFMDeauthorize;
- });
- },
- parseSCTagToRG: function(tag) {
- let soundcheck = tag.split(" ")
- let numbers = []
- for (item of soundcheck) {
- numbers.push(parseInt(item, 16))
-
- }
- numbers.shift()
- let gain = Math.log10((Math.max(numbers[0], numbers[1]) ?? 1000) / 1000.0) * -10
- let peak = Math.max(numbers[6], numbers[7]) / 32768.0
- return {
- gain: gain,
- peak: peak
- }
- },
- fullscreen(flag) {
- if (flag) {
- ipcRenderer.send('setFullScreen', true);
- if (app.mk.nowPlayingItem.type && app.mk.nowPlayingItem.type.toLowerCase().includes("video")) {
- document.querySelector('video#apple-music-video-player').requestFullscreen()
- } else {
- app.appMode = 'fullscreen';
- }
- document.addEventListener('keydown', event => {
- if (event.key === 'Escape' && app.appMode === 'fullscreen') {
- this.fullscreen(false);
- }
- });
- } else {
- ipcRenderer.send('setFullScreen', false);
- app.appMode = 'player';
- }
- },
- miniPlayer(flag) {
- if (flag) {
- this.tmpWidth = window.innerWidth;
- this.tmpHeight = window.innerHeight;
- ipcRenderer.send('unmaximize');
- ipcRenderer.send('windowmin', 250, 250)
- ipcRenderer.send('windowresize', 300, 300, false)
- app.appMode = 'mini';
- } else {
- ipcRenderer.send('windowmin', 844, 410)
- ipcRenderer.send('windowresize', this.tmpWidth, this.tmpHeight, false)
- ipcRenderer.send('windowontop', false)
- this.cfg.visual.miniplayer_top_toggle = true;
- app.appMode = 'player';
- }
- },
- pinMiniPlayer() {
- if (this.cfg.visual.miniplayer_top_toggle) {
- ipcRenderer.send('windowontop', true)
- this.cfg.visual.miniplayer_top_toggle = false
- } else {
- ipcRenderer.send('windowontop', false)
- this.cfg.visual.miniplayer_top_toggle = true;
- }
- },
- formatTimezoneOffset: (e = new Date) => {
- let leadingZeros = (e, s = 2) => {
- let n = "" + e;
- for (; n.length < s;)
- n = "0" + n;
- return n
- }
-
- const s = e.getTimezoneOffset(),
- n = Math.floor(Math.abs(s) / 60),
- d = Math.round(Math.abs(s) % 60);
- let h = "+";
- return 0 !== s && (h = s > 0 ? "-" : "+"),
- `${h}${leadingZeros(n, 2)}:${leadingZeros(d, 2)}`
- },
- toggleHideUserInfo() {
- if(this.chrome.hideUserInfo) {
- this.cfg.visual.showuserinfo = true
- this.chrome.hideUserInfo = false
- } else {
- this.cfg.visual.showuserinfo = false
- this.chrome.hideUserInfo = true
- }
- },
- isElementOverflowing(selector) {
- try{
- let element = document.querySelector(selector);
- var overflowX = element.offsetWidth < element.scrollWidth,
- overflowY = element.offsetHeight < element.scrollHeight;
- element.setAttribute('data-value', '\xa0\xa0\xa0\xa0' + element.textContent);
-
- return (overflowX || overflowY); } catch (e) { return false}
- },
- async showWebRemoteQR(){
- //this.webremoteqr = await ipcRenderer.invoke('setRemoteQR','')
- this.webremoteurl = await ipcRenderer.invoke('showQR','')
- //this.modals.qrcode = true;
- },
- checkMarquee() {
- if(isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-artist') == true) {
- document.getElementsByClassName('song-artist')[0].classList.add('marquee');
- document.getElementsByClassName('song-artist')[1].classList.add('marquee-after');
- }
- if(isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') == true) {
- document.getElementsByClassName('song-name')[0].classList.add('marquee');
- document.getElementsByClassName('song-name')[1].classList.add('marquee-after');
- }
- },
- closeWindow(){
- ipcRenderer.send('close');
- },
- checkForUpdate(){
- ipcRenderer.send('check-for-update')
- }
- }
-})
-
Vue.component('animated-number', {
template: "{{ displayNumber }}
",
@@ -3606,7 +74,7 @@ Vue.component('sidebar-library-item', {
required: false
}
},
- data: function() {
+ data: function () {
return {
app: app,
svgIconData: ""
@@ -3620,27 +88,6 @@ Vue.component('sidebar-library-item', {
methods: {}
});
-// Key binds
-document.addEventListener('keydown', function(e) {
- if (e.keyCode === 70 && e.ctrlKey) {
- app.$refs.searchInput.focus()
- app.$refs.searchInput.select()
- }
-});
-
-// Hang Timer
-app.hangtimer = setTimeout(() => {
- if (confirm("Cider is not responding. Reload the app?")) {
- window.location.reload()
- }
-}, 10000)
-
-// add event listener for when window.location.hash changes
-window.addEventListener("hashchange", function() {
- app.appRoute(window.location.hash)
-});
-
-
function fallbackinitMusicKit() {
const request = new XMLHttpRequest();
@@ -3655,7 +102,7 @@ function fallbackinitMusicKit() {
},
sourceType: 24,
suppressErrorDialog: true
- });
+ })
setTimeout(() => {
app.init()
}, 1000)
@@ -3666,12 +113,13 @@ function fallbackinitMusicKit() {
request.send();
}
-document.addEventListener('musickitloaded', function() {
+document.addEventListener('musickitloaded', function () {
+ console.log('MusicKit loaded')
// MusicKit global is now defined
function initMusicKit() {
let parsedJson = JSON.parse(this.responseText)
MusicKit.configure({
- developerToken: parsedJson.Key,
+ developerToken: parsedJson.token,
app: {
name: 'Apple Music',
build: '1978.4.1',
@@ -3679,31 +127,41 @@ document.addEventListener('musickitloaded', function() {
},
sourceType: 24,
suppressErrorDialog: true
- });
- setTimeout(() => {
- app.init()
- }, 1000)
+ }).then(() => {
+ function waitForApp() {
+ if (typeof app.init !== "undefined") {
+ app.init()
+ }
+ else {
+ setTimeout(waitForApp, 250);
+ }
+ }
+ waitForApp()
+ })
}
const request = new XMLHttpRequest();
request.timeout = 5000;
request.addEventListener("load", initMusicKit);
- request.onreadystatechange = function(aEvt) {
+ request.onreadystatechange = function (aEvt) {
if (request.readyState == 4) {
if (request.status != 200)
fallbackinitMusicKit()
}
};
- request.open("GET", "https://api.cider.sh/");
+ request.open("GET", "https://api.cider.sh/v1/");
request.send();
// check for widevine failure and reconfigure the instance.
- window.addEventListener("drmUnsupported", function() {
+ window.addEventListener("drmUnsupported", function () {
initMusicKit()
});
});
+
+
+
if ('serviceWorker' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener('load', () => {
@@ -3711,7 +169,7 @@ if ('serviceWorker' in navigator) {
});
}
-const getBase64FromUrl = async(url) => {
+const getBase64FromUrl = async (url) => {
const data = await fetch(url);
const blob = await data.blob();
return new Promise((resolve) => {
@@ -3724,7 +182,7 @@ const getBase64FromUrl = async(url) => {
});
}
-function Clone (obj) {
+function Clone(obj) {
return JSON.parse(JSON.stringify(obj));
}
@@ -3734,19 +192,6 @@ function uuidv4() {
);
}
-function refreshFocus() {
- if (document.hasFocus() == false) {
- app.windowFocus(false)
- } else {
- app.windowFocus(true)
- }
- setTimeout(refreshFocus, 200);
-}
-
-app.getHTMLStyle()
-
-refreshFocus();
-
function xmlToJson(xml) {
// Create the return object
@@ -3770,10 +215,10 @@ function xmlToJson(xml) {
for (var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
- if (typeof(obj[nodeName]) == "undefined") {
+ if (typeof (obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
- if (typeof(obj[nodeName].push) == "undefined") {
+ if (typeof (obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
@@ -3796,10 +241,11 @@ var checkIfScrollIsStatic = setInterval(() => {
try {
if (position === document.getElementsByClassName('lyric-body')[0].scrollTop) {
clearInterval(checkIfScrollIsStatic)
- // do something
+ // do something
}
position = document.getElementsByClassName('lyric-body')[0].scrollTop
- } catch (e) {}
+ } catch (e) {
+ }
}, 50);
@@ -3813,27 +259,30 @@ async function webGPU() {
}
}
+function isJson(item) {
+ item = typeof item !== "string"
+ ? JSON.stringify(item)
+ : item;
+
+ try {
+ item = JSON.parse(item);
+ } catch (e) {
+ return false;
+ }
+
+ if (typeof item === "object" && item !== null) {
+ return true;
+ }
+
+ return false;
+}
+
webGPU().then()
let screenWidth = screen.width;
let screenHeight = screen.height;
-// Key bind to unjam MusicKit in case it fails: CTRL+F10
-document.addEventListener('keydown', function(event) {
- if (event.ctrlKey && event.keyCode == 121) {
- try {
- app.mk._services.mediaItemPlayback._currentPlayer.stop()
- } catch (e) { }
- try {
- app.mk._services.mediaItemPlayback._currentPlayer.destroy()
- } catch (e) { }
- }
-});
-
-document.addEventListener('keydown', function(event) {
- if (event.ctrlKey && event.keyCode == 122) {
- try {
- ipcRenderer.send('detachDT','')
- } catch (e) { }
- }
-});
+window.onerror = function (error) {
+ console.log(error)
+ bootbox.alert("Error occured: " + error)
+};
diff --git a/src/renderer/ameframework.css b/src/renderer/less/ameframework.less
similarity index 100%
rename from src/renderer/ameframework.css
rename to src/renderer/less/ameframework.less
diff --git a/src/renderer/less/bootstrap-vue.min.css b/src/renderer/less/bootstrap-vue.min.css
new file mode 100644
index 00000000..c84a0f9f
--- /dev/null
+++ b/src/renderer/less/bootstrap-vue.min.css
@@ -0,0 +1,2637 @@
+@charset "UTF-8";
+/*!
+ * BootstrapVue Custom CSS (https://bootstrap-vue.org)
+ */
+.bv-no-focus-ring:focus {
+ outline: none;
+}
+
+@media (max-width: 575.98px) {
+ .bv-d-xs-down-none {
+ display: none !important;
+ }
+}
+@media (max-width: 767.98px) {
+ .bv-d-sm-down-none {
+ display: none !important;
+ }
+}
+@media (max-width: 991.98px) {
+ .bv-d-md-down-none {
+ display: none !important;
+ }
+}
+@media (max-width: 1199.98px) {
+ .bv-d-lg-down-none {
+ display: none !important;
+ }
+}
+.bv-d-xl-down-none {
+ display: none !important;
+}
+
+.form-control.focus {
+ color: #495057;
+ background-color: #fff;
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+.form-control.focus.is-valid {
+ border-color: #28a745;
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+}
+.form-control.focus.is-invalid {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.b-avatar {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ vertical-align: middle;
+ flex-shrink: 0;
+ width: 2.5rem;
+ height: 2.5rem;
+ font-size: inherit;
+ font-weight: 400;
+ line-height: 1;
+ max-width: 100%;
+ max-height: auto;
+ text-align: center;
+ overflow: visible;
+ position: relative;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+.b-avatar:focus {
+ outline: 0;
+}
+.b-avatar.btn, .b-avatar[href] {
+ padding: 0;
+ border: 0;
+}
+.b-avatar.btn .b-avatar-img img, .b-avatar[href] .b-avatar-img img {
+ transition: -webkit-transform 0.15s ease-in-out;
+ transition: transform 0.15s ease-in-out;
+ transition: transform 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;
+}
+.b-avatar.btn:not(:disabled):not(.disabled), .b-avatar[href]:not(:disabled):not(.disabled) {
+ cursor: pointer;
+}
+.b-avatar.btn:not(:disabled):not(.disabled):hover .b-avatar-img img, .b-avatar[href]:not(:disabled):not(.disabled):hover .b-avatar-img img {
+ -webkit-transform: scale(1.15);
+ transform: scale(1.15);
+}
+.b-avatar.disabled, .b-avatar:disabled, .b-avatar[disabled] {
+ opacity: 0.65;
+ pointer-events: none;
+}
+.b-avatar .b-avatar-custom,
+.b-avatar .b-avatar-text,
+.b-avatar .b-avatar-img {
+ border-radius: inherit;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ -webkit-mask-image: radial-gradient(white, black);
+ mask-image: radial-gradient(white, black);
+}
+.b-avatar .b-avatar-text {
+ text-transform: uppercase;
+ white-space: nowrap;
+}
+.b-avatar[href] {
+ text-decoration: none;
+}
+.b-avatar > .b-icon {
+ width: 60%;
+ height: auto;
+ max-width: 100%;
+}
+.b-avatar .b-avatar-img img {
+ width: 100%;
+ height: 100%;
+ max-height: auto;
+ border-radius: inherit;
+ -o-object-fit: cover;
+ object-fit: cover;
+}
+.b-avatar .b-avatar-badge {
+ position: absolute;
+ min-height: 1.5em;
+ min-width: 1.5em;
+ padding: 0.25em;
+ line-height: 1;
+ border-radius: 10em;
+ font-size: 70%;
+ font-weight: 700;
+ z-index: 1;
+}
+
+.b-avatar-sm {
+ width: 1.5rem;
+ height: 1.5rem;
+}
+.b-avatar-sm .b-avatar-text {
+ font-size: calc(0.6rem);
+}
+.b-avatar-sm .b-avatar-badge {
+ font-size: calc(0.42rem);
+}
+
+.b-avatar-lg {
+ width: 3.5rem;
+ height: 3.5rem;
+}
+.b-avatar-lg .b-avatar-text {
+ font-size: calc(1.4rem);
+}
+.b-avatar-lg .b-avatar-badge {
+ font-size: calc(0.98rem);
+}
+
+.b-avatar-group .b-avatar-group-inner {
+ display: flex;
+ flex-wrap: wrap;
+}
+.b-avatar-group .b-avatar {
+ border: 1px solid #dee2e6;
+}
+.b-avatar-group a.b-avatar:hover:not(.disabled):not(disabled),
+.b-avatar-group .btn.b-avatar:hover:not(.disabled):not(disabled) {
+ z-index: 1;
+}
+
+.b-calendar {
+ display: inline-flex;
+}
+.b-calendar .b-calendar-inner {
+ min-width: 250px;
+}
+.b-calendar .b-calendar-header,
+.b-calendar .b-calendar-nav {
+ margin-bottom: 0.25rem;
+}
+.b-calendar .b-calendar-nav .btn {
+ padding: 0.25rem;
+}
+.b-calendar output {
+ padding: 0.25rem;
+ font-size: 80%;
+}
+.b-calendar output.readonly {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+.b-calendar .b-calendar-footer {
+ margin-top: 0.5rem;
+}
+.b-calendar .b-calendar-grid {
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+}
+.b-calendar .b-calendar-grid .row {
+ flex-wrap: nowrap;
+}
+.b-calendar .b-calendar-grid-caption {
+ padding: 0.25rem;
+}
+.b-calendar .b-calendar-grid-body .col[data-date] .btn {
+ width: 32px;
+ height: 32px;
+ font-size: 14px;
+ line-height: 1;
+ margin: 3px auto;
+ padding: 9px 0;
+}
+.b-calendar .btn:disabled, .b-calendar .btn.disabled, .b-calendar .btn[aria-disabled=true] {
+ cursor: default;
+ pointer-events: none;
+}
+
+.card-img-left {
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
+}
+
+.card-img-right {
+ border-top-right-radius: calc(0.25rem - 1px);
+ border-bottom-right-radius: calc(0.25rem - 1px);
+}
+
+.dropdown:not(.dropleft) .dropdown-toggle.dropdown-toggle-no-caret::after {
+ display: none !important;
+}
+.dropdown.dropleft .dropdown-toggle.dropdown-toggle-no-caret::before {
+ display: none !important;
+}
+.dropdown .dropdown-menu:focus {
+ outline: none;
+}
+
+.b-dropdown-form {
+ display: inline-block;
+ padding: 0.25rem 1.5rem;
+ width: 100%;
+ clear: both;
+ font-weight: 400;
+}
+.b-dropdown-form:focus {
+ outline: 1px dotted !important;
+ outline: 5px auto -webkit-focus-ring-color !important;
+}
+.b-dropdown-form.disabled, .b-dropdown-form:disabled {
+ outline: 0 !important;
+ color: #6c757d;
+ pointer-events: none;
+}
+
+.b-dropdown-text {
+ display: inline-block;
+ padding: 0.25rem 1.5rem;
+ margin-bottom: 0;
+ width: 100%;
+ clear: both;
+ font-weight: lighter;
+}
+
+.custom-checkbox.b-custom-control-lg,
+.input-group-lg .custom-checkbox {
+ font-size: 1.25rem;
+ line-height: 1.5;
+ padding-left: 1.875rem;
+}
+.custom-checkbox.b-custom-control-lg .custom-control-label::before,
+.input-group-lg .custom-checkbox .custom-control-label::before {
+ top: 0.3125rem;
+ left: -1.875rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ border-radius: 0.3rem;
+}
+.custom-checkbox.b-custom-control-lg .custom-control-label::after,
+.input-group-lg .custom-checkbox .custom-control-label::after {
+ top: 0.3125rem;
+ left: -1.875rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ background-size: 50% 50%;
+}
+
+.custom-checkbox.b-custom-control-sm,
+.input-group-sm .custom-checkbox {
+ font-size: 0.875rem;
+ line-height: 1.5;
+ padding-left: 1.3125rem;
+}
+.custom-checkbox.b-custom-control-sm .custom-control-label::before,
+.input-group-sm .custom-checkbox .custom-control-label::before {
+ top: 0.21875rem;
+ left: -1.3125rem;
+ width: 0.875rem;
+ height: 0.875rem;
+ border-radius: 0.2rem;
+}
+.custom-checkbox.b-custom-control-sm .custom-control-label::after,
+.input-group-sm .custom-checkbox .custom-control-label::after {
+ top: 0.21875rem;
+ left: -1.3125rem;
+ width: 0.875rem;
+ height: 0.875rem;
+ background-size: 50% 50%;
+}
+
+.custom-switch.b-custom-control-lg,
+.input-group-lg .custom-switch {
+ padding-left: 2.8125rem;
+}
+.custom-switch.b-custom-control-lg .custom-control-label,
+.input-group-lg .custom-switch .custom-control-label {
+ font-size: 1.25rem;
+ line-height: 1.5;
+}
+.custom-switch.b-custom-control-lg .custom-control-label::before,
+.input-group-lg .custom-switch .custom-control-label::before {
+ top: 0.3125rem;
+ height: 1.25rem;
+ left: -2.8125rem;
+ width: 2.1875rem;
+ border-radius: 0.625rem;
+}
+.custom-switch.b-custom-control-lg .custom-control-label::after,
+.input-group-lg .custom-switch .custom-control-label::after {
+ top: calc( 0.3125rem + 2px );
+ left: calc( -2.8125rem + 2px );
+ width: calc( 1.25rem - 4px );
+ height: calc( 1.25rem - 4px );
+ border-radius: 0.625rem;
+ background-size: 50% 50%;
+}
+.custom-switch.b-custom-control-lg .custom-control-input:checked ~ .custom-control-label::after,
+.input-group-lg .custom-switch .custom-control-input:checked ~ .custom-control-label::after {
+ -webkit-transform: translateX(0.9375rem);
+ transform: translateX(0.9375rem);
+}
+
+.custom-switch.b-custom-control-sm,
+.input-group-sm .custom-switch {
+ padding-left: 1.96875rem;
+}
+.custom-switch.b-custom-control-sm .custom-control-label,
+.input-group-sm .custom-switch .custom-control-label {
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+.custom-switch.b-custom-control-sm .custom-control-label::before,
+.input-group-sm .custom-switch .custom-control-label::before {
+ top: 0.21875rem;
+ left: -1.96875rem;
+ width: 1.53125rem;
+ height: 0.875rem;
+ border-radius: 0.4375rem;
+}
+.custom-switch.b-custom-control-sm .custom-control-label::after,
+.input-group-sm .custom-switch .custom-control-label::after {
+ top: calc( 0.21875rem + 2px );
+ left: calc( -1.96875rem + 2px );
+ width: calc( 0.875rem - 4px );
+ height: calc( 0.875rem - 4px );
+ border-radius: 0.4375rem;
+ background-size: 50% 50%;
+}
+.custom-switch.b-custom-control-sm .custom-control-input:checked ~ .custom-control-label::after,
+.input-group-sm .custom-switch .custom-control-input:checked ~ .custom-control-label::after {
+ -webkit-transform: translateX(0.65625rem);
+ transform: translateX(0.65625rem);
+}
+
+.input-group > .input-group-prepend > .btn-group > .btn,
+.input-group > .input-group-append:not(:last-child) > .btn-group > .btn,
+.input-group > .input-group-append:last-child > .btn-group:not(:last-child):not(.dropdown-toggle) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group > .input-group-append > .btn-group > .btn,
+.input-group > .input-group-prepend:not(:first-child) > .btn-group > .btn,
+.input-group > .input-group-prepend:first-child > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.b-form-btn-label-control.form-control {
+ display: flex;
+ align-items: stretch;
+ height: auto;
+ padding: 0;
+ background-image: none;
+}
+.input-group .b-form-btn-label-control.form-control {
+ padding: 0;
+}
+
+[dir=rtl] .b-form-btn-label-control.form-control, .b-form-btn-label-control.form-control[dir=rtl] {
+ flex-direction: row-reverse;
+}
+[dir=rtl] .b-form-btn-label-control.form-control > label, .b-form-btn-label-control.form-control[dir=rtl] > label {
+ text-align: right;
+}
+
+.b-form-btn-label-control.form-control > .btn {
+ line-height: 1;
+ font-size: inherit;
+ box-shadow: none !important;
+ border: 0;
+}
+.b-form-btn-label-control.form-control > .btn:disabled {
+ pointer-events: none;
+}
+.b-form-btn-label-control.form-control.is-valid > .btn {
+ color: #28a745;
+}
+.b-form-btn-label-control.form-control.is-invalid > .btn {
+ color: #dc3545;
+}
+.b-form-btn-label-control.form-control > .dropdown-menu {
+ padding: 0.5rem;
+}
+.b-form-btn-label-control.form-control > .form-control {
+ height: auto;
+ min-height: calc(calc(1.5em + 0.75rem + 2px) - 2px);
+ padding-left: 0.25rem;
+ margin: 0;
+ border: 0;
+ outline: 0;
+ background: transparent;
+ word-break: break-word;
+ font-size: inherit;
+ white-space: normal;
+ cursor: pointer;
+}
+.b-form-btn-label-control.form-control > .form-control.form-control-sm {
+ min-height: calc(calc(1.5em + 0.5rem + 2px) - 2px);
+}
+.b-form-btn-label-control.form-control > .form-control.form-control-lg {
+ min-height: calc(calc(1.5em + 1rem + 2px) - 2px);
+}
+.input-group.input-group-sm .b-form-btn-label-control.form-control > .form-control {
+ min-height: calc(calc(1.5em + 0.5rem + 2px) - 2px);
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.input-group.input-group-lg .b-form-btn-label-control.form-control > .form-control {
+ min-height: calc(calc(1.5em + 1rem + 2px) - 2px);
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.b-form-btn-label-control.form-control[aria-disabled=true], .b-form-btn-label-control.form-control[aria-readonly=true] {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+.b-form-btn-label-control.form-control[aria-disabled=true] {
+ pointer-events: none;
+}
+.b-form-btn-label-control.form-control[aria-disabled=true] > label {
+ cursor: default;
+}
+
+.b-form-btn-label-control.btn-group > .dropdown-menu {
+ padding: 0.5rem;
+}
+
+.custom-file-label {
+ white-space: nowrap;
+ overflow-x: hidden;
+}
+
+.b-custom-control-lg.custom-file,
+.b-custom-control-lg .custom-file-input,
+.b-custom-control-lg .custom-file-label,
+.input-group-lg.custom-file,
+.input-group-lg .custom-file-input,
+.input-group-lg .custom-file-label {
+ font-size: 1.25rem;
+ height: calc(1.5em + 1rem + 2px);
+}
+.b-custom-control-lg .custom-file-label,
+.b-custom-control-lg .custom-file-label:after,
+.input-group-lg .custom-file-label,
+.input-group-lg .custom-file-label:after {
+ padding: 0.5rem 1rem;
+ line-height: 1.5;
+}
+.b-custom-control-lg .custom-file-label,
+.input-group-lg .custom-file-label {
+ border-radius: 0.3rem;
+}
+.b-custom-control-lg .custom-file-label::after,
+.input-group-lg .custom-file-label::after {
+ font-size: inherit;
+ height: calc( 1.5em + 1rem );
+ border-radius: 0 0.3rem 0.3rem 0;
+}
+
+.b-custom-control-sm.custom-file,
+.b-custom-control-sm .custom-file-input,
+.b-custom-control-sm .custom-file-label,
+.input-group-sm.custom-file,
+.input-group-sm .custom-file-input,
+.input-group-sm .custom-file-label {
+ font-size: 0.875rem;
+ height: calc(1.5em + 0.5rem + 2px);
+}
+.b-custom-control-sm .custom-file-label,
+.b-custom-control-sm .custom-file-label:after,
+.input-group-sm .custom-file-label,
+.input-group-sm .custom-file-label:after {
+ padding: 0.25rem 0.5rem;
+ line-height: 1.5;
+}
+.b-custom-control-sm .custom-file-label,
+.input-group-sm .custom-file-label {
+ border-radius: 0.2rem;
+}
+.b-custom-control-sm .custom-file-label::after,
+.input-group-sm .custom-file-label::after {
+ font-size: inherit;
+ height: calc( 1.5em + 0.5rem );
+ border-radius: 0 0.2rem 0.2rem 0;
+}
+
+.was-validated .form-control:invalid, .was-validated .form-control:valid, .form-control.is-invalid, .form-control.is-valid {
+ background-position: right calc(0.375em + 0.1875rem) center;
+}
+
+input[type=color].form-control {
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: 0.125rem 0.25rem;
+}
+
+input[type=color].form-control.form-control-sm,
+.input-group-sm input[type=color].form-control {
+ height: calc(1.5em + 0.5rem + 2px);
+ padding: 0.125rem 0.25rem;
+}
+
+input[type=color].form-control.form-control-lg,
+.input-group-lg input[type=color].form-control {
+ height: calc(1.5em + 1rem + 2px);
+ padding: 0.125rem 0.25rem;
+}
+
+input[type=color].form-control:disabled {
+ background-color: #adb5bd;
+ opacity: 0.65;
+}
+
+.input-group > .custom-range {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0;
+}
+.input-group > .custom-range + .form-control,
+.input-group > .custom-range + .form-control-plaintext,
+.input-group > .custom-range + .custom-select,
+.input-group > .custom-range + .custom-range,
+.input-group > .custom-range + .custom-file {
+ margin-left: -1px;
+}
+.input-group > .form-control + .custom-range,
+.input-group > .form-control-plaintext + .custom-range,
+.input-group > .custom-select + .custom-range,
+.input-group > .custom-range + .custom-range,
+.input-group > .custom-file + .custom-range {
+ margin-left: -1px;
+}
+.input-group > .custom-range:focus {
+ z-index: 3;
+}
+.input-group > .custom-range:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group > .custom-range:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.input-group > .custom-range {
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: 0 0.75rem;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ced4da;
+ height: calc(1.5em + 0.75rem + 2px);
+ border-radius: 0.25rem;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .input-group > .custom-range {
+ transition: none;
+ }
+}
+.input-group > .custom-range:focus {
+ color: #495057;
+ background-color: #fff;
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+.input-group > .custom-range:disabled, .input-group > .custom-range[readonly] {
+ background-color: #e9ecef;
+}
+
+.input-group-lg > .custom-range {
+ height: calc(1.5em + 1rem + 2px);
+ padding: 0 1rem;
+ border-radius: 0.3rem;
+}
+
+.input-group-sm > .custom-range {
+ height: calc(1.5em + 0.5rem + 2px);
+ padding: 0 0.5rem;
+ border-radius: 0.2rem;
+}
+
+.was-validated .input-group .custom-range:valid, .input-group .custom-range.is-valid {
+ border-color: #28a745;
+}
+.was-validated .input-group .custom-range:valid:focus, .input-group .custom-range.is-valid:focus {
+ border-color: #28a745;
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+}
+
+.was-validated .custom-range:valid:focus::-webkit-slider-thumb, .custom-range.is-valid:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem #9be7ac;
+}
+.was-validated .custom-range:valid:focus::-moz-range-thumb, .custom-range.is-valid:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem #9be7ac;
+}
+.was-validated .custom-range:valid:focus::-ms-thumb, .custom-range.is-valid:focus::-ms-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem #9be7ac;
+}
+.was-validated .custom-range:valid::-webkit-slider-thumb, .custom-range.is-valid::-webkit-slider-thumb {
+ background-color: #28a745;
+ background-image: none;
+}
+.was-validated .custom-range:valid::-webkit-slider-thumb:active, .custom-range.is-valid::-webkit-slider-thumb:active {
+ background-color: #9be7ac;
+ background-image: none;
+}
+.was-validated .custom-range:valid::-webkit-slider-runnable-track, .custom-range.is-valid::-webkit-slider-runnable-track {
+ background-color: rgba(40, 167, 69, 0.35);
+}
+.was-validated .custom-range:valid::-moz-range-thumb, .custom-range.is-valid::-moz-range-thumb {
+ background-color: #28a745;
+ background-image: none;
+}
+.was-validated .custom-range:valid::-moz-range-thumb:active, .custom-range.is-valid::-moz-range-thumb:active {
+ background-color: #9be7ac;
+ background-image: none;
+}
+.was-validated .custom-range:valid::-moz-range-track, .custom-range.is-valid::-moz-range-track {
+ background: rgba(40, 167, 69, 0.35);
+}
+.was-validated .custom-range:valid ~ .valid-feedback,
+.was-validated .custom-range:valid ~ .valid-tooltip, .custom-range.is-valid ~ .valid-feedback,
+.custom-range.is-valid ~ .valid-tooltip {
+ display: block;
+}
+.was-validated .custom-range:valid::-ms-thumb, .custom-range.is-valid::-ms-thumb {
+ background-color: #28a745;
+ background-image: none;
+}
+.was-validated .custom-range:valid::-ms-thumb:active, .custom-range.is-valid::-ms-thumb:active {
+ background-color: #9be7ac;
+ background-image: none;
+}
+.was-validated .custom-range:valid::-ms-track-lower, .custom-range.is-valid::-ms-track-lower {
+ background: rgba(40, 167, 69, 0.35);
+}
+.was-validated .custom-range:valid::-ms-track-upper, .custom-range.is-valid::-ms-track-upper {
+ background: rgba(40, 167, 69, 0.35);
+}
+
+.was-validated .input-group .custom-range:invalid, .input-group .custom-range.is-invalid {
+ border-color: #dc3545;
+}
+.was-validated .input-group .custom-range:invalid:focus, .input-group .custom-range.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.was-validated .custom-range:invalid:focus::-webkit-slider-thumb, .custom-range.is-invalid:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem #f6cdd1;
+}
+.was-validated .custom-range:invalid:focus::-moz-range-thumb, .custom-range.is-invalid:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem #f6cdd1;
+}
+.was-validated .custom-range:invalid:focus::-ms-thumb, .custom-range.is-invalid:focus::-ms-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem #f6cdd1;
+}
+.was-validated .custom-range:invalid::-webkit-slider-thumb, .custom-range.is-invalid::-webkit-slider-thumb {
+ background-color: #dc3545;
+ background-image: none;
+}
+.was-validated .custom-range:invalid::-webkit-slider-thumb:active, .custom-range.is-invalid::-webkit-slider-thumb:active {
+ background-color: #f6cdd1;
+ background-image: none;
+}
+.was-validated .custom-range:invalid::-webkit-slider-runnable-track, .custom-range.is-invalid::-webkit-slider-runnable-track {
+ background-color: rgba(220, 53, 69, 0.35);
+}
+.was-validated .custom-range:invalid::-moz-range-thumb, .custom-range.is-invalid::-moz-range-thumb {
+ background-color: #dc3545;
+ background-image: none;
+}
+.was-validated .custom-range:invalid::-moz-range-thumb:active, .custom-range.is-invalid::-moz-range-thumb:active {
+ background-color: #f6cdd1;
+ background-image: none;
+}
+.was-validated .custom-range:invalid::-moz-range-track, .custom-range.is-invalid::-moz-range-track {
+ background: rgba(220, 53, 69, 0.35);
+}
+.was-validated .custom-range:invalid ~ .invalid-feedback,
+.was-validated .custom-range:invalid ~ .invalid-tooltip, .custom-range.is-invalid ~ .invalid-feedback,
+.custom-range.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+.was-validated .custom-range:invalid::-ms-thumb, .custom-range.is-invalid::-ms-thumb {
+ background-color: #dc3545;
+ background-image: none;
+}
+.was-validated .custom-range:invalid::-ms-thumb:active, .custom-range.is-invalid::-ms-thumb:active {
+ background-color: #f6cdd1;
+ background-image: none;
+}
+.was-validated .custom-range:invalid::-ms-track-lower, .custom-range.is-invalid::-ms-track-lower {
+ background: rgba(220, 53, 69, 0.35);
+}
+.was-validated .custom-range:invalid::-ms-track-upper, .custom-range.is-invalid::-ms-track-upper {
+ background: rgba(220, 53, 69, 0.35);
+}
+
+.custom-radio.b-custom-control-lg,
+.input-group-lg .custom-radio {
+ font-size: 1.25rem;
+ line-height: 1.5;
+ padding-left: 1.875rem;
+}
+.custom-radio.b-custom-control-lg .custom-control-label::before,
+.input-group-lg .custom-radio .custom-control-label::before {
+ top: 0.3125rem;
+ left: -1.875rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ border-radius: 50%;
+}
+.custom-radio.b-custom-control-lg .custom-control-label::after,
+.input-group-lg .custom-radio .custom-control-label::after {
+ top: 0.3125rem;
+ left: -1.875rem;
+ width: 1.25rem;
+ height: 1.25rem;
+ background: no-repeat 50%/50% 50%;
+}
+
+.custom-radio.b-custom-control-sm,
+.input-group-sm .custom-radio {
+ font-size: 0.875rem;
+ line-height: 1.5;
+ padding-left: 1.3125rem;
+}
+.custom-radio.b-custom-control-sm .custom-control-label::before,
+.input-group-sm .custom-radio .custom-control-label::before {
+ top: 0.21875rem;
+ left: -1.3125rem;
+ width: 0.875rem;
+ height: 0.875rem;
+ border-radius: 50%;
+}
+.custom-radio.b-custom-control-sm .custom-control-label::after,
+.input-group-sm .custom-radio .custom-control-label::after {
+ top: 0.21875rem;
+ left: -1.3125rem;
+ width: 0.875rem;
+ height: 0.875rem;
+ background: no-repeat 50%/50% 50%;
+}
+
+.b-rating {
+ text-align: center;
+}
+.b-rating.d-inline-flex {
+ width: auto;
+}
+.b-rating .b-rating-star,
+.b-rating .b-rating-value {
+ padding: 0 0.25em;
+}
+.b-rating .b-rating-value {
+ min-width: 2.5em;
+}
+.b-rating .b-rating-star {
+ display: inline-flex;
+ justify-content: center;
+ outline: 0;
+}
+.b-rating .b-rating-star .b-rating-icon {
+ display: inline-flex;
+ transition: all 0.15s ease-in-out;
+}
+.b-rating.disabled, .b-rating:disabled {
+ background-color: #e9ecef;
+ color: #6c757d;
+}
+.b-rating:not(.disabled):not(.readonly) .b-rating-star {
+ cursor: pointer;
+}
+.b-rating:not(.disabled):not(.readonly):focus:not(:hover) .b-rating-star.focused .b-rating-icon,
+.b-rating:not(.disabled):not(.readonly) .b-rating-star:hover .b-rating-icon {
+ -webkit-transform: scale(1.5);
+ transform: scale(1.5);
+}
+.b-rating[dir=rtl] .b-rating-star-half {
+ -webkit-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.b-form-spinbutton {
+ text-align: center;
+ overflow: hidden;
+ background-image: none;
+ padding: 0;
+}
+[dir=rtl] .b-form-spinbutton:not(.flex-column), .b-form-spinbutton[dir=rtl]:not(.flex-column) {
+ flex-direction: row-reverse;
+}
+
+.b-form-spinbutton output {
+ font-size: inherit;
+ outline: 0;
+ border: 0;
+ background-color: transparent;
+ width: auto;
+ margin: 0;
+ padding: 0 0.25rem;
+}
+.b-form-spinbutton output > div,
+.b-form-spinbutton output > bdi {
+ display: block;
+ min-width: 2.25em;
+ height: 1.5em;
+}
+.b-form-spinbutton.flex-column {
+ height: auto;
+ width: auto;
+}
+.b-form-spinbutton.flex-column output {
+ margin: 0 0.25rem;
+ padding: 0.25rem 0;
+}
+.b-form-spinbutton:not(.d-inline-flex):not(.flex-column) {
+ output-width: 100%;
+}
+.b-form-spinbutton.d-inline-flex:not(.flex-column) {
+ width: auto;
+}
+.b-form-spinbutton .btn {
+ line-height: 1;
+ box-shadow: none !important;
+}
+.b-form-spinbutton .btn:disabled {
+ pointer-events: none;
+}
+.b-form-spinbutton .btn:hover:not(:disabled) > div > .b-icon {
+ -webkit-transform: scale(1.25);
+ transform: scale(1.25);
+}
+.b-form-spinbutton.disabled, .b-form-spinbutton.readonly {
+ background-color: #e9ecef;
+}
+.b-form-spinbutton.disabled {
+ pointer-events: none;
+}
+
+.b-form-tags .b-form-tags-list {
+ margin-top: -0.25rem;
+}
+.b-form-tags .b-form-tags-list .b-from-tags-field,
+.b-form-tags .b-form-tags-list .b-form-tag {
+ margin-top: 0.25rem;
+}
+.b-form-tags.focus {
+ color: #495057;
+ background-color: #fff;
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+.b-form-tags.focus.is-valid {
+ border-color: #28a745;
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
+}
+.b-form-tags.focus.is-invalid {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+.b-form-tags.disabled {
+ background-color: #e9ecef;
+}
+
+.b-form-tag {
+ font-size: 75%;
+ font-weight: normal;
+ line-height: 1.5;
+ margin-right: 0.25rem;
+}
+.b-form-tag.disabled {
+ opacity: 0.75;
+}
+.b-form-tag > button.b-form-tag-remove {
+ color: inherit;
+ font-size: 125%;
+ line-height: 1;
+ float: none;
+ margin-left: 0.25rem;
+}
+
+.form-control-sm .b-form-tag {
+ line-height: 1.5;
+}
+
+.form-control-lg .b-form-tag {
+ line-height: 1.5;
+}
+
+.media-aside {
+ display: flex;
+ margin-right: 1rem;
+}
+
+.media-aside-right {
+ margin-right: 0;
+ margin-left: 1rem;
+}
+
+.modal-backdrop {
+ opacity: 0.5;
+}
+
+.b-pagination-pills .page-item .page-link {
+ border-radius: 50rem !important;
+ margin-left: 0.25rem;
+ line-height: 1;
+}
+.b-pagination-pills .page-item:first-child .page-link {
+ margin-left: 0;
+}
+
+.popover.b-popover {
+ display: block;
+ opacity: 1;
+ outline: 0;
+}
+.popover.b-popover.fade:not(.show) {
+ opacity: 0;
+}
+.popover.b-popover.show {
+ opacity: 1;
+}
+
+.b-popover-primary.popover {
+ background-color: #cce5ff;
+ border-color: #b8daff;
+}
+.b-popover-primary.bs-popover-top > .arrow::before, .b-popover-primary.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #b8daff;
+}
+.b-popover-primary.bs-popover-top > .arrow::after, .b-popover-primary.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #cce5ff;
+}
+.b-popover-primary.bs-popover-right > .arrow::before, .b-popover-primary.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #b8daff;
+}
+.b-popover-primary.bs-popover-right > .arrow::after, .b-popover-primary.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #cce5ff;
+}
+.b-popover-primary.bs-popover-bottom > .arrow::before, .b-popover-primary.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #b8daff;
+}
+.b-popover-primary.bs-popover-bottom > .arrow::after, .b-popover-primary.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #bdddff;
+}
+.b-popover-primary.bs-popover-bottom .popover-header::before, .b-popover-primary.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #bdddff;
+}
+.b-popover-primary.bs-popover-left > .arrow::before, .b-popover-primary.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #b8daff;
+}
+.b-popover-primary.bs-popover-left > .arrow::after, .b-popover-primary.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #cce5ff;
+}
+.b-popover-primary .popover-header {
+ color: #212529;
+ background-color: #bdddff;
+ border-bottom-color: #a3d0ff;
+}
+.b-popover-primary .popover-body {
+ color: #004085;
+}
+
+.b-popover-secondary.popover {
+ background-color: #e2e3e5;
+ border-color: #d6d8db;
+}
+.b-popover-secondary.bs-popover-top > .arrow::before, .b-popover-secondary.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #d6d8db;
+}
+.b-popover-secondary.bs-popover-top > .arrow::after, .b-popover-secondary.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #e2e3e5;
+}
+.b-popover-secondary.bs-popover-right > .arrow::before, .b-popover-secondary.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #d6d8db;
+}
+.b-popover-secondary.bs-popover-right > .arrow::after, .b-popover-secondary.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #e2e3e5;
+}
+.b-popover-secondary.bs-popover-bottom > .arrow::before, .b-popover-secondary.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #d6d8db;
+}
+.b-popover-secondary.bs-popover-bottom > .arrow::after, .b-popover-secondary.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #dadbde;
+}
+.b-popover-secondary.bs-popover-bottom .popover-header::before, .b-popover-secondary.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #dadbde;
+}
+.b-popover-secondary.bs-popover-left > .arrow::before, .b-popover-secondary.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #d6d8db;
+}
+.b-popover-secondary.bs-popover-left > .arrow::after, .b-popover-secondary.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #e2e3e5;
+}
+.b-popover-secondary .popover-header {
+ color: #212529;
+ background-color: #dadbde;
+ border-bottom-color: #ccced2;
+}
+.b-popover-secondary .popover-body {
+ color: #383d41;
+}
+
+.b-popover-success.popover {
+ background-color: #d4edda;
+ border-color: #c3e6cb;
+}
+.b-popover-success.bs-popover-top > .arrow::before, .b-popover-success.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #c3e6cb;
+}
+.b-popover-success.bs-popover-top > .arrow::after, .b-popover-success.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #d4edda;
+}
+.b-popover-success.bs-popover-right > .arrow::before, .b-popover-success.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #c3e6cb;
+}
+.b-popover-success.bs-popover-right > .arrow::after, .b-popover-success.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #d4edda;
+}
+.b-popover-success.bs-popover-bottom > .arrow::before, .b-popover-success.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #c3e6cb;
+}
+.b-popover-success.bs-popover-bottom > .arrow::after, .b-popover-success.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #c9e8d1;
+}
+.b-popover-success.bs-popover-bottom .popover-header::before, .b-popover-success.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #c9e8d1;
+}
+.b-popover-success.bs-popover-left > .arrow::before, .b-popover-success.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #c3e6cb;
+}
+.b-popover-success.bs-popover-left > .arrow::after, .b-popover-success.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #d4edda;
+}
+.b-popover-success .popover-header {
+ color: #212529;
+ background-color: #c9e8d1;
+ border-bottom-color: #b7e1c1;
+}
+.b-popover-success .popover-body {
+ color: #155724;
+}
+
+.b-popover-info.popover {
+ background-color: #d1ecf1;
+ border-color: #bee5eb;
+}
+.b-popover-info.bs-popover-top > .arrow::before, .b-popover-info.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #bee5eb;
+}
+.b-popover-info.bs-popover-top > .arrow::after, .b-popover-info.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #d1ecf1;
+}
+.b-popover-info.bs-popover-right > .arrow::before, .b-popover-info.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #bee5eb;
+}
+.b-popover-info.bs-popover-right > .arrow::after, .b-popover-info.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #d1ecf1;
+}
+.b-popover-info.bs-popover-bottom > .arrow::before, .b-popover-info.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #bee5eb;
+}
+.b-popover-info.bs-popover-bottom > .arrow::after, .b-popover-info.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #c5e7ed;
+}
+.b-popover-info.bs-popover-bottom .popover-header::before, .b-popover-info.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #c5e7ed;
+}
+.b-popover-info.bs-popover-left > .arrow::before, .b-popover-info.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #bee5eb;
+}
+.b-popover-info.bs-popover-left > .arrow::after, .b-popover-info.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #d1ecf1;
+}
+.b-popover-info .popover-header {
+ color: #212529;
+ background-color: #c5e7ed;
+ border-bottom-color: #b2dfe7;
+}
+.b-popover-info .popover-body {
+ color: #0c5460;
+}
+
+.b-popover-warning.popover {
+ background-color: #fff3cd;
+ border-color: #ffeeba;
+}
+.b-popover-warning.bs-popover-top > .arrow::before, .b-popover-warning.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #ffeeba;
+}
+.b-popover-warning.bs-popover-top > .arrow::after, .b-popover-warning.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #fff3cd;
+}
+.b-popover-warning.bs-popover-right > .arrow::before, .b-popover-warning.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #ffeeba;
+}
+.b-popover-warning.bs-popover-right > .arrow::after, .b-popover-warning.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #fff3cd;
+}
+.b-popover-warning.bs-popover-bottom > .arrow::before, .b-popover-warning.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #ffeeba;
+}
+.b-popover-warning.bs-popover-bottom > .arrow::after, .b-popover-warning.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #ffefbe;
+}
+.b-popover-warning.bs-popover-bottom .popover-header::before, .b-popover-warning.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #ffefbe;
+}
+.b-popover-warning.bs-popover-left > .arrow::before, .b-popover-warning.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #ffeeba;
+}
+.b-popover-warning.bs-popover-left > .arrow::after, .b-popover-warning.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #fff3cd;
+}
+.b-popover-warning .popover-header {
+ color: #212529;
+ background-color: #ffefbe;
+ border-bottom-color: #ffe9a4;
+}
+.b-popover-warning .popover-body {
+ color: #856404;
+}
+
+.b-popover-danger.popover {
+ background-color: #f8d7da;
+ border-color: #f5c6cb;
+}
+.b-popover-danger.bs-popover-top > .arrow::before, .b-popover-danger.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #f5c6cb;
+}
+.b-popover-danger.bs-popover-top > .arrow::after, .b-popover-danger.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #f8d7da;
+}
+.b-popover-danger.bs-popover-right > .arrow::before, .b-popover-danger.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #f5c6cb;
+}
+.b-popover-danger.bs-popover-right > .arrow::after, .b-popover-danger.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #f8d7da;
+}
+.b-popover-danger.bs-popover-bottom > .arrow::before, .b-popover-danger.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #f5c6cb;
+}
+.b-popover-danger.bs-popover-bottom > .arrow::after, .b-popover-danger.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #f6cace;
+}
+.b-popover-danger.bs-popover-bottom .popover-header::before, .b-popover-danger.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #f6cace;
+}
+.b-popover-danger.bs-popover-left > .arrow::before, .b-popover-danger.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #f5c6cb;
+}
+.b-popover-danger.bs-popover-left > .arrow::after, .b-popover-danger.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #f8d7da;
+}
+.b-popover-danger .popover-header {
+ color: #212529;
+ background-color: #f6cace;
+ border-bottom-color: #f2b4ba;
+}
+.b-popover-danger .popover-body {
+ color: #721c24;
+}
+
+.b-popover-light.popover {
+ background-color: #fefefe;
+ border-color: #fdfdfe;
+}
+.b-popover-light.bs-popover-top > .arrow::before, .b-popover-light.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #fdfdfe;
+}
+.b-popover-light.bs-popover-top > .arrow::after, .b-popover-light.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #fefefe;
+}
+.b-popover-light.bs-popover-right > .arrow::before, .b-popover-light.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #fdfdfe;
+}
+.b-popover-light.bs-popover-right > .arrow::after, .b-popover-light.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #fefefe;
+}
+.b-popover-light.bs-popover-bottom > .arrow::before, .b-popover-light.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #fdfdfe;
+}
+.b-popover-light.bs-popover-bottom > .arrow::after, .b-popover-light.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #f6f6f6;
+}
+.b-popover-light.bs-popover-bottom .popover-header::before, .b-popover-light.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #f6f6f6;
+}
+.b-popover-light.bs-popover-left > .arrow::before, .b-popover-light.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #fdfdfe;
+}
+.b-popover-light.bs-popover-left > .arrow::after, .b-popover-light.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #fefefe;
+}
+.b-popover-light .popover-header {
+ color: #212529;
+ background-color: #f6f6f6;
+ border-bottom-color: #eaeaea;
+}
+.b-popover-light .popover-body {
+ color: #818182;
+}
+
+.b-popover-dark.popover {
+ background-color: #d6d8d9;
+ border-color: #c6c8ca;
+}
+.b-popover-dark.bs-popover-top > .arrow::before, .b-popover-dark.bs-popover-auto[x-placement^=top] > .arrow::before {
+ border-top-color: #c6c8ca;
+}
+.b-popover-dark.bs-popover-top > .arrow::after, .b-popover-dark.bs-popover-auto[x-placement^=top] > .arrow::after {
+ border-top-color: #d6d8d9;
+}
+.b-popover-dark.bs-popover-right > .arrow::before, .b-popover-dark.bs-popover-auto[x-placement^=right] > .arrow::before {
+ border-right-color: #c6c8ca;
+}
+.b-popover-dark.bs-popover-right > .arrow::after, .b-popover-dark.bs-popover-auto[x-placement^=right] > .arrow::after {
+ border-right-color: #d6d8d9;
+}
+.b-popover-dark.bs-popover-bottom > .arrow::before, .b-popover-dark.bs-popover-auto[x-placement^=bottom] > .arrow::before {
+ border-bottom-color: #c6c8ca;
+}
+.b-popover-dark.bs-popover-bottom > .arrow::after, .b-popover-dark.bs-popover-auto[x-placement^=bottom] > .arrow::after {
+ border-bottom-color: #ced0d2;
+}
+.b-popover-dark.bs-popover-bottom .popover-header::before, .b-popover-dark.bs-popover-auto[x-placement^=bottom] .popover-header::before {
+ border-bottom-color: #ced0d2;
+}
+.b-popover-dark.bs-popover-left > .arrow::before, .b-popover-dark.bs-popover-auto[x-placement^=left] > .arrow::before {
+ border-left-color: #c6c8ca;
+}
+.b-popover-dark.bs-popover-left > .arrow::after, .b-popover-dark.bs-popover-auto[x-placement^=left] > .arrow::after {
+ border-left-color: #d6d8d9;
+}
+.b-popover-dark .popover-header {
+ color: #212529;
+ background-color: #ced0d2;
+ border-bottom-color: #c1c4c5;
+}
+.b-popover-dark .popover-body {
+ color: #1b1e21;
+}
+
+.b-sidebar-outer {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 0;
+ overflow: visible;
+ z-index: calc(1030 + 5);
+}
+
+.b-sidebar-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ width: 100vw;
+ height: 100vh;
+ opacity: 0.6;
+}
+
+.b-sidebar {
+ display: flex;
+ flex-direction: column;
+ position: fixed;
+ top: 0;
+ width: 320px;
+ max-width: 100%;
+ height: 100vh;
+ max-height: 100%;
+ margin: 0;
+ outline: 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+}
+.b-sidebar.slide {
+ transition: -webkit-transform 0.3s ease-in-out;
+ transition: transform 0.3s ease-in-out;
+ transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-sidebar.slide {
+ transition: none;
+ }
+}
+.b-sidebar:not(.b-sidebar-right) {
+ left: 0;
+ right: auto;
+}
+.b-sidebar:not(.b-sidebar-right).slide:not(.show) {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+}
+.b-sidebar:not(.b-sidebar-right) > .b-sidebar-header .close {
+ margin-left: auto;
+}
+.b-sidebar.b-sidebar-right {
+ left: auto;
+ right: 0;
+}
+.b-sidebar.b-sidebar-right.slide:not(.show) {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+}
+.b-sidebar.b-sidebar-right > .b-sidebar-header .close {
+ margin-right: auto;
+}
+.b-sidebar > .b-sidebar-header {
+ font-size: 1.5rem;
+ padding: 0.5rem 1rem;
+ display: flex;
+ flex-direction: row;
+ flex-grow: 0;
+ align-items: center;
+}
+[dir=rtl] .b-sidebar > .b-sidebar-header {
+ flex-direction: row-reverse;
+}
+
+.b-sidebar > .b-sidebar-header .close {
+ float: none;
+ font-size: 1.5rem;
+}
+.b-sidebar > .b-sidebar-body {
+ flex-grow: 1;
+ height: 100%;
+ overflow-y: auto;
+}
+.b-sidebar > .b-sidebar-footer {
+ flex-grow: 0;
+}
+
+.b-skeleton-wrapper {
+ cursor: wait;
+}
+
+.b-skeleton {
+ position: relative;
+ overflow: hidden;
+ background-color: rgba(0, 0, 0, 0.12);
+ cursor: wait;
+ -webkit-mask-image: radial-gradient(white, black);
+ mask-image: radial-gradient(white, black);
+}
+.b-skeleton::before {
+ content: " ";
+}
+
+.b-skeleton-text {
+ height: 1rem;
+ margin-bottom: 0.25rem;
+ border-radius: 0.25rem;
+}
+
+.b-skeleton-button {
+ width: 75px;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ border-radius: 0.25rem;
+}
+
+.b-skeleton-avatar {
+ width: 2.5em;
+ height: 2.5em;
+ border-radius: 50%;
+}
+
+.b-skeleton-input {
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: 0.375rem 0.75rem;
+ line-height: 1.5;
+ border: #ced4da solid 1px;
+ border-radius: 0.25rem;
+}
+
+.b-skeleton-icon-wrapper svg {
+ color: rgba(0, 0, 0, 0.12);
+}
+
+.b-skeleton-img {
+ height: 100%;
+ width: 100%;
+}
+
+.b-skeleton-animate-wave::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 0;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent);
+ -webkit-animation: b-skeleton-animate-wave 1.75s linear infinite;
+ animation: b-skeleton-animate-wave 1.75s linear infinite;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-skeleton-animate-wave::after {
+ background: none;
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+@-webkit-keyframes b-skeleton-animate-wave {
+ from {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+ }
+ to {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ }
+}
+
+@keyframes b-skeleton-animate-wave {
+ from {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+ }
+ to {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ }
+}
+.b-skeleton-animate-fade {
+ -webkit-animation: b-skeleton-animate-fade 0.875s ease-in-out alternate infinite;
+ animation: b-skeleton-animate-fade 0.875s ease-in-out alternate infinite;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-skeleton-animate-fade {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+@-webkit-keyframes b-skeleton-animate-fade {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0.4;
+ }
+}
+
+@keyframes b-skeleton-animate-fade {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0.4;
+ }
+}
+.b-skeleton-animate-throb {
+ -webkit-animation: b-skeleton-animate-throb 0.875s ease-in alternate infinite;
+ animation: b-skeleton-animate-throb 0.875s ease-in alternate infinite;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-skeleton-animate-throb {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+@-webkit-keyframes b-skeleton-animate-throb {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ -webkit-transform: scale(0.975);
+ transform: scale(0.975);
+ }
+}
+
+@keyframes b-skeleton-animate-throb {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ -webkit-transform: scale(0.975);
+ transform: scale(0.975);
+ }
+}
+.table.b-table.b-table-fixed {
+ table-layout: fixed;
+}
+.table.b-table.b-table-no-border-collapse {
+ border-collapse: separate;
+ border-spacing: 0;
+}
+.table.b-table[aria-busy=true] {
+ opacity: 0.55;
+}
+.table.b-table > tbody > tr.b-table-details > td {
+ border-top: none !important;
+}
+.table.b-table > caption {
+ caption-side: bottom;
+}
+.table.b-table.b-table-caption-top > caption {
+ caption-side: top !important;
+}
+.table.b-table > tbody > .table-active,
+.table.b-table > tbody > .table-active > th,
+.table.b-table > tbody > .table-active > td {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.table.b-table.table-hover > tbody > tr.table-active:hover td,
+.table.b-table.table-hover > tbody > tr.table-active:hover th {
+ color: #212529;
+ background-image: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.075));
+ background-repeat: no-repeat;
+}
+.table.b-table > tbody > .bg-active,
+.table.b-table > tbody > .bg-active > th,
+.table.b-table > tbody > .bg-active > td {
+ background-color: rgba(255, 255, 255, 0.075) !important;
+}
+.table.b-table.table-hover.table-dark > tbody > tr.bg-active:hover td,
+.table.b-table.table-hover.table-dark > tbody > tr.bg-active:hover th {
+ color: #fff;
+ background-image: linear-gradient(rgba(255, 255, 255, 0.075), rgba(255, 255, 255, 0.075));
+ background-repeat: no-repeat;
+}
+
+.b-table-sticky-header,
+.table-responsive,
+[class*=table-responsive-] {
+ margin-bottom: 1rem;
+}
+.b-table-sticky-header > .table,
+.table-responsive > .table,
+[class*=table-responsive-] > .table {
+ margin-bottom: 0;
+}
+
+.b-table-sticky-header {
+ overflow-y: auto;
+ max-height: 300px;
+}
+
+@media print {
+ .b-table-sticky-header {
+ overflow-y: visible !important;
+ max-height: none !important;
+ }
+}
+@supports ((position: -webkit-sticky) or (position: sticky)) {
+ .b-table-sticky-header > .table.b-table > thead > tr > th {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 2;
+ }
+
+ .b-table-sticky-header > .table.b-table > thead > tr > .b-table-sticky-column,
+.b-table-sticky-header > .table.b-table > tbody > tr > .b-table-sticky-column,
+.b-table-sticky-header > .table.b-table > tfoot > tr > .b-table-sticky-column,
+.table-responsive > .table.b-table > thead > tr > .b-table-sticky-column,
+.table-responsive > .table.b-table > tbody > tr > .b-table-sticky-column,
+.table-responsive > .table.b-table > tfoot > tr > .b-table-sticky-column,
+[class*=table-responsive-] > .table.b-table > thead > tr > .b-table-sticky-column,
+[class*=table-responsive-] > .table.b-table > tbody > tr > .b-table-sticky-column,
+[class*=table-responsive-] > .table.b-table > tfoot > tr > .b-table-sticky-column {
+ position: -webkit-sticky;
+ position: sticky;
+ left: 0;
+ }
+ .b-table-sticky-header > .table.b-table > thead > tr > .b-table-sticky-column,
+.table-responsive > .table.b-table > thead > tr > .b-table-sticky-column,
+[class*=table-responsive-] > .table.b-table > thead > tr > .b-table-sticky-column {
+ z-index: 5;
+ }
+ .b-table-sticky-header > .table.b-table > tbody > tr > .b-table-sticky-column,
+.b-table-sticky-header > .table.b-table > tfoot > tr > .b-table-sticky-column,
+.table-responsive > .table.b-table > tbody > tr > .b-table-sticky-column,
+.table-responsive > .table.b-table > tfoot > tr > .b-table-sticky-column,
+[class*=table-responsive-] > .table.b-table > tbody > tr > .b-table-sticky-column,
+[class*=table-responsive-] > .table.b-table > tfoot > tr > .b-table-sticky-column {
+ z-index: 2;
+ }
+
+ .table.b-table > thead > tr > .table-b-table-default,
+.table.b-table > tbody > tr > .table-b-table-default,
+.table.b-table > tfoot > tr > .table-b-table-default {
+ color: #212529;
+ background-color: #fff;
+ }
+ .table.b-table.table-dark > thead > tr > .bg-b-table-default,
+.table.b-table.table-dark > tbody > tr > .bg-b-table-default,
+.table.b-table.table-dark > tfoot > tr > .bg-b-table-default {
+ color: #fff;
+ background-color: #343a40;
+ }
+ .table.b-table.table-striped > tbody > tr:nth-of-type(odd) > .table-b-table-default {
+ background-image: linear-gradient(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05));
+ background-repeat: no-repeat;
+ }
+ .table.b-table.table-striped.table-dark > tbody > tr:nth-of-type(odd) > .bg-b-table-default {
+ background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05));
+ background-repeat: no-repeat;
+ }
+ .table.b-table.table-hover > tbody > tr:hover > .table-b-table-default {
+ color: #212529;
+ background-image: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.075));
+ background-repeat: no-repeat;
+ }
+ .table.b-table.table-hover.table-dark > tbody > tr:hover > .bg-b-table-default {
+ color: #fff;
+ background-image: linear-gradient(rgba(255, 255, 255, 0.075), rgba(255, 255, 255, 0.075));
+ background-repeat: no-repeat;
+ }
+}
+.table.b-table > thead > tr > [aria-sort],
+.table.b-table > tfoot > tr > [aria-sort] {
+ cursor: pointer;
+ background-image: none;
+ background-repeat: no-repeat;
+ background-size: 0.65em 1em;
+}
+.table.b-table > thead > tr > [aria-sort]:not(.b-table-sort-icon-left),
+.table.b-table > tfoot > tr > [aria-sort]:not(.b-table-sort-icon-left) {
+ background-position: right calc(0.75rem / 2) center;
+ padding-right: calc(0.75rem + 0.65em);
+}
+.table.b-table > thead > tr > [aria-sort].b-table-sort-icon-left,
+.table.b-table > tfoot > tr > [aria-sort].b-table-sort-icon-left {
+ background-position: left calc(0.75rem / 2) center;
+ padding-left: calc(0.75rem + 0.65em);
+}
+.table.b-table > thead > tr > [aria-sort=none],
+.table.b-table > tfoot > tr > [aria-sort=none] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='black' opacity='.3' d='M51 1l25 23 24 22H1l25-22zM51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table > thead > tr > [aria-sort=ascending],
+.table.b-table > tfoot > tr > [aria-sort=ascending] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='black' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='black' opacity='.3' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table > thead > tr > [aria-sort=descending],
+.table.b-table > tfoot > tr > [aria-sort=descending] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='black' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='black' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table.table-dark > thead > tr > [aria-sort=none], .table.b-table.table-dark > tfoot > tr > [aria-sort=none],
+.table.b-table > .thead-dark > tr > [aria-sort=none] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22zM51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table.table-dark > thead > tr > [aria-sort=ascending], .table.b-table.table-dark > tfoot > tr > [aria-sort=ascending],
+.table.b-table > .thead-dark > tr > [aria-sort=ascending] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' opacity='.3' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table.table-dark > thead > tr > [aria-sort=descending], .table.b-table.table-dark > tfoot > tr > [aria-sort=descending],
+.table.b-table > .thead-dark > tr > [aria-sort=descending] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table > thead > tr > .table-dark[aria-sort=none],
+.table.b-table > tfoot > tr > .table-dark[aria-sort=none] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22zM51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table > thead > tr > .table-dark[aria-sort=ascending],
+.table.b-table > tfoot > tr > .table-dark[aria-sort=ascending] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' opacity='.3' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table > thead > tr > .table-dark[aria-sort=descending],
+.table.b-table > tfoot > tr > .table-dark[aria-sort=descending] {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='101' height='101' view-box='0 0 101 101' preserveAspectRatio='none'%3e%3cpath fill='white' opacity='.3' d='M51 1l25 23 24 22H1l25-22z'/%3e%3cpath fill='white' d='M51 101l25-23 24-22H1l25 22z'/%3e%3c/svg%3e");
+}
+.table.b-table.table-sm > thead > tr > [aria-sort]:not(.b-table-sort-icon-left),
+.table.b-table.table-sm > tfoot > tr > [aria-sort]:not(.b-table-sort-icon-left) {
+ background-position: right calc(0.3rem / 2) center;
+ padding-right: calc(0.3rem + 0.65em);
+}
+.table.b-table.table-sm > thead > tr > [aria-sort].b-table-sort-icon-left,
+.table.b-table.table-sm > tfoot > tr > [aria-sort].b-table-sort-icon-left {
+ background-position: left calc(0.3rem / 2) center;
+ padding-left: calc(0.3rem + 0.65em);
+}
+
+.table.b-table.b-table-selectable:not(.b-table-selectable-no-click) > tbody > tr {
+ cursor: pointer;
+}
+.table.b-table.b-table-selectable:not(.b-table-selectable-no-click).b-table-selecting.b-table-select-range > tbody > tr {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+@media (max-width: 575.98px) {
+ .table.b-table.b-table-stacked-sm {
+ display: block;
+ width: 100%;
+ }
+ .table.b-table.b-table-stacked-sm > caption,
+.table.b-table.b-table-stacked-sm > tbody,
+.table.b-table.b-table-stacked-sm > tbody > tr,
+.table.b-table.b-table-stacked-sm > tbody > tr > td,
+.table.b-table.b-table-stacked-sm > tbody > tr > th {
+ display: block;
+ }
+ .table.b-table.b-table-stacked-sm > thead,
+.table.b-table.b-table-stacked-sm > tfoot {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-sm > thead > tr.b-table-top-row,
+.table.b-table.b-table-stacked-sm > thead > tr.b-table-bottom-row,
+.table.b-table.b-table-stacked-sm > tfoot > tr.b-table-top-row,
+.table.b-table.b-table-stacked-sm > tfoot > tr.b-table-bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-sm > caption {
+ caption-side: top !important;
+ }
+ .table.b-table.b-table-stacked-sm > tbody > tr > [data-label]::before {
+ content: attr(data-label);
+ width: 40%;
+ float: left;
+ text-align: right;
+ overflow-wrap: break-word;
+ font-weight: bold;
+ font-style: normal;
+ padding: 0 calc(1rem / 2) 0 0;
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-sm > tbody > tr > [data-label]::after {
+ display: block;
+ clear: both;
+ content: "";
+ }
+ .table.b-table.b-table-stacked-sm > tbody > tr > [data-label] > div {
+ display: inline-block;
+ width: calc(100% - 40%);
+ padding: 0 0 0 calc(1rem / 2);
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-sm > tbody > tr.top-row, .table.b-table.b-table-stacked-sm > tbody > tr.bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-sm > tbody > tr > :first-child {
+ border-top-width: 3px;
+ }
+ .table.b-table.b-table-stacked-sm > tbody > tr > [rowspan] + td,
+.table.b-table.b-table-stacked-sm > tbody > tr > [rowspan] + th {
+ border-top-width: 3px;
+ }
+}
+@media (max-width: 767.98px) {
+ .table.b-table.b-table-stacked-md {
+ display: block;
+ width: 100%;
+ }
+ .table.b-table.b-table-stacked-md > caption,
+.table.b-table.b-table-stacked-md > tbody,
+.table.b-table.b-table-stacked-md > tbody > tr,
+.table.b-table.b-table-stacked-md > tbody > tr > td,
+.table.b-table.b-table-stacked-md > tbody > tr > th {
+ display: block;
+ }
+ .table.b-table.b-table-stacked-md > thead,
+.table.b-table.b-table-stacked-md > tfoot {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-md > thead > tr.b-table-top-row,
+.table.b-table.b-table-stacked-md > thead > tr.b-table-bottom-row,
+.table.b-table.b-table-stacked-md > tfoot > tr.b-table-top-row,
+.table.b-table.b-table-stacked-md > tfoot > tr.b-table-bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-md > caption {
+ caption-side: top !important;
+ }
+ .table.b-table.b-table-stacked-md > tbody > tr > [data-label]::before {
+ content: attr(data-label);
+ width: 40%;
+ float: left;
+ text-align: right;
+ overflow-wrap: break-word;
+ font-weight: bold;
+ font-style: normal;
+ padding: 0 calc(1rem / 2) 0 0;
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-md > tbody > tr > [data-label]::after {
+ display: block;
+ clear: both;
+ content: "";
+ }
+ .table.b-table.b-table-stacked-md > tbody > tr > [data-label] > div {
+ display: inline-block;
+ width: calc(100% - 40%);
+ padding: 0 0 0 calc(1rem / 2);
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-md > tbody > tr.top-row, .table.b-table.b-table-stacked-md > tbody > tr.bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-md > tbody > tr > :first-child {
+ border-top-width: 3px;
+ }
+ .table.b-table.b-table-stacked-md > tbody > tr > [rowspan] + td,
+.table.b-table.b-table-stacked-md > tbody > tr > [rowspan] + th {
+ border-top-width: 3px;
+ }
+}
+@media (max-width: 991.98px) {
+ .table.b-table.b-table-stacked-lg {
+ display: block;
+ width: 100%;
+ }
+ .table.b-table.b-table-stacked-lg > caption,
+.table.b-table.b-table-stacked-lg > tbody,
+.table.b-table.b-table-stacked-lg > tbody > tr,
+.table.b-table.b-table-stacked-lg > tbody > tr > td,
+.table.b-table.b-table-stacked-lg > tbody > tr > th {
+ display: block;
+ }
+ .table.b-table.b-table-stacked-lg > thead,
+.table.b-table.b-table-stacked-lg > tfoot {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-lg > thead > tr.b-table-top-row,
+.table.b-table.b-table-stacked-lg > thead > tr.b-table-bottom-row,
+.table.b-table.b-table-stacked-lg > tfoot > tr.b-table-top-row,
+.table.b-table.b-table-stacked-lg > tfoot > tr.b-table-bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-lg > caption {
+ caption-side: top !important;
+ }
+ .table.b-table.b-table-stacked-lg > tbody > tr > [data-label]::before {
+ content: attr(data-label);
+ width: 40%;
+ float: left;
+ text-align: right;
+ overflow-wrap: break-word;
+ font-weight: bold;
+ font-style: normal;
+ padding: 0 calc(1rem / 2) 0 0;
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-lg > tbody > tr > [data-label]::after {
+ display: block;
+ clear: both;
+ content: "";
+ }
+ .table.b-table.b-table-stacked-lg > tbody > tr > [data-label] > div {
+ display: inline-block;
+ width: calc(100% - 40%);
+ padding: 0 0 0 calc(1rem / 2);
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-lg > tbody > tr.top-row, .table.b-table.b-table-stacked-lg > tbody > tr.bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-lg > tbody > tr > :first-child {
+ border-top-width: 3px;
+ }
+ .table.b-table.b-table-stacked-lg > tbody > tr > [rowspan] + td,
+.table.b-table.b-table-stacked-lg > tbody > tr > [rowspan] + th {
+ border-top-width: 3px;
+ }
+}
+@media (max-width: 1199.98px) {
+ .table.b-table.b-table-stacked-xl {
+ display: block;
+ width: 100%;
+ }
+ .table.b-table.b-table-stacked-xl > caption,
+.table.b-table.b-table-stacked-xl > tbody,
+.table.b-table.b-table-stacked-xl > tbody > tr,
+.table.b-table.b-table-stacked-xl > tbody > tr > td,
+.table.b-table.b-table-stacked-xl > tbody > tr > th {
+ display: block;
+ }
+ .table.b-table.b-table-stacked-xl > thead,
+.table.b-table.b-table-stacked-xl > tfoot {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-xl > thead > tr.b-table-top-row,
+.table.b-table.b-table-stacked-xl > thead > tr.b-table-bottom-row,
+.table.b-table.b-table-stacked-xl > tfoot > tr.b-table-top-row,
+.table.b-table.b-table-stacked-xl > tfoot > tr.b-table-bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-xl > caption {
+ caption-side: top !important;
+ }
+ .table.b-table.b-table-stacked-xl > tbody > tr > [data-label]::before {
+ content: attr(data-label);
+ width: 40%;
+ float: left;
+ text-align: right;
+ overflow-wrap: break-word;
+ font-weight: bold;
+ font-style: normal;
+ padding: 0 calc(1rem / 2) 0 0;
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-xl > tbody > tr > [data-label]::after {
+ display: block;
+ clear: both;
+ content: "";
+ }
+ .table.b-table.b-table-stacked-xl > tbody > tr > [data-label] > div {
+ display: inline-block;
+ width: calc(100% - 40%);
+ padding: 0 0 0 calc(1rem / 2);
+ margin: 0;
+ }
+ .table.b-table.b-table-stacked-xl > tbody > tr.top-row, .table.b-table.b-table-stacked-xl > tbody > tr.bottom-row {
+ display: none;
+ }
+ .table.b-table.b-table-stacked-xl > tbody > tr > :first-child {
+ border-top-width: 3px;
+ }
+ .table.b-table.b-table-stacked-xl > tbody > tr > [rowspan] + td,
+.table.b-table.b-table-stacked-xl > tbody > tr > [rowspan] + th {
+ border-top-width: 3px;
+ }
+}
+.table.b-table.b-table-stacked {
+ display: block;
+ width: 100%;
+}
+.table.b-table.b-table-stacked > caption,
+.table.b-table.b-table-stacked > tbody,
+.table.b-table.b-table-stacked > tbody > tr,
+.table.b-table.b-table-stacked > tbody > tr > td,
+.table.b-table.b-table-stacked > tbody > tr > th {
+ display: block;
+}
+.table.b-table.b-table-stacked > thead,
+.table.b-table.b-table-stacked > tfoot {
+ display: none;
+}
+.table.b-table.b-table-stacked > thead > tr.b-table-top-row,
+.table.b-table.b-table-stacked > thead > tr.b-table-bottom-row,
+.table.b-table.b-table-stacked > tfoot > tr.b-table-top-row,
+.table.b-table.b-table-stacked > tfoot > tr.b-table-bottom-row {
+ display: none;
+}
+.table.b-table.b-table-stacked > caption {
+ caption-side: top !important;
+}
+.table.b-table.b-table-stacked > tbody > tr > [data-label]::before {
+ content: attr(data-label);
+ width: 40%;
+ float: left;
+ text-align: right;
+ overflow-wrap: break-word;
+ font-weight: bold;
+ font-style: normal;
+ padding: 0 calc(1rem / 2) 0 0;
+ margin: 0;
+}
+.table.b-table.b-table-stacked > tbody > tr > [data-label]::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+.table.b-table.b-table-stacked > tbody > tr > [data-label] > div {
+ display: inline-block;
+ width: calc(100% - 40%);
+ padding: 0 0 0 calc(1rem / 2);
+ margin: 0;
+}
+.table.b-table.b-table-stacked > tbody > tr.top-row, .table.b-table.b-table-stacked > tbody > tr.bottom-row {
+ display: none;
+}
+.table.b-table.b-table-stacked > tbody > tr > :first-child {
+ border-top-width: 3px;
+}
+.table.b-table.b-table-stacked > tbody > tr > [rowspan] + td,
+.table.b-table.b-table-stacked > tbody > tr > [rowspan] + th {
+ border-top-width: 3px;
+}
+
+.b-time {
+ min-width: 150px;
+}
+.b-time[aria-disabled=true] output, .b-time[aria-readonly=true] output,
+.b-time output.disabled {
+ background-color: #e9ecef;
+ opacity: 1;
+}
+.b-time[aria-disabled=true] output {
+ pointer-events: none;
+}
+[dir=rtl] .b-time > .d-flex:not(.flex-column) {
+ flex-direction: row-reverse;
+}
+
+.b-time .b-time-header {
+ margin-bottom: 0.5rem;
+}
+.b-time .b-time-header output {
+ padding: 0.25rem;
+ font-size: 80%;
+}
+.b-time .b-time-footer {
+ margin-top: 0.5rem;
+}
+.b-time .b-time-ampm {
+ margin-left: 0.5rem;
+}
+
+.b-toast {
+ display: block;
+ position: relative;
+ max-width: 350px;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ background-clip: padding-box;
+ z-index: 1;
+ border-radius: 0.25rem;
+}
+.b-toast .toast {
+ background-color: rgba(255, 255, 255, 0.85);
+}
+.b-toast:not(:last-child) {
+ margin-bottom: 0.75rem;
+}
+.b-toast.b-toast-solid .toast {
+ background-color: white;
+}
+.b-toast .toast {
+ opacity: 1;
+}
+.b-toast .toast.fade:not(.show) {
+ opacity: 0;
+}
+.b-toast .toast .toast-body {
+ display: block;
+}
+
+.b-toast-primary .toast {
+ background-color: rgba(230, 242, 255, 0.85);
+ border-color: rgba(184, 218, 255, 0.85);
+ color: #004085;
+}
+.b-toast-primary .toast .toast-header {
+ color: #004085;
+ background-color: rgba(204, 229, 255, 0.85);
+ border-bottom-color: rgba(184, 218, 255, 0.85);
+}
+.b-toast-primary.b-toast-solid .toast {
+ background-color: #e6f2ff;
+}
+
+.b-toast-secondary .toast {
+ background-color: rgba(239, 240, 241, 0.85);
+ border-color: rgba(214, 216, 219, 0.85);
+ color: #383d41;
+}
+.b-toast-secondary .toast .toast-header {
+ color: #383d41;
+ background-color: rgba(226, 227, 229, 0.85);
+ border-bottom-color: rgba(214, 216, 219, 0.85);
+}
+.b-toast-secondary.b-toast-solid .toast {
+ background-color: #eff0f1;
+}
+
+.b-toast-success .toast {
+ background-color: rgba(230, 245, 233, 0.85);
+ border-color: rgba(195, 230, 203, 0.85);
+ color: #155724;
+}
+.b-toast-success .toast .toast-header {
+ color: #155724;
+ background-color: rgba(212, 237, 218, 0.85);
+ border-bottom-color: rgba(195, 230, 203, 0.85);
+}
+.b-toast-success.b-toast-solid .toast {
+ background-color: #e6f5e9;
+}
+
+.b-toast-info .toast {
+ background-color: rgba(229, 244, 247, 0.85);
+ border-color: rgba(190, 229, 235, 0.85);
+ color: #0c5460;
+}
+.b-toast-info .toast .toast-header {
+ color: #0c5460;
+ background-color: rgba(209, 236, 241, 0.85);
+ border-bottom-color: rgba(190, 229, 235, 0.85);
+}
+.b-toast-info.b-toast-solid .toast {
+ background-color: #e5f4f7;
+}
+
+.b-toast-warning .toast {
+ background-color: rgba(255, 249, 231, 0.85);
+ border-color: rgba(255, 238, 186, 0.85);
+ color: #856404;
+}
+.b-toast-warning .toast .toast-header {
+ color: #856404;
+ background-color: rgba(255, 243, 205, 0.85);
+ border-bottom-color: rgba(255, 238, 186, 0.85);
+}
+.b-toast-warning.b-toast-solid .toast {
+ background-color: #fff9e7;
+}
+
+.b-toast-danger .toast {
+ background-color: rgba(252, 237, 238, 0.85);
+ border-color: rgba(245, 198, 203, 0.85);
+ color: #721c24;
+}
+.b-toast-danger .toast .toast-header {
+ color: #721c24;
+ background-color: rgba(248, 215, 218, 0.85);
+ border-bottom-color: rgba(245, 198, 203, 0.85);
+}
+.b-toast-danger.b-toast-solid .toast {
+ background-color: #fcedee;
+}
+
+.b-toast-light .toast {
+ background-color: rgba(255, 255, 255, 0.85);
+ border-color: rgba(253, 253, 254, 0.85);
+ color: #818182;
+}
+.b-toast-light .toast .toast-header {
+ color: #818182;
+ background-color: rgba(254, 254, 254, 0.85);
+ border-bottom-color: rgba(253, 253, 254, 0.85);
+}
+.b-toast-light.b-toast-solid .toast {
+ background-color: white;
+}
+
+.b-toast-dark .toast {
+ background-color: rgba(227, 229, 229, 0.85);
+ border-color: rgba(198, 200, 202, 0.85);
+ color: #1b1e21;
+}
+.b-toast-dark .toast .toast-header {
+ color: #1b1e21;
+ background-color: rgba(214, 216, 217, 0.85);
+ border-bottom-color: rgba(198, 200, 202, 0.85);
+}
+.b-toast-dark.b-toast-solid .toast {
+ background-color: #e3e5e5;
+}
+
+.b-toaster {
+ z-index: 1100;
+}
+.b-toaster .b-toaster-slot {
+ position: relative;
+ display: block;
+}
+.b-toaster .b-toaster-slot:empty {
+ display: none !important;
+}
+
+.b-toaster.b-toaster-top-right, .b-toaster.b-toaster-top-left, .b-toaster.b-toaster-top-center, .b-toaster.b-toaster-top-full, .b-toaster.b-toaster-bottom-right, .b-toaster.b-toaster-bottom-left, .b-toaster.b-toaster-bottom-center, .b-toaster.b-toaster-bottom-full {
+ position: fixed;
+ left: 0.5rem;
+ right: 0.5rem;
+ margin: 0;
+ padding: 0;
+ height: 0;
+ overflow: visible;
+}
+.b-toaster.b-toaster-top-right .b-toaster-slot, .b-toaster.b-toaster-top-left .b-toaster-slot, .b-toaster.b-toaster-top-center .b-toaster-slot, .b-toaster.b-toaster-top-full .b-toaster-slot, .b-toaster.b-toaster-bottom-right .b-toaster-slot, .b-toaster.b-toaster-bottom-left .b-toaster-slot, .b-toaster.b-toaster-bottom-center .b-toaster-slot, .b-toaster.b-toaster-bottom-full .b-toaster-slot {
+ position: absolute;
+ max-width: 350px;
+ width: 100%;
+ /* IE 11 fix */
+ left: 0;
+ right: 0;
+ padding: 0;
+ margin: 0;
+}
+.b-toaster.b-toaster-top-full .b-toaster-slot, .b-toaster.b-toaster-bottom-full .b-toaster-slot {
+ width: 100%;
+ max-width: 100%;
+}
+.b-toaster.b-toaster-top-full .b-toaster-slot .b-toast,
+.b-toaster.b-toaster-top-full .b-toaster-slot .toast, .b-toaster.b-toaster-bottom-full .b-toaster-slot .b-toast,
+.b-toaster.b-toaster-bottom-full .b-toaster-slot .toast {
+ width: 100%;
+ max-width: 100%;
+}
+.b-toaster.b-toaster-top-right, .b-toaster.b-toaster-top-left, .b-toaster.b-toaster-top-center, .b-toaster.b-toaster-top-full {
+ top: 0;
+}
+.b-toaster.b-toaster-top-right .b-toaster-slot, .b-toaster.b-toaster-top-left .b-toaster-slot, .b-toaster.b-toaster-top-center .b-toaster-slot, .b-toaster.b-toaster-top-full .b-toaster-slot {
+ top: 0.5rem;
+}
+.b-toaster.b-toaster-bottom-right, .b-toaster.b-toaster-bottom-left, .b-toaster.b-toaster-bottom-center, .b-toaster.b-toaster-bottom-full {
+ bottom: 0;
+}
+.b-toaster.b-toaster-bottom-right .b-toaster-slot, .b-toaster.b-toaster-bottom-left .b-toaster-slot, .b-toaster.b-toaster-bottom-center .b-toaster-slot, .b-toaster.b-toaster-bottom-full .b-toaster-slot {
+ bottom: 0.5rem;
+}
+.b-toaster.b-toaster-top-right .b-toaster-slot, .b-toaster.b-toaster-bottom-right .b-toaster-slot, .b-toaster.b-toaster-top-center .b-toaster-slot, .b-toaster.b-toaster-bottom-center .b-toaster-slot {
+ margin-left: auto;
+}
+.b-toaster.b-toaster-top-left .b-toaster-slot, .b-toaster.b-toaster-bottom-left .b-toaster-slot, .b-toaster.b-toaster-top-center .b-toaster-slot, .b-toaster.b-toaster-bottom-center .b-toaster-slot {
+ margin-right: auto;
+}
+
+.b-toaster.b-toaster-top-right .b-toast.b-toaster-enter-active, .b-toaster.b-toaster-top-right .b-toast.b-toaster-leave-active, .b-toaster.b-toaster-top-right .b-toast.b-toaster-move, .b-toaster.b-toaster-top-left .b-toast.b-toaster-enter-active, .b-toaster.b-toaster-top-left .b-toast.b-toaster-leave-active, .b-toaster.b-toaster-top-left .b-toast.b-toaster-move, .b-toaster.b-toaster-bottom-right .b-toast.b-toaster-enter-active, .b-toaster.b-toaster-bottom-right .b-toast.b-toaster-leave-active, .b-toaster.b-toaster-bottom-right .b-toast.b-toaster-move, .b-toaster.b-toaster-bottom-left .b-toast.b-toaster-enter-active, .b-toaster.b-toaster-bottom-left .b-toast.b-toaster-leave-active, .b-toaster.b-toaster-bottom-left .b-toast.b-toaster-move {
+ transition: -webkit-transform 0.175s;
+ transition: transform 0.175s;
+ transition: transform 0.175s, -webkit-transform 0.175s;
+}
+.b-toaster.b-toaster-top-right .b-toast.b-toaster-enter-to .toast.fade, .b-toaster.b-toaster-top-right .b-toast.b-toaster-enter-active .toast.fade, .b-toaster.b-toaster-top-left .b-toast.b-toaster-enter-to .toast.fade, .b-toaster.b-toaster-top-left .b-toast.b-toaster-enter-active .toast.fade, .b-toaster.b-toaster-bottom-right .b-toast.b-toaster-enter-to .toast.fade, .b-toaster.b-toaster-bottom-right .b-toast.b-toaster-enter-active .toast.fade, .b-toaster.b-toaster-bottom-left .b-toast.b-toaster-enter-to .toast.fade, .b-toaster.b-toaster-bottom-left .b-toast.b-toaster-enter-active .toast.fade {
+ transition-delay: 0.175s;
+}
+.b-toaster.b-toaster-top-right .b-toast.b-toaster-leave-active, .b-toaster.b-toaster-top-left .b-toast.b-toaster-leave-active, .b-toaster.b-toaster-bottom-right .b-toast.b-toaster-leave-active, .b-toaster.b-toaster-bottom-left .b-toast.b-toaster-leave-active {
+ position: absolute;
+ transition-delay: 0.175s;
+}
+.b-toaster.b-toaster-top-right .b-toast.b-toaster-leave-active .toast.fade, .b-toaster.b-toaster-top-left .b-toast.b-toaster-leave-active .toast.fade, .b-toaster.b-toaster-bottom-right .b-toast.b-toaster-leave-active .toast.fade, .b-toaster.b-toaster-bottom-left .b-toast.b-toaster-leave-active .toast.fade {
+ transition-delay: 0s;
+}
+.tooltip.b-tooltip {
+ display: block;
+ opacity: 0.9;
+ outline: 0;
+}
+.tooltip.b-tooltip.fade:not(.show) {
+ opacity: 0;
+}
+.tooltip.b-tooltip.show {
+ opacity: 0.9;
+}
+.tooltip.b-tooltip.noninteractive {
+ pointer-events: none;
+}
+.tooltip.b-tooltip .arrow {
+ margin: 0 0.25rem;
+}
+.tooltip.b-tooltip.bs-tooltip-right .arrow, .tooltip.b-tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=right] .arrow, .tooltip.b-tooltip.bs-tooltip-left .arrow, .tooltip.b-tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=left] .arrow, .tooltip.b-tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=left] .arrow, .tooltip.b-tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=left] .arrow, .tooltip.b-tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=left] .arrow, .tooltip.b-tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=left] .arrow, .tooltip.b-tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=left] .arrow, .tooltip.b-tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=left] .arrow, .tooltip.b-tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=left] .arrow {
+ margin: 0.25rem 0;
+}
+
+.tooltip.b-tooltip-primary.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #007bff;
+}
+.tooltip.b-tooltip-primary.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #007bff;
+}
+.tooltip.b-tooltip-primary.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #007bff;
+}
+.tooltip.b-tooltip-primary.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-primary.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #007bff;
+}
+.tooltip.b-tooltip-primary .tooltip-inner {
+ color: #fff;
+ background-color: #007bff;
+}
+
+.tooltip.b-tooltip-secondary.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #6c757d;
+}
+.tooltip.b-tooltip-secondary.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #6c757d;
+}
+.tooltip.b-tooltip-secondary.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #6c757d;
+}
+.tooltip.b-tooltip-secondary.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-secondary.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #6c757d;
+}
+.tooltip.b-tooltip-secondary .tooltip-inner {
+ color: #fff;
+ background-color: #6c757d;
+}
+
+.tooltip.b-tooltip-success.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #28a745;
+}
+.tooltip.b-tooltip-success.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #28a745;
+}
+.tooltip.b-tooltip-success.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #28a745;
+}
+.tooltip.b-tooltip-success.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-success.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #28a745;
+}
+.tooltip.b-tooltip-success .tooltip-inner {
+ color: #fff;
+ background-color: #28a745;
+}
+
+.tooltip.b-tooltip-info.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #17a2b8;
+}
+.tooltip.b-tooltip-info.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #17a2b8;
+}
+.tooltip.b-tooltip-info.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #17a2b8;
+}
+.tooltip.b-tooltip-info.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-info.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #17a2b8;
+}
+.tooltip.b-tooltip-info .tooltip-inner {
+ color: #fff;
+ background-color: #17a2b8;
+}
+
+.tooltip.b-tooltip-warning.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #ffc107;
+}
+.tooltip.b-tooltip-warning.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #ffc107;
+}
+.tooltip.b-tooltip-warning.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #ffc107;
+}
+.tooltip.b-tooltip-warning.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-warning.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #ffc107;
+}
+.tooltip.b-tooltip-warning .tooltip-inner {
+ color: #212529;
+ background-color: #ffc107;
+}
+
+.tooltip.b-tooltip-danger.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #dc3545;
+}
+.tooltip.b-tooltip-danger.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #dc3545;
+}
+.tooltip.b-tooltip-danger.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #dc3545;
+}
+.tooltip.b-tooltip-danger.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-danger.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #dc3545;
+}
+.tooltip.b-tooltip-danger .tooltip-inner {
+ color: #fff;
+ background-color: #dc3545;
+}
+
+.tooltip.b-tooltip-light.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #f8f9fa;
+}
+.tooltip.b-tooltip-light.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #f8f9fa;
+}
+.tooltip.b-tooltip-light.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #f8f9fa;
+}
+.tooltip.b-tooltip-light.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-light.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #f8f9fa;
+}
+.tooltip.b-tooltip-light .tooltip-inner {
+ color: #212529;
+ background-color: #f8f9fa;
+}
+
+.tooltip.b-tooltip-dark.bs-tooltip-top .arrow::before, .tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=top] .arrow::before {
+ border-top-color: #343a40;
+}
+.tooltip.b-tooltip-dark.bs-tooltip-right .arrow::before, .tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=right] .arrow::before {
+ border-right-color: #343a40;
+}
+.tooltip.b-tooltip-dark.bs-tooltip-bottom .arrow::before, .tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=bottom] .arrow::before {
+ border-bottom-color: #343a40;
+}
+.tooltip.b-tooltip-dark.bs-tooltip-left .arrow::before, .tooltip.b-tooltip-dark.bs-tooltip-auto[x-placement^=left] .arrow::before {
+ border-left-color: #343a40;
+}
+.tooltip.b-tooltip-dark .tooltip-inner {
+ color: #fff;
+ background-color: #343a40;
+}
+
+.b-icon.bi {
+ display: inline-block;
+ overflow: visible;
+ vertical-align: -0.15em;
+}
+.b-icon.b-icon-animation-cylon, .b-icon.b-iconstack .b-icon-animation-cylon > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-animation: 0.75s infinite ease-in-out alternate b-icon-animation-cylon;
+ animation: 0.75s infinite ease-in-out alternate b-icon-animation-cylon;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-cylon, .b-icon.b-iconstack .b-icon-animation-cylon > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+.b-icon.b-icon-animation-cylon-vertical, .b-icon.b-iconstack .b-icon-animation-cylon-vertical > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-animation: 0.75s infinite ease-in-out alternate b-icon-animation-cylon-vertical;
+ animation: 0.75s infinite ease-in-out alternate b-icon-animation-cylon-vertical;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-cylon-vertical, .b-icon.b-iconstack .b-icon-animation-cylon-vertical > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+.b-icon.b-icon-animation-fade, .b-icon.b-iconstack .b-icon-animation-fade > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-animation: 0.75s infinite ease-in-out alternate b-icon-animation-fade;
+ animation: 0.75s infinite ease-in-out alternate b-icon-animation-fade;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-fade, .b-icon.b-iconstack .b-icon-animation-fade > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+.b-icon.b-icon-animation-spin, .b-icon.b-iconstack .b-icon-animation-spin > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-animation: 2s infinite linear normal b-icon-animation-spin;
+ animation: 2s infinite linear normal b-icon-animation-spin;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-spin, .b-icon.b-iconstack .b-icon-animation-spin > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+.b-icon.b-icon-animation-spin-reverse, .b-icon.b-iconstack .b-icon-animation-spin-reverse > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ animation: 2s infinite linear reverse b-icon-animation-spin;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-spin-reverse, .b-icon.b-iconstack .b-icon-animation-spin-reverse > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+.b-icon.b-icon-animation-spin-pulse, .b-icon.b-iconstack .b-icon-animation-spin-pulse > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-animation: 1s infinite steps(8) normal b-icon-animation-spin;
+ animation: 1s infinite steps(8) normal b-icon-animation-spin;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-spin-pulse, .b-icon.b-iconstack .b-icon-animation-spin-pulse > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+.b-icon.b-icon-animation-spin-reverse-pulse, .b-icon.b-iconstack .b-icon-animation-spin-reverse-pulse > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ animation: 1s infinite steps(8) reverse b-icon-animation-spin;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-spin-reverse-pulse, .b-icon.b-iconstack .b-icon-animation-spin-reverse-pulse > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+.b-icon.b-icon-animation-throb, .b-icon.b-iconstack .b-icon-animation-throb > g {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-animation: 0.75s infinite ease-in-out alternate b-icon-animation-throb;
+ animation: 0.75s infinite ease-in-out alternate b-icon-animation-throb;
+}
+@media (prefers-reduced-motion: reduce) {
+ .b-icon.b-icon-animation-throb, .b-icon.b-iconstack .b-icon-animation-throb > g {
+ -webkit-animation: none;
+ animation: none;
+ }
+}
+
+@-webkit-keyframes b-icon-animation-cylon {
+ 0% {
+ -webkit-transform: translateX(-25%);
+ transform: translateX(-25%);
+ }
+ 100% {
+ -webkit-transform: translateX(25%);
+ transform: translateX(25%);
+ }
+}
+
+@keyframes b-icon-animation-cylon {
+ 0% {
+ -webkit-transform: translateX(-25%);
+ transform: translateX(-25%);
+ }
+ 100% {
+ -webkit-transform: translateX(25%);
+ transform: translateX(25%);
+ }
+}
+@-webkit-keyframes b-icon-animation-cylon-vertical {
+ 0% {
+ -webkit-transform: translateY(25%);
+ transform: translateY(25%);
+ }
+ 100% {
+ -webkit-transform: translateY(-25%);
+ transform: translateY(-25%);
+ }
+}
+@keyframes b-icon-animation-cylon-vertical {
+ 0% {
+ -webkit-transform: translateY(25%);
+ transform: translateY(25%);
+ }
+ 100% {
+ -webkit-transform: translateY(-25%);
+ transform: translateY(-25%);
+ }
+}
+@-webkit-keyframes b-icon-animation-fade {
+ 0% {
+ opacity: 0.1;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@keyframes b-icon-animation-fade {
+ 0% {
+ opacity: 0.1;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@-webkit-keyframes b-icon-animation-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes b-icon-animation-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes b-icon-animation-throb {
+ 0% {
+ opacity: 0.5;
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes b-icon-animation-throb {
+ 0% {
+ opacity: 0.5;
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+.btn .b-icon.bi,
+.nav-link .b-icon.bi,
+.dropdown-toggle .b-icon.bi,
+.dropdown-item .b-icon.bi,
+.input-group-text .b-icon.bi {
+ font-size: 125%;
+ vertical-align: text-bottom;
+}
+
+/*# sourceMappingURL=bootstrap-vue.css.map */
\ No newline at end of file
diff --git a/src/renderer/less/bootstrap.less b/src/renderer/less/bootstrap.less
index 6dfc7821..af7ced21 100644
--- a/src/renderer/less/bootstrap.less
+++ b/src/renderer/less/bootstrap.less
@@ -1,416 +1,1359 @@
-.modal {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1055;
- display: none;
- width: 100%;
- height: 100%;
- overflow-x: hidden;
- overflow-y: auto;
- outline: 0;
- user-select: none;
+// Dropdown
-
- .close {
- width: 50px;
- height: 42px;
- background-image: var(--gfx-closeBtn);
- background-position: center;
- background-repeat: no-repeat;
- -webkit-app-region: no-drag;
- appearance: none;
- border: 0;
- background-color: transparent;
- position: absolute;
- top: 0;
- right: 0;
-
- &:hover {
- background-color: rgb(196, 43, 28)
- }
- }
+.dropup,
+.dropend,
+.dropdown,
+.dropstart {
+ position: relative;
}
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 0.5rem;
- pointer-events: none;
- color: var(--textColor);
+.dropdown-toggle {
+ white-space: nowrap;
+}
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+.dropdown-toggle:empty::after {
+ margin-left: 0;
}
-.modal.fade .modal-dialog {
- transition: transform 0.1s var(--appleEase), opacity 0.1s var(--appleEase);
- transform: scale(0.9);
- opacity: 0;
+.dropdown-menu {
+ position: absolute;
+ z-index: 1000;
+ display: none;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0;
+ font-size: 1rem;
+ color: #212529;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+}
+.dropdown-menu[data-bs-popper] {
+ top: 100%;
+ left: 0;
+ margin-top: 0.125rem;
}
-@media (prefers-reduced-motion: reduce) {
- .modal.fade .modal-dialog {
- transition: none;
- }
+.dropdown-menu-start {
+ --bs-position: start;
+}
+.dropdown-menu-start[data-bs-popper] {
+ right: auto;
+ left: 0;
}
-.modal.show .modal-dialog {
- transform: none;
- opacity: 1;
+.dropdown-menu-end {
+ --bs-position: end;
}
-
-.modal.modal-static .modal-dialog {
- transform: scale(1.02);
-}
-
-.modal-dialog-scrollable {
- height: calc(100% - 1rem);
-}
-
-.modal-dialog-scrollable .modal-content {
- max-height: 100%;
- overflow: hidden;
-}
-
-.modal-dialog-scrollable .modal-body {
- overflow-y: auto;
-}
-
-.modal-dialog-centered {
- display: flex;
- align-items: center;
- min-height: calc(100% - 1rem);
-}
-
-.modal-content {
- position: relative;
- display: flex;
- flex-direction: column;
- width: 100%;
- pointer-events: auto;
- background-color: var(--modalBackground);
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 0.3rem;
- outline: 0;
- box-shadow: var(--ciderShadow-Generic);
- overflow: hidden;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1050;
- width: 100vw;
- height: 100vh;
- background-color: #000;
-}
-
-.modal-backdrop.fade {
- opacity: 0;
-}
-
-.modal-backdrop.show {
- opacity: 0.5;
-}
-
-.modal-header {
- display: flex;
- flex-shrink: 0;
- align-items: center;
- justify-content: space-between;
- padding: 1rem 1rem;
- border-top-left-radius: calc(0.3rem - 1px);
- border-top-right-radius: calc(0.3rem - 1px);
-}
-
-.modal-header .btn-close {
- padding: 0.5rem 0.5rem;
- margin: -0.5rem -0.5rem -0.5rem auto;
-}
-
-.modal-title {
- line-height: 1.5;
- margin: 0;
-}
-
-.modal-body {
- position: relative;
- flex: 1 1 auto;
- padding: 3rem 1rem 1rem 1rem;
- font-size: 0.9em
-}
-
-.modal-footer {
- display: flex;
- flex-wrap: wrap;
- flex-shrink: 0;
- align-items: center;
- justify-content: flex-end;
- padding: 0.75rem;
- border-bottom-right-radius: calc(0.3rem - 1px);
- border-bottom-left-radius: calc(0.3rem - 1px);
-}
-
-.modal-footer>* {
- margin: 0.25rem;
+.dropdown-menu-end[data-bs-popper] {
+ right: 0;
+ left: auto;
}
@media (min-width: 576px) {
- .modal-dialog {
- max-width: 500px;
- margin: 1.75rem auto;
- }
+ .dropdown-menu-sm-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
- .modal-dialog-scrollable {
- height: calc(100% - 3.5rem);
- }
+ .dropdown-menu-sm-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 768px) {
+ .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-md-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
- .modal-dialog-centered {
- min-height: calc(100% - 3.5rem);
- }
+ .dropdown-menu-md-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-md-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 992px) {
+ .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
- .modal-sm {
- max-width: 300px;
+ .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 1200px) {
+ .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .dropdown-menu-xl-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 1400px) {
+ .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+
+ .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+.dropup .dropdown-menu[data-bs-popper] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: 0.125rem;
+}
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.dropend .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: 0.125rem;
+}
+.dropend .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+.dropend .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropend .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.dropstart .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: 0.125rem;
+}
+.dropstart .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+.dropstart .dropdown-toggle::after {
+ display: none;
+}
+.dropstart .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+.dropstart .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropstart .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.dropdown-divider {
+ height: 0;
+ margin: 0.5rem 0;
+ overflow: hidden;
+ border-top: 1px solid rgba(0, 0, 0, 0.15);
+}
+
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: 0.25rem 1rem;
+ clear: both;
+ font-weight: 400;
+ color: #212529;
+ text-align: inherit;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+.dropdown-item:hover, .dropdown-item:focus {
+ color: #1e2125;
+ background-color: #e9ecef;
+}
+.dropdown-item.active, .dropdown-item:active {
+ color: #fff;
+ text-decoration: none;
+ background-color: #0d6efd;
+}
+.dropdown-item.disabled, .dropdown-item:disabled {
+ color: #adb5bd;
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.dropdown-menu.show {
+ display: block;
+}
+
+.dropdown-header {
+ display: block;
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: #6c757d;
+ white-space: nowrap;
+}
+
+.dropdown-item-text {
+ display: block;
+ padding: 0.25rem 1rem;
+ color: #212529;
+}
+
+.dropdown-menu-dark {
+ color: #dee2e6;
+ background-color: #343a40;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+.dropdown-menu-dark .dropdown-item {
+ color: #dee2e6;
+}
+.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {
+ color: #fff;
+ background-color: rgba(255, 255, 255, 0.15);
+}
+.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {
+ color: #fff;
+ background-color: #0d6efd;
+}
+.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {
+ color: #adb5bd;
+}
+.dropdown-menu-dark .dropdown-divider {
+ border-color: rgba(0, 0, 0, 0.15);
+}
+.dropdown-menu-dark .dropdown-item-text {
+ color: #dee2e6;
+}
+.dropdown-menu-dark .dropdown-header {
+ color: #adb5bd;
+}
+
+
+// List Group
+.list-group {
+ display : flex;
+ flex-direction: column;
+ padding-left : 0;
+ margin-bottom : 0;
+ border-radius : 0.25rem;
+}
+
+.list-group-numbered {
+ list-style-type: none;
+ counter-reset : section;
+}
+
+.list-group-numbered>li::before {
+ content : counters(section, ".") ". ";
+ counter-increment: section;
+}
+
+.list-group-item-action {
+ width : 100%;
+ color : #495057;
+ text-align: inherit;
+}
+
+.list-group-item-action:hover,
+.list-group-item-action:focus {
+ z-index : 1;
+ color : #495057;
+ text-decoration : none;
+ background-color: #f8f9fa;
+}
+
+.list-group-item-action:active {
+ color : #212529;
+ background-color: #e9ecef;
+}
+
+.list-group-item {
+ position : relative;
+ display : block;
+ padding : 0.5rem 1rem;
+ color : #212529;
+ text-decoration : none;
+ background-color: #fff;
+ border : 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.list-group-item:first-child {
+ border-top-left-radius : inherit;
+ border-top-right-radius: inherit;
+}
+
+.list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius : inherit;
+}
+
+.list-group-item.disabled,
+.list-group-item:disabled {
+ color : #6c757d;
+ pointer-events : none;
+ background-color: #fff;
+}
+
+.list-group-item.active {
+ z-index : 2;
+ color : #fff;
+ background-color: #0d6efd;
+ border-color : #0d6efd;
+}
+
+.list-group-item+.list-group-item {
+ border-top-width: 0;
+}
+
+.list-group-item+.list-group-item.active {
+ margin-top : -1px;
+ border-top-width: 1px;
+}
+
+.list-group-horizontal {
+ flex-direction: row;
+}
+
+.list-group-horizontal>.list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius : 0;
+}
+
+.list-group-horizontal>.list-group-item:last-child {
+ border-top-right-radius : 0.25rem;
+ border-bottom-left-radius: 0;
+}
+
+.list-group-horizontal>.list-group-item.active {
+ margin-top: 0;
+}
+
+.list-group-horizontal>.list-group-item+.list-group-item {
+ border-top-width : 1px;
+ border-left-width: 0;
+}
+
+.list-group-horizontal>.list-group-item+.list-group-item.active {
+ margin-left : -1px;
+ border-left-width: 1px;
+}
+
+@media (min-width: 576px) {
+ .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+
+ .list-group-horizontal-sm>.list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius : 0;
+ }
+
+ .list-group-horizontal-sm>.list-group-item:last-child {
+ border-top-right-radius : 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+
+ .list-group-horizontal-sm>.list-group-item.active {
+ margin-top: 0;
+ }
+
+ .list-group-horizontal-sm>.list-group-item+.list-group-item {
+ border-top-width : 1px;
+ border-left-width: 0;
+ }
+
+ .list-group-horizontal-sm>.list-group-item+.list-group-item.active {
+ margin-left : -1px;
+ border-left-width: 1px;
+ }
+}
+
+@media (min-width: 768px) {
+ .list-group-horizontal-md {
+ flex-direction: row;
+ }
+
+ .list-group-horizontal-md>.list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius : 0;
+ }
+
+ .list-group-horizontal-md>.list-group-item:last-child {
+ border-top-right-radius : 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+
+ .list-group-horizontal-md>.list-group-item.active {
+ margin-top: 0;
+ }
+
+ .list-group-horizontal-md>.list-group-item+.list-group-item {
+ border-top-width : 1px;
+ border-left-width: 0;
+ }
+
+ .list-group-horizontal-md>.list-group-item+.list-group-item.active {
+ margin-left : -1px;
+ border-left-width: 1px;
+ }
+}
+
+@media (min-width: 992px) {
+ .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+
+ .list-group-horizontal-lg>.list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius : 0;
+ }
+
+ .list-group-horizontal-lg>.list-group-item:last-child {
+ border-top-right-radius : 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+
+ .list-group-horizontal-lg>.list-group-item.active {
+ margin-top: 0;
+ }
+
+ .list-group-horizontal-lg>.list-group-item+.list-group-item {
+ border-top-width : 1px;
+ border-left-width: 0;
+ }
+
+ .list-group-horizontal-lg>.list-group-item+.list-group-item.active {
+ margin-left : -1px;
+ border-left-width: 1px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+
+ .list-group-horizontal-xl>.list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius : 0;
+ }
+
+ .list-group-horizontal-xl>.list-group-item:last-child {
+ border-top-right-radius : 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+
+ .list-group-horizontal-xl>.list-group-item.active {
+ margin-top: 0;
+ }
+
+ .list-group-horizontal-xl>.list-group-item+.list-group-item {
+ border-top-width : 1px;
+ border-left-width: 0;
+ }
+
+ .list-group-horizontal-xl>.list-group-item+.list-group-item.active {
+ margin-left : -1px;
+ border-left-width: 1px;
+ }
+}
+
+@media (min-width: 1400px) {
+ .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+
+ .list-group-horizontal-xxl>.list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius : 0;
+ }
+
+ .list-group-horizontal-xxl>.list-group-item:last-child {
+ border-top-right-radius : 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+
+ .list-group-horizontal-xxl>.list-group-item.active {
+ margin-top: 0;
+ }
+
+ .list-group-horizontal-xxl>.list-group-item+.list-group-item {
+ border-top-width : 1px;
+ border-left-width: 0;
+ }
+
+ .list-group-horizontal-xxl>.list-group-item+.list-group-item.active {
+ margin-left : -1px;
+ border-left-width: 1px;
+ }
+}
+
+.list-group-flush {
+ border-radius: 0;
+}
+
+.list-group-flush>.list-group-item {
+ border-width: 0 0 1px;
+}
+
+.list-group-flush>.list-group-item:last-child {
+ border-bottom-width: 0;
+}
+
+.list-group-item-primary {
+ color : #084298;
+ background-color: #cfe2ff;
+}
+
+.list-group-item-primary.list-group-item-action:hover,
+.list-group-item-primary.list-group-item-action:focus {
+ color : #084298;
+ background-color: #bacbe6;
+}
+
+.list-group-item-primary.list-group-item-action.active {
+ color : #fff;
+ background-color: #084298;
+ border-color : #084298;
+}
+
+.list-group-item-secondary {
+ color : #41464b;
+ background-color: #e2e3e5;
+}
+
+.list-group-item-secondary.list-group-item-action:hover,
+.list-group-item-secondary.list-group-item-action:focus {
+ color : #41464b;
+ background-color: #cbccce;
+}
+
+.list-group-item-secondary.list-group-item-action.active {
+ color : #fff;
+ background-color: #41464b;
+ border-color : #41464b;
+}
+
+.list-group-item-success {
+ color : #0f5132;
+ background-color: #d1e7dd;
+}
+
+.list-group-item-success.list-group-item-action:hover,
+.list-group-item-success.list-group-item-action:focus {
+ color : #0f5132;
+ background-color: #bcd0c7;
+}
+
+.list-group-item-success.list-group-item-action.active {
+ color : #fff;
+ background-color: #0f5132;
+ border-color : #0f5132;
+}
+
+.list-group-item-info {
+ color : #055160;
+ background-color: #cff4fc;
+}
+
+.list-group-item-info.list-group-item-action:hover,
+.list-group-item-info.list-group-item-action:focus {
+ color : #055160;
+ background-color: #badce3;
+}
+
+.list-group-item-info.list-group-item-action.active {
+ color : #fff;
+ background-color: #055160;
+ border-color : #055160;
+}
+
+.list-group-item-warning {
+ color : #664d03;
+ background-color: #fff3cd;
+}
+
+.list-group-item-warning.list-group-item-action:hover,
+.list-group-item-warning.list-group-item-action:focus {
+ color : #664d03;
+ background-color: #e6dbb9;
+}
+
+.list-group-item-warning.list-group-item-action.active {
+ color : #fff;
+ background-color: #664d03;
+ border-color : #664d03;
+}
+
+.list-group-item-danger {
+ color : #842029;
+ background-color: #f8d7da;
+}
+
+.list-group-item-danger.list-group-item-action:hover,
+.list-group-item-danger.list-group-item-action:focus {
+ color : #842029;
+ background-color: #dfc2c4;
+}
+
+.list-group-item-danger.list-group-item-action.active {
+ color : #fff;
+ background-color: #842029;
+ border-color : #842029;
+}
+
+.list-group-item-light {
+ color : #636464;
+ background-color: #fefefe;
+}
+
+.list-group-item-light.list-group-item-action:hover,
+.list-group-item-light.list-group-item-action:focus {
+ color : #636464;
+ background-color: #e5e5e5;
+}
+
+.list-group-item-light.list-group-item-action.active {
+ color : #fff;
+ background-color: #636464;
+ border-color : #636464;
+}
+
+.list-group-item-dark {
+ color : var(--textColor);
+ background-color: #333;
+}
+
+.list-group-item-dark.list-group-item-action:hover,
+.list-group-item-dark.list-group-item-action:focus {
+ color : #141619;
+ background-color: #bebebf;
+}
+
+.list-group-item-dark.list-group-item-action.active {
+ color : #fff;
+ background-color: #141619;
+ border-color : #141619;
+}
+
+// Toasts
+
+.toast {
+ width: 350px;
+ max-width: 100%;
+ font-size: 0.875rem;
+ pointer-events: auto;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+}
+.toast.showing {
+ opacity: 0;
+}
+.toast:not(.show) {
+ display: none;
+}
+
+.toast-container {
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+.toast-container > :not(:last-child) {
+ margin-bottom: 0.75rem;
+}
+
+.toast-header {
+ display: flex;
+ align-items: center;
+ padding: 0.5rem 0.75rem;
+ color: #6c757d;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+.toast-header .btn-close {
+ margin-right: -0.375rem;
+ margin-left: 0.75rem;
+}
+
+.toast-body {
+ padding: 0.75rem;
+ word-wrap: break-word;
+}
+
+// Card
+.card {
+ position : relative;
+ display : flex;
+ flex-direction : column;
+ min-width : 0;
+ word-wrap : break-word;
+ background-color: #333;
+ background-clip : border-box;
+ border : 1px solid rgba(0, 0, 0, 0.125);
+ border-radius : 0.25rem;
+}
+
+.card>hr {
+ margin-right: 0;
+ margin-left : 0;
+}
+
+.card>.list-group {
+ border-top : inherit;
+ border-bottom: inherit;
+}
+
+.card>.list-group:first-child {
+ border-top-width : 0;
+ border-top-left-radius : calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+
+.card>.list-group:last-child {
+ border-bottom-width : 0;
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius : calc(0.25rem - 1px);
+}
+
+.card>.card-header+.list-group,
+.card>.list-group+.card-footer {
+ border-top: 0;
+}
+
+.card-body {
+ flex : 1 1 auto;
+ padding: 1rem 1rem;
+}
+
+.card-title {
+ margin-bottom: 0.5rem;
+}
+
+.card-subtitle {
+ margin-top : -0.25rem;
+ margin-bottom: 0;
+}
+
+.card-text:last-child {
+ margin-bottom: 0;
+}
+
+.card-link+.card-link {
+ margin-left: 1rem;
+}
+
+.card-header {
+ padding : 0.5rem 1rem;
+ margin-bottom : 0;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-bottom : 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-header:first-child {
+ border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
+}
+
+.card-footer {
+ padding : 0.5rem 1rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-top : 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-footer:last-child {
+ border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
+}
+
+.card-header-tabs {
+ margin-right : -0.5rem;
+ margin-bottom: -0.5rem;
+ margin-left : -0.5rem;
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-right: -0.5rem;
+ margin-left : -0.5rem;
+}
+
+.card-img-overlay {
+ position : absolute;
+ top : 0;
+ right : 0;
+ bottom : 0;
+ left : 0;
+ padding : 1rem;
+ border-radius: calc(0.25rem - 1px);
+}
+
+.card-img,
+.card-img-top,
+.card-img-bottom {
+ width: 100%;
+}
+
+.card-img,
+.card-img-top {
+ border-top-left-radius : calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+
+.card-img,
+.card-img-bottom {
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius : calc(0.25rem - 1px);
+}
+
+.card-group>.card {
+ margin-bottom: 0.75rem;
+}
+
+@media (min-width: 576px) {
+ .card-group {
+ display : flex;
+ flex-flow: row wrap;
+ }
+
+ .card-group>.card {
+ flex : 1 0 0%;
+ margin-bottom: 0;
+ }
+
+ .card-group>.card+.card {
+ margin-left: 0;
+ border-left: 0;
+ }
+
+ .card-group>.card:not(:last-child) {
+ border-top-right-radius : 0;
+ border-bottom-right-radius: 0;
+ }
+
+ .card-group>.card:not(:last-child) .card-img-top,
+ .card-group>.card:not(:last-child) .card-header {
+ border-top-right-radius: 0;
+ }
+
+ .card-group>.card:not(:last-child) .card-img-bottom,
+ .card-group>.card:not(:last-child) .card-footer {
+ border-bottom-right-radius: 0;
+ }
+
+ .card-group>.card:not(:first-child) {
+ border-top-left-radius : 0;
+ border-bottom-left-radius: 0;
+ }
+
+ .card-group>.card:not(:first-child) .card-img-top,
+ .card-group>.card:not(:first-child) .card-header {
+ border-top-left-radius: 0;
+ }
+
+ .card-group>.card:not(:first-child) .card-img-bottom,
+ .card-group>.card:not(:first-child) .card-footer {
+ border-bottom-left-radius: 0;
+ }
+}
+
+
+.modal {
+ position : fixed;
+ top : 0;
+ left : 0;
+ z-index : 1055;
+ display : none;
+ width : 100%;
+ height : 100%;
+ overflow-x : hidden;
+ overflow-y : auto;
+ outline : 0;
+ user-select: none;
+
+
+ .close {
+ width : 50px;
+ height : 42px;
+ background-image : var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat : no-repeat;
+ -webkit-app-region : no-drag;
+ appearance : none;
+ border : 0;
+ background-color : transparent;
+ position : absolute;
+ top : 0;
+ right : 0;
+
+ &:hover {
+ background-color: rgb(196, 43, 28)
}
+ }
+}
+
+.modal-dialog {
+ position : relative;
+ width : auto;
+ margin : 0.5rem;
+ pointer-events: none;
+ color : var(--textColor);
+}
+
+.modal.fade .modal-dialog {
+ transition: transform 0.1s var(--appleEase), opacity 0.1s var(--appleEase);
+ transform : scale(0.9);
+ opacity : 0;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+
+.modal.show .modal-dialog {
+ transform: none;
+ opacity : 1;
+}
+
+.modal.modal-static .modal-dialog {
+ transform: scale(1.02);
+}
+
+.modal-dialog-scrollable {
+ height: calc(100% - 1rem);
+}
+
+.modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow : hidden;
+}
+
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.modal-dialog-centered {
+ display : flex;
+ align-items: center;
+ min-height : calc(100% - 1rem);
+}
+
+.modal-content {
+ position : relative;
+ display : flex;
+ flex-direction : column;
+ width : 100%;
+ pointer-events : auto;
+ background-color: var(--modalBackground);
+ background-clip : padding-box;
+ border : 1px solid rgba(0, 0, 0, 0.2);
+ border-radius : 0.3rem;
+ outline : 0;
+ box-shadow : var(--ciderShadow-Generic);
+ overflow : hidden;
+}
+
+.modal-backdrop {
+ position : fixed;
+ top : 0;
+ left : 0;
+ z-index : 1050;
+ width : 100vw;
+ height : 100vh;
+ background-color: #000;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+}
+
+.modal-backdrop.show {
+ opacity: 0.5;
+}
+
+.modal-header {
+ display : flex;
+ flex-shrink : 0;
+ align-items : center;
+ justify-content : space-between;
+ padding : 1rem 1rem;
+ border-top-left-radius : calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
+}
+
+.modal-header .btn-close {
+ padding: 0.5rem 0.5rem;
+ margin : -0.5rem -0.5rem -0.5rem auto;
+}
+
+.modal-title {
+ line-height: 1.5;
+ margin : 0;
+}
+
+.modal-body {
+ position : relative;
+ flex : 1 1 auto;
+ padding : 3rem 1rem 1rem 1rem;
+ font-size: 0.9em
+}
+
+.modal-footer {
+ display : flex;
+ flex-wrap : wrap;
+ flex-shrink : 0;
+ align-items : center;
+ justify-content : flex-end;
+ padding : 0.75rem;
+ border-bottom-right-radius: calc(0.3rem - 1px);
+ border-bottom-left-radius : calc(0.3rem - 1px);
+}
+
+.modal-footer>* {
+ margin: 0.25rem;
+}
+
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin : 1.75rem auto;
+ }
+
+ .modal-dialog-scrollable {
+ height: calc(100% - 3.5rem);
+ }
+
+ .modal-dialog-centered {
+ min-height: calc(100% - 3.5rem);
+ }
+
+ .modal-sm {
+ max-width: 300px;
+ }
}
@media (min-width: 992px) {
- .modal-lg,
- .modal-xl {
- max-width: 800px;
- }
+ .modal-lg,
+ .modal-xl {
+ max-width: 800px;
+ }
}
@media (min-width: 1200px) {
- .modal-xl {
- max-width: 1140px;
- }
+ .modal-xl {
+ max-width: 1140px;
+ }
}
.modal-fullscreen {
- width: 100vw;
- max-width: none;
- height: 100%;
- margin: 0;
+ width : 100vw;
+ max-width: none;
+ height : 100%;
+ margin : 0;
}
.modal-fullscreen .modal-content {
- height: 100%;
- border: 0;
- border-radius: 0;
+ height : 100%;
+ border : 0;
+ border-radius: 0;
}
.modal-fullscreen .modal-header {
- border-radius: 0;
+ border-radius: 0;
}
.modal-fullscreen .modal-body {
- overflow-y: auto;
+ overflow-y: auto;
}
.modal-fullscreen .modal-footer {
- border-radius: 0;
+ border-radius: 0;
}
@media (max-width: 575.98px) {
- .modal-fullscreen-sm-down {
- width: 100vw;
- max-width: none;
- height: 100%;
- margin: 0;
- }
+ .modal-fullscreen-sm-down {
+ width : 100vw;
+ max-width: none;
+ height : 100%;
+ margin : 0;
+ }
- .modal-fullscreen-sm-down .modal-content {
- height: 100%;
- border: 0;
- border-radius: 0;
- }
+ .modal-fullscreen-sm-down .modal-content {
+ height : 100%;
+ border : 0;
+ border-radius: 0;
+ }
- .modal-fullscreen-sm-down .modal-header {
- border-radius: 0;
- }
+ .modal-fullscreen-sm-down .modal-header {
+ border-radius: 0;
+ }
- .modal-fullscreen-sm-down .modal-body {
- overflow-y: auto;
- }
+ .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
+ }
- .modal-fullscreen-sm-down .modal-footer {
- border-radius: 0;
- }
+ .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
+ }
}
@media (max-width: 767.98px) {
- .modal-fullscreen-md-down {
- width: 100vw;
- max-width: none;
- height: 100%;
- margin: 0;
- }
+ .modal-fullscreen-md-down {
+ width : 100vw;
+ max-width: none;
+ height : 100%;
+ margin : 0;
+ }
- .modal-fullscreen-md-down .modal-content {
- height: 100%;
- border: 0;
- border-radius: 0;
- }
+ .modal-fullscreen-md-down .modal-content {
+ height : 100%;
+ border : 0;
+ border-radius: 0;
+ }
- .modal-fullscreen-md-down .modal-header {
- border-radius: 0;
- }
+ .modal-fullscreen-md-down .modal-header {
+ border-radius: 0;
+ }
- .modal-fullscreen-md-down .modal-body {
- overflow-y: auto;
- }
+ .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
+ }
- .modal-fullscreen-md-down .modal-footer {
- border-radius: 0;
- }
+ .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
+ }
}
@media (max-width: 991.98px) {
- .modal-fullscreen-lg-down {
- width: 100vw;
- max-width: none;
- height: 100%;
- margin: 0;
- }
+ .modal-fullscreen-lg-down {
+ width : 100vw;
+ max-width: none;
+ height : 100%;
+ margin : 0;
+ }
- .modal-fullscreen-lg-down .modal-content {
- height: 100%;
- border: 0;
- border-radius: 0;
- }
+ .modal-fullscreen-lg-down .modal-content {
+ height : 100%;
+ border : 0;
+ border-radius: 0;
+ }
- .modal-fullscreen-lg-down .modal-header {
- border-radius: 0;
- }
+ .modal-fullscreen-lg-down .modal-header {
+ border-radius: 0;
+ }
- .modal-fullscreen-lg-down .modal-body {
- overflow-y: auto;
- }
+ .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
+ }
- .modal-fullscreen-lg-down .modal-footer {
- border-radius: 0;
- }
+ .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
+ }
}
@media (max-width: 1199.98px) {
- .modal-fullscreen-xl-down {
- width: 100vw;
- max-width: none;
- height: 100%;
- margin: 0;
- }
+ .modal-fullscreen-xl-down {
+ width : 100vw;
+ max-width: none;
+ height : 100%;
+ margin : 0;
+ }
- .modal-fullscreen-xl-down .modal-content {
- height: 100%;
- border: 0;
- border-radius: 0;
- }
+ .modal-fullscreen-xl-down .modal-content {
+ height : 100%;
+ border : 0;
+ border-radius: 0;
+ }
- .modal-fullscreen-xl-down .modal-header {
- border-radius: 0;
- }
+ .modal-fullscreen-xl-down .modal-header {
+ border-radius: 0;
+ }
- .modal-fullscreen-xl-down .modal-body {
- overflow-y: auto;
- }
+ .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
+ }
- .modal-fullscreen-xl-down .modal-footer {
- border-radius: 0;
- }
+ .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
+ }
}
@media (max-width: 1399.98px) {
- .modal-fullscreen-xxl-down {
- width: 100vw;
- max-width: none;
- height: 100%;
- margin: 0;
- }
+ .modal-fullscreen-xxl-down {
+ width : 100vw;
+ max-width: none;
+ height : 100%;
+ margin : 0;
+ }
- .modal-fullscreen-xxl-down .modal-content {
- height: 100%;
- border: 0;
- border-radius: 0;
- }
+ .modal-fullscreen-xxl-down .modal-content {
+ height : 100%;
+ border : 0;
+ border-radius: 0;
+ }
- .modal-fullscreen-xxl-down .modal-header {
- border-radius: 0;
- }
+ .modal-fullscreen-xxl-down .modal-header {
+ border-radius: 0;
+ }
- .modal-fullscreen-xxl-down .modal-body {
- overflow-y: auto;
- }
+ .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
+ }
- .modal-fullscreen-xxl-down .modal-footer {
- border-radius: 0;
- }
+ .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
}
.btn {
- display: inline-block;
- font-weight: 400;
- line-height: 1.5;
- color: #212529;
- text-align: center;
- text-decoration: none;
- vertical-align: middle;
- cursor: pointer;
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
- background-color: transparent;
- border: 1px solid transparent;
- padding: 0.375rem 0.75rem;
- font-size: 1rem;
- border-radius: 0.25rem;
- font-family: inherit;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ display : inline-block;
+ font-weight : 400;
+ line-height : 1.5;
+ color : #212529;
+ text-align : center;
+ text-decoration : none;
+ vertical-align : middle;
+ cursor : pointer;
+ -webkit-user-select: none;
+ -moz-user-select : none;
+ user-select : none;
+ background-color : transparent;
+ border : 1px solid transparent;
+ padding : 0.375rem 0.75rem;
+ font-size : 1rem;
+ border-radius : 0.25rem;
+ font-family : inherit;
+ transition : color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
- .btn {
- transition: none;
- }
+ .btn {
+ transition: none;
+ }
}
.btn:hover {
- color: #212529;
+ color: #212529;
}
.btn-check:focus+.btn,
.btn:focus {
- outline: 0;
- box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ outline : 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
.btn:disabled,
.btn.disabled,
fieldset:disabled .btn {
- pointer-events: none;
- opacity: 0.65;
+ pointer-events: none;
+ opacity : 0.65;
}
.btn-primary {
- color: #fff;
- background-color: #0d6efd;
- border-color: #0d6efd;
+ color : #fff;
+ background-color: #0d6efd;
+ border-color : #0d6efd;
}
.btn-primary:hover {
- color: #fff;
- background-color: #0b5ed7;
- border-color: #0a58ca;
+ color : #fff;
+ background-color: #0b5ed7;
+ border-color : #0a58ca;
}
.btn-check:focus+.btn-primary,
.btn-primary:focus {
- color: #fff;
- background-color: #0b5ed7;
- border-color: #0a58ca;
- box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
+ color : #fff;
+ background-color: #0b5ed7;
+ border-color : #0a58ca;
+ box-shadow : 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
}
.btn-check:checked+.btn-primary,
@@ -418,9 +1361,9 @@ fieldset:disabled .btn {
.btn-primary:active,
.btn-primary.active,
.show>.btn-primary.dropdown-toggle {
- color: #fff;
- background-color: #0a58ca;
- border-color: #0a53be;
+ color : #fff;
+ background-color: #0a58ca;
+ border-color : #0a53be;
}
.btn-check:checked+.btn-primary:focus,
@@ -428,34 +1371,34 @@ fieldset:disabled .btn {
.btn-primary:active:focus,
.btn-primary.active:focus,
.show>.btn-primary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
}
.btn-primary:disabled,
.btn-primary.disabled {
- color: #fff;
- background-color: #0d6efd;
- border-color: #0d6efd;
+ color : #fff;
+ background-color: #0d6efd;
+ border-color : #0d6efd;
}
.btn-secondary {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
+ color : #fff;
+ background-color: #6c757d;
+ border-color : #6c757d;
}
.btn-secondary:hover {
- color: #fff;
- background-color: #5c636a;
- border-color: #565e64;
+ color : #fff;
+ background-color: #5c636a;
+ border-color : #565e64;
}
.btn-check:focus+.btn-secondary,
.btn-secondary:focus {
- color: #fff;
- background-color: #5c636a;
- border-color: #565e64;
- box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
+ color : #fff;
+ background-color: #5c636a;
+ border-color : #565e64;
+ box-shadow : 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
}
.btn-check:checked+.btn-secondary,
@@ -463,9 +1406,9 @@ fieldset:disabled .btn {
.btn-secondary:active,
.btn-secondary.active,
.show>.btn-secondary.dropdown-toggle {
- color: #fff;
- background-color: #565e64;
- border-color: #51585e;
+ color : #fff;
+ background-color: #565e64;
+ border-color : #51585e;
}
.btn-check:checked+.btn-secondary:focus,
@@ -473,34 +1416,34 @@ fieldset:disabled .btn {
.btn-secondary:active:focus,
.btn-secondary.active:focus,
.show>.btn-secondary.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
}
.btn-secondary:disabled,
.btn-secondary.disabled {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
+ color : #fff;
+ background-color: #6c757d;
+ border-color : #6c757d;
}
.btn-success {
- color: #fff;
- background-color: #198754;
- border-color: #198754;
+ color : #fff;
+ background-color: #198754;
+ border-color : #198754;
}
.btn-success:hover {
- color: #fff;
- background-color: #157347;
- border-color: #146c43;
+ color : #fff;
+ background-color: #157347;
+ border-color : #146c43;
}
.btn-check:focus+.btn-success,
.btn-success:focus {
- color: #fff;
- background-color: #157347;
- border-color: #146c43;
- box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
+ color : #fff;
+ background-color: #157347;
+ border-color : #146c43;
+ box-shadow : 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
}
.btn-check:checked+.btn-success,
@@ -508,9 +1451,9 @@ fieldset:disabled .btn {
.btn-success:active,
.btn-success.active,
.show>.btn-success.dropdown-toggle {
- color: #fff;
- background-color: #146c43;
- border-color: #13653f;
+ color : #fff;
+ background-color: #146c43;
+ border-color : #13653f;
}
.btn-check:checked+.btn-success:focus,
@@ -518,34 +1461,34 @@ fieldset:disabled .btn {
.btn-success:active:focus,
.btn-success.active:focus,
.show>.btn-success.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
}
.btn-success:disabled,
.btn-success.disabled {
- color: #fff;
- background-color: #198754;
- border-color: #198754;
+ color : #fff;
+ background-color: #198754;
+ border-color : #198754;
}
.btn-info {
- color: #000;
- background-color: #0dcaf0;
- border-color: #0dcaf0;
+ color : #000;
+ background-color: #0dcaf0;
+ border-color : #0dcaf0;
}
.btn-info:hover {
- color: #000;
- background-color: #31d2f2;
- border-color: #25cff2;
+ color : #000;
+ background-color: #31d2f2;
+ border-color : #25cff2;
}
.btn-check:focus+.btn-info,
.btn-info:focus {
- color: #000;
- background-color: #31d2f2;
- border-color: #25cff2;
- box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
+ color : #000;
+ background-color: #31d2f2;
+ border-color : #25cff2;
+ box-shadow : 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
}
.btn-check:checked+.btn-info,
@@ -553,9 +1496,9 @@ fieldset:disabled .btn {
.btn-info:active,
.btn-info.active,
.show>.btn-info.dropdown-toggle {
- color: #000;
- background-color: #3dd5f3;
- border-color: #25cff2;
+ color : #000;
+ background-color: #3dd5f3;
+ border-color : #25cff2;
}
.btn-check:checked+.btn-info:focus,
@@ -563,34 +1506,34 @@ fieldset:disabled .btn {
.btn-info:active:focus,
.btn-info.active:focus,
.show>.btn-info.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
}
.btn-info:disabled,
.btn-info.disabled {
- color: #000;
- background-color: #0dcaf0;
- border-color: #0dcaf0;
+ color : #000;
+ background-color: #0dcaf0;
+ border-color : #0dcaf0;
}
.btn-warning {
- color: #000;
- background-color: #ffc107;
- border-color: #ffc107;
+ color : #000;
+ background-color: #ffc107;
+ border-color : #ffc107;
}
.btn-warning:hover {
- color: #000;
- background-color: #ffca2c;
- border-color: #ffc720;
+ color : #000;
+ background-color: #ffca2c;
+ border-color : #ffc720;
}
.btn-check:focus+.btn-warning,
.btn-warning:focus {
- color: #000;
- background-color: #ffca2c;
- border-color: #ffc720;
- box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
+ color : #000;
+ background-color: #ffca2c;
+ border-color : #ffc720;
+ box-shadow : 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
}
.btn-check:checked+.btn-warning,
@@ -598,9 +1541,9 @@ fieldset:disabled .btn {
.btn-warning:active,
.btn-warning.active,
.show>.btn-warning.dropdown-toggle {
- color: #000;
- background-color: #ffcd39;
- border-color: #ffc720;
+ color : #000;
+ background-color: #ffcd39;
+ border-color : #ffc720;
}
.btn-check:checked+.btn-warning:focus,
@@ -608,34 +1551,34 @@ fieldset:disabled .btn {
.btn-warning:active:focus,
.btn-warning.active:focus,
.show>.btn-warning.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
}
.btn-warning:disabled,
.btn-warning.disabled {
- color: #000;
- background-color: #ffc107;
- border-color: #ffc107;
+ color : #000;
+ background-color: #ffc107;
+ border-color : #ffc107;
}
.btn-danger {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
+ color : #fff;
+ background-color: #dc3545;
+ border-color : #dc3545;
}
.btn-danger:hover {
- color: #fff;
- background-color: #bb2d3b;
- border-color: #b02a37;
+ color : #fff;
+ background-color: #bb2d3b;
+ border-color : #b02a37;
}
.btn-check:focus+.btn-danger,
.btn-danger:focus {
- color: #fff;
- background-color: #bb2d3b;
- border-color: #b02a37;
- box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
+ color : #fff;
+ background-color: #bb2d3b;
+ border-color : #b02a37;
+ box-shadow : 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
}
.btn-check:checked+.btn-danger,
@@ -643,9 +1586,9 @@ fieldset:disabled .btn {
.btn-danger:active,
.btn-danger.active,
.show>.btn-danger.dropdown-toggle {
- color: #fff;
- background-color: #b02a37;
- border-color: #a52834;
+ color : #fff;
+ background-color: #b02a37;
+ border-color : #a52834;
}
.btn-check:checked+.btn-danger:focus,
@@ -653,34 +1596,34 @@ fieldset:disabled .btn {
.btn-danger:active:focus,
.btn-danger.active:focus,
.show>.btn-danger.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
}
.btn-danger:disabled,
.btn-danger.disabled {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
+ color : #fff;
+ background-color: #dc3545;
+ border-color : #dc3545;
}
.btn-light {
- color: #000;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
+ color : #000;
+ background-color: #f8f9fa;
+ border-color : #f8f9fa;
}
.btn-light:hover {
- color: #000;
- background-color: #f9fafb;
- border-color: #f9fafb;
+ color : #000;
+ background-color: #f9fafb;
+ border-color : #f9fafb;
}
.btn-check:focus+.btn-light,
.btn-light:focus {
- color: #000;
- background-color: #f9fafb;
- border-color: #f9fafb;
- box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
+ color : #000;
+ background-color: #f9fafb;
+ border-color : #f9fafb;
+ box-shadow : 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
}
.btn-check:checked+.btn-light,
@@ -688,9 +1631,9 @@ fieldset:disabled .btn {
.btn-light:active,
.btn-light.active,
.show>.btn-light.dropdown-toggle {
- color: #000;
- background-color: #f9fafb;
- border-color: #f9fafb;
+ color : #000;
+ background-color: #f9fafb;
+ border-color : #f9fafb;
}
.btn-check:checked+.btn-light:focus,
@@ -698,34 +1641,34 @@ fieldset:disabled .btn {
.btn-light:active:focus,
.btn-light.active:focus,
.show>.btn-light.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
}
.btn-light:disabled,
.btn-light.disabled {
- color: #000;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
+ color : #000;
+ background-color: #f8f9fa;
+ border-color : #f8f9fa;
}
.btn-dark {
- color: #fff;
- background-color: #212529;
- border-color: #212529;
+ color : #fff;
+ background-color: #212529;
+ border-color : #212529;
}
.btn-dark:hover {
- color: #fff;
- background-color: #1c1f23;
- border-color: #1a1e21;
+ color : #fff;
+ background-color: #1c1f23;
+ border-color : #1a1e21;
}
.btn-check:focus+.btn-dark,
.btn-dark:focus {
- color: #fff;
- background-color: #1c1f23;
- border-color: #1a1e21;
- box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
+ color : #fff;
+ background-color: #1c1f23;
+ border-color : #1a1e21;
+ box-shadow : 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
}
.btn-check:checked+.btn-dark,
@@ -733,9 +1676,9 @@ fieldset:disabled .btn {
.btn-dark:active,
.btn-dark.active,
.show>.btn-dark.dropdown-toggle {
- color: #fff;
- background-color: #1a1e21;
- border-color: #191c1f;
+ color : #fff;
+ background-color: #1a1e21;
+ border-color : #191c1f;
}
.btn-check:checked+.btn-dark:focus,
@@ -743,30 +1686,30 @@ fieldset:disabled .btn {
.btn-dark:active:focus,
.btn-dark.active:focus,
.show>.btn-dark.dropdown-toggle:focus {
- box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
}
.btn-dark:disabled,
.btn-dark.disabled {
- color: #fff;
- background-color: #212529;
- border-color: #212529;
+ color : #fff;
+ background-color: #212529;
+ border-color : #212529;
}
.btn-outline-primary {
- color: #0d6efd;
- border-color: #0d6efd;
+ color : #0d6efd;
+ border-color: #0d6efd;
}
.btn-outline-primary:hover {
- color: #fff;
- background-color: #0d6efd;
- border-color: #0d6efd;
+ color : #fff;
+ background-color: #0d6efd;
+ border-color : #0d6efd;
}
.btn-check:focus+.btn-outline-primary,
.btn-outline-primary:focus {
- box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
}
.btn-check:checked+.btn-outline-primary,
@@ -774,9 +1717,9 @@ fieldset:disabled .btn {
.btn-outline-primary:active,
.btn-outline-primary.active,
.btn-outline-primary.dropdown-toggle.show {
- color: #fff;
- background-color: #0d6efd;
- border-color: #0d6efd;
+ color : #fff;
+ background-color: #0d6efd;
+ border-color : #0d6efd;
}
.btn-check:checked+.btn-outline-primary:focus,
@@ -784,29 +1727,29 @@ fieldset:disabled .btn {
.btn-outline-primary:active:focus,
.btn-outline-primary.active:focus,
.btn-outline-primary.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
}
.btn-outline-primary:disabled,
.btn-outline-primary.disabled {
- color: #0d6efd;
- background-color: transparent;
+ color : #0d6efd;
+ background-color: transparent;
}
.btn-outline-secondary {
- color: #6c757d;
- border-color: #6c757d;
+ color : #6c757d;
+ border-color: #6c757d;
}
.btn-outline-secondary:hover {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
+ color : #fff;
+ background-color: #6c757d;
+ border-color : #6c757d;
}
.btn-check:focus+.btn-outline-secondary,
.btn-outline-secondary:focus {
- box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
}
.btn-check:checked+.btn-outline-secondary,
@@ -814,9 +1757,9 @@ fieldset:disabled .btn {
.btn-outline-secondary:active,
.btn-outline-secondary.active,
.btn-outline-secondary.dropdown-toggle.show {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
+ color : #fff;
+ background-color: #6c757d;
+ border-color : #6c757d;
}
.btn-check:checked+.btn-outline-secondary:focus,
@@ -824,29 +1767,29 @@ fieldset:disabled .btn {
.btn-outline-secondary:active:focus,
.btn-outline-secondary.active:focus,
.btn-outline-secondary.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
}
.btn-outline-secondary:disabled,
.btn-outline-secondary.disabled {
- color: #6c757d;
- background-color: transparent;
+ color : #6c757d;
+ background-color: transparent;
}
.btn-outline-success {
- color: #198754;
- border-color: #198754;
+ color : #198754;
+ border-color: #198754;
}
.btn-outline-success:hover {
- color: #fff;
- background-color: #198754;
- border-color: #198754;
+ color : #fff;
+ background-color: #198754;
+ border-color : #198754;
}
.btn-check:focus+.btn-outline-success,
.btn-outline-success:focus {
- box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
}
.btn-check:checked+.btn-outline-success,
@@ -854,9 +1797,9 @@ fieldset:disabled .btn {
.btn-outline-success:active,
.btn-outline-success.active,
.btn-outline-success.dropdown-toggle.show {
- color: #fff;
- background-color: #198754;
- border-color: #198754;
+ color : #fff;
+ background-color: #198754;
+ border-color : #198754;
}
.btn-check:checked+.btn-outline-success:focus,
@@ -864,29 +1807,29 @@ fieldset:disabled .btn {
.btn-outline-success:active:focus,
.btn-outline-success.active:focus,
.btn-outline-success.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
}
.btn-outline-success:disabled,
.btn-outline-success.disabled {
- color: #198754;
- background-color: transparent;
+ color : #198754;
+ background-color: transparent;
}
.btn-outline-info {
- color: #0dcaf0;
- border-color: #0dcaf0;
+ color : #0dcaf0;
+ border-color: #0dcaf0;
}
.btn-outline-info:hover {
- color: #000;
- background-color: #0dcaf0;
- border-color: #0dcaf0;
+ color : #000;
+ background-color: #0dcaf0;
+ border-color : #0dcaf0;
}
.btn-check:focus+.btn-outline-info,
.btn-outline-info:focus {
- box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
}
.btn-check:checked+.btn-outline-info,
@@ -894,9 +1837,9 @@ fieldset:disabled .btn {
.btn-outline-info:active,
.btn-outline-info.active,
.btn-outline-info.dropdown-toggle.show {
- color: #000;
- background-color: #0dcaf0;
- border-color: #0dcaf0;
+ color : #000;
+ background-color: #0dcaf0;
+ border-color : #0dcaf0;
}
.btn-check:checked+.btn-outline-info:focus,
@@ -904,29 +1847,29 @@ fieldset:disabled .btn {
.btn-outline-info:active:focus,
.btn-outline-info.active:focus,
.btn-outline-info.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
}
.btn-outline-info:disabled,
.btn-outline-info.disabled {
- color: #0dcaf0;
- background-color: transparent;
+ color : #0dcaf0;
+ background-color: transparent;
}
.btn-outline-warning {
- color: #ffc107;
- border-color: #ffc107;
+ color : #ffc107;
+ border-color: #ffc107;
}
.btn-outline-warning:hover {
- color: #000;
- background-color: #ffc107;
- border-color: #ffc107;
+ color : #000;
+ background-color: #ffc107;
+ border-color : #ffc107;
}
.btn-check:focus+.btn-outline-warning,
.btn-outline-warning:focus {
- box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
}
.btn-check:checked+.btn-outline-warning,
@@ -934,9 +1877,9 @@ fieldset:disabled .btn {
.btn-outline-warning:active,
.btn-outline-warning.active,
.btn-outline-warning.dropdown-toggle.show {
- color: #000;
- background-color: #ffc107;
- border-color: #ffc107;
+ color : #000;
+ background-color: #ffc107;
+ border-color : #ffc107;
}
.btn-check:checked+.btn-outline-warning:focus,
@@ -944,29 +1887,29 @@ fieldset:disabled .btn {
.btn-outline-warning:active:focus,
.btn-outline-warning.active:focus,
.btn-outline-warning.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
}
.btn-outline-warning:disabled,
.btn-outline-warning.disabled {
- color: #ffc107;
- background-color: transparent;
+ color : #ffc107;
+ background-color: transparent;
}
.btn-outline-danger {
- color: #dc3545;
- border-color: #dc3545;
+ color : #dc3545;
+ border-color: #dc3545;
}
.btn-outline-danger:hover {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
+ color : #fff;
+ background-color: #dc3545;
+ border-color : #dc3545;
}
.btn-check:focus+.btn-outline-danger,
.btn-outline-danger:focus {
- box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
}
.btn-check:checked+.btn-outline-danger,
@@ -974,9 +1917,9 @@ fieldset:disabled .btn {
.btn-outline-danger:active,
.btn-outline-danger.active,
.btn-outline-danger.dropdown-toggle.show {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
+ color : #fff;
+ background-color: #dc3545;
+ border-color : #dc3545;
}
.btn-check:checked+.btn-outline-danger:focus,
@@ -984,29 +1927,29 @@ fieldset:disabled .btn {
.btn-outline-danger:active:focus,
.btn-outline-danger.active:focus,
.btn-outline-danger.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
}
.btn-outline-danger:disabled,
.btn-outline-danger.disabled {
- color: #dc3545;
- background-color: transparent;
+ color : #dc3545;
+ background-color: transparent;
}
.btn-outline-light {
- color: #f8f9fa;
- border-color: #f8f9fa;
+ color : #f8f9fa;
+ border-color: #f8f9fa;
}
.btn-outline-light:hover {
- color: #000;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
+ color : #000;
+ background-color: #f8f9fa;
+ border-color : #f8f9fa;
}
.btn-check:focus+.btn-outline-light,
.btn-outline-light:focus {
- box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
}
.btn-check:checked+.btn-outline-light,
@@ -1014,9 +1957,9 @@ fieldset:disabled .btn {
.btn-outline-light:active,
.btn-outline-light.active,
.btn-outline-light.dropdown-toggle.show {
- color: #000;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
+ color : #000;
+ background-color: #f8f9fa;
+ border-color : #f8f9fa;
}
.btn-check:checked+.btn-outline-light:focus,
@@ -1024,29 +1967,29 @@ fieldset:disabled .btn {
.btn-outline-light:active:focus,
.btn-outline-light.active:focus,
.btn-outline-light.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
}
.btn-outline-light:disabled,
.btn-outline-light.disabled {
- color: #f8f9fa;
- background-color: transparent;
+ color : #f8f9fa;
+ background-color: transparent;
}
.btn-outline-dark {
- color: #212529;
- border-color: #212529;
+ color : #212529;
+ border-color: #212529;
}
.btn-outline-dark:hover {
- color: #fff;
- background-color: #212529;
- border-color: #212529;
+ color : #fff;
+ background-color: #212529;
+ border-color : #212529;
}
.btn-check:focus+.btn-outline-dark,
.btn-outline-dark:focus {
- box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
}
.btn-check:checked+.btn-outline-dark,
@@ -1054,9 +1997,9 @@ fieldset:disabled .btn {
.btn-outline-dark:active,
.btn-outline-dark.active,
.btn-outline-dark.dropdown-toggle.show {
- color: #fff;
- background-color: #212529;
- border-color: #212529;
+ color : #fff;
+ background-color: #212529;
+ border-color : #212529;
}
.btn-check:checked+.btn-outline-dark:focus,
@@ -1064,44 +2007,5763 @@ fieldset:disabled .btn {
.btn-outline-dark:active:focus,
.btn-outline-dark.active:focus,
.btn-outline-dark.dropdown-toggle.show:focus {
- box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
+ box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
}
.btn-outline-dark:disabled,
.btn-outline-dark.disabled {
- color: #212529;
- background-color: transparent;
+ color : #212529;
+ background-color: transparent;
}
.btn-link {
- font-weight: 400;
- color: #0d6efd;
- text-decoration: underline;
+ font-weight : 400;
+ color : #0d6efd;
+ text-decoration: underline;
}
.btn-link:hover {
- color: #0a58ca;
+ color: #0a58ca;
}
.btn-link:disabled,
.btn-link.disabled {
- color: #6c757d;
+ color: #6c757d;
}
.btn-lg,
.btn-group-lg>.btn {
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- border-radius: 0.3rem;
+ padding : 0.5rem 1rem;
+ font-size : 1.25rem;
+ border-radius: 0.3rem;
}
.btn-sm,
.btn-group-sm>.btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- border-radius: 0.2rem;
+ padding : 0.25rem 0.5rem;
+ font-size : 0.875rem;
+ border-radius: 0.2rem;
}
.form-control {
- width:100%;
-}
\ No newline at end of file
+ width: 100%;
+}
+
+// Button Group
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+.btn-group > .btn-check:checked + .btn,
+.btn-group > .btn-check:focus + .btn,
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn-check:checked + .btn,
+.btn-group-vertical > .btn-check:focus + .btn,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+.btn-toolbar .input-group {
+ width: auto;
+}
+
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) {
+ margin-left: -1px;
+}
+.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn:nth-child(n+3),
+.btn-group > :not(.btn-check) + .btn,
+.btn-group > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+.dropstart .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+
+.btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+ width: 100%;
+}
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -1px;
+}
+.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group-vertical > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn ~ .btn,
+.btn-group-vertical > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+// Table
+.table {
+ --bs-table-bg: transparent;
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: #212529;
+ --bs-table-striped-bg: rgba(0, 0, 0, 0.05);
+ --bs-table-active-color: #212529;
+ --bs-table-active-bg: rgba(0, 0, 0, 0.1);
+ --bs-table-hover-color: #212529;
+ --bs-table-hover-bg: rgba(0, 0, 0, 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ color: #212529;
+ vertical-align: top;
+ border-color: #dee2e6;
+}
+.table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ background-color: var(--bs-table-bg);
+ border-bottom-width: 1px;
+ box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
+}
+.table > tbody {
+ vertical-align: inherit;
+}
+.table > thead {
+ vertical-align: bottom;
+}
+.table > :not(:first-child) {
+ border-top: 2px solid currentColor;
+}
+
+.caption-top {
+ caption-side: top;
+}
+
+.table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
+}
+
+.table-bordered > :not(caption) > * {
+ border-width: 1px 0;
+}
+.table-bordered > :not(caption) > * > * {
+ border-width: 0 1px;
+}
+
+.table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
+}
+.table-borderless > :not(:first-child) {
+ border-top-width: 0;
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) > * {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+
+.table-active {
+ --bs-table-accent-bg: var(--bs-table-active-bg);
+ color: var(--bs-table-active-color);
+}
+
+.table-hover > tbody > tr:hover > * {
+ --bs-table-accent-bg: var(--bs-table-hover-bg);
+ color: var(--bs-table-hover-color);
+}
+
+.table-primary {
+ --bs-table-bg: #cfe2ff;
+ --bs-table-striped-bg: #c5d7f2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bacbe6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfd1ec;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #bacbe6;
+}
+
+.table-secondary {
+ --bs-table-bg: #e2e3e5;
+ --bs-table-striped-bg: #d7d8da;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #cbccce;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d1d2d4;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #cbccce;
+}
+
+.table-success {
+ --bs-table-bg: #d1e7dd;
+ --bs-table-striped-bg: #c7dbd2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bcd0c7;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c1d6cc;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #bcd0c7;
+}
+
+.table-info {
+ --bs-table-bg: #cff4fc;
+ --bs-table-striped-bg: #c5e8ef;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #badce3;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfe2e9;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #badce3;
+}
+
+.table-warning {
+ --bs-table-bg: #fff3cd;
+ --bs-table-striped-bg: #f2e7c3;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #e6dbb9;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #ece1be;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #e6dbb9;
+}
+
+.table-danger {
+ --bs-table-bg: #f8d7da;
+ --bs-table-striped-bg: #eccccf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfc2c4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5c7ca;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #dfc2c4;
+}
+
+.table-light {
+ --bs-table-bg: #f8f9fa;
+ --bs-table-striped-bg: #ecedee;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfe0e1;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5e6e7;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #dfe0e1;
+}
+
+.table-dark {
+ --bs-table-bg: #212529;
+ --bs-table-striped-bg: #2c3034;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #373b3e;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #323539;
+ --bs-table-hover-color: #fff;
+ color: #fff;
+ border-color: #373b3e;
+}
+
+.table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+@media (max-width: 575.98px) {
+ .table-responsive-sm {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 767.98px) {
+ .table-responsive-md {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 991.98px) {
+ .table-responsive-lg {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 1199.98px) {
+ .table-responsive-xl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 1399.98px) {
+ .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+
+// Tabs
+
+.nav-tabs {
+ border-bottom: 1px solid #dee2e6;
+}
+.nav-tabs .nav-link {
+ margin-bottom: -1px;
+ background: none;
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+ border-color: #e9ecef #e9ecef #dee2e6;
+ isolation: isolate;
+}
+.nav-tabs .nav-link.disabled {
+ color: #6c757d;
+ background-color: transparent;
+ border-color: transparent;
+}
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #495057;
+ background-color: #fff;
+ border-color: #dee2e6 #dee2e6 #fff;
+}
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: 0.25rem;
+}
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #0d6efd;
+}
+
+.nav-fill > .nav-link,
+.nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.nav-justified > .nav-link,
+.nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.nav-fill .nav-item .nav-link,
+.nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+.tab-content > .active {
+ display: block;
+}
+
+/*!
+ * Bootstrap Grid v5.1.1 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+:root {
+ --bs-blue : #0d6efd;
+ --bs-indigo : #6610f2;
+ --bs-purple : #6f42c1;
+ --bs-pink : #d63384;
+ --bs-red : #dc3545;
+ --bs-orange : #fd7e14;
+ --bs-yellow : #ffc107;
+ --bs-green : #198754;
+ --bs-teal : #20c997;
+ --bs-cyan : #0dcaf0;
+ --bs-white : #fff;
+ --bs-gray : #6c757d;
+ --bs-gray-dark : #343a40;
+ --bs-gray-100 : #f8f9fa;
+ --bs-gray-200 : #e9ecef;
+ --bs-gray-300 : #dee2e6;
+ --bs-gray-400 : #ced4da;
+ --bs-gray-500 : #adb5bd;
+ --bs-gray-600 : #6c757d;
+ --bs-gray-700 : #495057;
+ --bs-gray-800 : #343a40;
+ --bs-gray-900 : #212529;
+ --bs-primary : #0d6efd;
+ --bs-secondary : #6c757d;
+ --bs-success : #198754;
+ --bs-info : #0dcaf0;
+ --bs-warning : #ffc107;
+ --bs-danger : #dc3545;
+ --bs-light : #f8f9fa;
+ --bs-dark : #212529;
+ --bs-primary-rgb : 13, 110, 253;
+ --bs-secondary-rgb : 108, 117, 125;
+ --bs-success-rgb : 25, 135, 84;
+ --bs-info-rgb : 13, 202, 240;
+ --bs-warning-rgb : 255, 193, 7;
+ --bs-danger-rgb : 220, 53, 69;
+ --bs-light-rgb : 248, 249, 250;
+ --bs-dark-rgb : 33, 37, 41;
+ --bs-white-rgb : 255, 255, 255;
+ --bs-black-rgb : 0, 0, 0;
+ --bs-body-color-rgb : 33, 37, 41;
+ --bs-body-bg-rgb : 255, 255, 255;
+ --bs-font-sans-serif : inherit;
+ --bs-font-monospace : SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient : linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ --bs-body-font-family: inherit;
+ --bs-body-font-size : 1rem;
+ --bs-body-font-weight: 400;
+ --bs-body-line-height: 1.5;
+ --bs-body-color : #212529;
+ --bs-body-bg : #fff;
+}
+
+.container,
+.container-fluid,
+.container-xxl,
+.container-xl,
+.container-lg,
+.container-md,
+.container-sm {
+ width : 100%;
+ padding-right: var(--bs-gutter-x, 0.75rem);
+ padding-left : var(--bs-gutter-x, 0.75rem);
+ margin-right : auto;
+ margin-left : auto;
+}
+
+@media (min-width: 576px) {
+
+ .container-sm,
+ .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+
+ .container-lg,
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+
+ .container-xl,
+ .container-lg,
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 1140px;
+ }
+}
+
+@media (min-width: 1400px) {
+
+ .container-xxl,
+ .container-xl,
+ .container-lg,
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 1320px;
+ }
+}
+
+.col {
+ flex: 1 0 0%;
+}
+
+.row-cols-auto>* {
+ flex : 0 0 auto;
+ width: auto;
+}
+
+.row-cols-1>* {
+ flex : 0 0 auto;
+ width: 100%;
+}
+
+.row-cols-2>* {
+ flex : 0 0 auto;
+ width: 50%;
+}
+
+.row-cols-3>* {
+ flex : 0 0 auto;
+ width: 33.3333333333%;
+}
+
+.row-cols-4>* {
+ flex : 0 0 auto;
+ width: 25%;
+}
+
+.row-cols-5>* {
+ flex : 0 0 auto;
+ width: 20%;
+}
+
+.row-cols-6>* {
+ flex : 0 0 auto;
+ width: 16.6666666667%;
+}
+
+.col-auto {
+ flex : 0 0 auto;
+ width: auto;
+}
+
+.col-1 {
+ flex : 0 0 auto;
+ width: 8.33333333%;
+}
+
+.col-2 {
+ flex : 0 0 auto;
+ width: 16.66666667%;
+}
+
+.col-3 {
+ flex : 0 0 auto;
+ width: 25%;
+}
+
+.col-4 {
+ flex : 0 0 auto;
+ width: 33.33333333%;
+}
+
+.col-5 {
+ flex : 0 0 auto;
+ width: 41.66666667%;
+}
+
+.col-6 {
+ flex : 0 0 auto;
+ width: 50%;
+}
+
+.col-7 {
+ flex : 0 0 auto;
+ width: 58.33333333%;
+}
+
+.col-8 {
+ flex : 0 0 auto;
+ width: 66.66666667%;
+}
+
+.col-9 {
+ flex : 0 0 auto;
+ width: 75%;
+}
+
+.col-10 {
+ flex : 0 0 auto;
+ width: 83.33333333%;
+}
+
+.col-11 {
+ flex : 0 0 auto;
+ width: 91.66666667%;
+}
+
+.col-12 {
+ flex : 0 0 auto;
+ width: 100%;
+}
+
+.offset-1 {
+ margin-left: 8.33333333%;
+}
+
+.offset-2 {
+ margin-left: 16.66666667%;
+}
+
+.offset-3 {
+ margin-left: 25%;
+}
+
+.offset-4 {
+ margin-left: 33.33333333%;
+}
+
+.offset-5 {
+ margin-left: 41.66666667%;
+}
+
+.offset-6 {
+ margin-left: 50%;
+}
+
+.offset-7 {
+ margin-left: 58.33333333%;
+}
+
+.offset-8 {
+ margin-left: 66.66666667%;
+}
+
+.offset-9 {
+ margin-left: 75%;
+}
+
+.offset-10 {
+ margin-left: 83.33333333%;
+}
+
+.offset-11 {
+ margin-left: 91.66666667%;
+}
+
+.g-0,
+.gx-0 {
+ --bs-gutter-x: 0;
+}
+
+.g-0,
+.gy-0 {
+ --bs-gutter-y: 0;
+}
+
+.g-1,
+.gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+
+.g-1,
+.gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+
+.g-2,
+.gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+
+.g-2,
+.gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+
+.g-3,
+.gx-3 {
+ --bs-gutter-x: 1rem;
+}
+
+.g-3,
+.gy-3 {
+ --bs-gutter-y: 1rem;
+}
+
+.g-4,
+.gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+
+.g-4,
+.gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+
+.g-5,
+.gx-5 {
+ --bs-gutter-x: 3rem;
+}
+
+.g-5,
+.gy-5 {
+ --bs-gutter-y: 3rem;
+}
+
+@media (min-width: 576px) {
+ .col-sm {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-sm-auto>* {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-sm-1>* {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-sm-2>* {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-sm-3>* {
+ flex : 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-sm-4>* {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-sm-5>* {
+ flex : 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-sm-6>* {
+ flex : 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-sm-auto {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .col-sm-1 {
+ flex : 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .col-sm-2 {
+ flex : 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .col-sm-3 {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .col-sm-4 {
+ flex : 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .col-sm-5 {
+ flex : 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .col-sm-6 {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .col-sm-7 {
+ flex : 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .col-sm-8 {
+ flex : 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .col-sm-9 {
+ flex : 0 0 auto;
+ width: 75%;
+ }
+
+ .col-sm-10 {
+ flex : 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .col-sm-11 {
+ flex : 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .col-sm-12 {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-sm-0 {
+ margin-left: 0;
+ }
+
+ .offset-sm-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .offset-sm-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+
+ .offset-sm-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .offset-sm-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+
+ .offset-sm-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .offset-sm-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+
+ .offset-sm-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .offset-sm-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .g-sm-0,
+ .gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-sm-0,
+ .gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-sm-1,
+ .gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-sm-1,
+ .gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-sm-2,
+ .gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-sm-2,
+ .gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-sm-3,
+ .gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-sm-3,
+ .gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-sm-4,
+ .gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-sm-4,
+ .gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-sm-5,
+ .gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-sm-5,
+ .gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-md {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-md-auto>* {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-md-1>* {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-md-2>* {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-md-3>* {
+ flex : 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-md-4>* {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-md-5>* {
+ flex : 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-md-6>* {
+ flex : 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-md-auto {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .col-md-1 {
+ flex : 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .col-md-2 {
+ flex : 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .col-md-3 {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .col-md-4 {
+ flex : 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .col-md-5 {
+ flex : 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .col-md-6 {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .col-md-7 {
+ flex : 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .col-md-8 {
+ flex : 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .col-md-9 {
+ flex : 0 0 auto;
+ width: 75%;
+ }
+
+ .col-md-10 {
+ flex : 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .col-md-11 {
+ flex : 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .col-md-12 {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-md-0 {
+ margin-left: 0;
+ }
+
+ .offset-md-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .offset-md-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+
+ .offset-md-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .offset-md-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+
+ .offset-md-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .offset-md-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+
+ .offset-md-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .offset-md-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .g-md-0,
+ .gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-md-0,
+ .gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-md-1,
+ .gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-md-1,
+ .gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-md-2,
+ .gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-md-2,
+ .gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-md-3,
+ .gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-md-3,
+ .gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-md-4,
+ .gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-md-4,
+ .gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-md-5,
+ .gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-md-5,
+ .gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 992px) {
+ .col-lg {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-lg-auto>* {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-lg-1>* {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-lg-2>* {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-lg-3>* {
+ flex : 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-lg-4>* {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-lg-5>* {
+ flex : 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-lg-6>* {
+ flex : 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-lg-auto {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .col-lg-1 {
+ flex : 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .col-lg-2 {
+ flex : 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .col-lg-3 {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .col-lg-4 {
+ flex : 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .col-lg-5 {
+ flex : 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .col-lg-6 {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .col-lg-7 {
+ flex : 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .col-lg-8 {
+ flex : 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .col-lg-9 {
+ flex : 0 0 auto;
+ width: 75%;
+ }
+
+ .col-lg-10 {
+ flex : 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .col-lg-11 {
+ flex : 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .col-lg-12 {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-lg-0 {
+ margin-left: 0;
+ }
+
+ .offset-lg-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .offset-lg-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+
+ .offset-lg-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .offset-lg-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+
+ .offset-lg-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .offset-lg-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+
+ .offset-lg-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .offset-lg-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .g-lg-0,
+ .gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-lg-0,
+ .gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-lg-1,
+ .gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-lg-1,
+ .gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-lg-2,
+ .gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-lg-2,
+ .gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-lg-3,
+ .gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-lg-3,
+ .gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-lg-4,
+ .gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-lg-4,
+ .gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-lg-5,
+ .gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-lg-5,
+ .gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-xl {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-xl-auto>* {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-xl-1>* {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-xl-2>* {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-xl-3>* {
+ flex : 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-xl-4>* {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-xl-5>* {
+ flex : 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-xl-6>* {
+ flex : 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-xl-auto {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .col-xl-1 {
+ flex : 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .col-xl-2 {
+ flex : 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .col-xl-3 {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .col-xl-4 {
+ flex : 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .col-xl-5 {
+ flex : 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .col-xl-6 {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .col-xl-7 {
+ flex : 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .col-xl-8 {
+ flex : 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .col-xl-9 {
+ flex : 0 0 auto;
+ width: 75%;
+ }
+
+ .col-xl-10 {
+ flex : 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .col-xl-11 {
+ flex : 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .col-xl-12 {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-xl-0 {
+ margin-left: 0;
+ }
+
+ .offset-xl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .offset-xl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+
+ .offset-xl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .offset-xl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+
+ .offset-xl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .offset-xl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+
+ .offset-xl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .offset-xl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .g-xl-0,
+ .gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-xl-0,
+ .gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-xl-1,
+ .gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-xl-1,
+ .gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-xl-2,
+ .gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-xl-2,
+ .gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-xl-3,
+ .gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-xl-3,
+ .gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-xl-4,
+ .gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-xl-4,
+ .gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-xl-5,
+ .gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-xl-5,
+ .gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+@media (min-width: 1400px) {
+ .col-xxl {
+ flex: 1 0 0%;
+ }
+
+ .row-cols-xxl-auto>* {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .row-cols-xxl-1>* {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .row-cols-xxl-2>* {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .row-cols-xxl-3>* {
+ flex : 0 0 auto;
+ width: 33.3333333333%;
+ }
+
+ .row-cols-xxl-4>* {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .row-cols-xxl-5>* {
+ flex : 0 0 auto;
+ width: 20%;
+ }
+
+ .row-cols-xxl-6>* {
+ flex : 0 0 auto;
+ width: 16.6666666667%;
+ }
+
+ .col-xxl-auto {
+ flex : 0 0 auto;
+ width: auto;
+ }
+
+ .col-xxl-1 {
+ flex : 0 0 auto;
+ width: 8.33333333%;
+ }
+
+ .col-xxl-2 {
+ flex : 0 0 auto;
+ width: 16.66666667%;
+ }
+
+ .col-xxl-3 {
+ flex : 0 0 auto;
+ width: 25%;
+ }
+
+ .col-xxl-4 {
+ flex : 0 0 auto;
+ width: 33.33333333%;
+ }
+
+ .col-xxl-5 {
+ flex : 0 0 auto;
+ width: 41.66666667%;
+ }
+
+ .col-xxl-6 {
+ flex : 0 0 auto;
+ width: 50%;
+ }
+
+ .col-xxl-7 {
+ flex : 0 0 auto;
+ width: 58.33333333%;
+ }
+
+ .col-xxl-8 {
+ flex : 0 0 auto;
+ width: 66.66666667%;
+ }
+
+ .col-xxl-9 {
+ flex : 0 0 auto;
+ width: 75%;
+ }
+
+ .col-xxl-10 {
+ flex : 0 0 auto;
+ width: 83.33333333%;
+ }
+
+ .col-xxl-11 {
+ flex : 0 0 auto;
+ width: 91.66666667%;
+ }
+
+ .col-xxl-12 {
+ flex : 0 0 auto;
+ width: 100%;
+ }
+
+ .offset-xxl-0 {
+ margin-left: 0;
+ }
+
+ .offset-xxl-1 {
+ margin-left: 8.33333333%;
+ }
+
+ .offset-xxl-2 {
+ margin-left: 16.66666667%;
+ }
+
+ .offset-xxl-3 {
+ margin-left: 25%;
+ }
+
+ .offset-xxl-4 {
+ margin-left: 33.33333333%;
+ }
+
+ .offset-xxl-5 {
+ margin-left: 41.66666667%;
+ }
+
+ .offset-xxl-6 {
+ margin-left: 50%;
+ }
+
+ .offset-xxl-7 {
+ margin-left: 58.33333333%;
+ }
+
+ .offset-xxl-8 {
+ margin-left: 66.66666667%;
+ }
+
+ .offset-xxl-9 {
+ margin-left: 75%;
+ }
+
+ .offset-xxl-10 {
+ margin-left: 83.33333333%;
+ }
+
+ .offset-xxl-11 {
+ margin-left: 91.66666667%;
+ }
+
+ .g-xxl-0,
+ .gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+
+ .g-xxl-0,
+ .gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+
+ .g-xxl-1,
+ .gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+
+ .g-xxl-1,
+ .gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+
+ .g-xxl-2,
+ .gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+
+ .g-xxl-2,
+ .gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+
+ .g-xxl-3,
+ .gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+
+ .g-xxl-3,
+ .gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+
+ .g-xxl-4,
+ .gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+
+ .g-xxl-4,
+ .gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+
+ .g-xxl-5,
+ .gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+
+ .g-xxl-5,
+ .gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+
+.d-inline {
+ display: inline !important;
+}
+
+.d-inline-block {
+ display: inline-block !important;
+}
+
+.d-block {
+ display: block !important;
+}
+
+.d-grid {
+ display: grid !important;
+}
+
+.d-table {
+ display: table !important;
+}
+
+.d-table-row {
+ display: table-row !important;
+}
+
+.d-table-cell {
+ display: table-cell !important;
+}
+
+.d-flex {
+ display: flex !important;
+}
+
+.d-inline-flex {
+ display: inline-flex !important;
+}
+
+.d-none {
+ display: none !important;
+}
+
+.flex-fill {
+ flex: 1 1 auto !important;
+}
+
+.flex-row {
+ flex-direction: row !important;
+}
+
+.flex-column {
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+
+.flex-grow-0 {
+ flex-grow: 0 !important;
+}
+
+.flex-grow-1 {
+ flex-grow: 1 !important;
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+
+.flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+
+.justify-content-start {
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ justify-content: space-around !important;
+}
+
+.justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+
+.align-items-start {
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ align-content: center !important;
+}
+
+.align-content-between {
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ align-self: auto !important;
+}
+
+.align-self-start {
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ align-self: stretch !important;
+}
+
+.order-first {
+ order: -1 !important;
+}
+
+.order-0 {
+ order: 0 !important;
+}
+
+.order-1 {
+ order: 1 !important;
+}
+
+.order-2 {
+ order: 2 !important;
+}
+
+.order-3 {
+ order: 3 !important;
+}
+
+.order-4 {
+ order: 4 !important;
+}
+
+.order-5 {
+ order: 5 !important;
+}
+
+.order-last {
+ order: 6 !important;
+}
+
+.m-0 {
+ margin: 0 !important;
+}
+
+.m-1 {
+ margin: 0.25rem !important;
+}
+
+.m-2 {
+ margin: 0.5rem !important;
+}
+
+.m-3 {
+ margin: 1rem !important;
+}
+
+.m-4 {
+ margin: 1.5rem !important;
+}
+
+.m-5 {
+ margin: 3rem !important;
+}
+
+.m-auto {
+ margin: auto !important;
+}
+
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left : 0 !important;
+}
+
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left : 0.25rem !important;
+}
+
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left : 0.5rem !important;
+}
+
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left : 1rem !important;
+}
+
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left : 1.5rem !important;
+}
+
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left : 3rem !important;
+}
+
+.mx-auto {
+ margin-right: auto !important;
+ margin-left : auto !important;
+}
+
+.my-0 {
+ margin-top : 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.my-1 {
+ margin-top : 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.my-2 {
+ margin-top : 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.my-3 {
+ margin-top : 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.my-4 {
+ margin-top : 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.my-5 {
+ margin-top : 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.my-auto {
+ margin-top : auto !important;
+ margin-bottom: auto !important;
+}
+
+.mt-0 {
+ margin-top: 0 !important;
+}
+
+.mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.mt-3 {
+ margin-top: 1rem !important;
+}
+
+.mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.mt-5 {
+ margin-top: 3rem !important;
+}
+
+.mt-auto {
+ margin-top: auto !important;
+}
+
+.me-0 {
+ margin-right: 0 !important;
+}
+
+.me-1 {
+ margin-right: 0.25rem !important;
+}
+
+.me-2 {
+ margin-right: 0.5rem !important;
+}
+
+.me-3 {
+ margin-right: 1rem !important;
+}
+
+.me-4 {
+ margin-right: 1.5rem !important;
+}
+
+.me-5 {
+ margin-right: 3rem !important;
+}
+
+.me-auto {
+ margin-right: auto !important;
+}
+
+.mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.mb-auto {
+ margin-bottom: auto !important;
+}
+
+.ms-0 {
+ margin-left: 0 !important;
+}
+
+.ms-1 {
+ margin-left: 0.25rem !important;
+}
+
+.ms-2 {
+ margin-left: 0.5rem !important;
+}
+
+.ms-3 {
+ margin-left: 1rem !important;
+}
+
+.ms-4 {
+ margin-left: 1.5rem !important;
+}
+
+.ms-5 {
+ margin-left: 3rem !important;
+}
+
+.ms-auto {
+ margin-left: auto !important;
+}
+
+.p-0 {
+ padding: 0 !important;
+}
+
+.p-1 {
+ padding: 0.25rem !important;
+}
+
+.p-2 {
+ padding: 0.5rem !important;
+}
+
+.p-3 {
+ padding: 1rem !important;
+}
+
+.p-4 {
+ padding: 1.5rem !important;
+}
+
+.p-5 {
+ padding: 3rem !important;
+}
+
+.px-0 {
+ padding-right: 0 !important;
+ padding-left : 0 !important;
+}
+
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left : 0.25rem !important;
+}
+
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left : 0.5rem !important;
+}
+
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left : 1rem !important;
+}
+
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left : 1.5rem !important;
+}
+
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left : 3rem !important;
+}
+
+.py-0 {
+ padding-top : 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.py-1 {
+ padding-top : 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.py-2 {
+ padding-top : 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.py-3 {
+ padding-top : 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.py-4 {
+ padding-top : 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.py-5 {
+ padding-top : 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.pt-0 {
+ padding-top: 0 !important;
+}
+
+.pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.pt-3 {
+ padding-top: 1rem !important;
+}
+
+.pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.pt-5 {
+ padding-top: 3rem !important;
+}
+
+.pe-0 {
+ padding-right: 0 !important;
+}
+
+.pe-1 {
+ padding-right: 0.25rem !important;
+}
+
+.pe-2 {
+ padding-right: 0.5rem !important;
+}
+
+.pe-3 {
+ padding-right: 1rem !important;
+}
+
+.pe-4 {
+ padding-right: 1.5rem !important;
+}
+
+.pe-5 {
+ padding-right: 3rem !important;
+}
+
+.pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.ps-0 {
+ padding-left: 0 !important;
+}
+
+.ps-1 {
+ padding-left: 0.25rem !important;
+}
+
+.ps-2 {
+ padding-left: 0.5rem !important;
+}
+
+.ps-3 {
+ padding-left: 1rem !important;
+}
+
+.ps-4 {
+ padding-left: 1.5rem !important;
+}
+
+.ps-5 {
+ padding-left: 3rem !important;
+}
+
+@media (min-width: 576px) {
+ .d-sm-inline {
+ display: inline !important;
+ }
+
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-sm-block {
+ display: block !important;
+ }
+
+ .d-sm-grid {
+ display: grid !important;
+ }
+
+ .d-sm-table {
+ display: table !important;
+ }
+
+ .d-sm-table-row {
+ display: table-row !important;
+ }
+
+ .d-sm-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-sm-flex {
+ display: flex !important;
+ }
+
+ .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-sm-none {
+ display: none !important;
+ }
+
+ .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-sm-row {
+ flex-direction: row !important;
+ }
+
+ .flex-sm-column {
+ flex-direction: column !important;
+ }
+
+ .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-sm-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-sm-center {
+ align-items: center !important;
+ }
+
+ .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-sm-center {
+ align-content: center !important;
+ }
+
+ .align-content-sm-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-sm-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-sm-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-sm-center {
+ align-self: center !important;
+ }
+
+ .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-sm-first {
+ order: -1 !important;
+ }
+
+ .order-sm-0 {
+ order: 0 !important;
+ }
+
+ .order-sm-1 {
+ order: 1 !important;
+ }
+
+ .order-sm-2 {
+ order: 2 !important;
+ }
+
+ .order-sm-3 {
+ order: 3 !important;
+ }
+
+ .order-sm-4 {
+ order: 4 !important;
+ }
+
+ .order-sm-5 {
+ order: 5 !important;
+ }
+
+ .order-sm-last {
+ order: 6 !important;
+ }
+
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
+
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
+
+ .m-sm-auto {
+ margin: auto !important;
+ }
+
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left : 0 !important;
+ }
+
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left : 0.25rem !important;
+ }
+
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left : 0.5rem !important;
+ }
+
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left : 1rem !important;
+ }
+
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left : 1.5rem !important;
+ }
+
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left : 3rem !important;
+ }
+
+ .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left : auto !important;
+ }
+
+ .my-sm-0 {
+ margin-top : 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-sm-1 {
+ margin-top : 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-sm-2 {
+ margin-top : 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-sm-3 {
+ margin-top : 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-sm-4 {
+ margin-top : 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-sm-5 {
+ margin-top : 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-sm-auto {
+ margin-top : auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-sm-auto {
+ margin-top: auto !important;
+ }
+
+ .me-sm-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-sm-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-sm-auto {
+ margin-left: auto !important;
+ }
+
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+
+ .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-sm-3 {
+ padding: 1rem !important;
+ }
+
+ .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-sm-5 {
+ padding: 3rem !important;
+ }
+
+ .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left : 0 !important;
+ }
+
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left : 0.25rem !important;
+ }
+
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left : 0.5rem !important;
+ }
+
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left : 1rem !important;
+ }
+
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left : 1.5rem !important;
+ }
+
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left : 3rem !important;
+ }
+
+ .py-sm-0 {
+ padding-top : 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-sm-1 {
+ padding-top : 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-sm-2 {
+ padding-top : 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-sm-3 {
+ padding-top : 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-sm-4 {
+ padding-top : 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-sm-5 {
+ padding-top : 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .d-md-inline {
+ display: inline !important;
+ }
+
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-md-block {
+ display: block !important;
+ }
+
+ .d-md-grid {
+ display: grid !important;
+ }
+
+ .d-md-table {
+ display: table !important;
+ }
+
+ .d-md-table-row {
+ display: table-row !important;
+ }
+
+ .d-md-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-md-flex {
+ display: flex !important;
+ }
+
+ .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-md-none {
+ display: none !important;
+ }
+
+ .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-md-row {
+ flex-direction: row !important;
+ }
+
+ .flex-md-column {
+ flex-direction: column !important;
+ }
+
+ .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-md-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-md-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-md-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-md-center {
+ align-items: center !important;
+ }
+
+ .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-md-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-md-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-md-center {
+ align-content: center !important;
+ }
+
+ .align-content-md-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-md-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-md-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-md-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-md-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-md-center {
+ align-self: center !important;
+ }
+
+ .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-md-first {
+ order: -1 !important;
+ }
+
+ .order-md-0 {
+ order: 0 !important;
+ }
+
+ .order-md-1 {
+ order: 1 !important;
+ }
+
+ .order-md-2 {
+ order: 2 !important;
+ }
+
+ .order-md-3 {
+ order: 3 !important;
+ }
+
+ .order-md-4 {
+ order: 4 !important;
+ }
+
+ .order-md-5 {
+ order: 5 !important;
+ }
+
+ .order-md-last {
+ order: 6 !important;
+ }
+
+ .m-md-0 {
+ margin: 0 !important;
+ }
+
+ .m-md-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-md-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-md-3 {
+ margin: 1rem !important;
+ }
+
+ .m-md-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-md-5 {
+ margin: 3rem !important;
+ }
+
+ .m-md-auto {
+ margin: auto !important;
+ }
+
+ .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left : 0 !important;
+ }
+
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left : 0.25rem !important;
+ }
+
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left : 0.5rem !important;
+ }
+
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left : 1rem !important;
+ }
+
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left : 1.5rem !important;
+ }
+
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left : 3rem !important;
+ }
+
+ .mx-md-auto {
+ margin-right: auto !important;
+ margin-left : auto !important;
+ }
+
+ .my-md-0 {
+ margin-top : 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-md-1 {
+ margin-top : 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-md-2 {
+ margin-top : 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-md-3 {
+ margin-top : 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-md-4 {
+ margin-top : 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-md-5 {
+ margin-top : 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-md-auto {
+ margin-top : auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-md-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-md-auto {
+ margin-top: auto !important;
+ }
+
+ .me-md-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-md-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-md-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-md-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-md-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-md-auto {
+ margin-left: auto !important;
+ }
+
+ .p-md-0 {
+ padding: 0 !important;
+ }
+
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-md-3 {
+ padding: 1rem !important;
+ }
+
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-md-5 {
+ padding: 3rem !important;
+ }
+
+ .px-md-0 {
+ padding-right: 0 !important;
+ padding-left : 0 !important;
+ }
+
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left : 0.25rem !important;
+ }
+
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left : 0.5rem !important;
+ }
+
+ .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left : 1rem !important;
+ }
+
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left : 1.5rem !important;
+ }
+
+ .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left : 3rem !important;
+ }
+
+ .py-md-0 {
+ padding-top : 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-md-1 {
+ padding-top : 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-md-2 {
+ padding-top : 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-md-3 {
+ padding-top : 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-md-4 {
+ padding-top : 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-md-5 {
+ padding-top : 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-md-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-md-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-md-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .d-lg-inline {
+ display: inline !important;
+ }
+
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-lg-block {
+ display: block !important;
+ }
+
+ .d-lg-grid {
+ display: grid !important;
+ }
+
+ .d-lg-table {
+ display: table !important;
+ }
+
+ .d-lg-table-row {
+ display: table-row !important;
+ }
+
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-lg-flex {
+ display: flex !important;
+ }
+
+ .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-lg-none {
+ display: none !important;
+ }
+
+ .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-lg-row {
+ flex-direction: row !important;
+ }
+
+ .flex-lg-column {
+ flex-direction: column !important;
+ }
+
+ .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-lg-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-lg-center {
+ align-items: center !important;
+ }
+
+ .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-lg-center {
+ align-content: center !important;
+ }
+
+ .align-content-lg-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-lg-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-lg-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-lg-center {
+ align-self: center !important;
+ }
+
+ .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-lg-first {
+ order: -1 !important;
+ }
+
+ .order-lg-0 {
+ order: 0 !important;
+ }
+
+ .order-lg-1 {
+ order: 1 !important;
+ }
+
+ .order-lg-2 {
+ order: 2 !important;
+ }
+
+ .order-lg-3 {
+ order: 3 !important;
+ }
+
+ .order-lg-4 {
+ order: 4 !important;
+ }
+
+ .order-lg-5 {
+ order: 5 !important;
+ }
+
+ .order-lg-last {
+ order: 6 !important;
+ }
+
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+
+ .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-lg-3 {
+ margin: 1rem !important;
+ }
+
+ .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-lg-5 {
+ margin: 3rem !important;
+ }
+
+ .m-lg-auto {
+ margin: auto !important;
+ }
+
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left : 0 !important;
+ }
+
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left : 0.25rem !important;
+ }
+
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left : 0.5rem !important;
+ }
+
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left : 1rem !important;
+ }
+
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left : 1.5rem !important;
+ }
+
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left : 3rem !important;
+ }
+
+ .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left : auto !important;
+ }
+
+ .my-lg-0 {
+ margin-top : 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-lg-1 {
+ margin-top : 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-lg-2 {
+ margin-top : 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-lg-3 {
+ margin-top : 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-lg-4 {
+ margin-top : 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-lg-5 {
+ margin-top : 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-lg-auto {
+ margin-top : auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-lg-auto {
+ margin-top: auto !important;
+ }
+
+ .me-lg-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-lg-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-lg-auto {
+ margin-left: auto !important;
+ }
+
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+
+ .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-lg-3 {
+ padding: 1rem !important;
+ }
+
+ .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-lg-5 {
+ padding: 3rem !important;
+ }
+
+ .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left : 0 !important;
+ }
+
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left : 0.25rem !important;
+ }
+
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left : 0.5rem !important;
+ }
+
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left : 1rem !important;
+ }
+
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left : 1.5rem !important;
+ }
+
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left : 3rem !important;
+ }
+
+ .py-lg-0 {
+ padding-top : 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-lg-1 {
+ padding-top : 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-lg-2 {
+ padding-top : 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-lg-3 {
+ padding-top : 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-lg-4 {
+ padding-top : 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-lg-5 {
+ padding-top : 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .d-xl-inline {
+ display: inline !important;
+ }
+
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-xl-block {
+ display: block !important;
+ }
+
+ .d-xl-grid {
+ display: grid !important;
+ }
+
+ .d-xl-table {
+ display: table !important;
+ }
+
+ .d-xl-table-row {
+ display: table-row !important;
+ }
+
+ .d-xl-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-xl-flex {
+ display: flex !important;
+ }
+
+ .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-xl-none {
+ display: none !important;
+ }
+
+ .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-xl-row {
+ flex-direction: row !important;
+ }
+
+ .flex-xl-column {
+ flex-direction: column !important;
+ }
+
+ .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-xl-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-xl-center {
+ align-items: center !important;
+ }
+
+ .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-xl-center {
+ align-content: center !important;
+ }
+
+ .align-content-xl-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-xl-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-xl-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-xl-center {
+ align-self: center !important;
+ }
+
+ .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-xl-first {
+ order: -1 !important;
+ }
+
+ .order-xl-0 {
+ order: 0 !important;
+ }
+
+ .order-xl-1 {
+ order: 1 !important;
+ }
+
+ .order-xl-2 {
+ order: 2 !important;
+ }
+
+ .order-xl-3 {
+ order: 3 !important;
+ }
+
+ .order-xl-4 {
+ order: 4 !important;
+ }
+
+ .order-xl-5 {
+ order: 5 !important;
+ }
+
+ .order-xl-last {
+ order: 6 !important;
+ }
+
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+
+ .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-xl-3 {
+ margin: 1rem !important;
+ }
+
+ .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-xl-5 {
+ margin: 3rem !important;
+ }
+
+ .m-xl-auto {
+ margin: auto !important;
+ }
+
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left : 0 !important;
+ }
+
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left : 0.25rem !important;
+ }
+
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left : 0.5rem !important;
+ }
+
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left : 1rem !important;
+ }
+
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left : 1.5rem !important;
+ }
+
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left : 3rem !important;
+ }
+
+ .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left : auto !important;
+ }
+
+ .my-xl-0 {
+ margin-top : 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-xl-1 {
+ margin-top : 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-xl-2 {
+ margin-top : 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-xl-3 {
+ margin-top : 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-xl-4 {
+ margin-top : 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-xl-5 {
+ margin-top : 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-xl-auto {
+ margin-top : auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-xl-auto {
+ margin-top: auto !important;
+ }
+
+ .me-xl-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-xl-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-xl-auto {
+ margin-left: auto !important;
+ }
+
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+
+ .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-xl-3 {
+ padding: 1rem !important;
+ }
+
+ .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+
+ .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left : 0 !important;
+ }
+
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left : 0.25rem !important;
+ }
+
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left : 0.5rem !important;
+ }
+
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left : 1rem !important;
+ }
+
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left : 1.5rem !important;
+ }
+
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left : 3rem !important;
+ }
+
+ .py-xl-0 {
+ padding-top : 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-xl-1 {
+ padding-top : 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-xl-2 {
+ padding-top : 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-xl-3 {
+ padding-top : 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-xl-4 {
+ padding-top : 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-xl-5 {
+ padding-top : 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+}
+
+@media (min-width: 1400px) {
+ .d-xxl-inline {
+ display: inline !important;
+ }
+
+ .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-xxl-block {
+ display: block !important;
+ }
+
+ .d-xxl-grid {
+ display: grid !important;
+ }
+
+ .d-xxl-table {
+ display: table !important;
+ }
+
+ .d-xxl-table-row {
+ display: table-row !important;
+ }
+
+ .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-xxl-flex {
+ display: flex !important;
+ }
+
+ .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-xxl-none {
+ display: none !important;
+ }
+
+ .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+
+ .flex-xxl-row {
+ flex-direction: row !important;
+ }
+
+ .flex-xxl-column {
+ flex-direction: column !important;
+ }
+
+ .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+
+ .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+
+ .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+
+ .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+
+ .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+
+ .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+
+ .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+
+ .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+
+ .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+
+ .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+
+ .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+
+ .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+
+ .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+
+ .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+
+ .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+
+ .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+
+ .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+
+ .align-items-xxl-center {
+ align-items: center !important;
+ }
+
+ .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+
+ .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+
+ .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+
+ .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+
+ .align-content-xxl-center {
+ align-content: center !important;
+ }
+
+ .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+
+ .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+
+ .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+
+ .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+
+ .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+
+ .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+
+ .align-self-xxl-center {
+ align-self: center !important;
+ }
+
+ .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+
+ .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+
+ .order-xxl-first {
+ order: -1 !important;
+ }
+
+ .order-xxl-0 {
+ order: 0 !important;
+ }
+
+ .order-xxl-1 {
+ order: 1 !important;
+ }
+
+ .order-xxl-2 {
+ order: 2 !important;
+ }
+
+ .order-xxl-3 {
+ order: 3 !important;
+ }
+
+ .order-xxl-4 {
+ order: 4 !important;
+ }
+
+ .order-xxl-5 {
+ order: 5 !important;
+ }
+
+ .order-xxl-last {
+ order: 6 !important;
+ }
+
+ .m-xxl-0 {
+ margin: 0 !important;
+ }
+
+ .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+
+ .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+
+ .m-xxl-3 {
+ margin: 1rem !important;
+ }
+
+ .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+
+ .m-xxl-5 {
+ margin: 3rem !important;
+ }
+
+ .m-xxl-auto {
+ margin: auto !important;
+ }
+
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left : 0 !important;
+ }
+
+ .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left : 0.25rem !important;
+ }
+
+ .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left : 0.5rem !important;
+ }
+
+ .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left : 1rem !important;
+ }
+
+ .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left : 1.5rem !important;
+ }
+
+ .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left : 3rem !important;
+ }
+
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left : auto !important;
+ }
+
+ .my-xxl-0 {
+ margin-top : 0 !important;
+ margin-bottom: 0 !important;
+ }
+
+ .my-xxl-1 {
+ margin-top : 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+
+ .my-xxl-2 {
+ margin-top : 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .my-xxl-3 {
+ margin-top : 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+
+ .my-xxl-4 {
+ margin-top : 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+
+ .my-xxl-5 {
+ margin-top : 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+
+ .my-xxl-auto {
+ margin-top : auto !important;
+ margin-bottom: auto !important;
+ }
+
+ .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+
+ .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+
+ .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+
+ .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+
+ .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+
+ .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+
+ .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+
+ .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+
+ .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+
+ .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+
+ .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+
+ .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+
+ .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+
+ .me-xxl-auto {
+ margin-right: auto !important;
+ }
+
+ .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+
+ .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+
+ .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+
+ .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+
+ .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+
+ .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+
+ .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+
+ .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+
+ .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+
+ .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+
+ .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+
+ .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+
+ .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+
+ .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+
+ .p-xxl-0 {
+ padding: 0 !important;
+ }
+
+ .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+
+ .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+
+ .p-xxl-3 {
+ padding: 1rem !important;
+ }
+
+ .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+
+ .p-xxl-5 {
+ padding: 3rem !important;
+ }
+
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left : 0 !important;
+ }
+
+ .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left : 0.25rem !important;
+ }
+
+ .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left : 0.5rem !important;
+ }
+
+ .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left : 1rem !important;
+ }
+
+ .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left : 1.5rem !important;
+ }
+
+ .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left : 3rem !important;
+ }
+
+ .py-xxl-0 {
+ padding-top : 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .py-xxl-1 {
+ padding-top : 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+
+ .py-xxl-2 {
+ padding-top : 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+
+ .py-xxl-3 {
+ padding-top : 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+
+ .py-xxl-4 {
+ padding-top : 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+
+ .py-xxl-5 {
+ padding-top : 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+
+ .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+
+ .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+
+ .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+
+ .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+
+ .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+
+ .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+
+ .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+
+ .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+
+ .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+
+ .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+
+ .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+
+ .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+
+ .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+
+ .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+
+ .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+
+ .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+
+ .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+
+ .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+
+ .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+
+ .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+
+ .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+
+ .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+
+ .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+
+ .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+}
+
+@media print {
+ .d-print-inline {
+ display: inline !important;
+ }
+
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+
+ .d-print-block {
+ display: block !important;
+ }
+
+ .d-print-grid {
+ display: grid !important;
+ }
+
+ .d-print-table {
+ display: table !important;
+ }
+
+ .d-print-table-row {
+ display: table-row !important;
+ }
+
+ .d-print-table-cell {
+ display: table-cell !important;
+ }
+
+ .d-print-flex {
+ display: flex !important;
+ }
+
+ .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+
+ .d-print-none {
+ display: none !important;
+ }
+}
+
+// Tooltips
+.tooltip {
+ position : absolute;
+ z-index : 1080;
+ display : block;
+ margin : 0;
+ font-family : var(--bs-font-sans-serif);
+ font-style : normal;
+ font-weight : 400;
+ line-height : 1.5;
+ text-align : left;
+ text-align : start;
+ text-decoration: none;
+ text-shadow : none;
+ text-transform : none;
+ letter-spacing : normal;
+ word-break : normal;
+ word-spacing : normal;
+ white-space : normal;
+ line-break : auto;
+ font-size : 0.875rem;
+ word-wrap : break-word;
+ opacity : 0;
+}
+
+.tooltip.show {
+ opacity: 0.9;
+}
+
+.tooltip .tooltip-arrow {
+ position: absolute;
+ display : block;
+ width : 0.8rem;
+ height : 0.4rem;
+}
+
+.tooltip .tooltip-arrow::before {
+ position : absolute;
+ content : "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bs-tooltip-top,
+.bs-tooltip-auto[data-popper-placement^=top] {
+ padding: 0.4rem 0;
+}
+
+.bs-tooltip-top .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: 0;
+}
+
+.bs-tooltip-top .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top : -1px;
+ border-width : 0.4rem 0.4rem 0;
+ border-top-color: #000;
+}
+
+.bs-tooltip-end,
+.bs-tooltip-auto[data-popper-placement^=right] {
+ padding: 0 0.4rem;
+}
+
+.bs-tooltip-end .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left : 0;
+ width : 0.4rem;
+ height: 0.8rem;
+}
+
+.bs-tooltip-end .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right : -1px;
+ border-width : 0.4rem 0.4rem 0.4rem 0;
+ border-right-color: #000;
+}
+
+.bs-tooltip-bottom,
+.bs-tooltip-auto[data-popper-placement^=bottom] {
+ padding: 0.4rem 0;
+}
+
+.bs-tooltip-bottom .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: 0;
+}
+
+.bs-tooltip-bottom .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom : -1px;
+ border-width : 0 0.4rem 0.4rem;
+ border-bottom-color: #000;
+}
+
+.bs-tooltip-start,
+.bs-tooltip-auto[data-popper-placement^=left] {
+ padding: 0 0.4rem;
+}
+
+.bs-tooltip-start .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right : 0;
+ width : 0.4rem;
+ height: 0.8rem;
+}
+
+.bs-tooltip-start .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left : -1px;
+ border-width : 0.4rem 0 0.4rem 0.4rem;
+ border-left-color: #000;
+}
+
+.tooltip-inner {
+ max-width : 200px;
+ padding : 0.25rem 0.5rem;
+ color : #fff;
+ text-align : center;
+ background-color: #000;
+ border-radius : 0.25rem;
+ -webkit-user-select: none;
+ user-select: none;
+ pointer-events: none;
+}
+
+.popover {
+ position: absolute;
+ top : 0;
+ left : 0
+ /* rtl:ignore */
+ ;
+ z-index : 1070;
+ display : block;
+ max-width : 276px;
+ font-family : var(--bs-font-sans-serif);
+ font-style : normal;
+ font-weight : 400;
+ line-height : 1.5;
+ text-align : left;
+ text-align : start;
+ text-decoration : none;
+ text-shadow : none;
+ text-transform : none;
+ letter-spacing : normal;
+ word-break : normal;
+ word-spacing : normal;
+ white-space : normal;
+ line-break : auto;
+ font-size : 0.875rem;
+ word-wrap : break-word;
+ background-color: #fff;
+ background-clip : padding-box;
+ border : 1px solid rgba(0, 0, 0, 0.2);
+ border-radius : 0.3rem;
+}
+
+.popover .popover-arrow {
+ position: absolute;
+ display : block;
+ width : 1rem;
+ height : 0.5rem;
+}
+
+.popover .popover-arrow::before,
+.popover .popover-arrow::after {
+ position : absolute;
+ display : block;
+ content : "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bs-popover-top>.popover-arrow,
+.bs-popover-auto[data-popper-placement^=top]>.popover-arrow {
+ bottom: calc(-0.5rem - 1px);
+}
+
+.bs-popover-top>.popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before {
+ bottom : 0;
+ border-width : 0.5rem 0.5rem 0;
+ border-top-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-top>.popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after {
+ bottom : 1px;
+ border-width : 0.5rem 0.5rem 0;
+ border-top-color: #fff;
+}
+
+.bs-popover-end>.popover-arrow,
+.bs-popover-auto[data-popper-placement^=right]>.popover-arrow {
+ left : calc(-0.5rem - 1px);
+ width : 0.5rem;
+ height: 1rem;
+}
+
+.bs-popover-end>.popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before {
+ left : 0;
+ border-width : 0.5rem 0.5rem 0.5rem 0;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-end>.popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after {
+ left : 1px;
+ border-width : 0.5rem 0.5rem 0.5rem 0;
+ border-right-color: #fff;
+}
+
+.bs-popover-bottom>.popover-arrow,
+.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow {
+ top: calc(-0.5rem - 1px);
+}
+
+.bs-popover-bottom>.popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before {
+ top : 0;
+ border-width : 0 0.5rem 0.5rem 0.5rem;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-bottom>.popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after {
+ top : 1px;
+ border-width : 0 0.5rem 0.5rem 0.5rem;
+ border-bottom-color: #fff;
+}
+
+.bs-popover-bottom .popover-header::before,
+.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position : absolute;
+ top : 0;
+ left : 50%;
+ display : block;
+ width : 1rem;
+ margin-left : -0.5rem;
+ content : "";
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.bs-popover-start>.popover-arrow,
+.bs-popover-auto[data-popper-placement^=left]>.popover-arrow {
+ right : calc(-0.5rem - 1px);
+ width : 0.5rem;
+ height: 1rem;
+}
+
+.bs-popover-start>.popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before {
+ right : 0;
+ border-width : 0.5rem 0 0.5rem 0.5rem;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.bs-popover-start>.popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after {
+ right : 1px;
+ border-width : 0.5rem 0 0.5rem 0.5rem;
+ border-left-color: #fff;
+}
+
+.popover-header {
+ padding : 0.5rem 1rem;
+ margin-bottom : 0;
+ font-size : 1rem;
+ background-color : #f0f0f0;
+ border-bottom : 1px solid rgba(0, 0, 0, 0.2);
+ border-top-left-radius : calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
+}
+
+.popover-header:empty {
+ display: none;
+}
+
+.popover-body {
+ padding: 1rem 1rem;
+ color : #212529;
+}
diff --git a/src/renderer/less/codicon.css b/src/renderer/less/codicon.css
new file mode 100644
index 00000000..bd00654c
--- /dev/null
+++ b/src/renderer/less/codicon.css
@@ -0,0 +1,553 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+@font-face {
+ font-family: "codicon";
+ font-display: block;
+ src: url("codicon.ttf") format("truetype");
+}
+
+.codicon[class*='codicon-'] {
+ font: normal normal normal 16px/1 codicon;
+ display: inline-block;
+ text-decoration: none;
+ text-rendering: auto;
+ text-align: center;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+}
+
+/*---------------------
+ * Modifiers
+ *-------------------*/
+
+@keyframes codicon-spin {
+ 100% {
+ transform:rotate(360deg);
+ }
+}
+
+.codicon-sync.codicon-modifier-spin,
+.codicon-loading.codicon-modifier-spin,
+.codicon-gear.codicon-modifier-spin {
+ /* Use steps to throttle FPS to reduce CPU usage */
+ animation: codicon-spin 1.5s steps(30) infinite;
+}
+
+.codicon-modifier-disabled {
+ opacity: 0.5;
+}
+
+/* custom speed & easing for loading icon */
+.codicon-loading {
+ animation-duration: 1s !important;
+ animation-timing-function: cubic-bezier(0.53, 0.21, 0.29, 0.67) !important;
+}
+
+/*---------------------
+ * Icons
+ *-------------------*/
+
+.codicon-add:before { content: "\ea60" }
+.codicon-plus:before { content: "\ea60" }
+.codicon-gist-new:before { content: "\ea60" }
+.codicon-repo-create:before { content: "\ea60" }
+.codicon-lightbulb:before { content: "\ea61" }
+.codicon-light-bulb:before { content: "\ea61" }
+.codicon-repo:before { content: "\ea62" }
+.codicon-repo-delete:before { content: "\ea62" }
+.codicon-gist-fork:before { content: "\ea63" }
+.codicon-repo-forked:before { content: "\ea63" }
+.codicon-git-pull-request:before { content: "\ea64" }
+.codicon-git-pull-request-abandoned:before { content: "\ea64" }
+.codicon-record-keys:before { content: "\ea65" }
+.codicon-keyboard:before { content: "\ea65" }
+.codicon-tag:before { content: "\ea66" }
+.codicon-tag-add:before { content: "\ea66" }
+.codicon-tag-remove:before { content: "\ea66" }
+.codicon-person:before { content: "\ea67" }
+.codicon-person-follow:before { content: "\ea67" }
+.codicon-person-outline:before { content: "\ea67" }
+.codicon-person-filled:before { content: "\ea67" }
+.codicon-git-branch:before { content: "\ea68" }
+.codicon-git-branch-create:before { content: "\ea68" }
+.codicon-git-branch-delete:before { content: "\ea68" }
+.codicon-source-control:before { content: "\ea68" }
+.codicon-mirror:before { content: "\ea69" }
+.codicon-mirror-public:before { content: "\ea69" }
+.codicon-star:before { content: "\ea6a" }
+.codicon-star-add:before { content: "\ea6a" }
+.codicon-star-delete:before { content: "\ea6a" }
+.codicon-star-empty:before { content: "\ea6a" }
+.codicon-comment:before { content: "\ea6b" }
+.codicon-comment-add:before { content: "\ea6b" }
+.codicon-alert:before { content: "\ea6c" }
+.codicon-warning:before { content: "\ea6c" }
+.codicon-search:before { content: "\ea6d" }
+.codicon-search-save:before { content: "\ea6d" }
+.codicon-log-out:before { content: "\ea6e" }
+.codicon-sign-out:before { content: "\ea6e" }
+.codicon-log-in:before { content: "\ea6f" }
+.codicon-sign-in:before { content: "\ea6f" }
+.codicon-eye:before { content: "\ea70" }
+.codicon-eye-unwatch:before { content: "\ea70" }
+.codicon-eye-watch:before { content: "\ea70" }
+.codicon-circle-filled:before { content: "\ea71" }
+.codicon-primitive-dot:before { content: "\ea71" }
+.codicon-close-dirty:before { content: "\ea71" }
+.codicon-debug-breakpoint:before { content: "\ea71" }
+.codicon-debug-breakpoint-disabled:before { content: "\ea71" }
+.codicon-debug-hint:before { content: "\ea71" }
+.codicon-primitive-square:before { content: "\ea72" }
+.codicon-edit:before { content: "\ea73" }
+.codicon-pencil:before { content: "\ea73" }
+.codicon-info:before { content: "\ea74" }
+.codicon-issue-opened:before { content: "\ea74" }
+.codicon-gist-private:before { content: "\ea75" }
+.codicon-git-fork-private:before { content: "\ea75" }
+.codicon-lock:before { content: "\ea75" }
+.codicon-mirror-private:before { content: "\ea75" }
+.codicon-close:before { content: "\ea76" }
+.codicon-remove-close:before { content: "\ea76" }
+.codicon-x:before { content: "\ea76" }
+.codicon-repo-sync:before { content: "\ea77" }
+.codicon-sync:before { content: "\ea77" }
+.codicon-clone:before { content: "\ea78" }
+.codicon-desktop-download:before { content: "\ea78" }
+.codicon-beaker:before { content: "\ea79" }
+.codicon-microscope:before { content: "\ea79" }
+.codicon-vm:before { content: "\ea7a" }
+.codicon-device-desktop:before { content: "\ea7a" }
+.codicon-file:before { content: "\ea7b" }
+.codicon-file-text:before { content: "\ea7b" }
+.codicon-more:before { content: "\ea7c" }
+.codicon-ellipsis:before { content: "\ea7c" }
+.codicon-kebab-horizontal:before { content: "\ea7c" }
+.codicon-mail-reply:before { content: "\ea7d" }
+.codicon-reply:before { content: "\ea7d" }
+.codicon-organization:before { content: "\ea7e" }
+.codicon-organization-filled:before { content: "\ea7e" }
+.codicon-organization-outline:before { content: "\ea7e" }
+.codicon-new-file:before { content: "\ea7f" }
+.codicon-file-add:before { content: "\ea7f" }
+.codicon-new-folder:before { content: "\ea80" }
+.codicon-file-directory-create:before { content: "\ea80" }
+.codicon-trash:before { content: "\ea81" }
+.codicon-trashcan:before { content: "\ea81" }
+.codicon-history:before { content: "\ea82" }
+.codicon-clock:before { content: "\ea82" }
+.codicon-folder:before { content: "\ea83" }
+.codicon-file-directory:before { content: "\ea83" }
+.codicon-symbol-folder:before { content: "\ea83" }
+.codicon-logo-github:before { content: "\ea84" }
+.codicon-mark-github:before { content: "\ea84" }
+.codicon-github:before { content: "\ea84" }
+.codicon-terminal:before { content: "\ea85" }
+.codicon-console:before { content: "\ea85" }
+.codicon-repl:before { content: "\ea85" }
+.codicon-zap:before { content: "\ea86" }
+.codicon-symbol-event:before { content: "\ea86" }
+.codicon-error:before { content: "\ea87" }
+.codicon-stop:before { content: "\ea87" }
+.codicon-variable:before { content: "\ea88" }
+.codicon-symbol-variable:before { content: "\ea88" }
+.codicon-array:before { content: "\ea8a" }
+.codicon-symbol-array:before { content: "\ea8a" }
+.codicon-symbol-module:before { content: "\ea8b" }
+.codicon-symbol-package:before { content: "\ea8b" }
+.codicon-symbol-namespace:before { content: "\ea8b" }
+.codicon-symbol-object:before { content: "\ea8b" }
+.codicon-symbol-method:before { content: "\ea8c" }
+.codicon-symbol-function:before { content: "\ea8c" }
+.codicon-symbol-constructor:before { content: "\ea8c" }
+.codicon-symbol-boolean:before { content: "\ea8f" }
+.codicon-symbol-null:before { content: "\ea8f" }
+.codicon-symbol-numeric:before { content: "\ea90" }
+.codicon-symbol-number:before { content: "\ea90" }
+.codicon-symbol-structure:before { content: "\ea91" }
+.codicon-symbol-struct:before { content: "\ea91" }
+.codicon-symbol-parameter:before { content: "\ea92" }
+.codicon-symbol-type-parameter:before { content: "\ea92" }
+.codicon-symbol-key:before { content: "\ea93" }
+.codicon-symbol-text:before { content: "\ea93" }
+.codicon-symbol-reference:before { content: "\ea94" }
+.codicon-go-to-file:before { content: "\ea94" }
+.codicon-symbol-enum:before { content: "\ea95" }
+.codicon-symbol-value:before { content: "\ea95" }
+.codicon-symbol-ruler:before { content: "\ea96" }
+.codicon-symbol-unit:before { content: "\ea96" }
+.codicon-activate-breakpoints:before { content: "\ea97" }
+.codicon-archive:before { content: "\ea98" }
+.codicon-arrow-both:before { content: "\ea99" }
+.codicon-arrow-down:before { content: "\ea9a" }
+.codicon-arrow-left:before { content: "\ea9b" }
+.codicon-arrow-right:before { content: "\ea9c" }
+.codicon-arrow-small-down:before { content: "\ea9d" }
+.codicon-arrow-small-left:before { content: "\ea9e" }
+.codicon-arrow-small-right:before { content: "\ea9f" }
+.codicon-arrow-small-up:before { content: "\eaa0" }
+.codicon-arrow-up:before { content: "\eaa1" }
+.codicon-bell:before { content: "\eaa2" }
+.codicon-bold:before { content: "\eaa3" }
+.codicon-book:before { content: "\eaa4" }
+.codicon-bookmark:before { content: "\eaa5" }
+.codicon-debug-breakpoint-conditional-unverified:before { content: "\eaa6" }
+.codicon-debug-breakpoint-conditional:before { content: "\eaa7" }
+.codicon-debug-breakpoint-conditional-disabled:before { content: "\eaa7" }
+.codicon-debug-breakpoint-data-unverified:before { content: "\eaa8" }
+.codicon-debug-breakpoint-data:before { content: "\eaa9" }
+.codicon-debug-breakpoint-data-disabled:before { content: "\eaa9" }
+.codicon-debug-breakpoint-log-unverified:before { content: "\eaaa" }
+.codicon-debug-breakpoint-log:before { content: "\eaab" }
+.codicon-debug-breakpoint-log-disabled:before { content: "\eaab" }
+.codicon-briefcase:before { content: "\eaac" }
+.codicon-broadcast:before { content: "\eaad" }
+.codicon-browser:before { content: "\eaae" }
+.codicon-bug:before { content: "\eaaf" }
+.codicon-calendar:before { content: "\eab0" }
+.codicon-case-sensitive:before { content: "\eab1" }
+.codicon-check:before { content: "\eab2" }
+.codicon-checklist:before { content: "\eab3" }
+.codicon-chevron-down:before { content: "\eab4" }
+.codicon-chevron-left:before { content: "\eab5" }
+.codicon-chevron-right:before { content: "\eab6" }
+.codicon-chevron-up:before { content: "\eab7" }
+.codicon-chrome-close:before { content: "\eab8" }
+.codicon-chrome-maximize:before { content: "\eab9" }
+.codicon-chrome-minimize:before { content: "\eaba" }
+.codicon-chrome-restore:before { content: "\eabb" }
+.codicon-circle-outline:before { content: "\eabc" }
+.codicon-debug-breakpoint-unverified:before { content: "\eabc" }
+.codicon-circle-slash:before { content: "\eabd" }
+.codicon-circuit-board:before { content: "\eabe" }
+.codicon-clear-all:before { content: "\eabf" }
+.codicon-clippy:before { content: "\eac0" }
+.codicon-close-all:before { content: "\eac1" }
+.codicon-cloud-download:before { content: "\eac2" }
+.codicon-cloud-upload:before { content: "\eac3" }
+.codicon-code:before { content: "\eac4" }
+.codicon-collapse-all:before { content: "\eac5" }
+.codicon-color-mode:before { content: "\eac6" }
+.codicon-comment-discussion:before { content: "\eac7" }
+.codicon-credit-card:before { content: "\eac9" }
+.codicon-dash:before { content: "\eacc" }
+.codicon-dashboard:before { content: "\eacd" }
+.codicon-database:before { content: "\eace" }
+.codicon-debug-continue:before { content: "\eacf" }
+.codicon-debug-disconnect:before { content: "\ead0" }
+.codicon-debug-pause:before { content: "\ead1" }
+.codicon-debug-restart:before { content: "\ead2" }
+.codicon-debug-start:before { content: "\ead3" }
+.codicon-debug-step-into:before { content: "\ead4" }
+.codicon-debug-step-out:before { content: "\ead5" }
+.codicon-debug-step-over:before { content: "\ead6" }
+.codicon-debug-stop:before { content: "\ead7" }
+.codicon-debug:before { content: "\ead8" }
+.codicon-device-camera-video:before { content: "\ead9" }
+.codicon-device-camera:before { content: "\eada" }
+.codicon-device-mobile:before { content: "\eadb" }
+.codicon-diff-added:before { content: "\eadc" }
+.codicon-diff-ignored:before { content: "\eadd" }
+.codicon-diff-modified:before { content: "\eade" }
+.codicon-diff-removed:before { content: "\eadf" }
+.codicon-diff-renamed:before { content: "\eae0" }
+.codicon-diff:before { content: "\eae1" }
+.codicon-discard:before { content: "\eae2" }
+.codicon-editor-layout:before { content: "\eae3" }
+.codicon-empty-window:before { content: "\eae4" }
+.codicon-exclude:before { content: "\eae5" }
+.codicon-extensions:before { content: "\eae6" }
+.codicon-eye-closed:before { content: "\eae7" }
+.codicon-file-binary:before { content: "\eae8" }
+.codicon-file-code:before { content: "\eae9" }
+.codicon-file-media:before { content: "\eaea" }
+.codicon-file-pdf:before { content: "\eaeb" }
+.codicon-file-submodule:before { content: "\eaec" }
+.codicon-file-symlink-directory:before { content: "\eaed" }
+.codicon-file-symlink-file:before { content: "\eaee" }
+.codicon-file-zip:before { content: "\eaef" }
+.codicon-files:before { content: "\eaf0" }
+.codicon-filter:before { content: "\eaf1" }
+.codicon-flame:before { content: "\eaf2" }
+.codicon-fold-down:before { content: "\eaf3" }
+.codicon-fold-up:before { content: "\eaf4" }
+.codicon-fold:before { content: "\eaf5" }
+.codicon-folder-active:before { content: "\eaf6" }
+.codicon-folder-opened:before { content: "\eaf7" }
+.codicon-gear:before { content: "\eaf8" }
+.codicon-gift:before { content: "\eaf9" }
+.codicon-gist-secret:before { content: "\eafa" }
+.codicon-gist:before { content: "\eafb" }
+.codicon-git-commit:before { content: "\eafc" }
+.codicon-git-compare:before { content: "\eafd" }
+.codicon-compare-changes:before { content: "\eafd" }
+.codicon-git-merge:before { content: "\eafe" }
+.codicon-github-action:before { content: "\eaff" }
+.codicon-github-alt:before { content: "\eb00" }
+.codicon-globe:before { content: "\eb01" }
+.codicon-grabber:before { content: "\eb02" }
+.codicon-graph:before { content: "\eb03" }
+.codicon-gripper:before { content: "\eb04" }
+.codicon-heart:before { content: "\eb05" }
+.codicon-home:before { content: "\eb06" }
+.codicon-horizontal-rule:before { content: "\eb07" }
+.codicon-hubot:before { content: "\eb08" }
+.codicon-inbox:before { content: "\eb09" }
+.codicon-issue-reopened:before { content: "\eb0b" }
+.codicon-issues:before { content: "\eb0c" }
+.codicon-italic:before { content: "\eb0d" }
+.codicon-jersey:before { content: "\eb0e" }
+.codicon-json:before { content: "\eb0f" }
+.codicon-kebab-vertical:before { content: "\eb10" }
+.codicon-key:before { content: "\eb11" }
+.codicon-law:before { content: "\eb12" }
+.codicon-lightbulb-autofix:before { content: "\eb13" }
+.codicon-link-external:before { content: "\eb14" }
+.codicon-link:before { content: "\eb15" }
+.codicon-list-ordered:before { content: "\eb16" }
+.codicon-list-unordered:before { content: "\eb17" }
+.codicon-live-share:before { content: "\eb18" }
+.codicon-loading:before { content: "\eb19" }
+.codicon-location:before { content: "\eb1a" }
+.codicon-mail-read:before { content: "\eb1b" }
+.codicon-mail:before { content: "\eb1c" }
+.codicon-markdown:before { content: "\eb1d" }
+.codicon-megaphone:before { content: "\eb1e" }
+.codicon-mention:before { content: "\eb1f" }
+.codicon-milestone:before { content: "\eb20" }
+.codicon-mortar-board:before { content: "\eb21" }
+.codicon-move:before { content: "\eb22" }
+.codicon-multiple-windows:before { content: "\eb23" }
+.codicon-mute:before { content: "\eb24" }
+.codicon-no-newline:before { content: "\eb25" }
+.codicon-note:before { content: "\eb26" }
+.codicon-octoface:before { content: "\eb27" }
+.codicon-open-preview:before { content: "\eb28" }
+.codicon-package:before { content: "\eb29" }
+.codicon-paintcan:before { content: "\eb2a" }
+.codicon-pin:before { content: "\eb2b" }
+.codicon-play:before { content: "\eb2c" }
+.codicon-run:before { content: "\eb2c" }
+.codicon-plug:before { content: "\eb2d" }
+.codicon-preserve-case:before { content: "\eb2e" }
+.codicon-preview:before { content: "\eb2f" }
+.codicon-project:before { content: "\eb30" }
+.codicon-pulse:before { content: "\eb31" }
+.codicon-question:before { content: "\eb32" }
+.codicon-quote:before { content: "\eb33" }
+.codicon-radio-tower:before { content: "\eb34" }
+.codicon-reactions:before { content: "\eb35" }
+.codicon-references:before { content: "\eb36" }
+.codicon-refresh:before { content: "\eb37" }
+.codicon-regex:before { content: "\eb38" }
+.codicon-remote-explorer:before { content: "\eb39" }
+.codicon-remote:before { content: "\eb3a" }
+.codicon-remove:before { content: "\eb3b" }
+.codicon-replace-all:before { content: "\eb3c" }
+.codicon-replace:before { content: "\eb3d" }
+.codicon-repo-clone:before { content: "\eb3e" }
+.codicon-repo-force-push:before { content: "\eb3f" }
+.codicon-repo-pull:before { content: "\eb40" }
+.codicon-repo-push:before { content: "\eb41" }
+.codicon-report:before { content: "\eb42" }
+.codicon-request-changes:before { content: "\eb43" }
+.codicon-rocket:before { content: "\eb44" }
+.codicon-root-folder-opened:before { content: "\eb45" }
+.codicon-root-folder:before { content: "\eb46" }
+.codicon-rss:before { content: "\eb47" }
+.codicon-ruby:before { content: "\eb48" }
+.codicon-save-all:before { content: "\eb49" }
+.codicon-save-as:before { content: "\eb4a" }
+.codicon-save:before { content: "\eb4b" }
+.codicon-screen-full:before { content: "\eb4c" }
+.codicon-screen-normal:before { content: "\eb4d" }
+.codicon-search-stop:before { content: "\eb4e" }
+.codicon-server:before { content: "\eb50" }
+.codicon-settings-gear:before { content: "\eb51" }
+.codicon-settings:before { content: "\eb52" }
+.codicon-shield:before { content: "\eb53" }
+.codicon-smiley:before { content: "\eb54" }
+.codicon-sort-precedence:before { content: "\eb55" }
+.codicon-split-horizontal:before { content: "\eb56" }
+.codicon-split-vertical:before { content: "\eb57" }
+.codicon-squirrel:before { content: "\eb58" }
+.codicon-star-full:before { content: "\eb59" }
+.codicon-star-half:before { content: "\eb5a" }
+.codicon-symbol-class:before { content: "\eb5b" }
+.codicon-symbol-color:before { content: "\eb5c" }
+.codicon-symbol-constant:before { content: "\eb5d" }
+.codicon-symbol-enum-member:before { content: "\eb5e" }
+.codicon-symbol-field:before { content: "\eb5f" }
+.codicon-symbol-file:before { content: "\eb60" }
+.codicon-symbol-interface:before { content: "\eb61" }
+.codicon-symbol-keyword:before { content: "\eb62" }
+.codicon-symbol-misc:before { content: "\eb63" }
+.codicon-symbol-operator:before { content: "\eb64" }
+.codicon-symbol-property:before { content: "\eb65" }
+.codicon-wrench:before { content: "\eb65" }
+.codicon-wrench-subaction:before { content: "\eb65" }
+.codicon-symbol-snippet:before { content: "\eb66" }
+.codicon-tasklist:before { content: "\eb67" }
+.codicon-telescope:before { content: "\eb68" }
+.codicon-text-size:before { content: "\eb69" }
+.codicon-three-bars:before { content: "\eb6a" }
+.codicon-thumbsdown:before { content: "\eb6b" }
+.codicon-thumbsup:before { content: "\eb6c" }
+.codicon-tools:before { content: "\eb6d" }
+.codicon-triangle-down:before { content: "\eb6e" }
+.codicon-triangle-left:before { content: "\eb6f" }
+.codicon-triangle-right:before { content: "\eb70" }
+.codicon-triangle-up:before { content: "\eb71" }
+.codicon-twitter:before { content: "\eb72" }
+.codicon-unfold:before { content: "\eb73" }
+.codicon-unlock:before { content: "\eb74" }
+.codicon-unmute:before { content: "\eb75" }
+.codicon-unverified:before { content: "\eb76" }
+.codicon-verified:before { content: "\eb77" }
+.codicon-versions:before { content: "\eb78" }
+.codicon-vm-active:before { content: "\eb79" }
+.codicon-vm-outline:before { content: "\eb7a" }
+.codicon-vm-running:before { content: "\eb7b" }
+.codicon-watch:before { content: "\eb7c" }
+.codicon-whitespace:before { content: "\eb7d" }
+.codicon-whole-word:before { content: "\eb7e" }
+.codicon-window:before { content: "\eb7f" }
+.codicon-word-wrap:before { content: "\eb80" }
+.codicon-zoom-in:before { content: "\eb81" }
+.codicon-zoom-out:before { content: "\eb82" }
+.codicon-list-filter:before { content: "\eb83" }
+.codicon-list-flat:before { content: "\eb84" }
+.codicon-list-selection:before { content: "\eb85" }
+.codicon-selection:before { content: "\eb85" }
+.codicon-list-tree:before { content: "\eb86" }
+.codicon-debug-breakpoint-function-unverified:before { content: "\eb87" }
+.codicon-debug-breakpoint-function:before { content: "\eb88" }
+.codicon-debug-breakpoint-function-disabled:before { content: "\eb88" }
+.codicon-debug-stackframe-active:before { content: "\eb89" }
+.codicon-debug-stackframe-dot:before { content: "\eb8a" }
+.codicon-debug-stackframe:before { content: "\eb8b" }
+.codicon-debug-stackframe-focused:before { content: "\eb8b" }
+.codicon-debug-breakpoint-unsupported:before { content: "\eb8c" }
+.codicon-symbol-string:before { content: "\eb8d" }
+.codicon-debug-reverse-continue:before { content: "\eb8e" }
+.codicon-debug-step-back:before { content: "\eb8f" }
+.codicon-debug-restart-frame:before { content: "\eb90" }
+.codicon-debug-alt:before { content: "\eb91" }
+.codicon-call-incoming:before { content: "\eb92" }
+.codicon-call-outgoing:before { content: "\eb93" }
+.codicon-menu:before { content: "\eb94" }
+.codicon-expand-all:before { content: "\eb95" }
+.codicon-feedback:before { content: "\eb96" }
+.codicon-group-by-ref-type:before { content: "\eb97" }
+.codicon-ungroup-by-ref-type:before { content: "\eb98" }
+.codicon-account:before { content: "\eb99" }
+.codicon-bell-dot:before { content: "\eb9a" }
+.codicon-debug-console:before { content: "\eb9b" }
+.codicon-library:before { content: "\eb9c" }
+.codicon-output:before { content: "\eb9d" }
+.codicon-run-all:before { content: "\eb9e" }
+.codicon-sync-ignored:before { content: "\eb9f" }
+.codicon-pinned:before { content: "\eba0" }
+.codicon-github-inverted:before { content: "\eba1" }
+.codicon-server-process:before { content: "\eba2" }
+.codicon-server-environment:before { content: "\eba3" }
+.codicon-pass:before { content: "\eba4" }
+.codicon-issue-closed:before { content: "\eba4" }
+.codicon-stop-circle:before { content: "\eba5" }
+.codicon-play-circle:before { content: "\eba6" }
+.codicon-record:before { content: "\eba7" }
+.codicon-debug-alt-small:before { content: "\eba8" }
+.codicon-vm-connect:before { content: "\eba9" }
+.codicon-cloud:before { content: "\ebaa" }
+.codicon-merge:before { content: "\ebab" }
+.codicon-export:before { content: "\ebac" }
+.codicon-graph-left:before { content: "\ebad" }
+.codicon-magnet:before { content: "\ebae" }
+.codicon-notebook:before { content: "\ebaf" }
+.codicon-redo:before { content: "\ebb0" }
+.codicon-check-all:before { content: "\ebb1" }
+.codicon-pinned-dirty:before { content: "\ebb2" }
+.codicon-pass-filled:before { content: "\ebb3" }
+.codicon-circle-large-filled:before { content: "\ebb4" }
+.codicon-circle-large-outline:before { content: "\ebb5" }
+.codicon-combine:before { content: "\ebb6" }
+.codicon-gather:before { content: "\ebb6" }
+.codicon-table:before { content: "\ebb7" }
+.codicon-variable-group:before { content: "\ebb8" }
+.codicon-type-hierarchy:before { content: "\ebb9" }
+.codicon-type-hierarchy-sub:before { content: "\ebba" }
+.codicon-type-hierarchy-super:before { content: "\ebbb" }
+.codicon-git-pull-request-create:before { content: "\ebbc" }
+.codicon-run-above:before { content: "\ebbd" }
+.codicon-run-below:before { content: "\ebbe" }
+.codicon-notebook-template:before { content: "\ebbf" }
+.codicon-debug-rerun:before { content: "\ebc0" }
+.codicon-workspace-trusted:before { content: "\ebc1" }
+.codicon-workspace-untrusted:before { content: "\ebc2" }
+.codicon-workspace-unknown:before { content: "\ebc3" }
+.codicon-terminal-cmd:before { content: "\ebc4" }
+.codicon-terminal-debian:before { content: "\ebc5" }
+.codicon-terminal-linux:before { content: "\ebc6" }
+.codicon-terminal-powershell:before { content: "\ebc7" }
+.codicon-terminal-tmux:before { content: "\ebc8" }
+.codicon-terminal-ubuntu:before { content: "\ebc9" }
+.codicon-terminal-bash:before { content: "\ebca" }
+.codicon-arrow-swap:before { content: "\ebcb" }
+.codicon-copy:before { content: "\ebcc" }
+.codicon-person-add:before { content: "\ebcd" }
+.codicon-filter-filled:before { content: "\ebce" }
+.codicon-wand:before { content: "\ebcf" }
+.codicon-debug-line-by-line:before { content: "\ebd0" }
+.codicon-inspect:before { content: "\ebd1" }
+.codicon-layers:before { content: "\ebd2" }
+.codicon-layers-dot:before { content: "\ebd3" }
+.codicon-layers-active:before { content: "\ebd4" }
+.codicon-compass:before { content: "\ebd5" }
+.codicon-compass-dot:before { content: "\ebd6" }
+.codicon-compass-active:before { content: "\ebd7" }
+.codicon-azure:before { content: "\ebd8" }
+.codicon-issue-draft:before { content: "\ebd9" }
+.codicon-git-pull-request-closed:before { content: "\ebda" }
+.codicon-git-pull-request-draft:before { content: "\ebdb" }
+.codicon-debug-all:before { content: "\ebdc" }
+.codicon-debug-coverage:before { content: "\ebdd" }
+.codicon-run-errors:before { content: "\ebde" }
+.codicon-folder-library:before { content: "\ebdf" }
+.codicon-debug-continue-small:before { content: "\ebe0" }
+.codicon-beaker-stop:before { content: "\ebe1" }
+.codicon-graph-line:before { content: "\ebe2" }
+.codicon-graph-scatter:before { content: "\ebe3" }
+.codicon-pie-chart:before { content: "\ebe4" }
+.codicon-bracket:before { content: "\eb0f" }
+.codicon-bracket-dot:before { content: "\ebe5" }
+.codicon-bracket-error:before { content: "\ebe6" }
+.codicon-lock-small:before { content: "\ebe7" }
+.codicon-azure-devops:before { content: "\ebe8" }
+.codicon-verified-filled:before { content: "\ebe9" }
+.codicon-newline:before { content: "\ebea" }
+.codicon-layout:before { content: "\ebeb" }
+.codicon-layout-activitybar-left:before { content: "\ebec" }
+.codicon-layout-activitybar-right:before { content: "\ebed" }
+.codicon-layout-panel-left:before { content: "\ebee" }
+.codicon-layout-panel-center:before { content: "\ebef" }
+.codicon-layout-panel-justify:before { content: "\ebf0" }
+.codicon-layout-panel-right:before { content: "\ebf1" }
+.codicon-layout-panel:before { content: "\ebf2" }
+.codicon-layout-sidebar-left:before { content: "\ebf3" }
+.codicon-layout-sidebar-right:before { content: "\ebf4" }
+.codicon-layout-statusbar:before { content: "\ebf5" }
+.codicon-layout-menubar:before { content: "\ebf6" }
+.codicon-layout-centered:before { content: "\ebf7" }
+.codicon-target:before { content: "\ebf8" }
+.codicon-indent:before { content: "\ebf9" }
+.codicon-record-small:before { content: "\ebfa" }
+.codicon-error-small:before { content: "\ebfb" }
+.codicon-arrow-circle-down:before { content: "\ebfc" }
+.codicon-arrow-circle-left:before { content: "\ebfd" }
+.codicon-arrow-circle-right:before { content: "\ebfe" }
+.codicon-arrow-circle-up:before { content: "\ebff" }
diff --git a/src/renderer/less/codicon.svg b/src/renderer/less/codicon.svg
new file mode 100644
index 00000000..c0bb5a8d
--- /dev/null
+++ b/src/renderer/less/codicon.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/renderer/less/codicon.ttf b/src/renderer/less/codicon.ttf
new file mode 100644
index 00000000..47dffef7
Binary files /dev/null and b/src/renderer/less/codicon.ttf differ
diff --git a/src/renderer/less/directives.less b/src/renderer/less/directives.less
new file mode 100644
index 00000000..3831816c
--- /dev/null
+++ b/src/renderer/less/directives.less
@@ -0,0 +1,182 @@
+#app.twopanel {
+ --chromeHeight1: 42px;
+ --chromeHeight2: 76px;
+ --chromeHeight: calc(var(--chromeHeight1) + var(--chromeHeight2));
+
+ .app-chrome {
+ .app-mainmenu {
+ margin-left: 10px;
+ width: 88px;
+ }
+
+ height: var(--chromeHeight1);
+
+ &.chrome-bottom {
+ height: var(--chromeHeight2);
+ box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25);
+ }
+ }
+
+ .app-sidebar-footer--controls {
+ display: none !important;
+ }
+
+ .app-chrome.chrome-bottom {
+ .app-playback-controls .actions {
+ align-self: center;
+ }
+
+ .playback-button.play,
+ .playback-button.pause {
+ width: 42px;
+ height: 42px;
+ background-color: rgb(200 200 200 / 20%);
+ border-radius: 50%;
+ margin: 6px;
+ box-shadow: 0px 0px 0px 2px var(--keyColor);
+ }
+
+ .app-chrome--center {
+ display: flex;
+ flex-direction: column;
+
+ .app-chrome-playback-controls {
+ display: flex;
+ z-index: 1;
+ // margin-bottom: 12px;
+ }
+
+ .app-chrome-playback-duration {
+ position: relative;
+ width: 80%;
+ -webkit-app-region: no-drag;
+ height: 16px;
+
+ .song-progress {
+ @bgColor: transparent;
+ height: 16px;
+ position: absolute;
+ bottom: 4px;
+ left: 0px;
+ right: 4px;
+ background: @bgColor;
+ z-index: 0;
+
+
+ .song-duration {
+ display: flex;
+ }
+
+ .song-duration p {
+ font-weight: 400;
+ font-size: 10px;
+ height: 1.2em;
+ line-height: 1.3em;
+ overflow: hidden;
+ margin: 0 0 0 0.25em;
+ }
+
+ &:hover {
+ > input[type=range] {
+ &::-webkit-slider-thumb {
+ opacity: 1;
+ transform: scale(1);
+ z-index: 1;
+ }
+ }
+ }
+
+ input[type=range] {
+ appearance: none;
+ width: 100%;
+ height: 4px;
+ background-color: rgb(200 200 200 / 10%);
+ border-radius: 2px;
+
+ &::-webkit-slider-thumb {
+ opacity: 0;
+ transform: scale(0.5);
+ -webkit-appearance: none;
+ appearance: none;
+ width: 12px;
+ height: 12px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+ transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
+ }
+ }
+ }
+ }
+
+ }
+
+ .app-chrome--left {
+ width: 30%;
+ justify-content: flex-start;
+ align-items: flex-start;
+
+ .playback-controls {
+ .artwork {
+ width: var(--chromeHeight2);
+ height: var(--chromeHeight2);
+ margin: 0px 6px 0px 0px;
+ box-shadow: unset;
+ border: 0px;
+
+ .mediaitem-artwork,
+ img {
+ border-radius: 0px;
+ box-shadow: unset;
+ border: 0px;
+ }
+ }
+
+ .playback-info {
+ align-items: flex-start;
+ margin: 6px;
+
+ .song-name {
+ text-align: left;
+ font-size: 15px;
+ font-weight: initial;
+ width: 100%;
+ -webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
+ }
+
+ .song-artist-album {
+ width: 100%;
+ -webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
+ }
+
+ .audio-type {
+ margin: 0px;
+ }
+
+ .song-artist-album-content {
+ text-align: left;
+ font-size: 12px;
+ }
+ }
+
+
+ width: 100%;
+ height: 100%;
+ max-width: 100%;
+ border: 0px;
+ }
+
+ flex: 0 0 auto;
+ }
+
+ .app-chrome--right {
+ width: 30%;
+ flex: 0 0 auto;
+ }
+ }
+ .collection-page {
+ .top-fab {
+ bottom:96px;
+ }
+ }
+}
diff --git a/src/renderer/less/elements.less b/src/renderer/less/elements.less
new file mode 100644
index 00000000..afed7b74
--- /dev/null
+++ b/src/renderer/less/elements.less
@@ -0,0 +1,1838 @@
+// Form
+
+.md-select {
+ padding: 6px;
+ border-radius: 6px;
+ border: 1px solid rgba(200, 200, 200, 0.1);
+ border-top: 1px solid rgba(100, 100, 100, 0.5);
+ font-family: inherit;
+ font-size: 14px;
+ background: rgba(100, 100, 100, 0.25);
+ color: #eee;
+
+ option {
+ font-size: 1em;
+ font-family: inherit;
+ padding: 8px 16px;
+ background: #404040;
+ }
+
+ optgroup {
+ background: #2c2c2c;
+ }
+
+ &:focus {
+ outline: solid 1px var(--selected);
+ }
+}
+
+// Buttons
+.md-btn {
+ font-family: inherit;
+ background: rgb(100 100 100 / 25%);
+ padding: 8px 14px;
+ border-radius: 6px;
+ font-size: 14px;
+ border: 1px solid rgba(100, 100, 100, 0.35);
+ border-top: 1px solid rgba(100, 100, 100, 0.5);
+ color: #eee;
+ white-space: nowrap;
+ transition: transform 0.2s var(--appleEase), box-shadow 0.2s var(--appleEase);
+
+ &.md-btn-block {
+ display: block;
+ width: 100%;
+ }
+
+ &.md-btn-glyph {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ }
+
+ &.md-btn-primary {
+ background: #ff2b52a6;
+ color: white;
+ border: 1px solid rgb(220 53 69 / 25%);
+ border-top: 1px solid rgb(220 53 69 / 50%);
+ }
+
+ &.md-btn-small {
+ padding: 6px 8px;
+ font-size: 13px;
+ }
+
+ &:hover {
+ filter: brightness(125%);
+ }
+
+ &:active {
+ filter: brightness(75%);
+ transform: scale(0.98);
+ transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
+ }
+
+ &.md-btn-icon {
+ display: inline-flex;
+ vertical-align: middle;
+ justify-content: center;
+
+ > img {
+ margin: 0px 16px 0px 0px;
+ pointer-events: none;
+ }
+
+ > .md-btn-text {
+ margin: 0px;
+ }
+ }
+}
+
+.btn-group {
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+
+ > .md-btn {
+ border-radius: 0px;
+ width: 100%;
+ }
+
+ > .md-btn:first-child {
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 6px;
+ }
+
+ > .md-btn:last-child {
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+ }
+
+ > .md-btn:not(:first-child):not(:last-child) {
+ border-radius: 0px;
+ }
+}
+
+
+.md-close-btn {
+ -webkit-mask-image: url("ameres://icons/webui/close.svg");
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-position: center;
+ background-color: white;
+ opacity: 0.75;
+ -webkit-mask-size: contain;
+ height: 18px;
+ width: 18px;
+}
+
+.md-ico-play {
+ content: url("./assets/play.svg");
+ width: 10px;
+ height: 12px;
+ margin-right: 1px;
+ align-self: center;
+}
+
+.md-ico-shuffle {
+ content: url("./assets/shuffle.svg");
+ width: 1em;
+ height: 1em;
+ margin-right: 1px;
+ margin-bottom: -2px;
+ align-self: center;
+}
+
+.md-ico-remove {
+ content: url("./assets/feather/x-circle-white.svg");
+ width: 16px;
+ height: 16px;
+ margin-right: 1px;
+ margin-bottom: -1.5px;
+ align-self: center;
+}
+
+.md-ico-add {
+ content: url("./assets/feather/plus-circle-white.svg");
+ width: 1em;
+ height: 1em;
+ margin-right: 1px;
+ margin-bottom: -1.5px;
+ align-self: center;
+}
+
+.reload-btn {
+ background: rgb(86 86 86 / 52%);
+ border-radius: 100%;
+ width: 32px;
+ height: 32px;
+ border: 0px;
+ appearance: none;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.reload-btn:hover {
+ background: rgb(86 86 86 / 80%);
+ cursor: pointer;
+}
+
+.reload-btn > svg {
+ height: 50%;
+ color: #eee;
+}
+
+.wr-btn {
+ font-family: inherit;
+ appearance: none;
+ border: 0px;
+ border-radius: 6px;
+ padding: 8px;
+ font-weight: 600;
+ background: rgb(80 80 80 / 70%);
+ color: white;
+}
+
+.cd-btn-seeall {
+ background: transparent;
+ border: 0px;
+ color: var(--keyColor);
+ font-family: inherit;
+ font-weight: 500;
+ font-size: 16px;
+ border-radius: 4px;
+ padding: 6px;
+
+ &:hover {
+ cursor: pointer;
+ background: rgb(200 200 200 / 10%)
+ }
+}
+
+
+// Media Item Elements
+
+.mediaitem-artwork {
+ border-radius: var(--mediaItemRadius);
+ overflow: hidden;
+ flex: 0 0 auto;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background-image: url("https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg");
+ background-size: cover;
+ background-position: center;
+
+ .animatedartwork-view-box {
+ position: absolute;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+
+ .animated {
+ position: absolute;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+
+ video {
+ width: 100%;
+ height: 100%;
+ }
+ }
+ }
+
+ &.rounded {
+ border-radius: 100%;
+
+ &::after {
+ border-radius: 100%;
+ }
+ }
+
+ &::after {
+ content: "";
+ box-shadow: var(--mediaItemShadow);
+ z-index: 1;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border-radius: inherit;
+ }
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ image-rendering: -webkit-optimize-contrast;
+ pointer-events: none;
+ }
+
+ &.no-shadow {
+ box-shadow: none;
+
+ &::after {
+ display: none;
+ }
+ }
+
+ &.subtle-shadow {
+ box-shadow: var(--mediaItemShadow-ShadowSubtle);
+ }
+
+ &.shadow {
+ box-shadow: var(--mediaItemShadow-Shadow);
+ }
+}
+
+/* queue item */
+.cd-queue-item {
+ border-bottom: 1px solid rgb(200 200 200 / 10%);
+ padding: 8px;
+
+ .row,
+ .col {
+ padding: 0px;
+ margin: 0px;
+ }
+
+ .artwork {
+ width: 32px;
+ height: 32px;
+ flex: 0 0 auto;
+ }
+
+ &.selected {
+ background: var(--selected);
+ }
+
+ &:active {
+ background: var(--selected-click);
+ color: #eee;
+ }
+
+ .queue-info {
+ display: flex;
+ flex-direction: column;
+
+ .queue-title {
+ font-size: 14px;
+ }
+
+ .queue-subtitle {
+ font-size: 13px;
+ opacity: 0.85;
+ }
+ }
+}
+
+/* horizontal media scroller */
+.cd-hmedia-scroller {
+ &::-webkit-scrollbar-thumb {
+ box-shadow: none;
+ }
+
+ &:hover::-webkit-scrollbar-thumb {
+ box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%);
+ }
+
+ &.hmedia-scroller-card {
+ .mediaitem-card {
+ margin: 16px;
+ }
+ }
+}
+
+/* mediaitem-list-item */
+.cd-mediaitem-list-item {
+ width: 100%;
+ height: 60px;
+ display: flex;
+ flex: 0 0 auto;
+ flex-direction: row;
+ font-size: 14px;
+ justify-content: center-between;
+ align-items: center;
+ border-radius: var(--mediaItemRadius);
+
+ .artwork {
+ height: 42px;
+ width: 42px;
+ border-radius: var(--mediaItemRadius);
+ object-fit: cover;
+ object-position: center;
+ flex: 0 0 auto;
+ background-repeat: no-repeat;
+ margin: 12px;
+ border: 0px;
+ outline: none;
+ position: relative;
+ overflow: hidden;
+
+ .overlay-play {
+ background: rgba(0, 0, 0, 0.5);
+ opacity: 0;
+ appearance: none;
+ border: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ padding: 0px;
+ z-index: 5;
+ cursor: pointer;
+
+ &:hover {
+ opacity: 1;
+ }
+
+ &:active {
+ background: var(--selected-click);
+ }
+ }
+ }
+
+ .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+ }
+
+ .info-rect {
+ height: 100%;
+ display: flex;
+ flex-flow: column;
+ justify-content: center;
+ flex-grow: 1;
+ }
+
+ .title {
+ width: 100%;
+ }
+
+ .subtitle {
+ width: 90%;
+ font-size: .8em;
+ opacity: 0.7;
+ }
+
+ .duration {
+ min-width: 60px;
+ text-align: center;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .metainfo {
+ min-width: 145px;
+ text-align: center;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .explicit-icon {
+ background-image: url("./assets/explicit.svg");
+ height: 12px;
+ width: 36px;
+ filter: contrast(0);
+ background-repeat: no-repeat;
+ }
+
+ /* CSS.gg
+ */
+ @keyframes load-bar {
+ 10% {
+ box-shadow: inset 0 -4px 0
+ }
+ 20% {
+ box-shadow: inset 0 -10px 0
+ }
+ 30% {
+ box-shadow: inset 0 -12px 0
+ }
+ 40% {
+ box-shadow: inset 0 -8px 0
+ }
+ 50% {
+ box-shadow: inset 0 -4px 0
+ }
+ 60% {
+ box-shadow: inset 0 -6px 0
+ }
+ 80% {
+ box-shadow: inset 0 -12px 0
+ }
+ 90% {
+ box-shadow: inset 0 -6px 0
+ }
+ to {
+ box-shadow: inset 0 -2px 0
+ }
+ }
+
+ .loadbar-sound,
+ .loadbar-sound::after,
+ .loadbar-sound::before {
+ animation: load-bar 1.3s ease infinite alternate;
+ box-sizing: border-box;
+ width: 3px;
+ height: 28px;
+ box-shadow: inset 0 -12px 0;
+ }
+
+ .loadbar-sound {
+ margin-left: 22px;
+ margin-top: -16px;
+ position: relative;
+ transform: scale(var(--load-bar, 1));
+ color: var(--keyColor);
+ display: block;
+ }
+
+ .loadbar-sound::after,
+ .loadbar-sound::before {
+ content: "";
+ position: absolute;
+ bottom: 0
+ }
+
+ .loadbar-sound::before {
+ left: -4.5px;
+ animation-delay: -2.4s
+ }
+
+ .loadbar-sound::after {
+ right: -4.2px;
+ animation-delay: -3.7s
+ }
+
+ .isLibrary {
+ flex: 0 0 auto;
+ width: 40px;
+ text-align: center;
+
+ button {
+ appearance: none;
+ border: 0px;
+ background: transparent;
+ cursor: pointer;
+ filter: contrast(0.8);
+ }
+ }
+
+ &:hover {
+ background: rgb(200 200 200 / 10%);
+ box-shadow: var(--mediaItemShadow);
+
+ .overlay-play {
+ opacity: 1;
+ }
+ }
+
+ &.mediaitem-selected {
+ background: var(--selected);
+ box-shadow: var(--mediaItemShadow);
+ }
+
+
+ &:active {
+ background: var(--selected-click);
+ box-shadow: var(--mediaItemShadow);
+ color: #eee;
+ }
+
+ // list item compact
+ &.compact {
+ height: 40px;
+ font-size: 13px;
+
+ .artwork {
+ display: none;
+ }
+
+ .info-rect {
+ padding-left: 1em;
+ }
+ }
+}
+
+/* mediaitem-hrect */
+.cd-mediaitem-hrect {
+ background: rgb(255 255 255 / 18%);
+ width: 264px;
+ height: 100px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: row;
+ font-size: 14px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 6px;
+ cursor: pointer;
+
+ .artwork {
+ height: 70px;
+ width: 70px;
+ background: blue;
+ border-radius: var(--mediaItemRadius);
+ background: var(--artwork);
+ background-size: contain;
+ flex: 0 0 auto;
+ background-repeat: no-repeat;
+ margin: 18px;
+ }
+
+ .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+ }
+
+ .info-rect {
+ width: 100%;
+ }
+
+ .title {
+ width: 100%;
+ text-align: center;
+ }
+
+ .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+ }
+}
+
+/* mediaitem-square-sp */
+.cd-mediaitem-square-sp {
+ --spcolor: var("");
+ width: 190px;
+ height: 245px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: flex-start;
+ align-items: center;
+ border-radius: 6px;
+ margin-left: 10px;
+ cursor: pointer;
+ background-color: var(--spcolor);
+
+ .artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+
+ &.round {
+ border-radius: var(--mediaItemRadiusRound);
+ }
+
+ &:hover {
+ box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
+ }
+ }
+
+ .title {
+ width: 90%;
+ text-align: center;
+ }
+
+ .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+ }
+
+ > .cd-mediaitem-square-large-overlay {
+ z-index: 3;
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
+ + .cd-mediaitem-square-large-overlay {
+ pointer-events: none;
+ }
+
+ &:hover + .cd-mediaitem-square-large-overlay {
+ opacity: 1;
+
+ }
+
+ &:hover {
+ box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
+ }
+}
+
+
+/* mediaitem-square-large */
+.cd-mediaitem-square-large {
+ width: 190px;
+ height: 250px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: flex-start;
+ align-items: center;
+ border-radius: 6px;
+ margin-left: 10px;
+ cursor: pointer;
+
+ > * {
+ z-index: inherit;
+ }
+}
+
+.cd-mediaitem-square-large .artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+}
+
+.cd-mediaitem-square-large-overlay {
+ position: absolute;
+ width: 190px;
+ float: right;
+ height: 250px;
+ top: 0px;
+ margin: 10px;
+ margin-top: 0px;
+ opacity: 0;
+
+}
+
+.cd-mediaitem-square-large-overlay > * {
+ pointer-events: auto;
+
+}
+
+.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay {
+ z-index: 3;
+}
+
+.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay:hover {
+ opacity: 1;
+}
+
+.cd-mediaitem-square-large + .cd-mediaitem-square-large-overlay {
+ pointer-events: none;
+
+}
+
+.cd-mediaitem-square-large:hover + .cd-mediaitem-square-large-overlay {
+ opacity: 1;
+
+}
+
+
+.cd-mediaitem-square-large .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+
+.cd-mediaitem-square-large .title {
+ width: 90%;
+ text-align: center;
+}
+
+.cd-mediaitem-square-large .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+}
+
+/* mediaitem-mvview */
+
+/* mediaitem-mvview */
+.cd-mediaitem-mvview {
+ width: 300px;
+ height: 250px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: flex-start;
+ align-items: center;
+ border-radius: 6px;
+ margin-left: 10px;
+ cursor: pointer;
+
+ > * {
+ z-index: inherit;
+ }
+}
+
+.cd-mediaitem-mvview .artwork {
+ height: 172px;
+ width: 300px;
+ background: blue;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+}
+
+.cd-mediaitem-mvview-overlay {
+ position: absolute;
+ width: 300px;
+ float: right;
+ height: 250px;
+ top: 0px;
+ margin: 10px;
+ margin-top: 0px;
+ opacity: 0;
+
+}
+
+.cd-mediaitem-mvview-overlay > * {
+ pointer-events: auto;
+
+}
+
+.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay {
+ z-index: 3;
+}
+
+.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay:hover {
+ opacity: 1;
+}
+
+.cd-mediaitem-mvview + .cd-mediaitem-mvview-overlay {
+ pointer-events: none;
+
+}
+
+.cd-mediaitem-mvview:hover + .cd-mediaitem-mvview-overlay {
+ opacity: 1;
+
+}
+
+
+.cd-mediaitem-mvview .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+
+.cd-mediaitem-mvview .title {
+ width: 90%;
+ text-align: center;
+}
+
+.cd-mediaitem-mvview .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+}
+
+
+/* mediaitem-square */
+.cd-mediaitem-square {
+ width: 220px;
+ height: 238px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 6px;
+
+ .artwork-container {
+ position: relative;
+
+ .artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-radius: var(--mediaItemRadius);
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ cursor: pointer;
+
+ &.round {
+ border-radius: var(--mediaItemRadiusRound);
+ }
+ }
+
+ .badge-container {
+ transition: opacity 0.1s var(--appleEase);
+ opacity: 1;
+
+ .socialBadge {
+ width: 32px;
+ height: 32px;
+ position: absolute;
+ right: 14px;
+ bottom: 14px;
+ border-radius: 100%;
+ overflow: hidden;
+ z-index: 2;
+ pointer-events: none;
+ }
+ }
+
+ > .play-btn,
+ > .menu-btn {
+ opacity: 0;
+ appearance: none;
+ padding: 0px;
+ border: 0px;
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ background: rgba(50, 50, 50, 0.7);
+ cursor: pointer;
+ transition: opacity 0.1s var(--appleEase);
+
+ :hover {
+ border-radius: 50%;
+ background: rgba(250, 0, 0, 0.7);
+ }
+ }
+
+ > .play-btn {
+ position: absolute;
+ bottom: 14px;
+ left: 14px;
+ z-index: 2;
+
+ }
+
+ > .menu-btn {
+ position: absolute;
+ bottom: 14px;
+ right: 14px;
+ z-index: 2;
+ }
+
+ &:hover {
+ > .badge-container {
+ opacity: 0;
+ }
+
+ > .play-btn,
+ > .menu-btn {
+ opacity: 1;
+ }
+ }
+ }
+
+ .info-rect {
+ width: 90%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ }
+
+
+ .title {
+ width: 100%;
+ text-align: center;
+ display: flex;
+ align-content: center;
+ justify-content: center;
+ }
+
+ .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+ }
+
+ .unavailable-overlay {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ bottom: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ z-index: 2;
+ pointer-events: none;
+ background: rgb(0 0 0 / 40%);
+ margin: 2em;
+ border-radius: 10px;
+
+ >.codicon {
+ font-size: 4em;
+ font-weight: bold;
+ opacity: 0.5;
+ }
+ }
+
+ &.mediaitem-video {
+ height: 200px;
+ width: 240px;
+
+ .artwork {
+ height: 120px;
+ width: 212px;
+ }
+ }
+
+ &.mediaitem-brick {
+ height: 200px;
+ width: 240px;
+
+ .artwork {
+ height: 123px;
+ width: 220px;
+ }
+ }
+
+ &.mediaitem-small {
+ width: 140px;
+ height: 180px;
+
+ .artwork {
+ height: 128px;
+ width: 128px;
+ }
+ }
+
+ &.mediaitem-card {
+ background: #ccc;
+ background: var(--spcolor);
+ height: 298px;
+ width: 230px;
+ max-width: 250px;
+ max-height: 500px;
+ overflow: hidden;
+ position: relative;
+ border-radius: calc(var(--mediaItemRadius) * 2);
+ box-shadow: var(--mediaItemShadow-ShadowSubtle);
+
+ .artwork {
+ width: 230px;
+ height: 230px;
+ overflow: hidden;
+ border-radius: 0px;
+ margin: 0;
+
+ .mediaitem-artwork {
+ border-radius: 0px;
+
+ &::after {
+ box-shadow: unset;
+ }
+ }
+ }
+
+ .info-rect-card {
+ padding: 10px 10px 14px;
+ position: relative;
+ width: 100%;
+
+ &::before {
+ background: var(--bgartwork);
+ content: "";
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ position: absolute;
+ background-size: cover;
+ background-position: bottom;
+ z-index: 0;
+ opacity: 1;
+ filter: brightness(0.5) blur(50px) saturate(180%);
+ }
+ }
+
+ .title {
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 0.9em;
+ font-weight: 500;
+ z-index: 1;
+ }
+
+ .subtitle {
+ height: 100%;
+ justify-content: center;
+ align-items: center;
+ font-size: 0.75em;
+ width: 100%;
+ display: flex;
+ z-index: 1;
+ }
+
+ &::after {
+ box-shadow: var(--mediaItemShadow);
+ content: "";
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ pointer-events: none;
+ border-radius: inherit;
+ }
+ }
+}
+
+/* mediaitem-square */
+.albums-square-containeru > * > .cd-mediaitem-square {
+ --frame: max(220px, 15vw);
+ width: var(--frame);
+ height: calc(var(--frame) * 13 / 11);
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: calc(var(--frame) / 220 * 14);
+ justify-content: center;
+ align-items: center;
+ border-radius: calc(var(--frame) / 220 * 6);
+
+ .artwork-container {
+ position: relative;
+
+ .artwork {
+ height: calc(var(--frame) * 19 / 22);
+ width: calc(var(--frame) * 19 / 22);
+ background: blue;
+ border-radius: var(--mediaItemRadius);
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: calc(var(--frame) / 220 * 6);
+ cursor: pointer;
+
+ &.round {
+ border-radius: var(--mediaItemRadiusRound);
+ }
+ }
+
+ > .play-btn,
+ > .menu-btn {
+ opacity: 0;
+ appearance: none;
+ padding: 0px;
+ border: 0px;
+ width: calc(var(--frame) / 220 * 30);
+ height: calc(var(--frame) / 220 * 30);
+ border-radius: 50%;
+ background: rgba(50, 50, 50, 0.7);
+ cursor: pointer;
+ backdrop-filter: blur(32px) saturate(180%);
+ transition: opacity 0.1s var(--appleEase);
+ }
+
+ > .play-btn {
+ position: absolute;
+ bottom: calc(var(--frame) / 220 * 14);
+ left: calc(var(--frame) / 220 * 14);
+ z-index: 2;
+ }
+
+ > .menu-btn {
+ position: absolute;
+ bottom: calc(var(--frame) / 220 * 14);
+ right: calc(var(--frame) / 220 * 14);
+ z-index: 2;
+ }
+
+ &:hover {
+
+ > .play-btn,
+ > .menu-btn {
+ opacity: 1;
+ }
+ }
+ }
+
+
+ .title {
+ width: 90%;
+ text-align: center;
+ }
+
+ .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: calc(var(--frame) / 220 * 12);
+ }
+
+ &.mediaitem-video {
+ height: calc(var(--frame) / 220 * 200);
+ width: calc(var(--frame) / 220 * 240);
+
+ .artwork {
+ height: calc(var(--frame) / 220 * 120);
+ width: calc(var(--frame) / 220 * 212);
+ }
+ }
+
+ &.mediaitem-brick {
+ height: calc(var(--frame) / 220 * 200);
+ width: calc(var(--frame) / 220 * 240);
+
+ .artwork {
+ height: calc(var(--frame) / 220 * 123);
+ width: calc(var(--frame));
+ }
+ }
+}
+
+
+.listitem-horizontal {
+ .cd-mediaitem-list-item {
+ width: 350px;
+ height: 60px;
+ }
+}
+
+.mediaitem-list-item__grid {
+ background: rgba(200, 200, 200, 0.05);
+ border-radius: 10px;
+ padding: var(--contentInnerPadding);
+ box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;
+ width: 100%;
+
+ .cd-mediaitem-list-item {
+ width: 350px;
+ height: 60px;
+ }
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+
+ &:hover::-webkit-scrollbar {
+ display: initial;
+
+ }
+}
+
+// Graphics
+
+// sidebar icon
+.svg-icon {
+ --color: #aaa;
+ --url: url("./assets/feather/share.svg");
+ -webkit-mask-image: var(--url);
+ -webkit-mask-size: cover;
+ height: 18px;
+ width: 18px;
+ background: var(--color);
+
+ &.inline {
+ display: inline-block;
+ }
+}
+
+.sidebar-icon {
+ width: 18px;
+ height: 18px;
+ margin-right: 8px;
+
+ > .svg-icon {
+ width: 100%;
+ height: 100%;
+ --color: #aaa;
+ }
+
+ > svg {
+ width: 100%;
+ height: 100%;
+ color: #aaa;
+ }
+}
+
+
+/* Switch Checkbox */
+input[type=checkbox][switch] {
+ width: 38px;
+ appearance: none;
+ border-radius: 32px;
+ height: 24px;
+ zoom: 1;
+ top: 0;
+ cursor: pointer;
+ left: 0;
+ position: relative;
+ transform: scale(1);
+ background: rgb(142 142 147 / 100%);
+ padding: 0;
+ margin: 0;
+}
+
+input[type=checkbox][switch]:focus,
+input[type=checkbox][switch]:active {
+ outline: none;
+}
+
+input[type=checkbox][switch]:checked {
+ background: var(--keyColor);
+ border: 0 solid var(--keyColor);
+ mix-blend-mode: unset;
+
+ &:hover {
+ background: var(--keyColor-rollover);
+ }
+
+ &:active {
+ background: var(--keyColor-pressed);
+ }
+}
+
+input[type=checkbox][switch]::before {
+ background: white;
+ width: 26px;
+ height: 26px;
+ top: -1px;
+ left: -1px;
+ position: absolute;
+ content: ' ';
+ border-radius: 32px;
+ transition: .10s left var(--appleEase);
+ transform: scale(.75);
+}
+
+
+input[type=checkbox][switch]:checked::before {
+ background: white;
+ top: -1px;
+ left: 13px;
+ transition: .10s left var(--appleEase);
+ transform: scale(.75);
+}
+
+input[type=checkbox][switch]:disabled::before {
+ opacity: .5;
+}
+
+input[type=checkbox][switch]:active::before {
+ left: 13px;
+}
+
+input[type=checkbox][switch]:checked:active::before {
+ left: -1px;
+}
+
+/* End Switch Checkbox */
+
+
+
+.header-text {
+ margin: 0px;
+}
+
+.media-item--small {
+ background: rgb(0 0 0 / 25%);
+ height: 162px;
+ width: 132px;
+ display: inline-flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ border-radius: 10px;
+}
+
+.media-item--small .artwork {
+ background: red;
+ margin: 6px;
+ border-radius: 100%;
+ width: 90px;
+ height: 90px;
+ box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 30%);
+}
+
+.playlist-artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ box-shadow: var(--mediaItemShadow);
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+}
+
+.media-item--small .text {
+ font-weight: 600;
+ font-size: 0.90em;
+}
+
+.media-item--small .subtext {
+ font-size: 0.75em;
+}
+
+.player-duration-time {
+ opacity: 0.5;
+}
+
+.player-artwork-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.player-duration-container {
+ font-size: 0.85em;
+ font-weight: 500;
+}
+
+.media-artwork {
+ --artwork: url("");
+ width: 80vw;
+ height: 80vw;
+ max-height: 500px;
+ max-width: 500px;
+ background: black;
+ background-image: var(--artwork);
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ border-radius: 8px;
+ box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%), 0 8px 40px rgb(0 0 0 / 0.55);
+ transition: transform .10s var(--appleEase);
+}
+
+.media-artwork.paused {
+ transition: transform .35s var(--appleEase);
+ transform: scale(0.85);
+}
+
+.playback-slider {
+ width: 90%;
+}
+
+.volume-slider {
+ width: 100%;
+}
+
+.volume-slider-container {
+ width: 90%;
+ margin: 0 auto;
+ padding: 0px;
+}
+
+.volume-slider-container .col-auto,
+.volume-slider-container .col {
+ display: flex;
+ align-items: center;
+ justify-self: center;
+ padding: 0px;
+ margin: 0px;
+}
+
+.playback-button {
+ font-size: 2em;
+ width: 40px;
+ height: 36px;
+ padding: 0px;
+ background: transparent;
+ border: 0px;
+ border-radius: 0px;
+ box-shadow: unset;
+ background-size: 12px;
+ background-position: center;
+ background-repeat: no-repeat;
+ opacity: 0.70;
+ border-radius: 6px;
+}
+
+.playback-button:active {
+ transform: scale(0.95);
+}
+
+.playback-button--small {
+ border-radius: 6px;
+ font-size: 1em;
+ color: inherit;
+ background-size: 14px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-color: transparent;
+ width: 40px;
+ height: 32px;
+ border: 0px;
+ box-shadow: unset;
+ opacity: 0.70;
+}
+
+.playback-button:hover,
+.playback-button--small:hover {
+ background-color: rgb(200 200 200 / 10%);
+}
+
+.playback-button:active,
+.playback-button--small:active {
+ transform: scale(0.9);
+}
+
+.playback-button--small.active {
+ background-color: rgb(200 200 200 / 25%);
+}
+
+.playback-button--small.search {
+ background-image: url("./assets/search.svg");
+}
+
+.playback-button--small.cast {
+ background-image: url("./assets/cast_white.svg");
+}
+
+.playback-button--small.miniplayer {
+ background-image: url("./assets/pip.svg");
+}
+
+.playback-button--small.queue {
+ background-image: url("./assets/list.svg");
+}
+
+.playback-button--small.lyrics {
+ background-image: url("./assets/quote-right.svg");
+}
+
+.playback-button--small.shuffle {
+ background-image: url("./assets/shuffle.svg");
+}
+
+.playback-button--small.repeat {
+ background-image: url("./assets/repeat.svg");
+}
+
+.playback-button--small.repeat.repeatOne {
+ background-color: rgb(200 200 200 / 25%);
+ background-image: url("./assets/repeatOne.svg");
+}
+
+.playback-button.pause {
+ background-image: url('./assets/pause.svg');
+}
+
+.playback-button.play {
+ background-image: url('./assets/play.svg');
+}
+
+.playback-button.next {
+ background-image: url('./assets/forward.svg');
+}
+
+.playback-button.previous {
+ background-image: url('./assets/backward.svg');
+}
+
+.playback-buttons {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.player-volume-glyph {
+ width: 32px;
+ height: 16px;
+ background-repeat: no-repeat;
+ background-size: contain;
+ background-position: center;
+}
+
+.player-volume-glyph.decrease {
+ background-image: url("./assets/volume.svg");
+ opacity: 0.5;
+}
+
+.player-volume-glyph.increase {
+ background-image: url("./assets/volume-2.svg");
+ opacity: 0.5;
+}
+
+.player-track-info {
+ width: 90%;
+ margin: 0 auto;
+}
+
+.player-song-title {
+ font-size: 1.25em;
+ text-align: left;
+ margin: 0 auto;
+ font-weight: 500;
+}
+
+.player-song-artist {
+ font-size: 1.0em;
+ text-align: left;
+ margin: 0 auto;
+ color: var(--keyColor);
+ font-weight: 400;
+}
+
+.player-song-artist:hover {
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+.player-more-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.player-more-button {
+ appearance: none;
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ border: 0px;
+ background: var(--keyColor);
+ cursor: pointer;
+ box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%);
+ color: white;
+ font-weight: bold;
+ padding: 0px;
+ font-size: 16px;
+}
+
+.back-button {
+ width: 40px;
+ height: 40px;
+ background-color: transparent;
+ background-size: 16px;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-image: url("./assets/arrow-left.svg");
+ border: 0px;
+ border-radius: 0px;
+}
+
+.header-text {
+ height: 40px;
+ display: flex;
+ align-items: center;
+
+}
+
+
+.list-entry-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12px;
+ font-size: 1em;
+ font-family: inherit;
+}
+
+.list-entry {
+ display: flex;
+ align-items: center;
+ /* justify-content: space-between; */
+ padding: 12px;
+ font-size: 1em;
+ font-family: inherit;
+ border-bottom: 1px solid rgba(255 255 255 / 0.1);
+ cursor: pointer;
+}
+
+.list-entry-image {
+ --artwork: url("");
+ width: 64px;
+ height: 64px;
+ background: var(--artwork);
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ border-radius: 8px;
+ box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%), 0 8px 40px rgb(0 0 0 / 0.55);
+}
+
+.list-entry-image.artist {
+ border-radius: 50%;
+}
+
+.list-entry-body {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: flex-start;
+ margin-left: 12px;
+}
+
+.list-entry-name {
+ font-size: 14px;
+ font-weight: 500;
+ overflow: hidden;
+ width: 100%;
+}
+
+.list-entry-artist {
+ font-size: 12px;
+ overflow: hidden;
+ width: 100%;
+}
+
+.list-entry .handle {
+ height: 100%;
+ width: 28px;
+ background: var(--keyColor);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.artist-chip {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ margin: 4px 0px;
+ border-radius: 4px;
+ color: white;
+ font-size: 1em;
+ font-weight: 500;
+ cursor: pointer;
+ padding: 8px;
+
+ &:hover {
+ background: var(--selected);
+ }
+
+ .artist-chip__follow {
+ appearance: none;
+ border: 0;
+ height: 32px;
+ width: 32px;
+ background: #ffffff0f;
+ margin: 0px 0px 0px 10px;
+ font-weight: bold;
+ color: white;
+ border-radius: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 12px;
+ cursor: pointer;
+ flex: 0 0 32px;
+
+ &:hover {
+ background: var(--selected);
+ }
+ }
+
+ .artist-chip__image {
+ width: 32px;
+ height: 32px;
+ background-size: contain;
+ background-position: center;
+ background-repeat: no-repeat;
+ border-radius: 100%;
+ overflow: hidden;
+ margin: 0px 12px 0px 0px;
+ pointer-events: none;
+ flex: 0 0 32px;
+
+ .mediaitem-artwork {
+ border-radius: inherit;
+ }
+ }
+ .artist-chip__name {
+ pointer-events: none;
+ }
+}
+
+.search-panel {
+ background: rgb(0 0 0 / 50%);
+}
+
+.search-header {
+ position: absolute;
+ width: 100%;
+ z-index: 1;
+ backdrop-filter: blur(16px);
+ -webkit-backdrop-filter: blur(16px);
+ border-bottom: 1px solid rgb(200 200 200 / 8%);
+}
+
+.connection-error-panel {
+ background: rgb(0 0 0 / 50%);
+}
+
+.search-type-container {
+ display: flex;
+}
+
+.search-type-button {
+ background: rgb(20 20 20 / 0.85);
+ border-radius: 50px;
+ color: white;
+ border: 0px;
+ box-shadow: unset;
+ font-family: inherit;
+ padding: 8px 16px;
+ font-size: 14px;
+ font-weight: 500;
+ margin: 8px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.search-type-button.active {
+ background: var(--keyColor);
+}
+
+.search-tab-container {
+ overflow: auto;
+ white-space: nowrap;
+ overflow-y: hidden;
+}
+
+.search-body-container {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+.search-body {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ padding-top: 220px;
+}
+
+.search-tab {
+ background: rgb(20 20 20 / 0.85);
+ border-radius: 50px;
+ color: white;
+ border: 0px;
+ box-shadow: unset;
+ font-family: inherit;
+ padding: 8px 16px;
+ font-size: 14px;
+ font-weight: 500;
+}
+
+.search-tab.active {
+ background: var(--keyColor);
+}
\ No newline at end of file
diff --git a/src/renderer/less/helpers.less b/src/renderer/less/helpers.less
new file mode 100644
index 00000000..08cd33c3
--- /dev/null
+++ b/src/renderer/less/helpers.less
@@ -0,0 +1,407 @@
+.notyf__toast {
+ -webkit-app-region: no-drag;
+ cursor: pointer;
+}
+
+.notyf-info {
+ background: var(--keyColor);
+}
+
+
+
+.modal-fullscreen {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.3);
+ z-index: 1000;
+
+ .modal-window {
+ background: #333;
+ border-radius: 10px;
+ box-shadow: var(--mediaItemShadow-Shadow);
+ display: flex;
+ flex-flow: column;
+ max-height: 500px;
+ max-width: 360px;
+ background: #121212;
+ width: 100%;
+ position: relative;
+
+ &:after {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ box-shadow: var(--mediaItemShadow);
+ z-index: 1;
+ border-radius: inherit;
+ }
+
+ .modal-header {
+ width: 100%;
+ padding: 6px;
+ }
+
+ .modal-content {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ overflow-y: overlay;
+ }
+
+ .modal-footer {
+ }
+ }
+}
+
+.spatialproperties-panel {
+ .modal-window {
+ height: 700px;
+ max-height: 700px;
+ width: 800px;
+ max-width: 800px;
+ overflow: hidden;
+
+ .info-header {
+ padding-left: 12px;
+ }
+
+ .visual-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: hidden;
+ }
+
+ .visual {
+ position: relative;
+ height: 250px;
+ width: 300px;
+ display: inline-flex;
+ align-items: flex-end;
+ justify-content: center;
+ filter: drop-shadow(2px 12px 6px rgb(0 0 0 / 25%));
+ margin: 0 auto;
+
+ .face {
+ position: absolute;
+ width: calc(12px * 6);
+ height: calc(12px * 6);
+ border-radius: 6px;
+ transform: rotateX(60deg) rotateZ(-45deg);
+ transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
+ }
+
+ .listener {
+ position: absolute;
+ width: 32px;
+ height: 32px;
+ border-radius: 6px;
+ transform: rotateX(60deg) rotateZ(-45deg);
+ transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
+ background: white;
+ color: black;
+ z-index: 2;
+ }
+
+ .audiosource {
+ position: absolute;
+ width: 32px;
+ height: 32px;
+ border-radius: 6px;
+ transform: rotateX(60deg) rotateZ(-45deg);
+ transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
+ background: yellow;
+ z-index: 2;
+ }
+
+ .face:nth-of-type(1) {
+ background: linear-gradient(45deg, #28223a, #1f2038);
+ z-index: 1;
+ }
+
+ .face:nth-of-type(2) {
+ background: linear-gradient(45deg, #7d53ad, #5763ff);
+ transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px);
+ opacity: 0.7;
+ z-index: 3;
+ }
+ }
+
+ .modal-header {
+ padding: 16px;
+ position: relative;
+ overflow: hidden;
+
+ .modal-title {
+ text-align: center;
+ }
+
+ .close-btn {
+ width: 50px;
+ height: 100%;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+
+ &:hover {
+ background-color: rgb(196, 43, 28)
+ }
+ }
+ }
+ }
+}
+
+.addtoplaylist-panel {
+ .modal-window {
+ max-height: 600px;
+ max-width: 400px;
+ background: rgb(18 18 18 / 90%);
+ overflow: hidden;
+ backdrop-filter: blur(16px) saturate(180%);
+
+ .modal-header {
+ padding: 16px;
+ position: relative;
+
+ .modal-title {
+ text-align: center;
+ }
+
+ .close-btn {
+ width: 50px;
+ height: 100%;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+
+ &:hover {
+ background-color: rgb(196, 43, 28)
+ }
+ }
+ }
+
+ .modal-search {
+ width: 100%;
+ padding: 0px 16px;
+ position: relative;
+ }
+
+ .playlist-item {
+ appearance: none;
+ border: 0px;
+ text-align: left;
+ width: 100%;
+ margin: 0;
+ display: flex;
+ background: rgba(32, 32, 32, 0.46);
+ color: #eee;
+ font-family: inherit;
+ font-size: 0.98em;
+ padding: 6px 12px;
+ align-items: center;
+ flex-flow: row;
+
+ .icon {
+ pointer-events: none;
+ width: 32px;
+ height: 32px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-right: 6px;
+ }
+
+ .name {
+ position: relative;
+ }
+
+ &:hover {
+ background: var(--selected);
+ }
+
+ &:active {
+ background: var(--selected-click);
+ }
+
+ &.focused {
+ background: var(--keyColor);
+ }
+ }
+
+ .playlist-item:last-child {
+ border-bottom: 0px;
+ }
+ }
+}
+
+.menu-panel {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 100001;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ -webkit-app-region: no-drag;
+
+ .menu-header-body {
+ padding: 6px;
+ display: flex;
+ background: rgb(200 200 200 / 10%);
+
+ .menu-option-header {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: var(--mediaItemRadius);
+ appearance: none;
+ border: 0;
+ background: transparent;
+
+ &.active {
+ .sidebar-icon > .svg-icon {
+ --color: var(--keyColor);
+ }
+ }
+
+ &:hover {
+ background: var(--selected);
+ }
+
+ &:active {
+ background: var(--selected-click);
+ }
+ }
+ }
+
+ .menu-panel-body {
+ display: flex;
+ flex-flow: column;
+ background: #262626;
+ position: relative;
+ min-width: 200px;
+ box-shadow: var(--ciderShadow-Generic);
+ border-radius: var(--mediaItemRadius);
+ overflow: hidden;
+ font-size: 13px;
+
+ .menu-option {
+ text-align: left;
+ display: flex;
+ width: 100%;
+ padding: 9px 16px;
+ appearance: none;
+ border: 0px;
+ font: inherit;
+ background: transparent;
+ color: inherit;
+
+ &:hover {
+ background: var(--selected);
+ }
+
+ &:active {
+ background: var(--selected-click);
+ }
+ }
+ }
+
+
+ .menu-header-text {
+ margin: 18px 6px;
+
+ .close-btn {
+ width: 50px;
+ height: 42px;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+
+ &:hover {
+ background-color: rgb(196, 43, 28)
+ }
+ }
+ }
+
+ .menu-body {
+ overflow: overlay;
+ height: 100%;
+ }
+
+ .menu-footer {
+ width: 100%;
+ padding: 12px;
+ }
+}
+
+.queue-panel {
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-flow: column;
+
+ .queue-header-text {
+ margin: 18px 6px;
+ }
+
+ .queue-body {
+ overflow: overlay;
+ height: 100%;
+ }
+
+ .queue-footer {
+ width: 100%;
+ padding: 12px;
+ }
+
+ .autoplay {
+ background: rgb(200 200 200 / 15%);
+ display: flex;
+ justify-content: center;
+ appearance: none;
+ border: 0;
+ border-radius: 6px;
+ height: 32px;
+ width: 32px;
+ }
+
+ .infinity {
+ content: url("./assets/infinity.svg");
+ margin: auto;
+ }
+}
diff --git a/src/renderer/less/linux.less b/src/renderer/less/linux.less
new file mode 100644
index 00000000..6b26d1ee
--- /dev/null
+++ b/src/renderer/less/linux.less
@@ -0,0 +1,6 @@
+// Linux
+body[platform="linux"] {
+ #window-controls-container {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/src/renderer/less/macos.less b/src/renderer/less/macos.less
new file mode 100644
index 00000000..af21338b
--- /dev/null
+++ b/src/renderer/less/macos.less
@@ -0,0 +1,17 @@
+body[platform="darwin"] {
+ html {
+ background: transparent!important;
+ }
+
+ &.notransparency::before {
+ display: none;
+ }
+ #app {
+ &.simplebg {
+ background: transparent;
+ }
+ &::before {
+ display: none;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/renderer/less/pages.less b/src/renderer/less/pages.less
new file mode 100644
index 00000000..41fc5ea4
--- /dev/null
+++ b/src/renderer/less/pages.less
@@ -0,0 +1,1022 @@
+// Helpers
+.content-inner {
+ position: absolute;
+ top: var(--navigationBarHeight);
+ left: 0;
+ padding: 32px;
+ width: 100%;
+ transition: zoom 1s;
+ zoom: 1;
+}
+
+.content-inner.centered {
+ height: 100%;
+ display: flex;
+ flex-flow: column;
+ justify-content: center;
+ align-items: center;
+}
+// End Helpers
+
+// GitHub Themes
+.github-themes-page {
+ display: flex;
+ flex-direction: column;
+ padding: 0px;
+ height: calc(100% - var(--navigationBarHeight));
+
+ .github-avatar {
+ height: 42px;
+ width: 42px;
+ margin: 6px;
+ border-radius: 32px;
+ }
+
+ .repo-name {
+ margin:0px;
+ font-weight: 500;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: break-spaces;
+ }
+
+ .repo-url {
+ color: var(--textColor);
+ font-size: 0.8em;
+ }
+
+ .repo-preview-name {
+ margin:0px;
+ }
+
+ .repos-list {
+ height: 100%;
+ overflow-y: overlay;
+ width: 320px;
+ font-size: 14px;
+
+ >.list-group {
+ margin:0px;
+ }
+ .list-group-item {
+ padding: 12px 6px;
+
+ &:hover {
+ filter: brightness(1.2);
+ }
+
+ &:active {
+ filter: brightness(0.8);
+ }
+ }
+ }
+
+ .github-preview {
+ height: 100%;
+ flex: 1;
+ background: var(--color2);
+ padding: 16px 32px;
+ overflow-y:overlay;
+ }
+
+ .gh-content {
+ display: flex;
+ flex-direction: row;
+ flex: 1;
+ overflow: hidden;
+ }
+
+ .gh-header {
+ padding: 16px;
+ }
+}
+
+// Library - Songs page
+.library-page {
+ padding: 0px;
+
+ .library-header {
+ position: sticky;
+ top: 0;
+ left: 0;
+ border-bottom: 1px solid rgba(200, 200, 200, 0.05);
+ z-index: 6;
+ background: black;
+ padding: 0px 2em;
+ backdrop-filter: blur(32px);
+ background: rgba(0, 0, 0, 0.25);
+ top: var(--navigationBarHeight);
+ }
+
+ .well {
+ margin: 2em;
+ }
+}
+
+// Podcast Page
+.content-inner.podcasts-page {
+ display: flex;
+ height: calc(100% - var(--navigationBarHeight));
+ padding: 0px;
+
+ .list-flat {
+ border-radius: 0px;
+ }
+
+ .podcast-artwork {
+ width: 200px;
+ margin: 16px auto;
+ height: 200px;
+ }
+
+ .podcasts-list {
+ height: 100%;
+ width: 280px;
+ background: rgb(200 200 200 / 10%);
+ overflow-y: overlay;
+ border-right: 1px solid var(--color2);
+ flex: none;
+ overflow-x: hidden;
+
+ .podcast-list-header {
+ border-bottom: 1px solid var(--color2);
+ font-size: 0.7em;
+ padding: 6px;
+ background: #ffffff17;
+ text-transform: uppercase;
+ font-weight: 600;
+ opacity: 0.5;
+ }
+
+ .podcasts-search {
+ padding: 10px;
+ position: sticky;
+ top: 0;
+ left: 0;
+ width: 100%;
+ border-bottom: 1px solid var(--color2);
+ z-index: 2;
+ background: #303030;
+ }
+ }
+
+ .episodes-list {
+ height: 100%;
+ width: 100%;
+ background: rgb(200 200 200 / 6%);
+ overflow-y: overlay;
+ overflow-x: hidden;
+
+ .episodes-inline-info {
+ padding: 14px 14px 0px 14px;
+
+ .podcast-show-info {
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ }
+
+ .podcast-show-description {
+ margin: 32px 6px;
+ font-size: 0.8rem;
+ white-space: pre-wrap;
+ display: block;
+ }
+
+ .podcast-artwork {
+ width: 120px;
+ margin: 0px auto;
+ height: 120px;
+ }
+ }
+
+ .podcast-no-search-results {
+ text-align: center;
+ margin-top: 40px;
+ }
+ }
+
+ .podcasts-details {
+ width: 300px;
+ flex: none;
+ background: rgb(255 255 255 / 5%);
+ overflow-y: overlay;
+ overflow-x: hidden;
+ top: 2%;
+ z-index: 2;
+ border-left: 1px solid var(--color2);
+ padding-bottom: 1em;
+
+ .meta-btn {
+ font-size: 0.75em;
+ }
+
+ .podcasts-details-header {
+ display: flex;
+ justify-content: end;
+ align-items: center;
+ position: sticky;
+ top: 0;
+ z-index: 2;
+ }
+
+ .close-btn {
+ width: 50px;
+ height: 42px;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+
+ &:hover {
+ background-color: rgb(196, 43, 28)
+ }
+ }
+
+ .podcast-genre {
+ text-align: center;
+ margin: 6px;
+ font-size: 0.8em;
+ font-weight: 500;
+ opacity: 0.8;
+ }
+
+ .podcast-metainfo {
+ text-align: center;
+ font-size: 0.7em;
+ opacity: 0.8;
+ }
+
+ .podcast-header {
+ text-align: center;
+ }
+
+ .podcast-play-btn {
+ width: 50%;
+ display: block;
+ margin: 0 auto;
+ }
+
+ .podcast-description {
+ margin: 12px;
+ font-size: 0.75em;
+ white-space: pre-wrap;
+ display: block;
+ line-break: anywhere;
+ }
+
+
+ }
+
+}
+
+@media only screen and (max-width: 1230px) {
+ .content-inner.podcasts-page {
+ .podcasts-details {
+ height: 96%;
+ width: 300px;
+ flex: none;
+ background: rgb(20 20 20 / 97%);
+ overflow-y: overlay;
+ overflow-x: hidden;
+ position: absolute;
+ right: 2%;
+ top: 2%;
+ border-radius: 10px;
+ box-shadow: var(--ciderShadow-Generic);
+ z-index: 2;
+ }
+ }
+}
+
+/* Album / Playlist Page */
+.playlist-page {
+ --bgColor: transparent;
+ padding: 0px;
+ //background: linear-gradient(180deg, var(--bgColor) 32px, var(--bgColor) 18px, transparent 60px, transparent 100%);
+ top: 0;
+ padding-top: var(--navigationBarHeight);
+
+ .playlist-body {
+ padding: var(--contentInnerPadding) 2em;
+ margin-top: -75px;
+ }
+
+ .floating-header {
+ position: sticky;
+ top: 0;
+ left: 0;
+ border-bottom: 1px solid rgba(200, 200, 200, 0.05);
+ z-index: 6;
+ padding: 0px 1em;
+ backdrop-filter: blur(32px);
+ background: rgba(0, 0, 0, 0.25);
+ top: var(--navigationBarHeight);
+ transition: opacity 0.1s var(--appleEase);
+ }
+
+ .playlist-display {
+ padding: var(--contentInnerPadding);
+ min-height: 300px;
+ position: relative;
+
+ .artworkContainer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ margin: 0;
+ margin-top: calc(var(--navigationBarHeight) * -1);
+ margin-bottom: -10px;
+ padding: 0;
+ -webkit-mask-image: radial-gradient(at top left, black, transparent 70%), radial-gradient(at top right, black, transparent 70%), linear-gradient(180deg, rgb(200 200 200), transparent 98%);
+ opacity: .7;
+ animation: playlistArtworkFadeIn 1s var(--appleEase);
+
+ .artworkMaterial > img {
+ filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
+ object-position: center;
+ object-fit: cover;
+ width: 100%;
+ height: 100%;
+ transform: unset;
+ }
+ }
+
+ .playlistInfo {
+ z-index: 1;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ top: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+
+ > .row {
+ width: calc(100% - 32px);
+ }
+
+ .playlist-info {
+ flex-shrink: unset;
+ display: flex;
+ flex-flow: column;
+ justify-content: flex-end;
+
+ .playlist-name {
+ font-weight: 700;
+ font-size: 1.6rem;
+ //margin-bottom: 6px;
+ margin-right: 6px;
+ flex-shrink: unset;
+ }
+
+ .nameEdit {
+ font-weight: 700;
+ font-size: 1.6rem;
+ margin-bottom: 6px;
+ margin-right: 6px;
+ flex-shrink: unset;
+ background: transparent;
+ border: 0px;
+ color: inherit;
+ font-family: inherit;
+ }
+
+ .playlist-artist {
+ font-size: 20px;
+ margin-bottom: 6px;
+ margin-right: 6px;
+ flex-shrink: unset;
+ }
+
+ .playlist-desc {
+ box-sizing: border-box;
+ font-size: 14px;
+ flex-shrink: unset;
+ margin-right: 5px;
+ max-height: 100px;
+ position: relative;
+
+ .content {
+ height: 100px;
+ -webkit-mask-image: -webkit-gradient(linear, left 50%, left 90%, from(rgba(0, 0, 0, 1)), to(rgba(0, 0, 0, 0)));
+ }
+
+ .more-btn {
+ appearance: none;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ padding: 0 5px;
+ font-size: 14px;
+ color: var(--keyColor);
+ background-color: transparent;
+ border: 0px;
+ cursor: pointer;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ display: flex;
+ justify-content: flex-end;
+ align-items: flex-end;
+ font-weight: 600;
+ font-family: inherit;
+ text-transform: uppercase;
+ }
+ }
+
+ .playlist-desc-expanded {
+ box-sizing: border-box;
+ font-size: 14px;
+ position: relative;
+
+ .more-btn {
+ appearance: none;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ padding: 0 5px;
+ font-size: 14px;
+ color: var(--keyColor);
+ background-color: transparent;
+ border: 0px;
+ cursor: pointer;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ display: flex;
+ justify-content: flex-end;
+ align-items: flex-end;
+ font-weight: 600;
+ font-family: inherit;
+ text-transform: uppercase;
+ }
+ }
+ }
+ }
+
+
+ }
+
+ .friends-info {
+ display: flex;
+ flex-flow: column;
+
+ .badge-container {
+ display: flex;
+ flex-flow: wrap;
+
+ .socialBadge {
+ width: 40px;
+ height: 40px;
+ border-radius: 100%;
+ overflow: hidden;
+ box-shadow: var(--mediaItemShadow-ShadowSubtle);
+ transition: transform .2s var(--appleEase);
+ margin: 6px;
+
+ &:hover {
+ transform: scale(1.2);
+ }
+ }
+ }
+
+ .friends-name {
+ text-align: center;
+ font-size: 0.9em;
+ margin: 8px;
+ }
+ }
+
+ .playlist-time {
+ font-size: 0.9em;
+ margin: 6px;
+ opacity: 0.7;
+ }
+
+ &.inline-playlist {
+ overflow: hidden;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.5);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 6;
+ position: sticky;
+ margin-top: calc(var(--navigationBarHeight) * -1);
+
+ .floating-header {
+ opacity: 1;
+ top: 0px;
+ z-index: 6;
+ padding: 1em;
+ backdrop-filter: unset;
+ background: black;
+ h3 {
+ display: none;
+ }
+ }
+ .playlist-inner {
+ background: black;
+ width: 80%;
+ height: 100%;
+ overflow: overlay;
+ box-shadow: var(--ciderShadow-Generic);
+ border-radius: var(--mediaItemRadius) var(--mediaItemRadius) 0px 0px;
+
+ .close-btn {
+ position: sticky;
+ top: 16px;
+ left: 16px;
+ margin-left: 16px;
+ z-index: 7;
+ }
+ }
+ }
+}
+
+@keyframes playlistArtworkFadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 0.7;
+ }
+}
+
+// Collection Page
+.collection-page {
+ padding-bottom: 128px;
+
+ .top-fab {
+ height: 52px;
+ width: 52px;
+ position: fixed;
+ bottom: 32px;
+ right: 32px;
+ border-radius: 100%;
+ background: rgb(60 60 60);
+ border: 0px;
+ appearance: none;
+ box-shadow: var(--ciderShadow-Generic);
+
+ > svg {
+ height: 50%;
+ color: #eee;
+ pointer-events: none;
+ }
+
+ &:hover {
+ background: rgb(100 100 100);
+ }
+
+ &:active {
+ background: var(--keyColor);
+ }
+ }
+
+ .header-text {
+ margin-bottom: 32px;
+ }
+}
+
+/* Artist Page */
+
+.artist-page {
+ padding: 0px;
+ top: 0;
+
+ .floating-header {
+ position: sticky;
+ top: 0;
+ left: 0;
+ border-bottom: 1px solid rgba(200, 200, 200, 0.05);
+ z-index: 6;
+ padding: 0px 1em;
+ backdrop-filter: blur(32px);
+ background: rgba(0, 0, 0, 0.25);
+ top: var(--navigationBarHeight);
+ transition: opacity 0.1s var(--appleEase);
+ }
+
+ &.animated .artist-header .more-btn-round {
+ position: absolute;
+ bottom: 22px !important;
+ right: 28px;
+ }
+
+ .artist-header {
+ //background: linear-gradient(45deg, var(--keyColor), #0e0e0e);
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ min-height: 400px;
+ position: relative;
+ pointer-events: none;
+
+ .header-content {
+ z-index: 1;
+ margin-top: -16px;
+ }
+
+
+ .artworkContainer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ margin: 0;
+ padding: 0;
+ -webkit-mask-image: radial-gradient(at top left, black, transparent 70%), radial-gradient(at top right, black, transparent 70%), linear-gradient(180deg, rgb(200 200 200), transparent 98%);
+ opacity: .7;
+ animation: playlistArtworkFadeIn 1s var(--appleEase);
+
+ .artworkMaterial > img {
+ filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
+ object-position: center;
+ object-fit: cover;
+ width: 100%;
+ height: 100%;
+ transform: unset;
+ }
+ }
+
+ .more-btn-round {
+ position: absolute;
+ bottom: 82px;
+ right: 28px;
+ }
+
+ .animated {
+ width: 100%;
+ height: 100%;
+ align-self: center;
+ position: absolute;
+ overflow: hidden;
+ box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
+
+ video {
+ overflow: hidden;
+ height: 100%;
+ width: 100%;
+ min-height: 56.25vw;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+ }
+
+ .row .col.flex-center {
+ z-index: 4;
+ }
+ }
+
+ .artist-image {
+ width: 200px;
+ height: 200px;
+ margin: 32px;
+ position: relative;
+
+ .overlay-play {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ background: rgb(0 0 0 / 50%);
+ transition: opacity 0.1s var(--appleEase);
+ border-radius: 100%;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ appearance: none;
+ border: 0px;
+ padding: 0px;
+
+ &:hover {
+ opacity: 1;
+ }
+
+ &:active {
+ background: var(--selected-click);
+ }
+
+ > svg {
+ width: 70%;
+ }
+ }
+ }
+
+ .artist-play {
+ width: 32px;
+ height: 32px;
+ background: rgba(100, 100, 100, 0.5);
+ box-shadow: var(--ciderShadow-Generic);
+ border-radius: 100%;
+ box-shadow: var(--mediaItemShadow);
+ display: none;
+ cursor: pointer;
+ appearance: none;
+ border: 0px;
+ padding: 0px;
+
+ &:hover {
+ filter: brightness(125%);
+ }
+
+ &:active {
+ filter: brightness(75%);
+ transform: scale(0.98);
+ transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
+ }
+ }
+
+ .artist-title {
+
+ .artist-play {
+ transform: translateY(3px);
+ margin: 14px;
+ }
+
+ &.artist-animation-on {
+ width: 100%;
+ flex: unset;
+ margin-left: 0.5em;
+ color: whitesmoke;
+ position: absolute;
+ bottom: 0;
+
+ .artist-play {
+ display: block;
+ }
+ }
+ }
+
+ .artist-body {
+ padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
+ margin: -140px 20px;
+ }
+
+ &.animated > .artist-body {
+ padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
+ margin-top: -57px;
+ }
+
+ .showmoreless {
+ font-family: inherit;
+ font-size: 16px;
+ font-weight: 500;
+ background: transparent;
+ border: 0px;
+ border-radius: 6px;
+ appearance: none;
+ color: var(--keyColor);
+ padding: 8px 12px;
+ cursor: pointer;
+ margin-top: 12px;
+ float: right;
+ }
+
+ .showmoreless:hover {
+ background: rgb(200 200 200 / 10%);
+ }
+}
+
+/* Artist Page End */
+
+// Settings page
+.settings-page {
+ padding: 0px;
+
+ .md-option-header {
+ padding: 1.25em 1.25em;
+ border-bottom: unset;
+ border-top: unset;
+ font-weight: 600;
+ font-size: 1.0em;
+ background: rgb(255 255 255 / 3%);
+ }
+
+ .settings-option-body {
+ margin: 16px;
+ }
+}
+
+//Home
+.home-page {
+ top: 0;
+ padding-top: var(--navbarHeight);
+
+ .md-btn-replay {
+ background: var(--replayGradient);
+ border: 0px;
+ box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.2);
+ text-transform: uppercase;
+ font-weight: bold;
+ }
+ .md-btn-replay--hero {
+ font-size: 1em;
+ padding: 16px;
+ background: var(--replayGradient);
+ border: 0px;
+ box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 20%);
+ margin-top: 1em;
+ font-size: 0.9em;
+ text-transform: uppercase;
+ font-weight: bold;
+ }
+
+ .artist-feed-card {
+ position: absolute;
+ bottom: 0;
+ left: 10%;
+ z-index: 1;
+ background: black;
+ width: 80%;
+ height: 96%;
+ overflow: scroll;
+ border-radius: 10px;
+ }
+
+ .col.madeforyou-col {
+ width: 420px;
+ min-width: 0px;
+ max-width: 420px;
+ }
+
+ .well.artistfeed-well {
+ margin-top: 0px;
+ height: 392px;
+ align-content: flex-start;
+ }
+
+ .hint-text {
+ font-size: 0.9rem;
+ color: rgb(200 200 200 / 70%);
+ }
+
+ .user-icon {
+ border-radius: 100%;
+ width: 128px;
+ height: 128px;
+ overflow: hidden;
+ box-shadow: var(--mediaItemShadow-Shadow);
+ margin: 16px;
+ }
+
+ .well.profile-well {
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .name {
+ margin: 4px;
+ font-weight: 500;
+ }
+
+ .handle {
+ margin: 4px;
+ opacity: 0.7;
+ font-weight: 500;
+ }
+ }
+}
+
+// Replay
+.replay-page {
+ --replayTextShadow: 0px 3px 2px #6f3f52;
+
+ .replay-period {
+ height: 200px;
+ width: 200px;
+ margin: 6px;
+ border-radius: var(--mediaItemRadius);
+ overflow: hidden;
+ cursor: pointer;
+ transition: transform .2s var(--appleEase);
+ transition-delay: .1s;
+ align-self: center;
+ &:hover {
+ transform: translateY(-6px);
+ transition-delay: 0s;
+ }
+ .artwork-container {
+ height:200px;
+ width:200px;
+ }
+ }
+
+ .replay-playlist-container {
+ .cd-mediaitem-square {
+ height: 230px;
+ width: 230px;
+ .info-rect {
+ display: none;
+ }
+ }
+ }
+
+ .replay-video {
+ max-height: 300px;
+ max-width: 800px;
+ margin: 0 auto;
+
+ .mediaitem-artwork {
+ max-height: 300px;
+ max-width: 800px;
+ }
+
+ .mediaitem-artwork .animatedartwork-view-box .animated video {
+ object-fit: cover;
+ }
+ }
+ .top-genres-container {
+
+ .genre-name {
+ font-size: 0.9em;
+ margin: 6px 0px;
+ font-weight: 500;
+ }
+ .genre-count {
+ width: 100%;
+ height: 32px;
+ background: #ffffff14;
+ border-radius: 10px;
+ overflow: hidden;
+
+ .genre-count-bar {
+ height: 100%;
+ width: 0%;
+ background: var(--keyColor);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-width: 32px;
+ font-size: 0.9em;
+ font-weight: 500;
+ }
+ }
+ }
+
+ .cd-mediaitem-square {
+ .mediaitem-artwork {
+ animation: replayFadeIn .5s var(--appleEase);
+ }
+ transition: transform .2s var(--appleEase);
+ transition-delay: .1s;
+ &:hover {
+ transform: scale(1.1);
+ transition-delay: 0s;
+ }
+ }
+
+ @keyframes replayFadeIn {
+ 0% {
+ //border-radius: 100%;
+ transform: translateY(10px) scale(0.9);
+ opacity: 0;
+ }
+
+ 100% {
+ //border-radius: var(--mediaItemRadius);
+ transform: scale(1);
+ opacity: 1;
+ }
+ }
+
+ .replay-viewport {
+ background: var(--replayGradient);
+ padding: 16px 40px;
+ border-radius: 10px;
+ box-shadow: var(--mediaItemShadow), var(--mediaItemShadow-Shadow);
+ color: rgb(238 238 238 / 86%);
+
+ .replay-header {
+ text-align: center;
+ font-size: 3em;
+ text-shadow: var(--replayTextShadow);
+ }
+ }
+ .replay-card {
+ background: transparent;
+ border:0px;
+ }
+}
\ No newline at end of file
diff --git a/src/renderer/js/bootbox.min.js b/src/renderer/lib/bootbox.min.js
similarity index 100%
rename from src/renderer/js/bootbox.min.js
rename to src/renderer/lib/bootbox.min.js
diff --git a/src/renderer/lib/bootstrap-vue.min.js b/src/renderer/lib/bootstrap-vue.min.js
new file mode 100644
index 00000000..74575d56
--- /dev/null
+++ b/src/renderer/lib/bootstrap-vue.min.js
@@ -0,0 +1,11 @@
+/*!
+ * BootstrapVue 2.21.2
+ *
+ * @link https://bootstrap-vue.org
+ * @source https://github.com/bootstrap-vue/bootstrap-vue
+ * @copyright (c) 2016-2021 BootstrapVue
+ * @license MIT
+ * https://github.com/bootstrap-vue/bootstrap-vue/blob/master/LICENSE
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("vue")):"function"==typeof define&&define.amd?define(["vue"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrapVue=e(t.Vue)}(this,(function(t){"use strict";function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var i=e(t);function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){for(var i=0;it.length)&&(e=t.length);for(var i=0,n=new Array(e);i0,W=(/msie|trident/.test(j),function(){var t=!1;if(M)try{var e={get passive(){t=!0}};H.addEventListener("test",e,e),H.removeEventListener("test",e,e)}catch(e){t=!1}return t}()),Y=M&&("ontouchstart"in z.documentElement||N.maxTouchPoints>0),U=M&&Boolean(H.PointerEvent||H.MSPointerEvent),q=M&&"IntersectionObserver"in H&&"IntersectionObserverEntry"in H&&"intersectionRatio"in H.IntersectionObserverEntry.prototype,K="BvConfig",X=["xs","sm","md","lg","xl"],Z=/\[(\d+)]/g,J=/^(BV?)/,Q=/^\d+$/,tt=/^\..+/,et=/^#/,it=/^#[A-Za-z]+[\w\-:.]*$/,nt=/(<([^>]+)>)/gi,ot=/\B([A-Z])/g,rt=/([a-z])([A-Z])/g,st=/^[0-9]*\.?[0-9]+$/,at=/\+/g,lt=/[-/\\^$*+?.()|[\]{}]/g,ct=/[\s\uFEFF\xA0]+/g,ut=/\s+/,dt=/\/\*$/,ht=/(\s|^)(\w)/g,ft=/^\s+/,pt=/_/g,mt=/-(\w)/g,vt=/^\d+-\d\d?-\d\d?(?:\s|T|$)/,bt=/-|\s|T/,gt=/^([0-1]?[0-9]|2[0-3]):[0-5]?[0-9](:[0-5]?[0-9])?$/,yt=/^.*(#[^#]+)$/,wt=/%2C/g,Tt=/[!'()*]/g,Ct=/^(\?|#|&)/,xt=/^\d+(\.\d*)?[/:]\d+(\.\d*)?$/,St=/[/:]/,kt=/^col-/,$t=/^BIcon/,Bt=/-u-.+/,Element=V?H.Element:function(t){u(Element,t);var e=g(Element);function Element(){return o(this,Element),e.apply(this,arguments)}return Element}(m(Object)),HTMLElement=V?H.HTMLElement:function(t){u(HTMLElement,t);var e=g(HTMLElement);function HTMLElement(){return o(this,HTMLElement),e.apply(this,arguments)}return HTMLElement}(Element),SVGElement=V?H.SVGElement:function(t){u(SVGElement,t);var e=g(SVGElement);function SVGElement(){return o(this,SVGElement),e.apply(this,arguments)}return SVGElement}(Element),_t=V?H.File:function(t){u(i,t);var e=g(i);function i(){return o(this,i),e.apply(this,arguments)}return i}(m(Object)),Dt=function(t){return n(t)},Ft=function(t){return void 0===t},It=function(t){return null===t},Pt=function(t){return Ft(t)||It(t)},Ot=function(t){return"function"===Dt(t)},Vt=function(t){return"boolean"===Dt(t)},Et=function(t){return"string"===Dt(t)},Lt=function(t){return"number"===Dt(t)},At=function(t){return st.test(String(t))},Rt=function(t){return Array.isArray(t)},Mt=function(t){return null!==t&&"object"===n(t)},Ht=function(t){return"[object Object]"===Object.prototype.toString.call(t)},zt=function(t){return t instanceof Date},Nt=function(t){return t instanceof Event},jt=function(t){return"RegExp"===function(t){return Object.prototype.toString.call(t).slice(8,-1)}(t)},Gt=function(){return Object.assign.apply(Object,arguments)},Wt=function(t,e){return Object.create(t,e)},Yt=function(t,e){return Object.defineProperties(t,e)},Ut=function(t,e,i){return Object.defineProperty(t,e,i)},qt=function(t){return Object.getOwnPropertyNames(t)},Kt=function(t){return Object.keys(t)},Xt=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},Zt=function(t){return c({},t)},Jt=function(t,e){return Kt(t).filter((function(t){return-1!==e.indexOf(t)})).reduce((function(e,i){return c(c({},e),{},a({},i,t[i]))}),{})},Qt=function(t,e){return Kt(t).filter((function(t){return-1===e.indexOf(t)})).reduce((function(e,i){return c(c({},e),{},a({},i,t[i]))}),{})},te=function t(e,i){return Mt(e)&&Mt(i)&&Kt(i).forEach((function(n){Mt(i[n])?(e[n]&&Mt(e[n])||(e[n]=i[n]),t(e[n],i[n])):Gt(e,a({},n,i[n]))})),e},ee=function(t){return Kt(t).sort().reduce((function(e,i){return c(c({},e),{},a({},i,t[i]))}),{})},ie=function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return Rt(e)?e.reduce((function(e,i){return[].concat(T(e),[t(i,i)])}),[]):Ht(e)?Kt(e).reduce((function(i,n){return c(c({},i),{},a({},n,t(e[n],e[n])))}),{}):i},ne=function(t){return t},oe=function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;if(!(e=Rt(e)?e.join("."):e)||!Mt(t))return i;if(e in t)return t[e];var n=(e=String(e).replace(Z,".$1")).split(".").filter(ne);return 0===n.length?i:n.every((function(e){return Mt(t)&&e in t&&!Pt(t=t[e])}))?t:It(t)?null:i},re=function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=oe(t,e);return Pt(n)?i:n},se=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i="undefined"!=typeof process&&process&&process.env||{};return t?i[t]||e:i},ae=function(){return se("BOOTSTRAP_VUE_NO_WARN")||"production"===se("NODE_ENV")},le=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;ae()||console.warn("[BootstrapVue warn]: ".concat(e?"".concat(e," - "):"").concat(t))},ce=function(t){return!M&&(le("".concat(t,": Can not be called during SSR.")),!0)},ue=function(t){return!A&&(le("".concat(t,": Requires Promise support.")),!0)},de=function(){function t(){o(this,t),this.$_config={}}return s(t,[{key:"setConfig",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Ht(e)){var i=qt(e);i.forEach((function(i){var n=e[i];"breakpoints"===i?!Rt(n)||n.length<2||n.some((function(t){return!Et(t)||0===t.length}))?le('"breakpoints" must be an array of at least 2 breakpoint names',K):t.$_config[i]=ie(n):Ht(n)&&(t.$_config[i]=qt(n).reduce((function(t,e){return Ft(n[e])||(t[e]=ie(n[e])),t}),t.$_config[i]||{}))}))}}},{key:"resetConfig",value:function(){this.$_config={}}},{key:"getConfig",value:function(){return ie(this.$_config)}},{key:"getConfigValue",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;return ie(oe(this.$_config,t,e))}}]),t}(),he=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.default;e.prototype.$bvConfig=i.default.prototype.$bvConfig=e.prototype.$bvConfig||i.default.prototype.$bvConfig||new de,e.prototype.$bvConfig.setConfig(t)},fe=(I=!1,P=["Multiple instances of Vue detected!","You may need to set up an alias for Vue in your bundler config.","See: https://bootstrap-vue.org/docs#using-module-bundlers"].join("\n"),function(t){I||i.default===t||G||le(P),I=!0}),pe=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.components,i=t.directives,n=t.plugins,o=function t(o){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.installed||(t.installed=!0,fe(o),he(r,o),ge(o,e),we(o,i),ve(o,n))};return o.installed=!1,o},me=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return c(c({},e),{},{install:pe(t)})},ve=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(var i in e)i&&e[i]&&t.use(e[i])},be=function(t,e,i){t&&e&&i&&t.component(e,i)},ge=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(var i in e)be(t,i,e[i])},ye=function(t,e,i){t&&e&&i&&t.directive(e.replace(/^VB/,"B"),i)},we=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(var i in e)ye(t,i,e[i])},Te="BAlert",Ce="BAspect",xe="BAvatar",Se="BAvatarGroup",ke="BBadge",$e="BBreadcrumb",Be="BBreadcrumbItem",_e="BBreadcrumbLink",De="BButton",Fe="BButtonClose",Ie="BButtonGroup",Pe="BButtonToolbar",Oe="BCalendar",Ve="BCard",Ee="BCardBody",Le="BCardFooter",Ae="BCardGroup",Re="BCardHeader",Me="BCardImg",He="BCardImgLazy",ze="BCardSubTitle",Ne="BCardText",je="BCardTitle",Ge="BCarousel",We="BCarouselSlide",Ye="BCol",Ue="BCollapse",qe="BContainer",Ke="BDropdown",Xe="BDropdownDivider",Ze="BDropdownForm",Je="BDropdownGroup",Qe="BDropdownHeader",ti="BDropdownItem",ei="BDropdownItemButton",ii="BDropdownText",ni="BEmbed",oi="BForm",ri="BFormCheckbox",si="BFormCheckboxGroup",ai="BFormDatalist",li="BFormDatepicker",ci="BFormFile",ui="BFormGroup",di="BFormInput",hi="BFormInvalidFeedback",fi="BFormRadio",pi="BFormRadioGroup",mi="BFormRating",vi="BFormRow",bi="BFormSelect",gi="BFormSelectOption",yi="BFormSelectOptionGroup",wi="BFormSpinbutton",Ti="BFormTag",Ci="BFormTags",xi="BFormText",Si="BFormTextarea",ki="BFormTimepicker",$i="BFormValidFeedback",Bi="BIcon",_i="BImg",Di="BImgLazy",Fi="BInputGroup",Ii="BInputGroupAddon",Pi="BInputGroupAppend",Oi="BInputGroupPrepend",Vi="BInputGroupText",Ei="BJumbotron",Li="BLink",Ai="BListGroup",Ri="BListGroupItem",Mi="BMedia",Hi="BMediaAside",zi="BMediaBody",Ni="BModal",ji="BNav",Gi="BNavbar",Wi="BNavbarBrand",Yi="BNavbarNav",Ui="BNavbarToggle",qi="BNavForm",Ki="BNavItem",Xi="BNavItemDropdown",Zi="BOverlay",Ji="BPagination",Qi="BPaginationNav",tn="BPopover",en="BProgress",nn="BProgressBar",on="BRow",rn="BSidebar",sn="BSkeleton",an="BSkeletonIcon",ln="BSkeletonImg",cn="BSkeletonTable",un="BSkeletonWrapper",dn="BSpinner",hn="BTab",fn="BTable",pn="BTableCell",mn="BTableLite",vn="BTableSimple",bn="BTabs",gn="BTbody",yn="BTfoot",wn="BThead",Tn="BTime",Cn="BToast",xn="BToaster",Sn="BTooltip",kn="cancel",$n="change",Bn="click",_n="close",Dn="context",Fn="context-changed",In="destroyed",Pn="disable",On="disabled",Vn="enable",En="enabled",Ln="filtered",An="first",Rn="focusin",Mn="focusout",Hn="head-clicked",zn="hidden",Nn="hide",jn="input",Gn="last",Wn="mouseenter",Yn="mouseleave",Un="next",qn="open",Kn="page-click",Xn="prev",Zn="refreshed",Jn="row-clicked",Qn="selected",to="show",eo="shown",io="sliding-end",no="toggle",oo="hook:beforeDestroy",ro="hook:destroyed",so="bv",ao={passive:!0},lo={passive:!0,capture:!1},co=void 0,uo=Array,ho=Boolean,fo=Date,po=Function,mo=Number,vo=Object,bo=RegExp,go=String,yo=[uo,po],wo=[uo,vo],To=[uo,vo,go],Co=[uo,go],xo=[ho,mo],So=[ho,mo,go],ko=[ho,go],$o=[fo,go],Bo=[po,go],_o=[mo,go],Do=[mo,vo,go],Fo=[vo,po],Io=[vo,go],Po="append",Oo="badge",Vo="bottom-row",Eo="button-content",Lo="custom-foot",Ao="default",Ro="empty",Mo="file-name",Ho="first",zo="footer",No="header",jo="label",Go="lead",Wo="modal-cancel",Yo="modal-ok",Uo="modal-title",qo="prepend",Ko="row-details",Xo="table-busy",Zo="table-caption",Jo="table-colgroup",Qo="thead-top",tr="title",er="top-row",ir=function(){return Array.from.apply(Array,arguments)},nr=function(t,e){return-1!==t.indexOf(e)},or=function(){for(var t=arguments.length,e=new Array(t),i=0;i1&&void 0!==arguments[1]?arguments[1]:NaN,i=parseInt(t,10);return isNaN(i)?e:i},cr=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:NaN,i=parseFloat(t);return isNaN(i)?e:i},ur=function(t,e){return cr(t).toFixed(lr(e,0))},dr=function(t){return t.replace(ot,"-$1").toLowerCase()},hr=function(t){return(t=dr(t).replace(mt,(function(t,e){return e?e.toUpperCase():""}))).charAt(0).toUpperCase()+t.slice(1)},fr=function(t){return t.replace(pt," ").replace(rt,(function(t,e,i){return e+" "+i})).replace(ht,(function(t,e,i){return e+i.toUpperCase()}))},pr=function(t){return(t=Et(t)?t.trim():String(t)).charAt(0).toUpperCase()+t.slice(1)},mr=function(t){return t.replace(lt,"\\$&")},vr=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;return Pt(t)?"":Rt(t)||Ht(t)&&t.toString===Object.prototype.toString?JSON.stringify(t,null,e):String(t)},br=function(t){return vr(t).trim()},gr=function(t){return vr(t).toLowerCase()},yr=Element.prototype,wr=["button","[href]:not(.disabled)","input","select","textarea","[tabindex]","[contenteditable]"].map((function(t){return"".concat(t,":not(:disabled):not([disabled])")})).join(", "),Tr=yr.matches||yr.msMatchesSelector||yr.webkitMatchesSelector,Cr=yr.closest||function(t){var e=this;do{if(Vr(e,t))return e;e=e.parentElement||e.parentNode}while(!It(e)&&e.nodeType===Node.ELEMENT_NODE);return null},xr=H.requestAnimationFrame||H.webkitRequestAnimationFrame||H.mozRequestAnimationFrame||H.msRequestAnimationFrame||H.oRequestAnimationFrame||function(t){return setTimeout(t,16)},Sr=H.MutationObserver||H.WebKitMutationObserver||H.MozMutationObserver||null,kr=function(t){return!(!t||t.nodeType!==Node.ELEMENT_NODE)},$r=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=z.activeElement;return e&&!t.some((function(t){return t===e}))?e:null},Br=function(t,e){return vr(t).toLowerCase()===vr(e).toLowerCase()},_r=function(t){return kr(t)&&t===$r()},Dr=function(t){if(!kr(t)||!t.parentNode||!Lr(z.body,t))return!1;if("none"===Ur(t,"display"))return!1;var e=qr(t);return!!(e&&e.height>0&&e.width>0)},Fr=function(t){return!kr(t)||t.disabled||Gr(t,"disabled")||Hr(t,"disabled")},Ir=function(t){return kr(t)&&t.offsetHeight},Pr=function(t,e){return ir((kr(e)?e:z).querySelectorAll(t))},Or=function(t,e){return(kr(e)?e:z).querySelector(t)||null},Vr=function(t,e){return!!kr(t)&&Tr.call(t,e)},Er=function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!kr(e))return null;var n=Cr.call(e,t);return i?n:n===e?null:n},Lr=function(t,e){return!(!t||!Ot(t.contains))&&t.contains(e)},Ar=function(t){return z.getElementById(/^#/.test(t)?t.slice(1):t)||null},Rr=function(t,e){e&&kr(t)&&t.classList&&t.classList.add(e)},Mr=function(t,e){e&&kr(t)&&t.classList&&t.classList.remove(e)},Hr=function(t,e){return!!(e&&kr(t)&&t.classList)&&t.classList.contains(e)},zr=function(t,e,i){e&&kr(t)&&t.setAttribute(e,i)},Nr=function(t,e){e&&kr(t)&&t.removeAttribute(e)},jr=function(t,e){return e&&kr(t)?t.getAttribute(e):null},Gr=function(t,e){return e&&kr(t)?t.hasAttribute(e):null},Wr=function(t,e,i){e&&kr(t)&&(t.style[e]=i)},Yr=function(t,e){e&&kr(t)&&(t.style[e]="")},Ur=function(t,e){return e&&kr(t)&&t.style[e]||null},qr=function(t){return kr(t)?t.getBoundingClientRect():null},Kr=function(t){var e=H.getComputedStyle;return e&&kr(t)?e(t):{}},Xr=function(){return H.getSelection?H.getSelection():null},Zr=function(t){var e={top:0,left:0};if(!kr(t)||0===t.getClientRects().length)return e;var i=qr(t);if(i){var n=t.ownerDocument.defaultView;e.top=i.top+n.pageYOffset,e.left=i.left+n.pageXOffset}return e},Jr=function(t){var e={top:0,left:0};if(!kr(t))return e;var i={top:0,left:0},n=Kr(t);if("fixed"===n.position)e=qr(t)||e;else{e=Zr(t);for(var o=t.ownerDocument,r=t.offsetParent||o.documentElement;r&&(r===o.body||r===o.documentElement)&&"static"===Kr(r).position;)r=r.parentNode;if(r&&r!==t&&r.nodeType===Node.ELEMENT_NODE){i=Zr(r);var s=Kr(r);i.top+=cr(s.borderTopWidth,0),i.left+=cr(s.borderLeftWidth,0)}}return{top:e.top-i.top-cr(n.marginTop,0),left:e.left-i.left-cr(n.marginLeft,0)}},Qr=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document;return Pr(wr,t).filter(Dr).filter((function(t){return t.tabIndex>-1&&!t.disabled}))},ts=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};try{t.focus(e)}catch(t){}return _r(t)},es=function(t){try{t.blur()}catch(t){}return!_r(t)},is=function(t){var e=Wt(null);return function(){for(var i=arguments.length,n=new Array(i),o=0;o1&&void 0!==arguments[1]?arguments[1]:void 0,i=ns.$bvConfig;return i?i.getConfigValue(t,e):ie(e)},rs=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;return e?os("".concat(t,".").concat(e),i):os(t,{})},ss=function(){return os("breakpoints",X)},as=is((function(){return ss()})),ls=is((function(){var t=ie(as());return t[0]="",t})),cs=function(t,e){return t+pr(e)},us=function(t,e){return i=e.replace(t,""),(i=Et(i)?i.trim():String(i)).charAt(0).toLowerCase()+i.slice(1);var i},ds=function(t,e){return e+(t?pr(t):"")},hs=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:co,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0,o=!0===i;return n=o?n:i,c(c(c({},t?{type:t}:{}),o?{required:o}:Ft(e)?{}:{default:Mt(e)?function(){return e}:e}),Ft(n)?{}:{validator:n})},fs=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ne;if(Rt(t))return t.map(e);var i={};for(var n in t)Xt(t,n)&&(i[e(n)]=Mt(t[n])?Zt(t[n]):t[n]);return i},ps=function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ne;return(Rt(t)?t.slice():Kt(t)).reduce((function(t,n){return t[i(n)]=e[n],t}),{})},ms=function(t,e,i){return c(c({},ie(t)),{},{default:function(){var n=rs(i,e,t.default);return Ot(n)?n():n}})},vs=function(t,e){return Kt(t).reduce((function(i,n){return c(c({},i),{},a({},n,ms(t[n],n,e)))}),{})},bs=ms({},"","").default.name,gs=function(t){return Ot(t)&&t.name!==bs},ys=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.type,o=void 0===n?co:n,r=e.defaultValue,s=void 0===r?void 0:r,l=e.validator,c=void 0===l?void 0:l,u=e.event,d=void 0===u?jn:u,h=a({},t,hs(o,s,c)),f=i.default.extend({model:{prop:t,event:d},props:h});return{mixin:f,props:h,prop:t,event:d}},ws=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return(t=or(t).filter(ne)).some((function(t){return e[t]||i[t]}))},Ts=function(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};t=or(t).filter(ne);for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:Ao,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.$scopedSlots,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.$slots;return ws(t,e,i)},normalizeSlot:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Ao,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.$scopedSlots,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.$slots,o=Ts(t,e,i,n);return o?or(o):o}}}),xs=function(t){return W?Mt(t)?t:{capture:!!t||!1}:!!(Mt(t)?t.capture:t)},Ss=function(t,e,i,n){t&&t.addEventListener&&t.addEventListener(e,i,xs(n))},ks=function(t,e,i,n){t&&t.removeEventListener&&t.removeEventListener(e,i,xs(n))},$s=function(t){for(var e=t?Ss:ks,i=arguments.length,n=new Array(i>1?i-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:{},i=e.preventDefault,n=void 0===i||i,o=e.propagation,r=void 0===o||o,s=e.immediatePropagation,a=void 0!==s&&s;n&&t.preventDefault(),r&&t.stopPropagation(),a&&t.stopImmediatePropagation()},_s=function(t){return dr(t.replace(J,""))},Ds=function(t,e){return[so,_s(t),e].join("::")},Fs=function(t,e){return[so,e,_s(t)].join("::")},Is=vs({ariaLabel:hs(go,"Close"),content:hs(go,"×"),disabled:hs(ho,!1),textVariant:hs(go)},Fe),Ps=i.default.extend({name:Fe,functional:!0,props:Is,render:function(t,e){var i=e.props,n=e.data,o=e.slots,r=e.scopedSlots,s=o(),l=r||{},c={staticClass:"close",class:a({},"text-".concat(i.textVariant),i.textVariant),attrs:{type:"button",disabled:i.disabled,"aria-label":i.ariaLabel?String(i.ariaLabel):null},on:{click:function(t){i.disabled&&Nt(t)&&Bs(t)}}};return ws(Ao,l,s)||(c.domProps={innerHTML:i.content}),t("button",F(n,c),Ts(Ao,{},l,s))}}),Os={name:"",enterClass:"",enterActiveClass:"",enterToClass:"show",leaveClass:"show",leaveActiveClass:"",leaveToClass:""},Vs=c(c({},Os),{},{enterActiveClass:"fade",leaveActiveClass:"fade"}),Es={appear:hs(ho,!1),mode:hs(go),noFade:hs(ho,!1),transProps:hs(vo)},Ls=i.default.extend({name:"BVTransition",functional:!0,props:Es,render:function(t,e){var i=e.children,n=e.data,o=e.props,r=o.transProps;return Ht(r)||(r=o.noFade?Os:Vs,o.appear&&(r=c(c({},r),{},{appear:!0,appearClass:r.enterClass,appearActiveClass:r.enterActiveClass,appearToClass:r.enterToClass}))),t("transition",F(n,{props:r=c(c({mode:o.mode},r),{},{css:!0})}),i)}}),As=ys("show",{type:So,defaultValue:!1}),Rs=As.mixin,Ms=As.props,Hs=As.prop,zs=As.event,Ns=function(t){return""===t||Vt(t)?0:(t=lr(t,0))>0?t:0},js=function(t){return""===t||!0===t||!(lr(t,0)<1)&&!!t},Gs=vs(ee(c(c({},Ms),{},{dismissLabel:hs(go,"Close"),dismissible:hs(ho,!1),fade:hs(ho,!1),variant:hs(go,"info")})),Te),Ws=me({components:{BAlert:i.default.extend({name:Te,mixins:[Rs,Cs],props:Gs,data:function(){return{countDown:0,localShow:js(this[Hs])}},watch:(O={},a(O,Hs,(function(t){this.countDown=Ns(t),this.localShow=js(t)})),a(O,"countDown",(function(t){var e=this;this.clearCountDownInterval();var i=this[Hs];At(i)&&(this.$emit("dismiss-count-down",t),i!==t&&this.$emit(zs,t),t>0?(this.localShow=!0,this.$_countDownTimeout=setTimeout((function(){e.countDown--}),1e3)):this.$nextTick((function(){xr((function(){e.localShow=!1}))})))})),a(O,"localShow",(function(t){var e=this[Hs];t||!this.dismissible&&!At(e)||this.$emit("dismissed"),At(e)||e===t||this.$emit(zs,t)})),O),created:function(){this.$_filterTimer=null;var t=this[Hs];this.countDown=Ns(t),this.localShow=js(t)},beforeDestroy:function(){this.clearCountDownInterval()},methods:{dismiss:function(){this.clearCountDownInterval(),this.countDown=0,this.localShow=!1},clearCountDownInterval:function(){clearTimeout(this.$_countDownTimeout),this.$_countDownTimeout=null}},render:function(t){var e=t();if(this.localShow){var i=this.dismissible,n=this.variant,o=t();i&&(o=t(Ps,{attrs:{"aria-label":this.dismissLabel},on:{click:this.dismiss}},[this.normalizeSlot("dismiss")])),e=t("div",{staticClass:"alert",class:a({"alert-dismissible":i},"alert-".concat(n),n),attrs:{role:"alert","aria-live":"polite","aria-atomic":!0},key:this._uid},[o,this.normalizeSlot()])}return t(Ls,{props:{noFade:!this.fade}},[e])}})}}),Ys=Math.min,Us=Math.max,qs=Math.abs,Ks=Math.ceil,Xs=Math.floor,Zs=Math.pow,Js=Math.round,Qs="b-aspect",ta=vs({aspect:hs(_o,"1:1"),tag:hs(go,"div")},Ce),ea=i.default.extend({name:Ce,mixins:[Cs],props:ta,computed:{padding:function(){var t=this.aspect,e=1;if(xt.test(t)){var i=w(t.split(St).map((function(t){return cr(t)||1})),2);e=i[0]/i[1]}else e=cr(t)||1;return"".concat(100/qs(e),"%")}},render:function(t){var e=t("div",{staticClass:"".concat(Qs,"-sizer flex-grow-1"),style:{paddingBottom:this.padding,height:0}}),i=t("div",{staticClass:"".concat(Qs,"-content flex-grow-1 w-100 mw-100"),style:{marginLeft:"-100%"}},this.normalizeSlot());return t(this.tag,{staticClass:"".concat(Qs," d-flex")},[e,i])}}),ia=me({components:{BAspect:ea}}),na=function(t){return"%"+t.charCodeAt(0).toString(16)},oa=function(t){return encodeURIComponent(vr(t)).replace(Tt,na).replace(wt,",")},ra=decodeURIComponent,sa=function(t){if(!Ht(t))return"";var e=Kt(t).map((function(e){var i=t[e];return Ft(i)?"":It(i)?oa(e):Rt(i)?i.reduce((function(t,i){return It(i)?t.push(oa(e)):Ft(i)||t.push(oa(e)+"="+oa(i)),t}),[]).join("&"):oa(e)+"="+oa(i)})).filter((function(t){return t.length>0})).join("&");return e?"?".concat(e):""},aa=function(t){var e={};return(t=vr(t).trim().replace(Ct,""))?(t.split("&").forEach((function(t){var i=t.replace(at," ").split("="),n=ra(i.shift()),o=i.length>0?ra(i.join("=")):null;Ft(e[n])?e[n]=o:Rt(e[n])?e[n].push(o):e[n]=[e[n],o]})),e):e},la=function(t){return!(!t.href&&!t.to)},ca=function(t){return!(!t||Br(t,"a"))},ua=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.href,i=t.to,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"a",o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"#",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/";if(e)return e;if(ca(n))return null;if(Et(i))return i||r;if(Ht(i)&&(i.path||i.query||i.hash)){var s=vr(i.path),a=sa(i.query),l=vr(i.hash);return l=l&&"#"!==l.charAt(0)?"#".concat(l):l,"".concat(s).concat(a).concat(l)||r}return o},da={viewBox:"0 0 16 16",width:"1em",height:"1em",focusable:"false",role:"img","aria-label":"icon"},ha={width:null,height:null,focusable:null,role:null,"aria-label":null},fa={animation:hs(go),content:hs(go),flipH:hs(ho,!1),flipV:hs(ho,!1),fontScale:hs(_o,1),rotate:hs(_o,0),scale:hs(_o,1),shiftH:hs(_o,0),shiftV:hs(_o,0),stacked:hs(ho,!1),title:hs(go),variant:hs(go)},pa=i.default.extend({name:"BIconBase",functional:!0,props:fa,render:function(t,e){var i,n=e.data,o=e.props,r=e.children,s=o.animation,l=o.content,c=o.flipH,u=o.flipV,d=o.stacked,h=o.title,f=o.variant,p=Us(cr(o.fontScale,1),0)||1,m=Us(cr(o.scale,1),0)||1,v=cr(o.rotate,0),b=cr(o.shiftH,0),g=cr(o.shiftV,0),y=c||u||1!==m,w=y||v,T=b||g,C=!Pt(l),x=t("g",{attrs:{transform:[w?"translate(8 8)":null,y?"scale(".concat((c?-1:1)*m," ").concat((u?-1:1)*m,")"):null,v?"rotate(".concat(v,")"):null,w?"translate(-8 -8)":null].filter(ne).join(" ")||null},domProps:C?{innerHTML:l||""}:{}},r);T&&(x=t("g",{attrs:{transform:"translate(".concat(16*b/16," ").concat(-16*g/16,")")}},[x])),d&&(x=t("g",[x]));var S=[h?t("title",h):null,x].filter(ne);return t("svg",F({staticClass:"b-icon bi",class:(i={},a(i,"text-".concat(f),f),a(i,"b-icon-animation-".concat(s),s),i),attrs:da,style:d?{}:{fontSize:1===p?null:"".concat(100*p,"%")}},n,d?{attrs:ha}:{},{attrs:{xmlns:d?null:"http://www.w3.org/2000/svg",fill:"currentColor"}}),S)}}),ma=function(t,e){var n=dr(t),o="BIcon".concat(hr(t)),r="bi-".concat(n),s=n.replace(/-/g," "),a=br(e||"");return i.default.extend({name:o,functional:!0,props:Qt(fa,["content"]),render:function(t,e){var i=e.data,n=e.props;return t(pa,F({props:{title:s},attrs:{"aria-label":s}},i,{staticClass:r,props:c(c({},n),{},{content:a})}))}})},va=ma("Blank",""),ba=ma("Calendar",' '),ga=ma("CalendarFill",' '),ya=ma("ChevronBarLeft",' '),wa=ma("ChevronDoubleLeft",' '),Ta=ma("ChevronDown",' '),Ca=ma("ChevronLeft",' '),xa=ma("ChevronUp",' '),Sa=ma("CircleFill",' '),ka=ma("Clock",' '),$a=ma("ClockFill",' '),Ba=ma("Dash",' '),_a=ma("PersonFill",' '),Da=ma("Plus",' '),Fa=ma("Star",' '),Ia=ma("StarFill",' '),Pa=ma("StarHalf",' '),Oa=ma("X",' '),Va=function t(e,i){return e?(e.$options||{}).components[i]||t(e.$parent,i):null},Ea=Qt(fa,["content"]),La=vs(ee(c(c({},Ea),{},{icon:hs(go)})),Bi),Aa=i.default.extend({name:Bi,functional:!0,props:La,render:function(t,e){var i=e.data,n=e.props,o=e.parent,r=hr(br(n.icon||"")).replace($t,"");return t(r&&Va(o,"BIcon".concat(r))||va,F(i,{props:ps(Ea,n)}))}}),Ra=40,Ma=35,Ha=13,za=36,Na=37,ja=39,Ga=32,Wa=38,Ya=function(t,e){if(t.length!==e.length)return!1;for(var i=!0,n=0;i&&n1?i-1:0),o=1;o0&&void 0!==arguments[0]?arguments[0]:{},e=t.target,i=t.rel;return"_blank"===e&&It(i)?"noopener":i||null}({target:this.target,rel:this.rel})},computedHref:function(){var t=this.to,e=this.href;return ua({to:t,href:e},this.computedTag)},computedProps:function(){var t=this.prefetch;return this.isRouterLink?c(c({},ps(c(c({},el),il),this)),{},{prefetch:Vt(t)?t:void 0,tag:this.routerTag}):{}},computedAttrs:function(){var t=this.bvAttrs,e=this.computedHref,i=this.computedRel,n=this.disabled,o=this.target,r=this.routerTag,s=this.isRouterLink;return c(c(c(c({},t),e?{href:e}:{}),s&&!Br(r,"a")?{}:{rel:i,target:o}),{},{tabindex:n?"-1":Ft(t.tabindex)?null:t.tabindex,"aria-disabled":n?"true":null})},computedListeners:function(){return c(c({},this.bvListeners),{},{click:this.onClick})}},methods:{onClick:function(t){var e=arguments,i=Nt(t),n=this.isRouterLink,o=this.bvListeners.click;i&&this.disabled?Bs(t,{immediatePropagation:!0}):(n&&t.currentTarget.__vue__&&t.currentTarget.__vue__.$emit(Bn,t),or(o).filter((function(t){return Ot(t)})).forEach((function(t){t.apply(void 0,T(e))})),this.emitOnRoot(tl,t),this.emitOnRoot("clicked::link",t)),i&&!n&&"#"===this.computedHref&&Bs(t,{propagation:!1})},focus:function(){ts(this.$el)},blur:function(){es(this.$el)}},render:function(t){var e=this.active,i=this.disabled;return t(this.computedTag,a({class:{active:e,disabled:i},attrs:this.computedAttrs,props:this.computedProps},this.isRouterLink?"nativeOn":"on",this.computedListeners),this.normalizeSlot())}}),rl=Qt(nl,["event","routerTag"]);delete rl.href.default,delete rl.to.default;var sl=vs(ee(c(c({},rl),{},{block:hs(ho,!1),disabled:hs(ho,!1),pill:hs(ho,!1),pressed:hs(ho,null),size:hs(go),squared:hs(ho,!1),tag:hs(go,"button"),type:hs(go,"button"),variant:hs(go,"secondary")})),De),al=function(t){"focusin"===t.type?Rr(t.target,"focus"):"focusout"===t.type&&Mr(t.target,"focus")},ll=function(t){return la(t)||Br(t.tag,"a")},cl=function(t){return Vt(t.pressed)},ul=function(t){return!(ll(t)||t.tag&&!Br(t.tag,"button"))},dl=function(t){return!ll(t)&&!ul(t)},hl=function(t){var e;return["btn-".concat(t.variant||"secondary"),(e={},a(e,"btn-".concat(t.size),t.size),a(e,"btn-block",t.block),a(e,"rounded-pill",t.pill),a(e,"rounded-0",t.squared&&!t.pill),a(e,"disabled",t.disabled),a(e,"active",t.pressed),e)]},fl=function(t){return ll(t)?ps(rl,t):{}},pl=function(t,e){var i=ul(t),n=ll(t),o=cl(t),r=dl(t),s=n&&"#"===t.href,a=e.attrs&&e.attrs.role?e.attrs.role:null,l=e.attrs?e.attrs.tabindex:null;return(r||s)&&(l="0"),{type:i&&!n?t.type:null,disabled:i?t.disabled:null,role:r||s?"button":a,"aria-disabled":r?String(t.disabled):null,"aria-pressed":o?String(t.pressed):null,autocomplete:o?"off":null,tabindex:t.disabled&&!i?"-1":l}},ml=i.default.extend({name:De,functional:!0,props:sl,render:function(t,e){var i=e.props,n=e.data,o=e.listeners,r=e.children,s=cl(i),a=ll(i),l=dl(i),c=a&&"#"===i.href,u={keydown:function(t){if(!i.disabled&&(l||c)){var e=t.keyCode;if(e===Ga||e===Ha&&l){var n=t.currentTarget||t.target;Bs(t,{propagation:!1}),n.click()}}},click:function(t){i.disabled&&Nt(t)?Bs(t):s&&o&&o["update:pressed"]&&or(o["update:pressed"]).forEach((function(t){Ot(t)&&t(!i.pressed)}))}};s&&(u.focusin=al,u.focusout=al);var d={staticClass:"btn",class:hl(i),props:fl(i),attrs:pl(i,n),on:u};return t(a?ol:i.tag,F(n,d),r)}}),vl="b-avatar",bl=["sm",null,"lg"],gl=function(t){return t=Et(t)&&At(t)?cr(t,0):t,Lt(t)?"".concat(t,"px"):t||null},yl=Qt(nl,["active","event","routerTag"]),wl=vs(ee(c(c({},yl),{},{alt:hs(go,"avatar"),ariaLabel:hs(go),badge:hs(ko,!1),badgeLeft:hs(ho,!1),badgeOffset:hs(go),badgeTop:hs(ho,!1),badgeVariant:hs(go,"primary"),button:hs(ho,!1),buttonType:hs(go,"button"),icon:hs(go),rounded:hs(ko,!1),size:hs(_o),square:hs(ho,!1),src:hs(go),text:hs(go),variant:hs(go,"secondary")})),xe),Tl=i.default.extend({name:xe,mixins:[Cs],inject:{bvAvatarGroup:{default:null}},props:wl,data:function(){return{localSrc:this.src||null}},computed:{computedSize:function(){var t=this.bvAvatarGroup;return gl(t?t.size:this.size)},computedVariant:function(){var t=this.bvAvatarGroup;return t&&t.variant?t.variant:this.variant},computedRounded:function(){var t=this.bvAvatarGroup,e=!(!t||!t.square)||this.square,i=t&&t.rounded?t.rounded:this.rounded;return e?"0":""===i||(i||"circle")},fontStyle:function(){var t=this.computedSize,e=-1===bl.indexOf(t)?"calc(".concat(t," * ").concat(.4,")"):null;return e?{fontSize:e}:{}},marginStyle:function(){var t=this.computedSize,e=this.bvAvatarGroup,i=e?e.overlapScale:0,n=t&&i?"calc(".concat(t," * -").concat(i,")"):null;return n?{marginLeft:n,marginRight:n}:{}},badgeStyle:function(){var t=this.computedSize,e=this.badgeTop,i=this.badgeLeft,n=this.badgeOffset||"0px";return{fontSize:-1===bl.indexOf(t)?"calc(".concat(t," * ").concat(.27999999999999997," )"):null,top:e?n:null,bottom:e?null:n,left:i?n:null,right:i?null:n}}},watch:{src:function(t,e){t!==e&&(this.localSrc=t||null)}},methods:{onImgError:function(t){this.localSrc=null,this.$emit("img-error",t)},onClick:function(t){this.$emit(Bn,t)}},render:function(t){var e,i=this.computedVariant,n=this.disabled,o=this.computedRounded,r=this.icon,s=this.localSrc,l=this.text,u=this.fontStyle,d=this.marginStyle,h=this.computedSize,f=this.button,p=this.buttonType,m=this.badge,v=this.badgeVariant,b=this.badgeStyle,g=!f&&la(this),y=f?ml:g?ol:"span",w=this.alt,T=this.ariaLabel||null,C=null;this.hasNormalizedSlot()?C=t("span",{staticClass:"b-avatar-custom"},[this.normalizeSlot()]):s?(C=t("img",{style:i?{}:{width:"100%",height:"100%"},attrs:{src:s,alt:w},on:{error:this.onImgError}}),C=t("span",{staticClass:"b-avatar-img"},[C])):C=r?t(Aa,{props:{icon:r},attrs:{"aria-hidden":"true",alt:w}}):l?t("span",{staticClass:"b-avatar-text",style:u},[t("span",l)]):t(_a,{attrs:{"aria-hidden":"true",alt:w}});var x=t(),S=this.hasNormalizedSlot(Oo);if(m||""===m||S){var k=!0===m?"":m;x=t("span",{staticClass:"b-avatar-badge",class:a({},"badge-".concat(v),v),style:b},[S?this.normalizeSlot(Oo):k])}return t(y,{staticClass:vl,class:(e={},a(e,"".concat(vl,"-").concat(h),h&&-1!==bl.indexOf(h)),a(e,"badge-".concat(i),!f&&i),a(e,"rounded",!0===o),a(e,"rounded-".concat(o),o&&!0!==o),a(e,"disabled",n),e),style:c(c({},d),{},{width:h,height:h}),attrs:{"aria-label":T||null},props:f?{variant:i,disabled:n,type:p}:g?ps(yl,this):{},on:f||g?{click:this.onClick}:{}},[C,x])}}),Cl=vs({overlap:hs(_o,.3),rounded:hs(ko,!1),size:hs(go),square:hs(ho,!1),tag:hs(go,"div"),variant:hs(go)},Se),xl=me({components:{BAvatar:Tl,BAvatarGroup:i.default.extend({name:Se,mixins:[Cs],provide:function(){return{bvAvatarGroup:this}},props:Cl,computed:{computedSize:function(){return gl(this.size)},overlapScale:function(){return Ys(Us(cr(this.overlap,0),0),1)/2},paddingStyle:function(){var t=this.computedSize;return(t=t?"calc(".concat(t," * ").concat(this.overlapScale,")"):null)?{paddingLeft:t,paddingRight:t}:{}}},render:function(t){var e=t("div",{staticClass:"b-avatar-group-inner",style:this.paddingStyle},this.normalizeSlot());return t(this.tag,{staticClass:"b-avatar-group",attrs:{role:"group"}},[e])}})}}),Sl=Qt(nl,["event","routerTag"]);delete Sl.href.default,delete Sl.to.default;var kl,$l=vs(ee(c(c({},Sl),{},{pill:hs(ho,!1),tag:hs(go,"span"),variant:hs(go,"secondary")})),ke),Bl=i.default.extend({name:ke,functional:!0,props:$l,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.active,s=i.disabled,a=la(i),l=a?ol:i.tag,c=i.variant||"secondary";return t(l,F(n,{staticClass:"badge",class:["badge-".concat(c),{"badge-pill":i.pill,active:r,disabled:s}],props:a?ps(Sl,i):{}}),o)}}),_l=me({components:{BBadge:Bl}}),Dl=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return String(t).replace(nt,"")},Fl=function(t,e){return t?{innerHTML:t}:e?{textContent:e}:{}},Il=vs(ee(c(c({},Qt(nl,["event","routerTag"])),{},{ariaCurrent:hs(go,"location"),html:hs(go),text:hs(go)})),_e),Pl=i.default.extend({name:_e,functional:!0,props:Il,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.active,s=r?"span":ol,a={attrs:{"aria-current":r?i.ariaCurrent:null},props:ps(Il,i)};return o||(a.domProps=Fl(i.html,i.text)),t(s,F(n,a),o)}}),Ol=vs(Il,Be),Vl=i.default.extend({name:Be,functional:!0,props:Ol,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t("li",F(n,{staticClass:"breadcrumb-item",class:{active:i.active}}),[t(Pl,{props:i},o)])}}),El=vs({items:hs(uo)},$e),Ll=me({components:{BBreadcrumb:i.default.extend({name:$e,functional:!0,props:El,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.items,s=o;if(Rt(r)){var a=!1;s=r.map((function(e,i){Mt(e)||(e={text:vr(e)});var n=e.active;return n&&(a=!0),n||a||(n=i+1===r.length),t(Vl,{props:c(c({},e),{},{active:n})})}))}return t("ol",F(n,{staticClass:"breadcrumb"}),s)}}),BBreadcrumbItem:Vl,BBreadcrumbLink:Pl}}),Al=me({components:{BButton:ml,BBtn:ml,BButtonClose:Ps,BBtnClose:Ps}}),Rl=vs(ee(c(c({},Jt(sl,["size"])),{},{ariaRole:hs(go,"group"),size:hs(go),tag:hs(go,"div"),vertical:hs(ho,!1)})),Ie),Ml=i.default.extend({name:Ie,functional:!0,props:Rl,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(i.tag,F(n,{class:a({"btn-group":!i.vertical,"btn-group-vertical":i.vertical},"btn-group-".concat(i.size),i.size),attrs:{role:i.ariaRole}}),o)}}),Hl=me({components:{BButtonGroup:Ml,BBtnGroup:Ml}}),zl=[".btn:not(.disabled):not([disabled]):not(.dropdown-item)",".form-control:not(.disabled):not([disabled])","select:not(.disabled):not([disabled])",'input[type="checkbox"]:not(.disabled)','input[type="radio"]:not(.disabled)'].join(","),Nl=vs({justify:hs(ho,!1),keyNav:hs(ho,!1)},Pe),jl=i.default.extend({name:Pe,mixins:[Cs],props:Nl,mounted:function(){this.keyNav&&this.getItems()},methods:{getItems:function(){var t=Pr(zl,this.$el);return t.forEach((function(t){t.tabIndex=-1})),t.filter((function(t){return Dr(t)}))},focusFirst:function(){var t=this.getItems();ts(t[0])},focusPrev:function(t){var e=this.getItems(),i=e.indexOf(t.target);i>-1&&(e=e.slice(0,i).reverse(),ts(e[0]))},focusNext:function(t){var e=this.getItems(),i=e.indexOf(t.target);i>-1&&(e=e.slice(i+1),ts(e[0]))},focusLast:function(){var t=this.getItems().reverse();ts(t[0])},onFocusin:function(t){var e=this.$el;t.target!==e||Lr(e,t.relatedTarget)||(Bs(t),this.focusFirst(t))},onKeydown:function(t){var e=t.keyCode,i=t.shiftKey;e===Wa||e===Na?(Bs(t),i?this.focusFirst(t):this.focusPrev(t)):e!==Ra&&e!==ja||(Bs(t),i?this.focusLast(t):this.focusNext(t))}},render:function(t){var e=this.keyNav;return t("div",{staticClass:"btn-toolbar",class:{"justify-content-between":this.justify},attrs:{role:"toolbar",tabindex:e?"0":null},on:e?{focusin:this.onFocusin,keydown:this.onKeydown}:{}},[this.normalizeSlot()])}}),Gl=me({components:{BButtonToolbar:jl,BBtnToolbar:jl}}),Wl="gregory",Yl="long",Ul="short",ql="2-digit",Kl="numeric",Xl=function(){for(var t=arguments.length,e=new Array(t),i=0;i1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return t=Zl(t),e=Zl(e)||t,i=Zl(i)||t,t?ti?i:t:null},dc=["ar","az","ckb","fa","he","ks","lrc","mzn","ps","sd","te","ug","ur","yi"].map((function(t){return t.toLowerCase()})),hc=function(t){var e=vr(t).toLowerCase().replace(Bt,"").split("-"),i=e.slice(0,2).join("-"),n=e[0];return nr(dc,i)||nr(dc,n)},fc={id:hs(go)},pc=i.default.extend({props:fc,data:function(){return{localId_:null}},computed:{safeId:function(){var t=this.id||this.localId_;return function(e){return t?(e=String(e||"").replace(/\s+/g,"_"))?t+"_"+e:t:null}}},mounted:function(){var t=this;this.$nextTick((function(){t.localId_="__BVID__".concat(t._uid)}))}}),mc=ys("value",{type:$o}),vc=mc.mixin,bc=mc.props,gc=mc.prop,yc=mc.event,wc=vs(ee(c(c(c({},fc),bc),{},{ariaControls:hs(go),block:hs(ho,!1),dateDisabledFn:hs(po),dateFormatOptions:hs(vo,{year:Kl,month:Yl,day:Kl,weekday:Yl}),dateInfoFn:hs(po),direction:hs(go),disabled:hs(ho,!1),hidden:hs(ho,!1),hideHeader:hs(ho,!1),initialDate:hs($o),labelCalendar:hs(go,"Calendar"),labelCurrentMonth:hs(go,"Current month"),labelHelp:hs(go,"Use cursor keys to navigate calendar dates"),labelNav:hs(go,"Calendar navigation"),labelNextDecade:hs(go,"Next decade"),labelNextMonth:hs(go,"Next month"),labelNextYear:hs(go,"Next year"),labelNoDateSelected:hs(go,"No date selected"),labelPrevDecade:hs(go,"Previous decade"),labelPrevMonth:hs(go,"Previous month"),labelPrevYear:hs(go,"Previous year"),labelSelected:hs(go,"Selected date"),labelToday:hs(go,"Today"),locale:hs(Co),max:hs($o),min:hs($o),navButtonVariant:hs(go,"secondary"),noHighlightToday:hs(ho,!1),noKeyNav:hs(ho,!1),readonly:hs(ho,!1),roleDescription:hs(go),selectedVariant:hs(go,"primary"),showDecadeNav:hs(ho,!1),startWeekday:hs(_o,0),todayVariant:hs(go),valueAsDate:hs(ho,!1),weekdayHeaderFormat:hs(go,Ul,(function(t){return nr([Yl,Ul,"narrow"],t)})),width:hs(go,"270px")})),Oe),Tc=i.default.extend({name:Oe,mixins:[Za,pc,vc,Cs],props:wc,data:function(){var t=Jl(this[gc])||"";return{selectedYMD:t,activeYMD:t||Jl(uc(this.initialDate||this.getToday()),this.min,this.max),gridHasFocus:!1,isLive:!1}},computed:{valueId:function(){return this.safeId()},widgetId:function(){return this.safeId("_calendar-wrapper_")},navId:function(){return this.safeId("_calendar-nav_")},gridId:function(){return this.safeId("_calendar-grid_")},gridCaptionId:function(){return this.safeId("_calendar-grid-caption_")},gridHelpId:function(){return this.safeId("_calendar-grid-help_")},activeId:function(){return this.activeYMD?this.safeId("_cell-".concat(this.activeYMD,"_")):null},selectedDate:function(){return Zl(this.selectedYMD)},activeDate:function(){return Zl(this.activeYMD)},computedMin:function(){return Zl(this.min)},computedMax:function(){return Zl(this.max)},computedWeekStarts:function(){return Us(lr(this.startWeekday,0),0)%7},computedLocale:function(){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Wl;return t=or(t).filter(ne),new Intl.DateTimeFormat(t,{calendar:e}).resolvedOptions().locale}(or(this.locale).filter(ne),Wl)},computedDateDisabledFn:function(){var t=this.dateDisabledFn;return gs(t)?t:function(){return!1}},computedDateInfoFn:function(){var t=this.dateInfoFn;return gs(t)?t:function(){return{}}},calendarLocale:function(){var t=new Intl.DateTimeFormat(this.computedLocale,{calendar:Wl}),e=t.resolvedOptions().calendar,i=t.resolvedOptions().locale;return e!==Wl&&(i=i.replace(/-u-.+$/i,"").concat("-u-ca-gregory")),i},calendarYear:function(){return this.activeDate.getFullYear()},calendarMonth:function(){return this.activeDate.getMonth()},calendarFirstDay:function(){return Xl(this.calendarYear,this.calendarMonth,1,12)},calendarDaysInMonth:function(){var t=Xl(this.calendarFirstDay);return t.setMonth(t.getMonth()+1,0),t.getDate()},computedVariant:function(){return"btn-".concat(this.selectedVariant||"primary")},computedTodayVariant:function(){return"btn-outline-".concat(this.todayVariant||this.selectedVariant||"primary")},computedNavButtonVariant:function(){return"btn-outline-".concat(this.navButtonVariant||"primary")},isRTL:function(){var t=vr(this.direction).toLowerCase();return"rtl"===t||"ltr"!==t&&hc(this.computedLocale)},context:function(){var t=this.selectedYMD,e=this.activeYMD,i=Zl(t),n=Zl(e);return{selectedYMD:t,selectedDate:i,selectedFormatted:i?this.formatDateString(i):this.labelNoDateSelected,activeYMD:e,activeDate:n,activeFormatted:n?this.formatDateString(n):"",disabled:this.dateDisabled(n),locale:this.computedLocale,calendarLocale:this.calendarLocale,rtl:this.isRTL}},dateOutOfRange:function(){var t=this.computedMin,e=this.computedMax;return function(i){return i=Zl(i),t&&ie}},dateDisabled:function(){var t=this,e=this.dateOutOfRange;return function(i){i=Zl(i);var n=Jl(i);return!(!e(i)&&!t.computedDateDisabledFn(n,i))}},formatDateString:function(){return Ql(this.calendarLocale,c(c({year:Kl,month:ql,day:ql},this.dateFormatOptions),{},{hour:void 0,minute:void 0,second:void 0,calendar:Wl}))},formatYearMonth:function(){return Ql(this.calendarLocale,{year:Kl,month:Yl,calendar:Wl})},formatWeekdayName:function(){return Ql(this.calendarLocale,{weekday:Yl,calendar:Wl})},formatWeekdayNameShort:function(){return Ql(this.calendarLocale,{weekday:this.weekdayHeaderFormat||Ul,calendar:Wl})},formatDay:function(){var t=new Intl.NumberFormat([this.computedLocale],{style:"decimal",minimumIntegerDigits:1,minimumFractionDigits:0,maximumFractionDigits:0,notation:"standard"});return function(e){return t.format(e.getDate())}},prevDecadeDisabled:function(){var t=this.computedMin;return this.disabled||t&&ic(lc(this.activeDate))t},nextYearDisabled:function(){var t=this.computedMax;return this.disabled||t&&ec(ac(this.activeDate))>t},nextDecadeDisabled:function(){var t=this.computedMax;return this.disabled||t&&ec(cc(this.activeDate))>t},calendar:function(){for(var t=[],e=this.calendarFirstDay,i=e.getFullYear(),n=e.getMonth(),o=this.calendarDaysInMonth,r=e.getDay(),s=0-((this.computedWeekStarts>r?7:0)-this.computedWeekStarts)-r,a=0;a<6&&s ',Ec=vs({alt:hs(go),blank:hs(ho,!1),blankColor:hs(go,"transparent"),block:hs(ho,!1),center:hs(ho,!1),fluid:hs(ho,!1),fluidGrow:hs(ho,!1),height:hs(_o),left:hs(ho,!1),right:hs(ho,!1),rounded:hs(ko,!1),sizes:hs(Co),src:hs(go),srcset:hs(Co),thumbnail:hs(ho,!1),width:hs(_o)},_i),Lc=i.default.extend({name:_i,functional:!0,props:Ec,render:function(t,e){var i,n=e.props,o=e.data,r=n.alt,s=n.src,l=n.block,c=n.fluidGrow,u=n.rounded,d=lr(n.width)||null,h=lr(n.height)||null,f=null,p=or(n.srcset).filter(ne).join(","),m=or(n.sizes).filter(ne).join(",");return n.blank&&(!h&&d?h=d:!d&&h&&(d=h),d||h||(d=1,h=1),s=function(t,e,i){var n=encodeURIComponent(Vc.replace("%{w}",vr(t)).replace("%{h}",vr(e)).replace("%{f}",i));return"data:image/svg+xml;charset=UTF-8,".concat(n)}(d,h,n.blankColor||"transparent"),p=null,m=null),n.left?f="float-left":n.right?f="float-right":n.center&&(f="mx-auto",l=!0),t("img",F(o,{attrs:{src:s,alt:r,width:d?vr(d):null,height:h?vr(h):null,srcset:p||null,sizes:m||null},class:(i={"img-thumbnail":n.thumbnail,"img-fluid":n.fluid||c,"w-100":c,rounded:""===u||!0===u},a(i,"rounded-".concat(u),Et(u)&&""!==u),a(i,f,f),a(i,"d-block",l),i)}))}}),Ac=vs(ee(c(c({},Jt(Ec,["src","alt","width","height","left","right"])),{},{bottom:hs(ho,!1),end:hs(ho,!1),start:hs(ho,!1),top:hs(ho,!1)})),Me),Rc=i.default.extend({name:Me,functional:!0,props:Ac,render:function(t,e){var i=e.props,n=e.data,o=i.src,r=i.alt,s=i.width,a=i.height,l="card-img";return i.top?l+="-top":i.right||i.end?l+="-right":i.bottom?l+="-bottom":(i.left||i.start)&&(l+="-left"),t("img",F(n,{class:l,attrs:{src:o,alt:r,width:s,height:a}}))}}),Mc=fs(Ac,cs.bind(null,"img"));Mc.imgSrc.required=!1;var Hc,zc,Nc,jc=vs(ee(c(c(c(c(c(c({},_c),Fc),Pc),Mc),xc),{},{align:hs(go),noBody:hs(ho,!1)})),Ve),Gc=i.default.extend({name:Ve,functional:!0,props:jc,render:function(t,e){var i,n=e.props,o=e.data,r=e.slots,s=e.scopedSlots,l=n.imgSrc,c=n.imgLeft,u=n.imgRight,d=n.imgStart,h=n.imgEnd,f=n.imgBottom,p=n.header,m=n.headerHtml,v=n.footer,b=n.footerHtml,g=n.align,y=n.textVariant,w=n.bgVariant,T=n.borderVariant,C=s||{},x=r(),S={},k=t(),$=t();if(l){var B=t(Rc,{props:ps(Mc,n,us.bind(null,"img"))});f?$=B:k=B}var _=t(),D=ws(No,C,x);(D||p||m)&&(_=t(Ic,{props:ps(Fc,n),domProps:D?{}:Fl(m,p)},Ts(No,S,C,x)));var I=Ts(Ao,S,C,x);n.noBody||(I=t(Dc,{props:ps(_c,n)},I),n.overlay&&l&&(I=t("div",{staticClass:"position-relative"},[k,I,$]),k=t(),$=t()));var P=t();return(ws(zo,C,x)||v||b)&&(P=t(Oc,{props:ps(Pc,n),domProps:D?{}:Fl(b,v)},Ts(zo,S,C,x))),t(n.tag,F(o,{staticClass:"card",class:(i={"flex-row":c||d,"flex-row-reverse":(u||h)&&!(c||d)},a(i,"text-".concat(g),g),a(i,"bg-".concat(w),w),a(i,"border-".concat(T),T),a(i,"text-".concat(y),y),i)}),[k,_,I,P,$])}}),Wc="__bv__visibility_observer",Yc=function(){function t(e,i,n){o(this,t),this.el=e,this.callback=i.callback,this.margin=i.margin||0,this.once=i.once||!1,this.observer=null,this.visible=void 0,this.doneOnce=!1,this.createObserver(n)}return s(t,[{key:"createObserver",value:function(t){var e=this;if(this.observer&&this.stop(),!this.doneOnce&&Ot(this.callback)){try{this.observer=new IntersectionObserver(this.handler.bind(this),{root:null,rootMargin:this.margin,threshold:0})}catch(t){return this.doneOnce=!0,this.observer=void 0,void this.callback(null)}t.context.$nextTick((function(){xr((function(){e.observer&&e.observer.observe(e.el)}))}))}}},{key:"handler",value:function(t){var e=t?t[0]:{},i=Boolean(e.isIntersecting||e.intersectionRatio>0);i!==this.visible&&(this.visible=i,this.callback(i),this.once&&this.visible&&(this.doneOnce=!0,this.stop()))}},{key:"stop",value:function(){this.observer&&this.observer.disconnect(),this.observer=null}}]),t}(),Uc=function(t){var e=t[Wc];e&&e.stop&&e.stop(),delete t[Wc]},qc=function(t,e,i){var n=e.value,o=e.modifiers,r={margin:"0px",once:!1,callback:n};Kt(o).forEach((function(t){Q.test(t)?r.margin="".concat(t,"px"):"once"===t.toLowerCase()&&(r.once=!0)})),Uc(t),t[Wc]=new Yc(t,r,i),t[Wc]._prevModifiers=Zt(o)},Kc={bind:qc,componentUpdated:function(t,e,i){var n=e.value,o=e.oldValue,r=e.modifiers;r=Zt(r),!t||n===o&&t[Wc]&&Ua(r,t[Wc]._prevModifiers)||qc(t,{value:n,modifiers:r},i)},unbind:function(t){Uc(t)}},Xc="show",Zc=Qt(Ec,["blank"]),Jc=vs(c(c({},Zc),{},a({blankColor:hs(go,"transparent"),blankHeight:hs(_o),blankSrc:hs(go,null),blankWidth:hs(_o),offset:hs(_o,360)},Xc,hs(ho,!1))),Di),Qc=i.default.extend({name:Di,directives:{"b-visible":Kc},props:Jc,data:function(){return{isShown:this.show}},computed:{computedSrc:function(){var t=this.blankSrc;return!t||this.isShown?this.src:t},computedBlank:function(){return!(this.isShown||this.blankSrc)},computedWidth:function(){var t=this.width;return this.isShown?t:this.blankWidth||t},computedHeight:function(){var t=this.height;return this.isShown?t:this.blankHeight||t},computedSrcset:function(){var t=or(this.srcset).filter(ne).join(",");return!this.blankSrc||this.isShown?t:null},computedSizes:function(){var t=or(this.sizes).filter(ne).join(",");return!this.blankSrc||this.isShown?t:null}},watch:(Hc={},a(Hc,Xc,(function(t,e){if(t!==e){var i=!q||t;this.isShown=i,i!==t&&this.$nextTick(this.updateShowProp)}})),a(Hc,"isShown",(function(t,e){t!==e&&this.updateShowProp()})),Hc),mounted:function(){this.isShown=!q||this.show},methods:{updateShowProp:function(){this.$emit("update:show",this.isShown)},doShow:function(t){!t&&null!==t||this.isShown||(this.isShown=!0)}},render:function(t){var e,i=[];this.isShown||i.push({name:"b-visible",value:this.doShow,modifiers:(e={},a(e,"".concat(lr(this.offset,0)),!0),a(e,"once",!0),e)});return t(Lc,{directives:i,props:c({src:this.computedSrc,blank:this.computedBlank,width:this.computedWidth,height:this.computedHeight,srcset:this.computedSrcset||null,sizes:this.computedSizes||null},ps(Zc,this.$props))})}}),tu=vs(ee(c(c({},Qt(Jc,Kt(Ec))),Qt(Ac,["src","alt","width","height"]))),He),eu=i.default.extend({name:He,functional:!0,props:tu,render:function(t,e){var i=e.props,n=e.data,o="card-img";return i.top?o+="-top":i.right||i.end?o+="-right":i.bottom?o+="-bottom":(i.left||i.start)&&(o+="-left"),t(Qc,F(n,{class:[o],props:Qt(i,["left","right"])}))}}),iu=vs({textTag:hs(go,"p")},Ne),nu=i.default.extend({name:Ne,functional:!0,props:iu,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(i.textTag,F(n,{staticClass:"card-text"}),o)}}),ou=vs({columns:hs(ho,!1),deck:hs(ho,!1),tag:hs(go,"div")},Ae),ru=me({components:{BCard:Gc,BCardHeader:Ic,BCardBody:Dc,BCardTitle:kc,BCardSubTitle:Bc,BCardFooter:Oc,BCardImg:Rc,BCardImgLazy:eu,BCardText:nu,BCardGroup:i.default.extend({name:Ae,functional:!0,props:ou,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(i.tag,F(n,{class:i.deck?"card-deck":i.columns?"card-columns":"card-group"}),o)}})}}),su=function(){},au=function(t,e,i){if(t=t?t.$el||t:null,!kr(t))return null;if(n="observeDom",!R&&(le("".concat(n,": Requires MutationObserver support.")),1))return null;var n,o=new Sr((function(t){for(var i=!1,n=0;n0||o.removedNodes.length>0))&&(i=!0)}i&&e()}));return o.observe(t,c({childList:!0,subtree:!0},i)),o},lu=ys("value",{type:mo,defaultValue:0}),cu=lu.mixin,uu=lu.props,du=lu.prop,hu=lu.event,fu={next:{dirClass:"carousel-item-left",overlayClass:"carousel-item-next"},prev:{dirClass:"carousel-item-right",overlayClass:"carousel-item-prev"}},pu={TOUCH:"touch",PEN:"pen"},mu={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend oTransitionEnd",transition:"transitionend"},vu=vs(ee(c(c(c({},fc),uu),{},{background:hs(go),controls:hs(ho,!1),fade:hs(ho,!1),imgHeight:hs(_o),imgWidth:hs(_o),indicators:hs(ho,!1),interval:hs(mo,5e3),labelGotoSlide:hs(go,"Goto slide"),labelIndicators:hs(go,"Select a slide to display"),labelNext:hs(go,"Next slide"),labelPrev:hs(go,"Previous slide"),noAnimation:hs(ho,!1),noHoverPause:hs(ho,!1),noTouch:hs(ho,!1),noWrap:hs(ho,!1)})),Ge),bu=i.default.extend({name:Ge,mixins:[pc,cu,Cs],provide:function(){return{bvCarousel:this}},props:vu,data:function(){return{index:this[du]||0,isSliding:!1,transitionEndEvent:null,slides:[],direction:null,isPaused:!(lr(this.interval,0)>0),touchStartX:0,touchDeltaX:0}},computed:{numSlides:function(){return this.slides.length}},watch:(zc={},a(zc,du,(function(t,e){t!==e&&this.setSlide(lr(t,0))})),a(zc,"interval",(function(t,e){t!==e&&(t?(this.pause(!0),this.start(!1)):this.pause(!1))})),a(zc,"isPaused",(function(t,e){t!==e&&this.$emit(t?"paused":"unpaused")})),a(zc,"index",(function(t,e){t===e||this.isSliding||this.doSlide(t,e)})),zc),created:function(){this.$_interval=null,this.$_animationTimeout=null,this.$_touchTimeout=null,this.$_observer=null,this.isPaused=!(lr(this.interval,0)>0)},mounted:function(){this.transitionEndEvent=function(t){for(var e in mu)if(!Ft(t.style[e]))return mu[e];return null}(this.$el)||null,this.updateSlides(),this.setObserver(!0)},beforeDestroy:function(){this.clearInterval(),this.clearAnimationTimeout(),this.clearTouchTimeout(),this.setObserver(!1)},methods:{clearInterval:function(t){function e(){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(){clearInterval(this.$_interval),this.$_interval=null})),clearAnimationTimeout:function(){clearTimeout(this.$_animationTimeout),this.$_animationTimeout=null},clearTouchTimeout:function(){clearTimeout(this.$_touchTimeout),this.$_touchTimeout=null},setObserver:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$_observer&&this.$_observer.disconnect(),this.$_observer=null,t&&(this.$_observer=au(this.$refs.inner,this.updateSlides.bind(this),{subtree:!1,childList:!0,attributes:!0,attributeFilter:["id"]}))},setSlide:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!(M&&document.visibilityState&&document.hidden)){var n=this.noWrap,o=this.numSlides;t=Xs(t),0!==o&&(this.isSliding?this.$once(io,(function(){xr((function(){return e.setSlide(t,i)}))})):(this.direction=i,this.index=t>=o?n?o-1:0:t<0?n?0:o-1:t,n&&this.index!==t&&this.index!==this[du]&&this.$emit(hu,this.index)))}},prev:function(){this.setSlide(this.index-1,"prev")},next:function(){this.setSlide(this.index+1,"next")},pause:function(t){t||(this.isPaused=!0),this.clearInterval()},start:function(t){t||(this.isPaused=!1),this.clearInterval(),this.interval&&this.numSlides>1&&(this.$_interval=setInterval(this.next,Us(1e3,this.interval)))},restart:function(){this.$el.contains($r())||this.start()},doSlide:function(t,e){var i=this,n=Boolean(this.interval),o=this.calcDirection(this.direction,e,t),r=o.overlayClass,s=o.dirClass,a=this.slides[e],l=this.slides[t];if(a&&l){if(this.isSliding=!0,n&&this.pause(!1),this.$emit("sliding-start",t),this.$emit(hu,this.index),this.noAnimation)Rr(l,"active"),Mr(a,"active"),this.isSliding=!1,this.$nextTick((function(){return i.$emit(io,t)}));else{Rr(l,r),Ir(l),Rr(a,s),Rr(l,s);var c=!1,u=function e(){if(!c){if(c=!0,i.transitionEndEvent)i.transitionEndEvent.split(/\s+/).forEach((function(t){return ks(l,t,e,lo)}));i.clearAnimationTimeout(),Mr(l,s),Mr(l,r),Rr(l,"active"),Mr(a,"active"),Mr(a,s),Mr(a,r),zr(a,"aria-current","false"),zr(l,"aria-current","true"),zr(a,"aria-hidden","true"),zr(l,"aria-hidden","false"),i.isSliding=!1,i.direction=null,i.$nextTick((function(){return i.$emit(io,t)}))}};if(this.transitionEndEvent)this.transitionEndEvent.split(/\s+/).forEach((function(t){return Ss(l,t,u,lo)}));this.$_animationTimeout=setTimeout(u,650)}n&&this.start(!1)}},updateSlides:function(){this.pause(!0),this.slides=Pr(".carousel-item",this.$refs.inner);var t=this.slides.length,e=Us(0,Ys(Xs(this.index),t-1));this.slides.forEach((function(i,n){var o=n+1;n===e?(Rr(i,"active"),zr(i,"aria-current","true")):(Mr(i,"active"),zr(i,"aria-current","false")),zr(i,"aria-posinset",String(o)),zr(i,"aria-setsize",String(t))})),this.setSlide(e),this.start(this.isPaused)},calcDirection:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return t?fu[t]:i>e?fu.next:fu.prev},handleClick:function(t,e){var i=t.keyCode;"click"!==t.type&&i!==Ga&&i!==Ha||(Bs(t),e())},handleSwipe:function(){var t=qs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0?this.prev():e<0&&this.next()}},touchStart:function(t){U&&pu[t.pointerType.toUpperCase()]?this.touchStartX=t.clientX:U||(this.touchStartX=t.touches[0].clientX)},touchMove:function(t){t.touches&&t.touches.length>1?this.touchDeltaX=0:this.touchDeltaX=t.touches[0].clientX-this.touchStartX},touchEnd:function(t){U&&pu[t.pointerType.toUpperCase()]&&(this.touchDeltaX=t.clientX-this.touchStartX),this.handleSwipe(),this.pause(!1),this.clearTouchTimeout(),this.$_touchTimeout=setTimeout(this.start,500+Us(1e3,this.interval))}},render:function(t){var e=this,i=this.indicators,n=this.background,o=this.noAnimation,r=this.noHoverPause,s=this.noTouch,a=this.index,l=this.isSliding,c=this.pause,u=this.restart,d=this.touchStart,h=this.touchEnd,f=this.safeId("__BV_inner_"),p=t("div",{staticClass:"carousel-inner",attrs:{id:f,role:"list"},ref:"inner"},[this.normalizeSlot()]),m=t();if(this.controls){var v=function(i,n,o){var r=function(t){l?Bs(t,{propagation:!1}):e.handleClick(t,o)};return t("a",{staticClass:"carousel-control-".concat(i),attrs:{href:"#",role:"button","aria-controls":f,"aria-disabled":l?"true":null},on:{click:r,keydown:r}},[t("span",{staticClass:"carousel-control-".concat(i,"-icon"),attrs:{"aria-hidden":"true"}}),t("span",{class:"sr-only"},[n])])};m=[v("prev",this.labelPrev,this.prev),v("next",this.labelNext,this.next)]}var b=t("ol",{staticClass:"carousel-indicators",directives:[{name:"show",value:i}],attrs:{id:this.safeId("__BV_indicators_"),"aria-hidden":i?"false":"true","aria-label":this.labelIndicators,"aria-owns":f}},this.slides.map((function(n,o){var r=function(t){e.handleClick(t,(function(){e.setSlide(o)}))};return t("li",{class:{active:o===a},attrs:{role:"button",id:e.safeId("__BV_indicator_".concat(o+1,"_")),tabindex:i?"0":"-1","aria-current":o===a?"true":"false","aria-label":"".concat(e.labelGotoSlide," ").concat(o+1),"aria-describedby":n.id||null,"aria-controls":f},on:{click:r,keydown:r},key:"slide_".concat(o)})}))),g={mouseenter:r?su:c,mouseleave:r?su:u,focusin:c,focusout:u,keydown:function(t){if(!/input|textarea/i.test(t.target.tagName)){var i=t.keyCode;i!==Na&&i!==ja||(Bs(t),e[i===Na?"prev":"next"]())}}};return Y&&!s&&(U?(g["&pointerdown"]=d,g["&pointerup"]=h):(g["&touchstart"]=d,g["&touchmove"]=this.touchMove,g["&touchend"]=h)),t("div",{staticClass:"carousel",class:{slide:!o,"carousel-fade":!o&&this.fade,"pointer-event":Y&&U&&!s},style:{background:n},attrs:{role:"region",id:this.safeId(),"aria-busy":l?"true":"false"},on:g},[p,m,b])}}),gu={imgAlt:hs(go),imgBlank:hs(ho,!1),imgBlankColor:hs(go,"transparent"),imgHeight:hs(_o),imgSrc:hs(go),imgWidth:hs(_o)},yu=vs(ee(c(c(c({},fc),gu),{},{background:hs(go),caption:hs(go),captionHtml:hs(go),captionTag:hs(go,"h3"),contentTag:hs(go,"div"),contentVisibleUp:hs(go),text:hs(go),textHtml:hs(go),textTag:hs(go,"p")})),We),wu=me({components:{BCarousel:bu,BCarouselSlide:i.default.extend({name:We,mixins:[pc,Cs],inject:{bvCarousel:{default:function(){return{noTouch:!0}}}},props:yu,computed:{contentClasses:function(){return[this.contentVisibleUp?"d-none":"",this.contentVisibleUp?"d-".concat(this.contentVisibleUp,"-block"):""]},computedWidth:function(){return this.imgWidth||this.bvCarousel.imgWidth||null},computedHeight:function(){return this.imgHeight||this.bvCarousel.imgHeight||null}},render:function(t){var e=this.normalizeSlot("img");if(!e&&(this.imgSrc||this.imgBlank)){var i={};!this.bvCarousel.noTouch&&Y&&(i.dragstart=function(t){return Bs(t,{propagation:!1})}),e=t(Lc,{props:c(c({},ps(gu,this.$props,us.bind(null,"img"))),{},{width:this.computedWidth,height:this.computedHeight,fluidGrow:!0,block:!0}),on:i})}var n=[!(!this.caption&&!this.captionHtml)&&t(this.captionTag,{domProps:Fl(this.captionHtml,this.caption)}),!(!this.text&&!this.textHtml)&&t(this.textTag,{domProps:Fl(this.textHtml,this.text)}),this.normalizeSlot()||!1],o=t();return n.some(ne)&&(o=t(this.contentTag,{staticClass:"carousel-caption",class:this.contentClasses},n.map((function(e){return e||t()})))),t("div",{staticClass:"carousel-item",style:{background:this.background||this.bvCarousel.background||null},attrs:{id:this.safeId(),role:"listitem"}},[e,o])}})}}),Tu="show",Cu={css:!0,enterClass:"",enterActiveClass:"collapsing",enterToClass:"collapse show",leaveClass:"collapse show",leaveActiveClass:"collapsing",leaveToClass:"collapse"},xu={enter:function(t){Wr(t,"height",0),xr((function(){Ir(t),Wr(t,"height","".concat(t.scrollHeight,"px"))}))},afterEnter:function(t){Yr(t,"height")},leave:function(t){Wr(t,"height","auto"),Wr(t,"display","block"),Wr(t,"height","".concat(qr(t).height,"px")),Ir(t),Wr(t,"height",0)},afterLeave:function(t){Yr(t,"height")}},Su={appear:hs(ho,!1)},ku=i.default.extend({name:"BVCollapse",functional:!0,props:Su,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t("transition",F(n,{props:Cu,on:xu},{props:i}),o)}}),$u=Fs(Ue,"toggle"),Bu=Fs(Ue,"request-state"),_u=Ds(Ue,"accordion"),Du=Ds(Ue,"state"),Fu=Ds(Ue,"sync-state"),Iu=ys("visible",{type:ho,defaultValue:!1}),Pu=Iu.mixin,Ou=Iu.props,Vu=Iu.prop,Eu=Iu.event,Lu=vs(ee(c(c(c({},fc),Ou),{},{accordion:hs(go),appear:hs(ho,!1),isNav:hs(ho,!1),tag:hs(go,"div")})),Ue),Au=i.default.extend({name:Ue,mixins:[pc,Pu,Cs,Ja],props:Lu,data:function(){return{show:this[Vu],transitioning:!1}},computed:{classObject:function(){var t=this.transitioning;return{"navbar-collapse":this.isNav,collapse:!t,show:this.show&&!t}},slotScope:function(){var t=this;return{visible:this.show,close:function(){t.show=!1}}}},watch:(Nc={},a(Nc,Vu,(function(t){t!==this.show&&(this.show=t)})),a(Nc,"show",(function(t,e){t!==e&&this.emitState()})),Nc),created:function(){this.show=this[Vu]},mounted:function(){var t=this;this.show=this[Vu],this.listenOnRoot($u,this.handleToggleEvt),this.listenOnRoot(_u,this.handleAccordionEvt),this.isNav&&(this.setWindowEvents(!0),this.handleResize()),this.$nextTick((function(){t.emitState()})),this.listenOnRoot(Bu,(function(e){e===t.safeId()&&t.$nextTick(t.emitSync)}))},updated:function(){this.emitSync()},deactivated:function(){this.isNav&&this.setWindowEvents(!1)},activated:function(){this.isNav&&this.setWindowEvents(!0),this.emitSync()},beforeDestroy:function(){this.show=!1,this.isNav&&M&&this.setWindowEvents(!1)},methods:{setWindowEvents:function(t){$s(t,window,"resize",this.handleResize,lo),$s(t,window,"orientationchange",this.handleResize,lo)},toggle:function(){this.show=!this.show},onEnter:function(){this.transitioning=!0,this.$emit(to)},onAfterEnter:function(){this.transitioning=!1,this.$emit(eo)},onLeave:function(){this.transitioning=!0,this.$emit(Nn)},onAfterLeave:function(){this.transitioning=!1,this.$emit(zn)},emitState:function(){var t=this.show,e=this.accordion,i=this.safeId();this.$emit(Eu,t),this.emitOnRoot(Du,i,t),e&&t&&this.emitOnRoot(_u,i,e)},emitSync:function(){this.emitOnRoot(Fu,this.safeId(),this.show)},checkDisplayBlock:function(){var t=this.$el,e=Hr(t,Tu);Mr(t,Tu);var i="block"===Kr(t).display;return e&&Rr(t,Tu),i},clickHandler:function(t){var e=t.target;this.isNav&&e&&"block"===Kr(this.$el).display&&(!Vr(e,".nav-link,.dropdown-item")&&!Er(".nav-link,.dropdown-item",e)||this.checkDisplayBlock()||(this.show=!1))},handleToggleEvt:function(t){t===this.safeId()&&this.toggle()},handleAccordionEvt:function(t,e){var i=this.accordion,n=this.show;if(i&&i===e){var o=t===this.safeId();(o&&!n||!o&&n)&&this.toggle()}},handleResize:function(){this.show="block"===Kr(this.$el).display}},render:function(t){var e=this.appear,i=t(this.tag,{class:this.classObject,directives:[{name:"show",value:this.show}],attrs:{id:this.safeId()},on:{click:this.clickHandler}},this.normalizeSlot(Ao,this.slotScope));return t(ku,{props:{appear:e},on:{enter:this.onEnter,afterEnter:this.onAfterEnter,leave:this.onLeave,afterLeave:this.onAfterLeave}},[i])}}),Ru="collapsed",Mu="not-collapsed",Hu="__BV_toggle",zu="".concat(Hu,"_HANDLER__"),Nu="".concat(Hu,"_CLICK__"),ju="".concat(Hu,"_STATE__"),Gu="".concat(Hu,"_TARGETS__"),Wu="aria-controls",Yu="aria-expanded",Uu="role",qu="tabindex",Ku="overflow-anchor",Xu=Fs(Ue,"toggle"),Zu=Ds(Ue,"state"),Ju=Ds(Ue,"sync-state"),Qu=Fs(Ue,"request-state"),td=[Ha,Ga],ed=function(t){return!nr(["button","a"],t.tagName.toLowerCase())},id=function(t){var e=t[Nu];e&&(ks(t,"click",e,ao),ks(t,"keydown",e,ao)),t[Nu]=null},nd=function(t,e){t[zu]&&e.context&&e.context.$root.$off([Zu,Ju],t[zu]),t[zu]=null},od=function(t,e){e?(Mr(t,Ru),Rr(t,Mu),zr(t,Yu,"true")):(Mr(t,Mu),Rr(t,Ru),zr(t,Yu,"false"))},rd=function(t,e){t[e]=null,delete t[e]},sd=function(t,e,i){if(M&&i.context){ed(t)&&(Gr(t,Uu)||zr(t,Uu,"button"),Gr(t,qu)||zr(t,qu,"0")),od(t,t[ju]);var n=function(t,e){var i=t.modifiers,n=t.arg,o=t.value,r=Kt(i||{});if(o=Et(o)?o.split(ut):o,Br(e.tagName,"a")){var s=jr(e,"href")||"";it.test(s)&&r.push(s.replace(et,""))}return or(n,o).forEach((function(t){return Et(t)&&r.push(t)})),r.filter((function(t,e,i){return t&&i.indexOf(t)===e}))}(e,t);n.length>0?(zr(t,Wu,n.join(" ")),Wr(t,Ku,"none")):(Nr(t,Wu),Yr(t,Ku)),xr((function(){!function(t,e){if(id(t),e.context){var i=function(i){"keydown"===i.type&&!nr(td,i.keyCode)||Fr(t)||(t[Gu]||[]).forEach((function(t){e.context.$root.$emit(Xu,t)}))};t[Nu]=i,Ss(t,"click",i,ao),ed(t)&&Ss(t,"keydown",i,ao)}}(t,i)})),Ua(n,t[Gu])||(t[Gu]=n,n.forEach((function(t){i.context.$root.$emit(Qu,t)})))}},ad={bind:function(t,e,i){t[ju]=!1,t[Gu]=[],function(t,e){if(nd(t,e),e.context){var i=function(e,i){nr(t[Gu]||[],e)&&(t[ju]=i,od(t,i))};t[zu]=i,e.context.$root.$on([Zu,Ju],i)}}(t,i),sd(t,e,i)},componentUpdated:sd,updated:sd,unbind:function(t,e,i){id(t),nd(t,i),rd(t,zu),rd(t,Nu),rd(t,ju),rd(t,Gu),Mr(t,Ru),Mr(t,Mu),Nr(t,Yu),Nr(t,Wu),Nr(t,Uu),Yr(t,Ku)}},ld=me({directives:{VBToggle:ad}}),cd=me({components:{BCollapse:Au},plugins:{VBTogglePlugin:ld}}),ud="undefined"!=typeof window&&"undefined"!=typeof document&&"undefined"!=typeof navigator,dd=function(){for(var t=["Edge","Trident","Firefox"],e=0;e=0)return 1;return 0}();var hd=ud&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then((function(){e=!1,t()})))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout((function(){e=!1,t()}),dd))}};function fd(t){return t&&"[object Function]"==={}.toString.call(t)}function pd(t,e){if(1!==t.nodeType)return[];var i=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?i[e]:i}function md(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function vd(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=pd(t),i=e.overflow,n=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(i+o+n)?t:vd(md(t))}function bd(t){return t&&t.referenceNode?t.referenceNode:t}var gd=ud&&!(!window.MSInputMethodContext||!document.documentMode),yd=ud&&/MSIE 10/.test(navigator.userAgent);function wd(t){return 11===t?gd:10===t?yd:gd||yd}function Td(t){if(!t)return document.documentElement;for(var e=wd(10)?document.body:null,i=t.offsetParent||null;i===e&&t.nextElementSibling;)i=(t=t.nextElementSibling).offsetParent;var n=i&&i.nodeName;return n&&"BODY"!==n&&"HTML"!==n?-1!==["TH","TD","TABLE"].indexOf(i.nodeName)&&"static"===pd(i,"position")?Td(i):i:t?t.ownerDocument.documentElement:document.documentElement}function Cd(t){return null!==t.parentNode?Cd(t.parentNode):t}function xd(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var i=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,n=i?t:e,o=i?e:t,r=document.createRange();r.setStart(n,0),r.setEnd(o,0);var s,a,l=r.commonAncestorContainer;if(t!==l&&e!==l||n.contains(o))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&Td(s.firstElementChild)!==s?Td(l):l;var c=Cd(t);return c.host?xd(c.host,e):xd(t,Cd(e).host)}function Sd(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",i="top"===e?"scrollTop":"scrollLeft",n=t.nodeName;if("BODY"===n||"HTML"===n){var o=t.ownerDocument.documentElement,r=t.ownerDocument.scrollingElement||o;return r[i]}return t[i]}function kd(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=Sd(e,"top"),o=Sd(e,"left"),r=i?-1:1;return t.top+=n*r,t.bottom+=n*r,t.left+=o*r,t.right+=o*r,t}function $d(t,e){var i="x"===e?"Left":"Top",n="Left"===i?"Right":"Bottom";return parseFloat(t["border"+i+"Width"])+parseFloat(t["border"+n+"Width"])}function Bd(t,e,i,n){return Math.max(e["offset"+t],e["scroll"+t],i["client"+t],i["offset"+t],i["scroll"+t],wd(10)?parseInt(i["offset"+t])+parseInt(n["margin"+("Height"===t?"Top":"Left")])+parseInt(n["margin"+("Height"===t?"Bottom":"Right")]):0)}function _d(t){var e=t.body,i=t.documentElement,n=wd(10)&&getComputedStyle(i);return{height:Bd("Height",e,i,n),width:Bd("Width",e,i,n)}}var Dd=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},Fd=function(){function t(t,e){for(var i=0;i2&&void 0!==arguments[2]&&arguments[2],n=wd(10),o="HTML"===e.nodeName,r=Vd(t),s=Vd(e),a=vd(t),l=pd(e),c=parseFloat(l.borderTopWidth),u=parseFloat(l.borderLeftWidth);i&&o&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var d=Od({top:r.top-s.top-c,left:r.left-s.left-u,width:r.width,height:r.height});if(d.marginTop=0,d.marginLeft=0,!n&&o){var h=parseFloat(l.marginTop),f=parseFloat(l.marginLeft);d.top-=c-h,d.bottom-=c-h,d.left-=u-f,d.right-=u-f,d.marginTop=h,d.marginLeft=f}return(n&&!i?e.contains(a):e===a&&"BODY"!==a.nodeName)&&(d=kd(d,e)),d}function Ld(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=t.ownerDocument.documentElement,n=Ed(t,i),o=Math.max(i.clientWidth,window.innerWidth||0),r=Math.max(i.clientHeight,window.innerHeight||0),s=e?0:Sd(i),a=e?0:Sd(i,"left"),l={top:s-n.top+n.marginTop,left:a-n.left+n.marginLeft,width:o,height:r};return Od(l)}function Ad(t){var e=t.nodeName;if("BODY"===e||"HTML"===e)return!1;if("fixed"===pd(t,"position"))return!0;var i=md(t);return!!i&&Ad(i)}function Rd(t){if(!t||!t.parentElement||wd())return document.documentElement;for(var e=t.parentElement;e&&"none"===pd(e,"transform");)e=e.parentElement;return e||document.documentElement}function Md(t,e,i,n){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},s=o?Rd(t):xd(t,bd(e));if("viewport"===n)r=Ld(s,o);else{var a=void 0;"scrollParent"===n?"BODY"===(a=vd(md(e))).nodeName&&(a=t.ownerDocument.documentElement):a="window"===n?t.ownerDocument.documentElement:n;var l=Ed(a,s,o);if("HTML"!==a.nodeName||Ad(s))r=l;else{var c=_d(t.ownerDocument),u=c.height,d=c.width;r.top+=l.top-l.marginTop,r.bottom=u+l.top,r.left+=l.left-l.marginLeft,r.right=d+l.left}}var h="number"==typeof(i=i||0);return r.left+=h?i:i.left||0,r.top+=h?i:i.top||0,r.right-=h?i:i.right||0,r.bottom-=h?i:i.bottom||0,r}function Hd(t){return t.width*t.height}function zd(t,e,i,n,o){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return t;var s=Md(i,n,r,o),a={top:{width:s.width,height:e.top-s.top},right:{width:s.right-e.right,height:s.height},bottom:{width:s.width,height:s.bottom-e.bottom},left:{width:e.left-s.left,height:s.height}},l=Object.keys(a).map((function(t){return Pd({key:t},a[t],{area:Hd(a[t])})})).sort((function(t,e){return e.area-t.area})),c=l.filter((function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight})),u=c.length>0?c[0].key:l[0].key,d=t.split("-")[1];return u+(d?"-"+d:"")}function Nd(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=n?Rd(e):xd(e,bd(i));return Ed(i,o,n)}function jd(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),i=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),n=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+n,height:t.offsetHeight+i}}function Gd(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,(function(t){return e[t]}))}function Wd(t,e,i){i=i.split("-")[0];var n=jd(t),o={width:n.width,height:n.height},r=-1!==["right","left"].indexOf(i),s=r?"top":"left",a=r?"left":"top",l=r?"height":"width",c=r?"width":"height";return o[s]=e[s]+e[l]/2-n[l]/2,o[a]=i===a?e[a]-n[c]:e[Gd(a)],o}function Yd(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function Ud(t,e,i){return(void 0===i?t:t.slice(0,function(t,e,i){if(Array.prototype.findIndex)return t.findIndex((function(t){return t[e]===i}));var n=Yd(t,(function(t){return t[e]===i}));return t.indexOf(n)}(t,"name",i))).forEach((function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var i=t.function||t.fn;t.enabled&&fd(i)&&(e.offsets.popper=Od(e.offsets.popper),e.offsets.reference=Od(e.offsets.reference),e=i(e,t))})),e}function qd(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=Nd(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=zd(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=Wd(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=Ud(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}function Kd(t,e){return t.some((function(t){var i=t.name;return t.enabled&&i===e}))}function Xd(t){for(var e=[!1,"ms","Webkit","Moz","O"],i=t.charAt(0).toUpperCase()+t.slice(1),n=0;n1&&void 0!==arguments[1]&&arguments[1],i=lh.indexOf(t),n=lh.slice(i+1).concat(lh.slice(0,i));return e?n.reverse():n}var uh="flip",dh="clockwise",hh="counterclockwise";function fh(t,e,i,n){var o=[0,0],r=-1!==["right","left"].indexOf(n),s=t.split(/(\+|\-)/).map((function(t){return t.trim()})),a=s.indexOf(Yd(s,(function(t){return-1!==t.search(/,|\s/)})));s[a]&&-1===s[a].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==a?[s.slice(0,a).concat([s[a].split(l)[0]]),[s[a].split(l)[1]].concat(s.slice(a+1))]:[s];return(c=c.map((function(t,n){var o=(1===n?!r:r)?"height":"width",s=!1;return t.reduce((function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,s=!0,t):s?(t[t.length-1]+=e,s=!1,t):t.concat(e)}),[]).map((function(t){return function(t,e,i,n){var o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],s=o[2];if(!r)return t;if(0===s.indexOf("%")){var a=void 0;switch(s){case"%p":a=i;break;case"%":case"%r":default:a=n}return Od(a)[e]/100*r}if("vh"===s||"vw"===s)return("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;return r}(t,o,e,i)}))}))).forEach((function(t,e){t.forEach((function(i,n){nh(i)&&(o[e]+=i*("-"===t[n-1]?-1:1))}))})),o}var ph={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,i=e.split("-")[0],n=e.split("-")[1];if(n){var o=t.offsets,r=o.reference,s=o.popper,a=-1!==["bottom","top"].indexOf(i),l=a?"left":"top",c=a?"width":"height",u={start:Id({},l,r[l]),end:Id({},l,r[l]+r[c]-s[c])};t.offsets.popper=Pd({},s,u[n])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var i=e.offset,n=t.placement,o=t.offsets,r=o.popper,s=o.reference,a=n.split("-")[0],l=void 0;return l=nh(+i)?[+i,0]:fh(i,r,s,a),"left"===a?(r.top+=l[0],r.left-=l[1]):"right"===a?(r.top+=l[0],r.left+=l[1]):"top"===a?(r.left+=l[0],r.top-=l[1]):"bottom"===a&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,e){var i=e.boundariesElement||Td(t.instance.popper);t.instance.reference===i&&(i=Td(i));var n=Xd("transform"),o=t.instance.popper.style,r=o.top,s=o.left,a=o[n];o.top="",o.left="",o[n]="";var l=Md(t.instance.popper,t.instance.reference,e.padding,i,t.positionFixed);o.top=r,o.left=s,o[n]=a,e.boundaries=l;var c=e.priority,u=t.offsets.popper,d={primary:function(t){var i=u[t];return u[t]l[t]&&!e.escapeWithReference&&(n=Math.min(u[i],l[t]-("right"===t?u.width:u.height))),Id({},i,n)}};return c.forEach((function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";u=Pd({},u,d[e](t))})),t.offsets.popper=u,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,i=e.popper,n=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return i[a]r(n[a])&&(t.offsets.popper[l]=r(n[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var i;if(!sh(t.instance.modifiers,"arrow","keepTogether"))return t;var n=e.element;if("string"==typeof n){if(!(n=t.instance.popper.querySelector(n)))return t}else if(!t.instance.popper.contains(n))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",u=l?"Top":"Left",d=u.toLowerCase(),h=l?"left":"top",f=l?"bottom":"right",p=jd(n)[c];a[f]-ps[f]&&(t.offsets.popper[d]+=a[d]+p-s[f]),t.offsets.popper=Od(t.offsets.popper);var m=a[d]+a[c]/2-p/2,v=pd(t.instance.popper),b=parseFloat(v["margin"+u]),g=parseFloat(v["border"+u+"Width"]),y=m-t.offsets.popper[d]-b-g;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=n,t.offsets.arrow=(Id(i={},d,Math.round(y)),Id(i,h,""),i),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(t,e){if(Kd(t.instance.modifiers,"inner"))return t;if(t.flipped&&t.placement===t.originalPlacement)return t;var i=Md(t.instance.popper,t.instance.reference,e.padding,e.boundariesElement,t.positionFixed),n=t.placement.split("-")[0],o=Gd(n),r=t.placement.split("-")[1]||"",s=[];switch(e.behavior){case uh:s=[n,o];break;case dh:s=ch(n);break;case hh:s=ch(n,!0);break;default:s=e.behavior}return s.forEach((function(a,l){if(n!==a||s.length===l+1)return t;n=t.placement.split("-")[0],o=Gd(n);var c=t.offsets.popper,u=t.offsets.reference,d=Math.floor,h="left"===n&&d(c.right)>d(u.left)||"right"===n&&d(c.left)d(u.top)||"bottom"===n&&d(c.top)d(i.right),m=d(c.top)d(i.bottom),b="left"===n&&f||"right"===n&&p||"top"===n&&m||"bottom"===n&&v,g=-1!==["top","bottom"].indexOf(n),y=!!e.flipVariations&&(g&&"start"===r&&f||g&&"end"===r&&p||!g&&"start"===r&&m||!g&&"end"===r&&v),w=!!e.flipVariationsByContent&&(g&&"start"===r&&p||g&&"end"===r&&f||!g&&"start"===r&&v||!g&&"end"===r&&m),T=y||w;(h||b||T)&&(t.flipped=!0,(h||b)&&(n=s[l+1]),T&&(r=function(t){return"end"===t?"start":"start"===t?"end":t}(r)),t.placement=n+(r?"-"+r:""),t.offsets.popper=Pd({},t.offsets.popper,Wd(t.instance.popper,t.offsets.reference,t.placement)),t=Ud(t.instance.modifiers,t,"flip"))})),t},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,i=e.split("-")[0],n=t.offsets,o=n.popper,r=n.reference,s=-1!==["left","right"].indexOf(i),a=-1===["top","left"].indexOf(i);return o[s?"left":"top"]=r[i]-(a?o[s?"width":"height"]:0),t.placement=Gd(e),t.offsets.popper=Od(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!sh(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,i=Yd(t.instance.modifiers,(function(t){return"preventOverflow"===t.name})).boundaries;if(e.bottomi.right||e.top>i.bottom||e.right2&&void 0!==arguments[2]?arguments[2]:{};Dd(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=hd(this.update.bind(this)),this.options=Pd({},t.Defaults,o),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=i&&i.jquery?i[0]:i,this.options.modifiers={},Object.keys(Pd({},t.Defaults.modifiers,o.modifiers)).forEach((function(e){n.options.modifiers[e]=Pd({},t.Defaults.modifiers[e]||{},o.modifiers?o.modifiers[e]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(t){return Pd({name:t},n.options.modifiers[t])})).sort((function(t,e){return t.order-e.order})),this.modifiers.forEach((function(t){t.enabled&&fd(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)})),this.update();var r=this.options.eventsEnabled;r&&this.enableEventListeners(),this.state.eventsEnabled=r}return Fd(t,[{key:"update",value:function(){return qd.call(this)}},{key:"destroy",value:function(){return Zd.call(this)}},{key:"enableEventListeners",value:function(){return eh.call(this)}},{key:"disableEventListeners",value:function(){return ih.call(this)}}]),t}();mh.Utils=("undefined"!=typeof window?window:global).PopperUtils,mh.placements=ah,mh.Defaults=ph;var vh,bh,gh,yh,wh,Th,Ch,xh,Sh,kh,$h,Bh,BvEvent=function(){function BvEvent(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(o(this,BvEvent),!t)throw new TypeError("Failed to construct '".concat(this.constructor.name,"'. 1 argument required, ").concat(arguments.length," given."));Gt(this,BvEvent.Defaults,this.constructor.Defaults,e,{type:t}),Yt(this,{type:{enumerable:!0,configurable:!1,writable:!1},cancelable:{enumerable:!0,configurable:!1,writable:!1},nativeEvent:{enumerable:!0,configurable:!1,writable:!1},target:{enumerable:!0,configurable:!1,writable:!1},relatedTarget:{enumerable:!0,configurable:!1,writable:!1},vueTarget:{enumerable:!0,configurable:!1,writable:!1},componentId:{enumerable:!0,configurable:!1,writable:!1}});var i=!1;this.preventDefault=function(){this.cancelable&&(i=!0)},Ut(this,"defaultPrevented",{enumerable:!0,get:function(){return i}})}return s(BvEvent,null,[{key:"Defaults",get:function(){return{type:"",cancelable:!0,nativeEvent:null,target:null,relatedTarget:null,vueTarget:null,componentId:null}}}]),BvEvent}(),_h=i.default.extend({data:function(){return{listenForClickOut:!1}},watch:{listenForClickOut:function(t,e){t!==e&&(ks(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,lo),t&&Ss(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,lo))}},beforeCreate:function(){this.clickOutElement=null,this.clickOutEventName=null},mounted:function(){this.clickOutElement||(this.clickOutElement=document),this.clickOutEventName||(this.clickOutEventName="click"),this.listenForClickOut&&Ss(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,lo)},beforeDestroy:function(){ks(this.clickOutElement,this.clickOutEventName,this._clickOutHandler,lo)},methods:{isClickOut:function(t){return!Lr(this.$el,t.target)},_clickOutHandler:function(t){this.clickOutHandler&&this.isClickOut(t)&&this.clickOutHandler(t)}}}),Dh=i.default.extend({data:function(){return{listenForFocusIn:!1}},watch:{listenForFocusIn:function(t,e){t!==e&&(ks(this.focusInElement,"focusin",this._focusInHandler,lo),t&&Ss(this.focusInElement,"focusin",this._focusInHandler,lo))}},beforeCreate:function(){this.focusInElement=null},mounted:function(){this.focusInElement||(this.focusInElement=document),this.listenForFocusIn&&Ss(this.focusInElement,"focusin",this._focusInHandler,lo)},beforeDestroy:function(){ks(this.focusInElement,"focusin",this._focusInHandler,lo)},methods:{_focusInHandler:function(t){this.focusInHandler&&this.focusInHandler(t)}}}),Fh=Ds(Ke,eo),Ih=Ds(Ke,zn),Ph=[".dropdown-item",".b-dropdown-form"].map((function(t){return"".concat(t,":not(.disabled):not([disabled])")})).join(", "),Oh=vs(ee(c(c({},fc),{},{boundary:hs([HTMLElement,go],"scrollParent"),disabled:hs(ho,!1),dropleft:hs(ho,!1),dropright:hs(ho,!1),dropup:hs(ho,!1),noFlip:hs(ho,!1),offset:hs(_o,0),popperOpts:hs(vo,{}),right:hs(ho,!1)})),Ke),Vh=i.default.extend({mixins:[pc,Ja,_h,Dh],provide:function(){return{bvDropdown:this}},inject:{bvNavbar:{default:null}},props:Oh,data:function(){return{visible:!1,visibleChangePrevented:!1}},computed:{inNavbar:function(){return!It(this.bvNavbar)},toggler:function(){var t=this.$refs.toggle;return t?t.$el||t:null},directionClass:function(){return this.dropup?"dropup":this.dropright?"dropright":this.dropleft?"dropleft":""},boundaryClass:function(){return"scrollParent"===this.boundary||this.inNavbar?"":"position-static"}},watch:{visible:function(t,e){if(this.visibleChangePrevented)this.visibleChangePrevented=!1;else if(t!==e){var i=new BvEvent(t?to:Nn,{cancelable:!0,vueTarget:this,target:this.$refs.menu,relatedTarget:null,componentId:this.safeId?this.safeId():this.id||null});if(this.emitEvent(i),i.defaultPrevented)return this.visibleChangePrevented=!0,this.visible=e,void this.$off(zn,this.focusToggler);t?this.showMenu():this.hideMenu()}},disabled:function(t,e){t!==e&&t&&this.visible&&(this.visible=!1)}},created:function(){this.$_popper=null,this.$_hideTimeout=null},deactivated:function(){this.visible=!1,this.whileOpenListen(!1),this.destroyPopper()},beforeDestroy:function(){this.visible=!1,this.whileOpenListen(!1),this.destroyPopper(),this.clearHideTimeout()},methods:{emitEvent:function(t){var e=t.type;this.emitOnRoot(Ds(Ke,e),t),this.$emit(e,t)},showMenu:function(){var t=this;if(!this.disabled){if(!this.inNavbar)if("undefined"==typeof mh)le("Popper.js not found. Falling back to CSS positioning",Ke);else{var e=this.dropup&&this.right||this.split?this.$el:this.$refs.toggle;e=e.$el||e,this.createPopper(e)}this.emitOnRoot(Fh,this),this.whileOpenListen(!0),this.$nextTick((function(){t.focusMenu(),t.$emit(eo)}))}},hideMenu:function(){this.whileOpenListen(!1),this.emitOnRoot(Ih,this),this.$emit(zn),this.destroyPopper()},createPopper:function(t){this.destroyPopper(),this.$_popper=new mh(t,this.$refs.menu,this.getPopperConfig())},destroyPopper:function(){this.$_popper&&this.$_popper.destroy(),this.$_popper=null},updatePopper:function(){try{this.$_popper.scheduleUpdate()}catch(t){}},clearHideTimeout:function(){clearTimeout(this.$_hideTimeout),this.$_hideTimeout=null},getPopperConfig:function(){var t="bottom-start";this.dropup?t=this.right?"top-end":"top-start":this.dropright?t="right-start":this.dropleft?t="left-start":this.right&&(t="bottom-end");var e={placement:t,modifiers:{offset:{offset:this.offset||0},flip:{enabled:!this.noFlip}}},i=this.boundary;return i&&(e.modifiers.preventOverflow={boundariesElement:i}),te(e,this.popperOpts||{})},whileOpenListen:function(t){this.listenForClickOut=t,this.listenForFocusIn=t;var e=t?"$on":"$off";this.$root[e](Fh,this.rootCloseListener)},rootCloseListener:function(t){t!==this&&(this.visible=!1)},show:function(){var t=this;this.disabled||xr((function(){t.visible=!0}))},hide:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.disabled||(this.visible=!1,t&&this.$once(zn,this.focusToggler))},toggle:function(t){var e=t=t||{},i=e.type,n=e.keyCode;("click"===i||"keydown"===i&&-1!==[Ha,Ga,Ra].indexOf(n))&&(this.disabled?this.visible=!1:(this.$emit(no,t),Bs(t),this.visible?this.hide(!0):this.show()))},onMousedown:function(t){Bs(t,{propagation:!1})},onKeydown:function(t){var e=t.keyCode;27===e?this.onEsc(t):e===Ra?this.focusNext(t,!1):e===Wa&&this.focusNext(t,!0)},onEsc:function(t){this.visible&&(this.visible=!1,Bs(t),this.$once(zn,this.focusToggler))},onSplitClick:function(t){this.disabled?this.visible=!1:this.$emit(Bn,t)},hideHandler:function(t){var e=this,i=t.target;!this.visible||Lr(this.$refs.menu,i)||Lr(this.toggler,i)||(this.clearHideTimeout(),this.$_hideTimeout=setTimeout((function(){return e.hide()}),this.inNavbar?300:0))},clickOutHandler:function(t){this.hideHandler(t)},focusInHandler:function(t){this.hideHandler(t)},focusNext:function(t,e){var i=this,n=t.target;!this.visible||t&&Er(".dropdown form",n)||(Bs(t),this.$nextTick((function(){var t=i.getItems();if(!(t.length<1)){var o=t.indexOf(n);e&&o>0?o--:!e&&o1&&void 0!==arguments[1]?arguments[1]:null;if(Ht(t)){var i=re(t,this.valueField),n=re(t,this.textField);return{value:Ft(i)?e||n:i,text:Dl(String(Ft(n)?e:n)),html:re(t,this.htmlField),disabled:Boolean(re(t,this.disabledField))}}return{value:e||t,text:Dl(String(t)),disabled:!1}},normalizeOptions:function(t){var e=this;return Rt(t)?t.map((function(t){return e.normalizeOption(t)})):Ht(t)?(le('Setting prop "options" to an object is deprecated. Use the array format instead.',this.$options.name),Kt(t).map((function(i){return e.normalizeOption(t[i]||{},i)}))):[]}}}),lf=vs(ee(c(c({},sf),{},{id:hs(go,void 0,!0)})),ai),cf=i.default.extend({name:ai,mixins:[af,Cs],props:lf,render:function(t){var e=this.id,i=this.formOptions.map((function(e,i){var n=e.value,o=e.text,r=e.html,s=e.disabled;return t("option",{attrs:{value:n,disabled:s},domProps:Fl(r,o),key:"option_".concat(i)})}));return t("datalist",{attrs:{id:e}},[i,this.normalizeSlot()])}}),uf=vs({id:hs(go),inline:hs(ho,!1),tag:hs(go,"small"),textVariant:hs(go,"muted")},xi),df=i.default.extend({name:xi,functional:!0,props:uf,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(i.tag,F(n,{class:a({"form-text":!i.inline},"text-".concat(i.textVariant),i.textVariant),attrs:{id:i.id}}),o)}}),hf=vs({ariaLive:hs(go),forceShow:hs(ho,!1),id:hs(go),role:hs(go),state:hs(ho,null),tag:hs(go,"div"),tooltip:hs(ho,!1)},hi),ff=i.default.extend({name:hi,functional:!0,props:hf,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.tooltip,s=i.ariaLive,a=!0===i.forceShow||!1===i.state;return t(i.tag,F(n,{class:{"d-block":a,"invalid-feedback":!r,"invalid-tooltip":r},attrs:{id:i.id||null,role:i.role||null,"aria-live":s||null,"aria-atomic":s?"true":null}}),o)}}),pf=vs({ariaLive:hs(go),forceShow:hs(ho,!1),id:hs(go),role:hs(go),state:hs(ho,null),tag:hs(go,"div"),tooltip:hs(ho,!1)},$i),mf=i.default.extend({name:$i,functional:!0,props:pf,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.tooltip,s=i.ariaLive,a=!0===i.forceShow||!0===i.state;return t(i.tag,F(n,{class:{"d-block":a,"valid-feedback":!r,"valid-tooltip":r},attrs:{id:i.id||null,role:i.role||null,"aria-live":s||null,"aria-atomic":s?"true":null}}),o)}}),vf=vs({tag:hs(go,"div")},vi),bf=i.default.extend({name:vi,functional:!0,props:vf,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(i.tag,F(n,{staticClass:"form-row"}),o)}}),gf=me({components:{BForm:Uh,BFormDatalist:cf,BDatalist:cf,BFormText:df,BFormInvalidFeedback:ff,BFormFeedback:ff,BFormValidFeedback:mf,BFormRow:bf}}),yf=function(t,e){for(var i=0;i-1:Ua(e,t)},isRadio:function(){return!1}},watch:a({},Lf,(function(t,e){Ua(t,e)||this.setIndeterminate(t)})),mounted:function(){this.setIndeterminate(this.indeterminate)},methods:{computedLocalCheckedWatcher:function(t,e){if(!Ua(t,e)){this.$emit(Of,t);var i=this.$refs.input;i&&this.$emit(Af,i.indeterminate)}},handleChange:function(t){var e=this,i=t.target,n=i.checked,o=i.indeterminate,r=this.value,s=this.uncheckedValue,a=this.computedLocalChecked;if(Rt(a)){var l=yf(a,r);n&&l<0?a=a.concat(r):!n&&l>-1&&(a=a.slice(0,l).concat(a.slice(l+1)))}else a=n?r:s;this.computedLocalChecked=a,this.$nextTick((function(){e.$emit($n,a),e.isGroup&&e.bvGroup.$emit($n,a),e.$emit(Af,o)}))},setIndeterminate:function(t){Rt(this.computedLocalChecked)&&(t=!1);var e=this.$refs.input;e&&(e.indeterminate=t,this.$emit(Af,t))}}}),Hf=vs(ee(c(c(c(c(c({},fc),Tf),Vf),kf),Bf)),fi),zf=i.default.extend({name:fi,mixins:[pc,Ef,Cf,$f,_f],inject:{bvGroup:{from:"bvRadioGroup",default:!1}},props:Hf,watch:{computedLocalChecked:function(t,e){Ua(t,e)||this.$emit(Of,t)}}}),Nf=["aria-describedby","aria-labelledby"],jf=ys("checked"),Gf=jf.mixin,Wf=jf.props,Yf=jf.prop,Uf=jf.event,qf=vs(ee(c(c(c(c(c(c(c(c({},fc),Wf),Tf),sf),kf),Bf),xf),{},{ariaInvalid:hs(ko,!1),buttonVariant:hs(go),buttons:hs(ho,!1),stacked:hs(ho,!1),validated:hs(ho,!1)})),"formRadioCheckGroups"),Kf=i.default.extend({mixins:[pc,Gf,Cs,Cf,af,$f,_f,Sf],inheritAttrs:!1,props:qf,data:function(){return{localChecked:this[Yf]}},computed:{inline:function(){return!this.stacked},groupName:function(){return this.name||this.safeId()},groupClasses:function(){var t=this.inline,e=this.size,i={"was-validated":this.validated};return this.buttons&&(i=[i,"btn-group-toggle",a({"btn-group":t,"btn-group-vertical":!t},"btn-group-".concat(e),e)]),i}},watch:(yh={},a(yh,Yf,(function(t){Ua(t,this.localChecked)||(this.localChecked=t)})),a(yh,"localChecked",(function(t,e){Ua(t,e)||this.$emit(Uf,t)})),yh),render:function(t){var e=this,i=this.isRadioGroup,n=Jt(this.$attrs,Nf),o=i?zf:Mf,r=this.formOptions.map((function(i,r){var s="BV_option_".concat(r);return t(o,{props:{disabled:i.disabled||!1,id:e.safeId(s),value:i.value},attrs:n,key:s},[t("span",{domProps:Fl(i.html,i.text)})])}));return t("div",{class:[this.groupClasses,"bv-no-focus-ring"],attrs:c(c({},Qt(this.$attrs,Nf)),{},{"aria-invalid":this.computedAriaInvalid,"aria-required":this.required?"true":null,id:this.safeId(),role:i?"radiogroup":"group",tabindex:"-1"})},[this.normalizeSlot(Ho),r,this.normalizeSlot()])}}),Xf=vs(ee(c(c({},qf),{},(a(wh={},Yf,hs(uo,[])),a(wh,"switches",hs(ho,!1)),wh))),si),Zf=i.default.extend({name:si,mixins:[Kf],provide:function(){return{bvCheckGroup:this}},props:Xf,computed:{isRadioGroup:function(){return!1}}}),Jf=me({components:{BFormCheckbox:Mf,BCheckbox:Mf,BCheck:Mf,BFormCheckboxGroup:Zf,BCheckboxGroup:Zf,BCheckGroup:Zf}}),Qf="__BV_hover_handler__",tp="mouseenter",ep=function(t,e,i){$s(t,e,tp,i,lo),$s(t,e,"mouseleave",i,lo)},ip=function(t,e){var i=e.value,n=void 0===i?null:i;if(M){var o=t[Qf],r=Ot(o),s=!(r&&o.fn===n);r&&s&&(ep(!1,t,o),delete t[Qf]),Ot(n)&&s&&(t[Qf]=function(t){var e=function(e){t(e.type===tp,e)};return e.fn=t,e}(n),ep(!0,t,t[Qf]))}},np={bind:ip,componentUpdated:ip,unbind:function(t){ip(t,{value:null})}},op=ee(c(c(c(c(c(c({},fc),kf),Bf),Qt(Oh,["disabled"])),Qt(Tf,["autofocus"])),{},{buttonOnly:hs(ho,!1),buttonVariant:hs(go,"secondary"),formattedValue:hs(go),labelSelected:hs(go),lang:hs(go),menuClass:hs(To),placeholder:hs(go),readonly:hs(ho,!1),rtl:hs(ho,null),value:hs(go,"")})),rp=i.default.extend({name:"BVFormBtnLabelControl",directives:{"b-hover":np},mixins:[pc,$f,_f,Vh,Cs],props:op,data:function(){return{isHovered:!1,hasFocus:!1}},computed:{idButton:function(){return this.safeId()},idLabel:function(){return this.safeId("_value_")},idMenu:function(){return this.safeId("_dialog_")},idWrapper:function(){return this.safeId("_outer_")},computedDir:function(){return!0===this.rtl?"rtl":!1===this.rtl?"ltr":null}},methods:{focus:function(){this.disabled||ts(this.$refs.toggle)},blur:function(){this.disabled||es(this.$refs.toggle)},setFocus:function(t){this.hasFocus="focus"===t.type},handleHover:function(t){this.isHovered=t}},render:function(t){var e,i=this.idButton,n=this.idLabel,o=this.idMenu,r=this.idWrapper,s=this.disabled,l=this.readonly,c=this.required,u=this.name,d=this.state,h=this.visible,f=this.size,p=this.isHovered,m=this.hasFocus,v=this.labelSelected,b=this.buttonVariant,g=this.buttonOnly,y=vr(this.value)||"",w=!1===d||c&&!y,T={isHovered:p,hasFocus:m,state:d,opened:h},C=t("button",{staticClass:"btn",class:(e={},a(e,"btn-".concat(b),g),a(e,"btn-".concat(f),f),a(e,"h-auto",!g),a(e,"dropdown-toggle",g),a(e,"dropdown-toggle-no-caret",g),e),attrs:{id:i,type:"button",disabled:s,"aria-haspopup":"dialog","aria-expanded":h?"true":"false","aria-invalid":w?"true":null,"aria-required":c?"true":null},directives:[{name:"b-hover",value:this.handleHover}],on:{mousedown:this.onMousedown,click:this.toggle,keydown:this.toggle,"!focus":this.setFocus,"!blur":this.setFocus},ref:"toggle"},[this.hasNormalizedSlot(Eo)?this.normalizeSlot(Eo,T):t(Ta,{props:{scale:1.25}})]),x=t();u&&!s&&(x=t("input",{attrs:{type:"hidden",name:u||null,form:this.form||null,value:y}}));var S=t("div",{staticClass:"dropdown-menu",class:[this.menuClass,{show:h,"dropdown-menu-right":this.right}],attrs:{id:o,role:"dialog",tabindex:"-1","aria-modal":"false","aria-labelledby":n},on:{keydown:this.onKeydown},ref:"menu"},[this.normalizeSlot(Ao,{opened:h})]),k=t("label",{class:g?"sr-only":["form-control",{"text-muted":!y},this.stateClass,this.sizeFormClass],attrs:{id:n,for:i,"aria-invalid":w?"true":null,"aria-required":c?"true":null},directives:[{name:"b-hover",value:this.handleHover}],on:{"!click":function(t){Bs(t,{preventDefault:!1})}}},[y?this.formattedValue||y:this.placeholder||"",y&&v?t("bdi",{staticClass:"sr-only"},v):""]);return t("div",{staticClass:"b-form-btn-label-control dropdown",class:[this.directionClass,this.boundaryClass,[{"btn-group":g,"form-control":!g,focus:m&&!g,show:h,"is-valid":!0===d,"is-invalid":!1===d},g?null:this.sizeFormClass]],attrs:{id:r,role:g?null:"group",lang:this.lang||null,dir:this.computedDir,"aria-disabled":s,"aria-readonly":l&&!s,"aria-labelledby":n,"aria-invalid":!1===d||c&&!y?"true":null,"aria-required":c?"true":null}},[C,x,S,k])}}),sp=ys("value",{type:$o}),ap=sp.mixin,lp=sp.props,cp=sp.prop,up=sp.event,dp=Qt(wc,["block","hidden","id","noKeyNav","roleDescription","value","width"]),hp=Qt(op,["formattedValue","id","lang","rtl","value"]),fp=vs(ee(c(c(c(c(c({},fc),lp),dp),hp),{},{calendarWidth:hs(go,"270px"),closeButton:hs(ho,!1),closeButtonVariant:hs(go,"outline-secondary"),dark:hs(ho,!1),labelCloseButton:hs(go,"Close"),labelResetButton:hs(go,"Reset"),labelTodayButton:hs(go,"Select today"),noCloseOnSelect:hs(ho,!1),resetButton:hs(ho,!1),resetButtonVariant:hs(go,"outline-danger"),resetValue:hs($o),todayButton:hs(ho,!1),todayButtonVariant:hs(go,"outline-primary")})),li),pp=i.default.extend({name:li,mixins:[pc,ap],props:fp,data:function(){return{localYMD:Jl(this[cp])||"",isVisible:!1,localLocale:null,isRTL:!1,formattedValue:"",activeYMD:""}},computed:{calendarYM:function(){return this.activeYMD.slice(0,-3)},computedLang:function(){return(this.localLocale||"").replace(/-u-.*$/i,"")||null},computedResetValue:function(){return Jl(uc(this.resetValue))||""}},watch:(Th={},a(Th,cp,(function(t){this.localYMD=Jl(t)||""})),a(Th,"localYMD",(function(t){this.isVisible&&this.$emit(up,this.valueAsDate?Zl(t)||null:t||"")})),a(Th,"calendarYM",(function(t,e){if(t!==e&&e)try{this.$refs.control.updatePopper()}catch(t){}})),Th),methods:{focus:function(){this.disabled||ts(this.$refs.control)},blur:function(){this.disabled||es(this.$refs.control)},setAndClose:function(t){var e=this;this.localYMD=t,this.noCloseOnSelect||this.$nextTick((function(){e.$refs.control.hide(!0)}))},onSelected:function(t){var e=this;this.$nextTick((function(){e.setAndClose(t)}))},onInput:function(t){this.localYMD!==t&&(this.localYMD=t)},onContext:function(t){var e=t.activeYMD,i=t.isRTL,n=t.locale,o=t.selectedYMD,r=t.selectedFormatted;this.isRTL=i,this.localLocale=n,this.formattedValue=r,this.localYMD=o,this.activeYMD=e,this.$emit(Dn,t)},onTodayButton:function(){this.setAndClose(Jl(uc(Xl(),this.min,this.max)))},onResetButton:function(){this.setAndClose(this.computedResetValue)},onCloseButton:function(){this.$refs.control.hide(!0)},onShow:function(){this.isVisible=!0},onShown:function(){var t=this;this.$nextTick((function(){ts(t.$refs.calendar),t.$emit(eo)}))},onHidden:function(){this.isVisible=!1,this.$emit(zn)},defaultButtonFn:function(t){var e=t.isHovered,i=t.hasFocus;return this.$createElement(e||i?ga:ba,{attrs:{"aria-hidden":"true"}})}},render:function(t){var e=this.localYMD,i=this.disabled,n=this.readonly,o=this.dark,r=this.$props,s=this.$scopedSlots,l=Pt(this.placeholder)?this.labelNoDateSelected:this.placeholder,u=[];if(this.todayButton){var d=this.labelTodayButton;u.push(t(ml,{props:{disabled:i||n,size:"sm",variant:this.todayButtonVariant},attrs:{"aria-label":d||null},on:{click:this.onTodayButton}},d))}if(this.resetButton){var h=this.labelResetButton;u.push(t(ml,{props:{disabled:i||n,size:"sm",variant:this.resetButtonVariant},attrs:{"aria-label":h||null},on:{click:this.onResetButton}},h))}if(this.closeButton){var f=this.labelCloseButton;u.push(t(ml,{props:{disabled:i,size:"sm",variant:this.closeButtonVariant},attrs:{"aria-label":f||null},on:{click:this.onCloseButton}},f))}u.length>0&&(u=[t("div",{staticClass:"b-form-date-controls d-flex flex-wrap",class:{"justify-content-between":u.length>1,"justify-content-end":u.length<2}},u)]);var p=t(Tc,{staticClass:"b-form-date-calendar w-100",props:c(c({},ps(dp,r)),{},{hidden:!this.isVisible,value:e,valueAsDate:!1,width:this.calendarWidth}),on:{selected:this.onSelected,input:this.onInput,context:this.onContext},scopedSlots:Jt(s,["nav-prev-decade","nav-prev-year","nav-prev-month","nav-this-month","nav-next-month","nav-next-year","nav-next-decade"]),key:"calendar",ref:"calendar"},u);return t(rp,{staticClass:"b-form-datepicker",props:c(c({},ps(hp,r)),{},{formattedValue:e?this.formattedValue:"",id:this.safeId(),lang:this.computedLang,menuClass:[{"bg-dark":o,"text-light":o},this.menuClass],placeholder:l,rtl:this.isRTL,value:e}),on:{show:this.onShow,shown:this.onShown,hidden:this.onHidden},scopedSlots:a({},Eo,s["button-content"]||this.defaultButtonFn),ref:"control"},[p])}}),mp=me({components:{BFormDatepicker:pp,BDatepicker:pp}}),vp=ys("value",{type:[uo,_t],defaultValue:null,validator:function(t){return""===t?(le(Tp,ci),!0):Pt(t)||Cp(t)}}),bp=vp.mixin,gp=vp.props,yp=vp.prop,wp=vp.event,Tp='Setting "value"/"v-model" to an empty string for reset is deprecated. Set to "null" instead.',Cp=function t(e){return function(t){return t instanceof _t}(e)||Rt(e)&&e.every((function(e){return t(e)}))},xp=function(t){return Ot(t.getAsEntry)?t.getAsEntry():Ot(t.webkitGetAsEntry)?t.webkitGetAsEntry():null},Sp=function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return new Promise((function(n){var o=[];!function r(){e.readEntries((function(e){0===e.length?n(Promise.all(o).then((function(t){return sr(t)}))):(o.push(Promise.all(e.map((function(e){if(e){if(e.isDirectory)return t(e.createReader(),"".concat(i).concat(e.name,"/"));if(e.isFile)return new Promise((function(t){e.file((function(e){e.$path="".concat(i).concat(e.name),t(e)}))}))}return null})).filter(ne))),r())}))}()}))},kp=vs(ee(c(c(c(c(c(c(c({},fc),gp),Tf),xf),Bf),kf),{},{accept:hs(go,""),browseText:hs(go,"Browse"),capture:hs(ho,!1),directory:hs(ho,!1),dropPlaceholder:hs(go,"Drop files here"),fileNameFormatter:hs(po),multiple:hs(ho,!1),noDrop:hs(ho,!1),noDropPlaceholder:hs(go,"Not allowed"),noTraverse:hs(ho,!1),placeholder:hs(go,"No file chosen")})),ci),$p=i.default.extend({name:ci,mixins:[Za,pc,bp,Cs,Cf,_f,Sf,Cs],inheritAttrs:!1,props:kp,data:function(){return{files:[],dragging:!1,dropAllowed:!this.noDrop,hasFocus:!1}},computed:{computedAccept:function(){var t=this.accept;return 0===(t=(t||"").trim().split(/[,\s]+/).filter(ne)).length?null:t.map((function(t){var e="name",i="^",n="$";return tt.test(t)?i="":(e="type",dt.test(t)&&(n=".+$",t=t.slice(0,-1))),t=mr(t),{rx:new RegExp("".concat(i).concat(t).concat(n)),prop:e}}))},computedCapture:function(){var t=this.capture;return!0===t||""===t||(t||null)},computedAttrs:function(){var t=this.name,e=this.disabled,i=this.required,n=this.form,o=this.computedCapture,r=this.accept,s=this.multiple,a=this.directory;return c(c({},this.bvAttrs),{},{type:"file",id:this.safeId(),name:t,disabled:e,required:i,form:n||null,capture:o,accept:r||null,multiple:s,directory:a,webkitdirectory:a,"aria-required":i?"true":null})},computedFileNameFormatter:function(){var t=this.fileNameFormatter;return gs(t)?t:this.defaultFileNameFormatter},clonedFiles:function(){return ie(this.files)},flattenedFiles:function(){return ar(this.files)},fileNames:function(){return this.flattenedFiles.map((function(t){return t.name}))},labelContent:function(){if(this.dragging&&!this.noDrop)return this.normalizeSlot("drop-placeholder",{allowed:this.dropAllowed})||(this.dropAllowed?this.dropPlaceholder:this.$createElement("span",{staticClass:"text-danger"},this.noDropPlaceholder));if(0===this.files.length)return this.normalizeSlot("placeholder")||this.placeholder;var t=this.flattenedFiles,e=this.clonedFiles,i=this.fileNames,n=this.computedFileNameFormatter;return this.hasNormalizedSlot(Mo)?this.normalizeSlot(Mo,{files:t,filesTraversed:e,names:i}):n(t,e,i)}},watch:(Ch={},a(Ch,yp,(function(t){(!t||Rt(t)&&0===t.length)&&this.reset()})),a(Ch,"files",(function(t,e){if(!Ua(t,e)){var i=this.multiple,n=this.noTraverse,o=!i||n?ar(t):t;this.$emit(wp,i?o:o[0]||null)}})),Ch),created:function(){this.$_form=null},mounted:function(){var t=Er("form",this.$el);t&&(Ss(t,"reset",this.reset,ao),this.$_form=t)},beforeDestroy:function(){var t=this.$_form;t&&ks(t,"reset",this.reset,ao)},methods:{isFileValid:function(t){if(!t)return!1;var e=this.computedAccept;return!e||e.some((function(e){return e.rx.test(t[e.prop])}))},isFilesArrayValid:function(t){var e=this;return Rt(t)?t.every((function(t){return e.isFileValid(t)})):this.isFileValid(t)},defaultFileNameFormatter:function(t,e,i){return i.join(", ")},setFiles:function(t){this.dropAllowed=!this.noDrop,this.dragging=!1,this.files=this.multiple?this.directory?t:ar(t):ar(t).slice(0,1)},setInputFiles:function(t){try{var e=new ClipboardEvent("").clipboardData||new DataTransfer;ar(ie(t)).forEach((function(t){delete t.$path,e.items.add(t)})),this.$refs.input.files=e.files}catch(t){}},reset:function(){try{var t=this.$refs.input;t.value="",t.type="",t.type="file"}catch(t){}this.files=[]},handleFiles:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e){var i=t.filter(this.isFilesArrayValid);i.length>0&&(this.setFiles(i),this.setInputFiles(i))}else this.setFiles(t)},focusHandler:function(t){this.plain||"focusout"===t.type?this.hasFocus=!1:this.hasFocus=!0},onChange:function(t){var e=this,i=t.type,n=t.target,o=t.dataTransfer,r=void 0===o?{}:o,s="drop"===i;this.$emit($n,t);var a=ir(r.items||[]);if(A&&a.length>0&&!It(xp(a[0])))(function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return Promise.all(ir(t).filter((function(t){return"file"===t.kind})).map((function(t){var i=xp(t);if(i){if(i.isDirectory&&e)return Sp(i.createReader(),"".concat(i.name,"/"));if(i.isFile)return new Promise((function(t){i.file((function(e){e.$path="",t(e)}))}))}return null})).filter(ne))})(a,this.directory).then((function(t){return e.handleFiles(t,s)}));else{var l=ir(n.files||r.files||[]).map((function(t){return t.$path=t.webkitRelativePath||"",t}));this.handleFiles(l,s)}},onDragenter:function(t){Bs(t),this.dragging=!0;var e=t.dataTransfer,i=void 0===e?{}:e;if(this.noDrop||this.disabled||!this.dropAllowed)return i.dropEffect="none",void(this.dropAllowed=!1);i.dropEffect="copy"},onDragover:function(t){Bs(t),this.dragging=!0;var e=t.dataTransfer,i=void 0===e?{}:e;if(this.noDrop||this.disabled||!this.dropAllowed)return i.dropEffect="none",void(this.dropAllowed=!1);i.dropEffect="copy"},onDragleave:function(t){var e=this;Bs(t),this.$nextTick((function(){e.dragging=!1,e.dropAllowed=!e.noDrop}))},onDrop:function(t){var e=this;Bs(t),this.dragging=!1,this.noDrop||this.disabled||!this.dropAllowed?this.$nextTick((function(){e.dropAllowed=!e.noDrop})):this.onChange(t)}},render:function(t){var e=this.custom,i=this.plain,n=this.size,o=this.dragging,r=this.stateClass,s=this.bvAttrs,l=t("input",{class:[{"form-control-file":i,"custom-file-input":e,focus:e&&this.hasFocus},r],style:e?{zIndex:-5}:{},attrs:this.computedAttrs,on:{change:this.onChange,focusin:this.focusHandler,focusout:this.focusHandler,reset:this.reset},ref:"input"});if(i)return l;var c=t("label",{staticClass:"custom-file-label",class:{dragging:o},attrs:{for:this.safeId(),"data-browse":this.browseText||null}},[t("span",{staticClass:"d-block form-file-text",style:{pointerEvents:"none"}},[this.labelContent])]);return t("div",{staticClass:"custom-file b-form-file",class:[a({},"b-custom-control-".concat(n),n),r,s.class],style:s.style,attrs:{id:this.safeId("_BV_file_outer_")},on:{dragenter:this.onDragenter,dragover:this.onDragover,dragleave:this.onDragleave,drop:this.onDrop}},[l,c])}}),Bp=me({components:{BFormFile:$p,BFile:$p}}),_p=function(t){return"\\"+t},Dp=function(t){var e=(t=vr(t)).length,i=t.charCodeAt(0);return t.split("").reduce((function(n,o,r){var s=t.charCodeAt(r);return 0===s?n+"īŋŊ":127===s||s>=1&&s<=31||0===r&&s>=48&&s<=57||1===r&&s>=48&&s<=57&&45===i?n+_p("".concat(s.toString(16)," ")):0===r&&45===s&&1===e?n+_p(o):s>=128||45===s||95===s||s>=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122?n+o:n+_p(o)}),"")},Fp=["auto","start","end","center","baseline","stretch"],Ip=is((function(t,e,i){var n=t;if(!Pt(i)&&!1!==i)return e&&(n+="-".concat(e)),"col"!==t||""!==i&&!0!==i?(n+="-".concat(i),gr(n)):gr(n)})),Pp=Wt(null),Op={name:Ye,functional:!0,get props(){return delete this.props,this.props=(t=ls().filter(ne),e=t.reduce((function(t,e){return t[e]=hs(So),t}),Wt(null)),i=t.reduce((function(t,e){return t[ds(e,"offset")]=hs(_o),t}),Wt(null)),n=t.reduce((function(t,e){return t[ds(e,"order")]=hs(_o),t}),Wt(null)),Pp=Gt(Wt(null),{col:Kt(e),offset:Kt(i),order:Kt(n)}),vs(ee(c(c(c(c({},e),i),n),{},{alignSelf:hs(go,null,(function(t){return nr(Fp,t)})),col:hs(ho,!1),cols:hs(_o),offset:hs(_o),order:hs(_o),tag:hs(go,"div")})),Ye));var t,e,i,n},render:function(t,e){var i,n=e.props,o=e.data,r=e.children,s=n.cols,l=n.offset,c=n.order,u=n.alignSelf,d=[];for(var h in Pp)for(var f=Pp[h],p=0;p0||Kt(this.labelColProps).length>0}},watch:{ariaDescribedby:function(t,e){t!==e&&this.updateAriaDescribedby(t,e)}},mounted:function(){var t=this;this.$nextTick((function(){t.updateAriaDescribedby(t.ariaDescribedby)}))},methods:{getAlignClasses:function(t,e){return ls().reduce((function(i,n){var o=t[ds(n,"".concat(e,"Align"))]||null;return o&&i.push(["text",n,o].filter(ne).join("-")),i}),[])},getColProps:function(t,e){return ls().reduce((function(i,n){var o=t[ds(n,"".concat(e,"Cols"))];return Vt(o=""===o||(o||!1))||"auto"===o||(o=(o=lr(o,0))>0&&o),o&&(i[n||(Vt(o)?"col":"cols")]=o),i}),{})},updateAriaDescribedby:function(t,e){var i=this.labelFor;if(M&&i){var n=Or("#".concat(Dp(i)),this.$refs.content);if(n){var o="aria-describedby",r=(t||"").split(ut),s=(e||"").split(ut),a=(jr(n,o)||"").split(ut).filter((function(t){return!nr(s,t)})).concat(r).filter((function(t,e,i){return i.indexOf(t)===e})).filter(ne).join(" ").trim();a?zr(n,o,a):Nr(n,o)}}},onLegendClick:function(t){if(!this.labelFor){var e=t.target,i=e?e.tagName:"";if(-1===Lp.indexOf(i)){var n=Pr(Ep,this.$refs.content).filter(Dr);1===n.length&&ts(n[0])}}}},render:function(t){var e=this.computedState,i=this.feedbackAriaLive,n=this.isHorizontal,o=this.labelFor,r=this.normalizeSlot,s=this.safeId,a=this.tooltip,l=s(),u=!o,d=t(),h=r(jo)||this.label,f=h?s("_BV_label_"):null;if(h||n){var p=this.labelSize,m=this.labelColProps,v=u?"legend":"label";this.labelSrOnly?(h&&(d=t(v,{class:"sr-only",attrs:{id:f,for:o||null}},[h])),d=t(n?Op:"div",{props:n?m:{}},[d])):d=t(n?Op:v,{on:u?{click:this.onLegendClick}:{},props:n?c(c({},m),{},{tag:v}):{},attrs:{id:f,for:o||null,tabindex:u?"-1":null},class:[u?"bv-no-focus-ring":"",n||u?"col-form-label":"",!n&&u?"pt-0":"",n||u?"":"d-block",p?"col-form-label-".concat(p):"",this.labelAlignClasses,this.labelClass]},[h])}var b=t(),g=r("invalid-feedback")||this.invalidFeedback,y=g?s("_BV_feedback_invalid_"):null;g&&(b=t(ff,{props:{ariaLive:i,id:y,role:i?"alert":null,state:e,tooltip:a},attrs:{tabindex:g?"-1":null}},[g]));var w=t(),T=r("valid-feedback")||this.validFeedback,C=T?s("_BV_feedback_valid_"):null;T&&(w=t(mf,{props:{ariaLive:i,id:C,role:i?"alert":null,state:e,tooltip:a},attrs:{tabindex:T?"-1":null}},[T]));var x=t(),S=r("description")||this.description,k=S?s("_BV_description_"):null;S&&(x=t(df,{attrs:{id:k,tabindex:"-1"}},[S]));var $=this.ariaDescribedby=[k,!1===e?y:null,!0===e?C:null].filter(ne).join(" ")||null,B=t(n?Op:"div",{props:n?this.contentColProps:{},ref:"content"},[r(Ao,{ariaDescribedby:$,descriptionId:k,id:l,labelId:f})||t(),b,w,x]);return t(u?"fieldset":n?bf:"div",{staticClass:"form-group",class:[{"was-validated":this.validated},this.stateClass],attrs:{id:l,disabled:u?this.disabled:null,role:u?null:"group","aria-invalid":this.computedAriaInvalid,"aria-labelledby":u&&n?f:null}},n&&u?[t(bf,[d,B])]:[d,B])}},Rp=me({components:{BFormGroup:Ap,BFormFieldset:Ap}}),Mp=i.default.extend({computed:{selectionStart:{cache:!1,get:function(){return this.$refs.input.selectionStart},set:function(t){this.$refs.input.selectionStart=t}},selectionEnd:{cache:!1,get:function(){return this.$refs.input.selectionEnd},set:function(t){this.$refs.input.selectionEnd=t}},selectionDirection:{cache:!1,get:function(){return this.$refs.input.selectionDirection},set:function(t){this.$refs.input.selectionDirection=t}}},methods:{select:function(){var t;(t=this.$refs.input).select.apply(t,arguments)},setSelectionRange:function(){var t;(t=this.$refs.input).setSelectionRange.apply(t,arguments)},setRangeText:function(){var t;(t=this.$refs.input).setRangeText.apply(t,arguments)}}}),Hp=ys("value",{type:_o,defaultValue:"",event:"update"}),zp=Hp.mixin,Np=Hp.props,jp=Hp.prop,Gp=Hp.event,Wp=vs(ee(c(c({},Np),{},{ariaInvalid:hs(ko,!1),autocomplete:hs(go),debounce:hs(_o,0),formatter:hs(po),lazy:hs(ho,!1),lazyFormatter:hs(ho,!1),number:hs(ho,!1),placeholder:hs(go),plaintext:hs(ho,!1),readonly:hs(ho,!1),trim:hs(ho,!1)})),"formTextControls"),Yp=i.default.extend({mixins:[zp],props:Wp,data:function(){var t=this[jp];return{localValue:vr(t),vModelValue:this.modifyValue(t)}},computed:{computedClass:function(){var t=this.plaintext,e=this.type,i="range"===e,n="color"===e;return[{"custom-range":i,"form-control-plaintext":t&&!i&&!n,"form-control":n||!t&&!i},this.sizeFormClass,this.stateClass]},computedDebounce:function(){return Us(lr(this.debounce,0),0)},hasFormatter:function(){return gs(this.formatter)}},watch:a({},jp,(function(t){var e=vr(t),i=this.modifyValue(t);e===this.localValue&&i===this.vModelValue||(this.clearDebounce(),this.localValue=e,this.vModelValue=i)})),created:function(){this.$_inputDebounceTimer=null},mounted:function(){this.$on(oo,this.clearDebounce)},beforeDestroy:function(){this.clearDebounce()},methods:{clearDebounce:function(){clearTimeout(this.$_inputDebounceTimer),this.$_inputDebounceTimer=null},formatValue:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return t=vr(t),!this.hasFormatter||this.lazyFormatter&&!i||(t=this.formatter(t,e)),t},modifyValue:function(t){return t=vr(t),this.trim&&(t=t.trim()),this.number&&(t=cr(t,t)),t},updateValue:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.lazy;if(!n||i){this.clearDebounce();var o=function(){if((t=e.modifyValue(t))!==e.vModelValue)e.vModelValue=t,e.$emit(Gp,t);else if(e.hasFormatter){var i=e.$refs.input;i&&t!==i.value&&(i.value=t)}},r=this.computedDebounce;r>0&&!n&&!i?this.$_inputDebounceTimer=setTimeout(o,r):o()}},onInput:function(t){if(!t.target.composing){var e=t.target.value,i=this.formatValue(e,t);!1===i||t.defaultPrevented?Bs(t,{propagation:!1}):(this.localValue=i,this.updateValue(i),this.$emit(jn,i))}},onChange:function(t){var e=t.target.value,i=this.formatValue(e,t);!1===i||t.defaultPrevented?Bs(t,{propagation:!1}):(this.localValue=i,this.updateValue(i,!0),this.$emit($n,i))},onBlur:function(t){var e=t.target.value,i=this.formatValue(e,t,!0);!1!==i&&(this.localValue=vr(this.modifyValue(i)),this.updateValue(i,!0)),this.$emit("blur",t)},focus:function(){this.disabled||ts(this.$el)},blur:function(){this.disabled||es(this.$el)}}}),Up=i.default.extend({computed:{validity:{cache:!1,get:function(){return this.$refs.input.validity}},validationMessage:{cache:!1,get:function(){return this.$refs.input.validationMessage}},willValidate:{cache:!1,get:function(){return this.$refs.input.willValidate}}},methods:{setCustomValidity:function(){var t;return(t=this.$refs.input).setCustomValidity.apply(t,arguments)},checkValidity:function(){var t;return(t=this.$refs.input).checkValidity.apply(t,arguments)},reportValidity:function(){var t;return(t=this.$refs.input).reportValidity.apply(t,arguments)}}}),qp=["text","password","email","number","url","tel","search","range","color","date","time","datetime","datetime-local","month","week"],Kp=vs(ee(c(c(c(c(c(c({},fc),Tf),kf),Bf),Wp),{},{list:hs(go),max:hs(_o),min:hs(_o),noWheel:hs(ho,!1),step:hs(_o),type:hs(go,"text",(function(t){return nr(qp,t)}))})),di),Xp=i.default.extend({name:di,mixins:[Qa,pc,Cf,$f,_f,Yp,Mp,Up],props:Kp,computed:{localType:function(){var t=this.type;return nr(qp,t)?t:"text"},computedAttrs:function(){var t=this.localType,e=this.name,i=this.form,n=this.disabled,o=this.placeholder,r=this.required,s=this.min,a=this.max,l=this.step;return{id:this.safeId(),name:e,form:i,type:t,disabled:n,placeholder:o,required:r,autocomplete:this.autocomplete||null,readonly:this.readonly||this.plaintext,min:s,max:a,step:l,list:"password"!==t?this.list:null,"aria-required":r?"true":null,"aria-invalid":this.computedAriaInvalid}},computedListeners:function(){return c(c({},this.bvListeners),{},{input:this.onInput,change:this.onChange,blur:this.onBlur})}},watch:{noWheel:function(t){this.setWheelStopper(t)}},mounted:function(){this.setWheelStopper(this.noWheel)},deactivated:function(){this.setWheelStopper(!1)},activated:function(){this.setWheelStopper(this.noWheel)},beforeDestroy:function(){this.setWheelStopper(!1)},methods:{setWheelStopper:function(t){var e=this.$el;$s(t,e,"focus",this.onWheelFocus),$s(t,e,"blur",this.onWheelBlur),t||ks(document,"wheel",this.stopWheel)},onWheelFocus:function(){Ss(document,"wheel",this.stopWheel)},onWheelBlur:function(){ks(document,"wheel",this.stopWheel)},stopWheel:function(t){Bs(t,{propagation:!1}),es(this.$el)}},render:function(t){return t("input",{class:this.computedClass,attrs:this.computedAttrs,domProps:{value:this.localValue},on:this.computedListeners,ref:"input"})}}),Zp=me({components:{BFormInput:Xp,BInput:Xp}}),Jp=vs(qf,pi),Qp=i.default.extend({name:pi,mixins:[Kf],provide:function(){return{bvRadioGroup:this}},props:Jp,computed:{isRadioGroup:function(){return!0}}}),tm=me({components:{BFormRadio:zf,BRadio:zf,BFormRadioGroup:Qp,BRadioGroup:Qp}}),em=ys("value",{type:_o,event:$n}),im=em.mixin,nm=em.props,om=em.prop,rm=em.event,sm=function(t){return Us(3,lr(t,5))},am=function(t,e,i){return Us(Ys(t,i),e)},lm=i.default.extend({name:"BVFormRatingStar",mixins:[Cs],props:{disabled:hs(ho,!1),focused:hs(ho,!1),hasClear:hs(ho,!1),rating:hs(mo,0),readonly:hs(ho,!1),star:hs(mo,0),variant:hs(go)},methods:{onClick:function(t){this.disabled||this.readonly||(Bs(t,{propagation:!1}),this.$emit(Qn,this.star))}},render:function(t){var e=this.rating,i=this.star,n=this.focused,o=this.hasClear,r=this.variant,s=this.disabled,a=this.readonly,l=o?0:1,c=e>=i?"full":e>=i-.5?"half":"empty",u={variant:r,disabled:s,readonly:a};return t("span",{staticClass:"b-rating-star",class:{focused:n&&e===i||!lr(e)&&i===l,"b-rating-star-empty":"empty"===c,"b-rating-star-half":"half"===c,"b-rating-star-full":"full"===c},attrs:{tabindex:s||a?null:"-1"},on:{click:this.onClick}},[t("span",{staticClass:"b-rating-icon"},[this.normalizeSlot(c,u)])])}}),cm=vs(ee(c(c(c(c(c({},fc),nm),Qt(Tf,["required","autofocus"])),kf),{},{color:hs(go),iconClear:hs(go,"x"),iconEmpty:hs(go,"star"),iconFull:hs(go,"star-fill"),iconHalf:hs(go,"star-half"),inline:hs(ho,!1),locale:hs(Co),noBorder:hs(ho,!1),precision:hs(_o),readonly:hs(ho,!1),showClear:hs(ho,!1),showValue:hs(ho,!1),showValueMax:hs(ho,!1),stars:hs(_o,5,(function(t){return lr(t)>=3})),variant:hs(go)})),mi),um=i.default.extend({name:mi,components:{BIconStar:Fa,BIconStarHalf:Pa,BIconStarFill:Ia,BIconX:Oa},mixins:[pc,im,$f],props:cm,data:function(){var t=cr(this[om],null),e=sm(this.stars);return{localValue:It(t)?null:am(t,0,e),hasFocus:!1}},computed:{computedStars:function(){return sm(this.stars)},computedRating:function(){var t=cr(this.localValue,0),e=lr(this.precision,3);return am(cr(t.toFixed(e)),0,this.computedStars)},computedLocale:function(){var t=or(this.locale).filter(ne);return new Intl.NumberFormat(t).resolvedOptions().locale},isInteractive:function(){return!this.disabled&&!this.readonly},isRTL:function(){return hc(this.computedLocale)},formattedRating:function(){var t=lr(this.precision),e=this.showValueMax,i=this.computedLocale,n={notation:"standard",minimumFractionDigits:isNaN(t)?0:t,maximumFractionDigits:isNaN(t)?3:t},o=this.computedStars.toLocaleString(i),r=this.localValue;return r=It(r)?e?"-":"":r.toLocaleString(i,n),e?"".concat(r,"/").concat(o):r}},watch:(xh={},a(xh,om,(function(t,e){if(t!==e){var i=cr(t,null);this.localValue=It(i)?null:am(i,0,this.computedStars)}})),a(xh,"localValue",(function(t,e){t!==e&&t!==(this.value||0)&&this.$emit(rm,t||null)})),a(xh,"disabled",(function(t){t&&(this.hasFocus=!1,this.blur())})),xh),methods:{focus:function(){this.disabled||ts(this.$el)},blur:function(){this.disabled||es(this.$el)},onKeydown:function(t){var e=t.keyCode;if(this.isInteractive&&nr([Na,Ra,ja,Wa],e)){Bs(t,{propagation:!1});var i=lr(this.localValue,0),n=this.showClear?0:1,o=this.computedStars,r=this.isRTL?-1:1;e===Na?this.localValue=am(i-r,n,o)||null:e===ja?this.localValue=am(i+r,n,o):e===Ra?this.localValue=am(i-1,n,o)||null:e===Wa&&(this.localValue=am(i+1,n,o))}},onSelected:function(t){this.isInteractive&&(this.localValue=t)},onFocus:function(t){this.hasFocus=!!this.isInteractive&&"focus"===t.type},renderIcon:function(t){return this.$createElement(Aa,{props:{icon:t,variant:this.disabled||this.color?null:this.variant||null}})},iconEmptyFn:function(){return this.renderIcon(this.iconEmpty)},iconHalfFn:function(){return this.renderIcon(this.iconHalf)},iconFullFn:function(){return this.renderIcon(this.iconFull)},iconClearFn:function(){return this.$createElement(Aa,{props:{icon:this.iconClear}})}},render:function(t){var e=this,i=this.disabled,n=this.readonly,o=this.name,r=this.form,s=this.inline,a=this.variant,l=this.color,c=this.noBorder,u=this.hasFocus,d=this.computedRating,h=this.computedStars,f=this.formattedRating,p=this.showClear,m=this.isRTL,v=this.isInteractive,b=this.$scopedSlots,g=[];if(p&&!i&&!n){var y=t("span",{staticClass:"b-rating-icon"},[(b["icon-clear"]||this.iconClearFn)()]);g.push(t("span",{staticClass:"b-rating-star b-rating-star-clear flex-grow-1",class:{focused:u&&0===d},attrs:{tabindex:v?"-1":null},on:{click:function(){return e.onSelected(null)}},key:"clear"},[y]))}for(var w=0;w1&&void 0!==arguments[1]?arguments[1]:null;if(Ht(t)){var i=re(t,this.valueField),n=re(t,this.textField),o=re(t,this.optionsField,null);return It(o)?{value:Ft(i)?e||n:i,text:String(Ft(n)?e:n),html:re(t,this.htmlField),disabled:Boolean(re(t,this.disabledField))}:{label:String(re(t,this.labelField)||n),options:this.normalizeOptions(o)}}return{value:e||t,text:String(t),disabled:!1}}}}),ym=vs({disabled:hs(ho,!1),value:hs(co,void 0,!0)},gi),wm=i.default.extend({name:gi,functional:!0,props:ym,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.value;return t("option",F(n,{attrs:{disabled:i.disabled},domProps:{value:r}}),o)}}),Tm=vs(ee(c(c({},sf),{},{label:hs(go,void 0,!0)})),yi),Cm=i.default.extend({name:yi,mixins:[Cs,af],props:Tm,render:function(t){var e=this.label,i=this.formOptions.map((function(e,i){var n=e.value,o=e.text,r=e.html,s=e.disabled;return t(wm,{attrs:{value:n,disabled:s},domProps:Fl(r,o),key:"option_".concat(i)})}));return t("optgroup",{attrs:{label:e}},[this.normalizeSlot(Ho),i,this.normalizeSlot()])}}),xm=vs(ee(c(c(c(c(c(c(c({},fc),pm),Tf),xf),kf),Bf),{},{ariaInvalid:hs(ko,!1),multiple:hs(ho,!1),selectSize:hs(mo,0)})),bi),Sm=i.default.extend({name:bi,mixins:[pc,fm,Cf,$f,_f,Sf,gm,Cs],props:xm,data:function(){return{localValue:this[mm]}},computed:{computedSelectSize:function(){return this.plain||0!==this.selectSize?this.selectSize:null},inputClass:function(){return[this.plain?"form-control":"custom-select",this.size&&this.plain?"form-control-".concat(this.size):null,this.size&&!this.plain?"custom-select-".concat(this.size):null,this.stateClass]}},watch:{value:function(t){this.localValue=t},localValue:function(){this.$emit(vm,this.localValue)}},methods:{focus:function(){ts(this.$refs.input)},blur:function(){es(this.$refs.input)},onChange:function(t){var e=this,i=t.target,n=ir(i.options).filter((function(t){return t.selected})).map((function(t){return"_value"in t?t._value:t.value}));this.localValue=i.multiple?n:n[0],this.$nextTick((function(){e.$emit($n,e.localValue)}))}},render:function(t){var e=this.name,i=this.disabled,n=this.required,o=this.computedSelectSize,r=this.localValue,s=this.formOptions.map((function(e,i){var n=e.value,o=e.label,r=e.options,s=e.disabled,a="option_".concat(i);return Rt(r)?t(Cm,{props:{label:o,options:r},key:a}):t(wm,{props:{value:n,disabled:s},domProps:Fl(e.html,e.text),key:a})}));return t("select",{class:this.inputClass,attrs:{id:this.safeId(),name:e,form:this.form||null,multiple:this.multiple||null,size:o,disabled:i,required:n,"aria-required":n?"true":null,"aria-invalid":this.computedAriaInvalid},on:{change:this.onChange},directives:[{name:"model",value:r}],ref:"input"},[this.normalizeSlot(Ho),s,this.normalizeSlot()])}}),km=me({components:{BFormSelect:Sm,BFormSelectOption:wm,BFormSelectOptionGroup:Cm,BSelect:Sm,BSelectOption:wm,BSelectOptionGroup:Cm}}),$m=ys("value",{type:xo}),Bm=$m.mixin,_m=$m.props,Dm=$m.prop,Fm=$m.event,Im=[Wa,Ra,za,Ma,33,34],Pm=vs(ee(c(c(c(c(c(c({},fc),_m),Qt(Tf,["required","autofocus"])),kf),Bf),{},{ariaControls:hs(go),ariaLabel:hs(go),formatterFn:hs(po),inline:hs(ho,!1),labelDecrement:hs(go,"Decrement"),labelIncrement:hs(go,"Increment"),locale:hs(Co),max:hs(_o,100),min:hs(_o,1),placeholder:hs(go),readonly:hs(ho,!1),repeatDelay:hs(_o,500),repeatInterval:hs(_o,100),repeatStepMultiplier:hs(_o,4),repeatThreshold:hs(_o,10),step:hs(_o,1),vertical:hs(ho,!1),wrap:hs(ho,!1)})),wi),Om=i.default.extend({name:wi,mixins:[Za,pc,Bm,$f,_f,Cs],inheritAttrs:!1,props:Pm,data:function(){return{localValue:cr(this[Dm],null),hasFocus:!1}},computed:{spinId:function(){return this.safeId()},computedInline:function(){return this.inline&&!this.vertical},computedReadonly:function(){return this.readonly&&!this.disabled},computedRequired:function(){return this.required&&!this.computedReadonly&&!this.disabled},computedStep:function(){return cr(this.step,1)},computedMin:function(){return cr(this.min,1)},computedMax:function(){var t=cr(this.max,100),e=this.computedStep,i=this.computedMin;return Xs((t-i)/e)*e+i},computedDelay:function(){var t=lr(this.repeatDelay,0);return t>0?t:500},computedInterval:function(){var t=lr(this.repeatInterval,0);return t>0?t:100},computedThreshold:function(){return Us(lr(this.repeatThreshold,10),1)},computedStepMultiplier:function(){return Us(lr(this.repeatStepMultiplier,4),1)},computedPrecision:function(){var t=this.computedStep;return Xs(t)===t?0:(t.toString().split(".")[1]||"").length},computedMultiplier:function(){return Zs(10,this.computedPrecision||0)},valueAsFixed:function(){var t=this.localValue;return It(t)?"":t.toFixed(this.computedPrecision)},computedLocale:function(){var t=or(this.locale).filter(ne);return new Intl.NumberFormat(t).resolvedOptions().locale},computedRTL:function(){return hc(this.computedLocale)},defaultFormatter:function(){var t=this.computedPrecision;return new Intl.NumberFormat(this.computedLocale,{style:"decimal",useGrouping:!1,minimumIntegerDigits:1,minimumFractionDigits:t,maximumFractionDigits:t,notation:"standard"}).format},computedFormatter:function(){var t=this.formatterFn;return gs(t)?t:this.defaultFormatter},computedAttrs:function(){return c(c({},this.bvAttrs),{},{role:"group",lang:this.computedLocale,tabindex:this.disabled?null:"-1",title:this.ariaLabel})},computedSpinAttrs:function(){var t=this.spinId,e=this.localValue,i=this.computedRequired,n=this.disabled,o=this.state,r=this.computedFormatter,s=!It(e);return c(c({dir:this.computedRTL?"rtl":"ltr"},this.bvAttrs),{},{id:t,role:"spinbutton",tabindex:n?null:"0","aria-live":"off","aria-label":this.ariaLabel||null,"aria-controls":this.ariaControls||null,"aria-invalid":!1===o||!s&&i?"true":null,"aria-required":i?"true":null,"aria-valuemin":vr(this.computedMin),"aria-valuemax":vr(this.computedMax),"aria-valuenow":s?e:null,"aria-valuetext":s?r(e):null})}},watch:(Sh={},a(Sh,Dm,(function(t){this.localValue=cr(t,null)})),a(Sh,"localValue",(function(t){this.$emit(Fm,t)})),a(Sh,"disabled",(function(t){t&&this.clearRepeat()})),a(Sh,"readonly",(function(t){t&&this.clearRepeat()})),Sh),created:function(){this.$_autoDelayTimer=null,this.$_autoRepeatTimer=null,this.$_keyIsDown=!1},beforeDestroy:function(){this.clearRepeat()},deactivated:function(){this.clearRepeat()},methods:{focus:function(){this.disabled||ts(this.$refs.spinner)},blur:function(){this.disabled||es(this.$refs.spinner)},emitChange:function(){this.$emit($n,this.localValue)},stepValue:function(t){var e=this.localValue;if(!this.disabled&&!It(e)){var i=this.computedStep*t,n=this.computedMin,o=this.computedMax,r=this.computedMultiplier,s=this.wrap;e=Js((e-n)/i)*i+n+i,e=Js(e*r)/r,this.localValue=e>o?s?n:o:e0&&void 0!==arguments[0]?arguments[0]:1,e=this.localValue;It(e)?this.localValue=this.computedMin:this.stepValue(1*t)},stepDown:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,e=this.localValue;It(e)?this.localValue=this.wrap?this.computedMax:this.computedMin:this.stepValue(-1*t)},onKeydown:function(t){var e=t.keyCode,i=t.altKey,n=t.ctrlKey,o=t.metaKey;if(!(this.disabled||this.readonly||i||n||o)&&nr(Im,e)){if(Bs(t,{propagation:!1}),this.$_keyIsDown)return;this.resetTimers(),nr([Wa,Ra],e)?(this.$_keyIsDown=!0,e===Wa?this.handleStepRepeat(t,this.stepUp):e===Ra&&this.handleStepRepeat(t,this.stepDown)):33===e?this.stepUp(this.computedStepMultiplier):34===e?this.stepDown(this.computedStepMultiplier):e===za?this.localValue=this.computedMin:e===Ma&&(this.localValue=this.computedMax)}},onKeyup:function(t){var e=t.keyCode,i=t.altKey,n=t.ctrlKey,o=t.metaKey;this.disabled||this.readonly||i||n||o||nr(Im,e)&&(Bs(t,{propagation:!1}),this.resetTimers(),this.$_keyIsDown=!1,this.emitChange())},handleStepRepeat:function(t,e){var i=this,n=t||{},o=n.type,r=n.button;if(!this.disabled&&!this.readonly){if("mousedown"===o&&r)return;this.resetTimers(),e(1);var s=this.computedThreshold,a=this.computedStepMultiplier,l=this.computedDelay,c=this.computedInterval;this.$_autoDelayTimer=setTimeout((function(){var t=0;i.$_autoRepeatTimer=setInterval((function(){e(t0&&i.indexOf(t)===e}))},Wm=function(t){return Et(t)?t:Nt(t)&&t.target.value||""},Ym=vs(ee(c(c(c(c(c(c({},fc),Mm),Tf),kf),Bf),{},{addButtonText:hs(go,"Add"),addButtonVariant:hs(go,"outline-secondary"),addOnChange:hs(ho,!1),duplicateTagText:hs(go,"Duplicate tag(s)"),ignoreInputFocusSelector:hs(Co,jm),inputAttrs:hs(vo,{}),inputClass:hs(To),inputId:hs(go),inputType:hs(go,"text",(function(t){return nr(Nm,t)})),invalidTagText:hs(go,"Invalid tag(s)"),limit:hs(mo),limitTagsText:hs(go,"Tag limit reached"),noAddOnEnter:hs(ho,!1),noOuterFocus:hs(ho,!1),noTagRemove:hs(ho,!1),placeholder:hs(go,"Add tag..."),removeOnDelete:hs(ho,!1),separator:hs(Co),tagClass:hs(To),tagPills:hs(ho,!1),tagRemoveLabel:hs(go,"Remove tag"),tagRemovedLabel:hs(go,"Tag removed"),tagValidator:hs(po),tagVariant:hs(go,"secondary")})),Ci),Um=i.default.extend({name:Ci,mixins:[pc,Rm,Cf,$f,_f,Cs],props:Ym,data:function(){return{hasFocus:!1,newTag:"",tags:[],removedTags:[],tagsState:{all:[],valid:[],invalid:[],duplicate:[]}}},computed:{computedInputId:function(){return this.inputId||this.safeId("__input__")},computedInputType:function(){return nr(Nm,this.inputType)?this.inputType:"text"},computedInputAttrs:function(){var t=this.disabled,e=this.form;return c(c({},this.inputAttrs),{},{id:this.computedInputId,value:this.newTag,disabled:t,form:e})},computedInputHandlers:function(){return{input:this.onInputInput,change:this.onInputChange,keydown:this.onInputKeydown,reset:this.reset}},computedSeparator:function(){return or(this.separator).filter(Et).filter(ne).join("")},computedSeparatorRegExp:function(){var t=this.computedSeparator;return t?new RegExp("[".concat(mr(t).replace(ct,"\\s"),"]+")):null},computedJoiner:function(){var t=this.computedSeparator.charAt(0);return" "!==t?"".concat(t," "):t},computeIgnoreInputFocusSelector:function(){return or(this.ignoreInputFocusSelector).filter(ne).join(",").trim()},disableAddButton:function(){var t=this,e=br(this.newTag);return""===e||!this.splitTags(e).some((function(e){return!nr(t.tags,e)&&t.validateTag(e)}))},duplicateTags:function(){return this.tagsState.duplicate},hasDuplicateTags:function(){return this.duplicateTags.length>0},invalidTags:function(){return this.tagsState.invalid},hasInvalidTags:function(){return this.invalidTags.length>0},isLimitReached:function(){var t=this.limit;return Lt(t)&&t>=0&&this.tags.length>=t}},watch:(kh={},a(kh,Hm,(function(t){this.tags=Gm(t)})),a(kh,"tags",(function(t,e){Ua(t,this[Hm])||this.$emit(zm,t),Ua(t,e)||(t=or(t).filter(ne),e=or(e).filter(ne),this.removedTags=e.filter((function(e){return!nr(t,e)})))})),a(kh,"tagsState",(function(t,e){Ua(t,e)||this.$emit("tag-state",t.valid,t.invalid,t.duplicate)})),kh),created:function(){this.tags=Gm(this[Hm])},mounted:function(){var t=this,e=Er("form",this.$el);e&&(Ss(e,"reset",this.reset,ao),this.$on(oo,(function(){ks(e,"reset",t.reset,ao)})))},methods:{addTag:function(t){if(t=Et(t)?t:this.newTag,!this.disabled&&""!==br(t)&&!this.isLimitReached){var e=this.parseTags(t);if(e.valid.length>0||0===e.all.length)if(Vr(this.getInput(),"select"))this.newTag="";else{var i=[].concat(T(e.invalid),T(e.duplicate));this.newTag=e.all.filter((function(t){return nr(i,t)})).join(this.computedJoiner).concat(i.length>0?this.computedJoiner.charAt(0):"")}e.valid.length>0&&(this.tags=or(this.tags,e.valid)),this.tagsState=e,this.focus()}},removeTag:function(t){var e=this;this.disabled||(this.tags=this.tags.filter((function(e){return e!==t})),this.$nextTick((function(){e.focus()})))},reset:function(){var t=this;this.newTag="",this.tags=[],this.$nextTick((function(){t.removedTags=[],t.tagsState={all:[],valid:[],invalid:[],duplicate:[]}}))},onInputInput:function(t){if(!(this.disabled||Nt(t)&&t.target.composing)){var e=Wm(t),i=this.computedSeparatorRegExp;this.newTag!==e&&(this.newTag=e),e=vr(e).replace(ft,""),i&&i.test(e.slice(-1))?this.addTag():this.tagsState=""===e?{all:[],valid:[],invalid:[],duplicate:[]}:this.parseTags(e)}},onInputChange:function(t){if(!this.disabled&&this.addOnChange){var e=Wm(t);this.newTag!==e&&(this.newTag=e),this.addTag()}},onInputKeydown:function(t){if(!this.disabled&&Nt(t)){var e=t.keyCode,i=t.target.value||"";this.noAddOnEnter||e!==Ha?!this.removeOnDelete||8!==e&&46!==e||""!==i||(Bs(t,{propagation:!1}),this.tags=this.tags.slice(0,-1)):(Bs(t,{propagation:!1}),this.addTag())}},onClick:function(t){var e=this,i=this.computeIgnoreInputFocusSelector,n=t.target;this.disabled||_r(n)||i&&Er(i,n,!0)||this.$nextTick((function(){e.focus()}))},onFocusin:function(){this.hasFocus=!0},onFocusout:function(){this.hasFocus=!1},handleAutofocus:function(){var t=this;this.$nextTick((function(){xr((function(){t.autofocus&&!t.disabled&&t.focus()}))}))},focus:function(){this.disabled||ts(this.getInput())},blur:function(){this.disabled||es(this.getInput())},splitTags:function(t){t=vr(t);var e=this.computedSeparatorRegExp;return(e?t.split(e):[t]).map(br).filter(ne)},parseTags:function(t){var e=this,i=this.splitTags(t),n={all:i,valid:[],invalid:[],duplicate:[]};return i.forEach((function(t){nr(e.tags,t)||nr(n.valid,t)?nr(n.duplicate,t)||n.duplicate.push(t):e.validateTag(t)?n.valid.push(t):nr(n.invalid,t)||n.invalid.push(t)})),n},validateTag:function(t){var e=this.tagValidator;return!gs(e)||e(t)},getInput:function(){return Or("#".concat(Dp(this.computedInputId)),this.$el)},defaultRender:function(t){var e=t.addButtonText,i=t.addButtonVariant,n=t.addTag,o=t.disableAddButton,r=t.disabled,s=t.duplicateTagText,a=t.inputAttrs,l=t.inputClass,u=t.inputHandlers,d=t.inputType,h=t.invalidTagText,f=t.isDuplicate,p=t.isInvalid,m=t.isLimitReached,v=t.limitTagsText,b=t.noTagRemove,g=t.placeholder,y=t.removeTag,w=t.tagClass,T=t.tagPills,C=t.tagRemoveLabel,x=t.tagVariant,S=t.tags,k=this.$createElement,$=S.map((function(t){return t=vr(t),k(Lm,{class:w,props:{disabled:r,noRemove:b,pill:T,removeLabel:C,tag:"li",title:t,variant:x},on:{remove:function(){return y(t)}},key:"tags_".concat(t)},t)})),B=h&&p?this.safeId("__invalid_feedback__"):null,_=s&&f?this.safeId("__duplicate_feedback__"):null,D=v&&m?this.safeId("__limit_feedback__"):null,F=[a["aria-describedby"],B,_,D].filter(ne).join(" "),I=k("input",{staticClass:"b-form-tags-input w-100 flex-grow-1 p-0 m-0 bg-transparent border-0",class:l,style:{outline:0,minWidth:"5rem"},attrs:c(c({},a),{},{"aria-describedby":F||null,type:d,placeholder:g||null}),domProps:{value:a.value},on:u,directives:[{name:"model",value:a.value}],ref:"input"}),P=k(ml,{staticClass:"b-form-tags-button py-0",class:{invisible:o},style:{fontSize:"90%"},props:{disabled:o||m,variant:i},on:{click:function(){return n()}},ref:"button"},[this.normalizeSlot("add-button-text")||e]),O=this.safeId("__tag_list__"),V=k("li",{staticClass:"b-from-tags-field flex-grow-1",attrs:{role:"none","aria-live":"off","aria-controls":O},key:"tags_field"},[k("div",{staticClass:"d-flex",attrs:{role:"group"}},[I,P])]),E=k("ul",{staticClass:"b-form-tags-list list-unstyled mb-0 d-flex flex-wrap align-items-center",attrs:{id:O},key:"tags_list"},[$,V]),L=k();if(h||s||v){var A=this.computedJoiner,R=k();B&&(R=k(ff,{props:{id:B,forceShow:!0},key:"tags_invalid_feedback"},[this.invalidTagText,": ",this.invalidTags.join(A)]));var M=k();_&&(M=k(df,{props:{id:_},key:"tags_duplicate_feedback"},[this.duplicateTagText,": ",this.duplicateTags.join(A)]));var H=k();D&&(H=k(df,{props:{id:D},key:"tags_limit_feedback"},[v])),L=k("div",{attrs:{"aria-live":"polite","aria-atomic":"true"},key:"tags_feedback"},[R,M,H])}return[E,L]}},render:function(t){var e=this.name,i=this.disabled,n=this.required,o=this.form,r=this.tags,s=this.computedInputId,a=this.hasFocus,l=this.noOuterFocus,u=c({tags:r.slice(),inputAttrs:this.computedInputAttrs,inputType:this.computedInputType,inputHandlers:this.computedInputHandlers,removeTag:this.removeTag,addTag:this.addTag,reset:this.reset,inputId:s,isInvalid:this.hasInvalidTags,invalidTags:this.invalidTags.slice(),isDuplicate:this.hasDuplicateTags,duplicateTags:this.duplicateTags.slice(),isLimitReached:this.isLimitReached,disableAddButton:this.disableAddButton},Jt(this.$props,["addButtonText","addButtonVariant","disabled","duplicateTagText","form","inputClass","invalidTagText","limit","limitTagsText","noTagRemove","placeholder","required","separator","size","state","tagClass","tagPills","tagRemoveLabel","tagVariant"])),d=this.normalizeSlot(Ao,u)||this.defaultRender(u),h=t("output",{staticClass:"sr-only",attrs:{id:this.safeId("__selected_tags__"),role:"status",for:s,"aria-live":a?"polite":"off","aria-atomic":"true","aria-relevant":"additions text"}},this.tags.join(", ")),f=t("div",{staticClass:"sr-only",attrs:{id:this.safeId("__removed_tags__"),role:"status","aria-live":a?"assertive":"off","aria-atomic":"true"}},this.removedTags.length>0?"(".concat(this.tagRemovedLabel,") ").concat(this.removedTags.join(", ")):""),p=t();if(e&&!i){var m=r.length>0;p=(m?r:[""]).map((function(i){return t("input",{class:{"sr-only":!m},attrs:{type:m?"hidden":"text",value:i,required:n,name:e,form:o},key:"tag_input_".concat(i)})}))}return t("div",{staticClass:"b-form-tags form-control h-auto",class:[{focus:a&&!l&&!i,disabled:i},this.sizeFormClass,this.stateClass],attrs:{id:this.safeId(),role:"group",tabindex:i||l?null:"-1","aria-describedby":this.safeId("__selected_tags__")},on:{click:this.onClick,focusin:this.onFocusin,focusout:this.onFocusout}},[h,f,d,p])}}),qm=me({components:{BFormTags:Um,BTags:Um,BFormTag:Lm,BTag:Lm}}),Km=vs(ee(c(c(c(c(c(c({},fc),Tf),kf),Bf),Wp),{},{maxRows:hs(_o),noAutoShrink:hs(ho,!1),noResize:hs(ho,!1),rows:hs(_o,2),wrap:hs(go,"soft")})),Si),Xm=i.default.extend({name:Si,directives:{"b-visible":Kc},mixins:[Qa,pc,Ja,Cf,$f,_f,Yp,Mp,Up],props:Km,data:function(){return{heightInPx:null}},computed:{computedStyle:function(){var t={resize:!this.computedRows||this.noResize?"none":null};return this.computedRows||(t.height=this.heightInPx,t.overflowY="scroll"),t},computedMinRows:function(){return Us(lr(this.rows,2),2)},computedMaxRows:function(){return Us(this.computedMinRows,lr(this.maxRows,0))},computedRows:function(){return this.computedMinRows===this.computedMaxRows?this.computedMinRows:null},computedAttrs:function(){var t=this.disabled,e=this.required;return{id:this.safeId(),name:this.name||null,form:this.form||null,disabled:t,placeholder:this.placeholder||null,required:e,autocomplete:this.autocomplete||null,readonly:this.readonly||this.plaintext,rows:this.computedRows,wrap:this.wrap||null,"aria-required":this.required?"true":null,"aria-invalid":this.computedAriaInvalid}},computedListeners:function(){return c(c({},this.bvListeners),{},{input:this.onInput,change:this.onChange,blur:this.onBlur})}},watch:{localValue:function(){this.setHeight()}},mounted:function(){this.setHeight()},methods:{visibleCallback:function(t){t&&this.$nextTick(this.setHeight)},setHeight:function(){var t=this;this.$nextTick((function(){xr((function(){t.heightInPx=t.computeHeight()}))}))},computeHeight:function(){if(this.$isServer||!It(this.computedRows))return null;var t=this.$el;if(!Dr(t))return null;var e=Kr(t),i=cr(e.lineHeight,1),n=cr(e.borderTopWidth,0)+cr(e.borderBottomWidth,0),o=cr(e.paddingTop,0)+cr(e.paddingBottom,0),r=n+o,s=i*this.computedMinRows+r,a=Ur(t,"height")||e.height;Wr(t,"height","auto");var l=t.scrollHeight;Wr(t,"height",a);var c=Us((l-o)/i,2),u=Ys(Us(c,this.computedMinRows),this.computedMaxRows),d=Us(Ks(u*i+r),s);return this.noAutoShrink&&cr(a,0)>d?a:"".concat(d,"px")}},render:function(t){return t("textarea",{class:this.computedClass,style:this.computedStyle,directives:[{name:"b-visible",value:this.visibleCallback,modifiers:{640:!0}}],attrs:this.computedAttrs,domProps:{value:this.localValue},on:this.computedListeners,ref:"input"})}}),Zm=me({components:{BFormTextarea:Xm,BTextarea:Xm}}),Jm=ys("value",{type:go,defaultValue:""}),Qm=Jm.mixin,tv=Jm.props,ev=Jm.prop,iv=Jm.event,nv="numeric",ov=function(t){return"00".concat(t||"").slice(-2)},rv=function(t){t=vr(t);var e=null,i=null,n=null;if(gt.test(t)){var o=w(t.split(":").map((function(t){return lr(t,null)})),3);e=o[0],i=o[1],n=o[2]}return{hours:Pt(e)?null:e,minutes:Pt(i)?null:i,seconds:Pt(n)?null:n,ampm:Pt(e)||e<12?0:1}},sv=vs(ee(c(c(c(c({},fc),tv),Jt(Pm,["labelIncrement","labelDecrement"])),{},{ariaLabelledby:hs(go),disabled:hs(ho,!1),hidden:hs(ho,!1),hideHeader:hs(ho,!1),hour12:hs(ho,null),labelAm:hs(go,"AM"),labelAmpm:hs(go,"AM/PM"),labelHours:hs(go,"Hours"),labelMinutes:hs(go,"Minutes"),labelNoTimeSelected:hs(go,"No time selected"),labelPm:hs(go,"PM"),labelSeconds:hs(go,"Seconds"),labelSelected:hs(go,"Selected time"),locale:hs(Co),minutesStep:hs(_o,1),readonly:hs(ho,!1),secondsStep:hs(_o,1),showSeconds:hs(ho,!1)})),Tn),av=i.default.extend({name:Tn,mixins:[pc,Qm,Cs],props:sv,data:function(){var t=rv(this[ev]||"");return{modelHours:t.hours,modelMinutes:t.minutes,modelSeconds:t.seconds,modelAmpm:t.ampm,isLive:!1}},computed:{computedHMS:function(){return function(t){var e=t.hours,i=t.minutes,n=t.seconds,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return It(e)||It(i)||o&&It(n)?"":[e,i,o?n:0].map(ov).join(":")}({hours:this.modelHours,minutes:this.modelMinutes,seconds:this.modelSeconds},this.showSeconds)},resolvedOptions:function(){var t=or(this.locale).filter(ne),e={hour:nv,minute:nv,second:nv};Pt(this.hour12)||(e.hour12=!!this.hour12);var i=new Intl.DateTimeFormat(t,e).resolvedOptions(),n=i.hour12||!1,o=i.hourCycle||(n?"h12":"h23");return{locale:i.locale,hour12:n,hourCycle:o}},computedLocale:function(){return this.resolvedOptions.locale},computedLang:function(){return(this.computedLocale||"").replace(/-u-.*$/,"")},computedRTL:function(){return hc(this.computedLang)},computedHourCycle:function(){return this.resolvedOptions.hourCycle},is12Hour:function(){return!!this.resolvedOptions.hour12},context:function(){return{locale:this.computedLocale,isRTL:this.computedRTL,hourCycle:this.computedHourCycle,hour12:this.is12Hour,hours:this.modelHours,minutes:this.modelMinutes,seconds:this.showSeconds?this.modelSeconds:0,value:this.computedHMS,formatted:this.formattedTimeString}},valueId:function(){return this.safeId()||null},computedAriaLabelledby:function(){return[this.ariaLabelledby,this.valueId].filter(ne).join(" ")||null},timeFormatter:function(){var t={hour12:this.is12Hour,hourCycle:this.computedHourCycle,hour:nv,minute:nv,timeZone:"UTC"};return this.showSeconds&&(t.second=nv),Ql(this.computedLocale,t)},numberFormatter:function(){return new Intl.NumberFormat(this.computedLocale,{style:"decimal",minimumIntegerDigits:2,minimumFractionDigits:0,maximumFractionDigits:0,notation:"standard"}).format},formattedTimeString:function(){var t=this.modelHours,e=this.modelMinutes,i=this.showSeconds&&this.modelSeconds||0;return this.computedHMS?this.timeFormatter(Xl(Date.UTC(0,0,1,t,e,i))):this.labelNoTimeSelected||" "},spinScopedSlots:function(){var t=this.$createElement;return{increment:function(e){var i=e.hasFocus;return t(xa,{props:{scale:i?1.5:1.25},attrs:{"aria-hidden":"true"}})},decrement:function(e){var i=e.hasFocus;return t(xa,{props:{flipV:!0,scale:i?1.5:1.25},attrs:{"aria-hidden":"true"}})}}}},watch:($h={},a($h,ev,(function(t,e){if(t!==e&&!Ua(rv(t),rv(this.computedHMS))){var i=rv(t),n=i.hours,o=i.minutes,r=i.seconds,s=i.ampm;this.modelHours=n,this.modelMinutes=o,this.modelSeconds=r,this.modelAmpm=s}})),a($h,"computedHMS",(function(t,e){t!==e&&this.$emit(iv,t)})),a($h,"context",(function(t,e){Ua(t,e)||this.$emit(Dn,t)})),a($h,"modelAmpm",(function(t,e){var i=this;if(t!==e){var n=It(this.modelHours)?0:this.modelHours;this.$nextTick((function(){0===t&&n>11?i.modelHours=n-12:1===t&&n<12&&(i.modelHours=n+12)}))}})),a($h,"modelHours",(function(t,e){t!==e&&(this.modelAmpm=t>11?1:0)})),$h),created:function(){var t=this;this.$nextTick((function(){t.$emit(Dn,t.context)}))},mounted:function(){this.setLive(!0)},activated:function(){this.setLive(!0)},deactivated:function(){this.setLive(!1)},beforeDestroy:function(){this.setLive(!1)},methods:{focus:function(){this.disabled||ts(this.$refs.spinners[0])},blur:function(){if(!this.disabled){var t=$r();Lr(this.$el,t)&&es(t)}},formatHours:function(t){var e=this.computedHourCycle;return t=0===(t=this.is12Hour&&t>12?t-12:t)&&"h12"===e?12:0===t&&"h24"===e?24:12===t&&"h11"===e?0:t,this.numberFormatter(t)},formatMinutes:function(t){return this.numberFormatter(t)},formatSeconds:function(t){return this.numberFormatter(t)},formatAmpm:function(t){return 0===t?this.labelAm:1===t?this.labelPm:""},setHours:function(t){this.modelHours=t},setMinutes:function(t){this.modelMinutes=t},setSeconds:function(t){this.modelSeconds=t},setAmpm:function(t){this.modelAmpm=t},onSpinLeftRight:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.type,i=t.keyCode;if(!this.disabled&&"keydown"===e&&(i===Na||i===ja)){Bs(t);var n=this.$refs.spinners||[],o=n.map((function(t){return!!t.hasFocus})).indexOf(!0);o=(o+=i===Na?-1:1)>=n.length?0:o<0?n.length-1:o,ts(n[o])}},setLive:function(t){var e=this;t?this.$nextTick((function(){xr((function(){e.isLive=!0}))})):this.isLive=!1}},render:function(t){var e=this;if(this.hidden)return t();var i=this.valueId,n=this.computedAriaLabelledby,o=[],r=function(n,r,s){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},l=e.safeId("_spinbutton_".concat(r,"_"))||null;return o.push(l),t(Om,{class:s,props:c({id:l,placeholder:"--",vertical:!0,required:!0,disabled:e.disabled,readonly:e.readonly,locale:e.computedLocale,labelIncrement:e.labelIncrement,labelDecrement:e.labelDecrement,wrap:!0,ariaControls:i,min:0},a),scopedSlots:e.spinScopedSlots,on:{change:n},key:r,ref:"spinners",refInFor:!0})},s=function(){return t("div",{staticClass:"d-flex flex-column",class:{"text-muted":e.disabled||e.readonly},attrs:{"aria-hidden":"true"}},[t(Sa,{props:{shiftV:4,scale:.5}}),t(Sa,{props:{shiftV:-4,scale:.5}})])},a=[];a.push(r(this.setHours,"hours","b-time-hours",{value:this.modelHours,max:23,step:1,formatterFn:this.formatHours,ariaLabel:this.labelHours})),a.push(s()),a.push(r(this.setMinutes,"minutes","b-time-minutes",{value:this.modelMinutes,max:59,step:this.minutesStep||1,formatterFn:this.formatMinutes,ariaLabel:this.labelMinutes})),this.showSeconds&&(a.push(s()),a.push(r(this.setSeconds,"seconds","b-time-seconds",{value:this.modelSeconds,max:59,step:this.secondsStep||1,formatterFn:this.formatSeconds,ariaLabel:this.labelSeconds}))),this.is12Hour&&a.push(r(this.setAmpm,"ampm","b-time-ampm",{value:this.modelAmpm,max:1,formatterFn:this.formatAmpm,ariaLabel:this.labelAmpm,required:!1})),a=t("div",{staticClass:"d-flex align-items-center justify-content-center mx-auto",attrs:{role:"group",tabindex:this.disabled||this.readonly?null:"-1","aria-labelledby":n},on:{keydown:this.onSpinLeftRight,click:function(t){t.target===t.currentTarget&&e.focus()}}},a);var l=t("output",{staticClass:"form-control form-control-sm text-center",class:{disabled:this.disabled||this.readonly},attrs:{id:i,role:"status",for:o.filter(ne).join(" ")||null,tabindex:this.disabled?null:"-1","aria-live":this.isLive?"polite":"off","aria-atomic":"true"},on:{click:this.focus,focus:this.focus}},[t("bdi",this.formattedTimeString),this.computedHMS?t("span",{staticClass:"sr-only"}," (".concat(this.labelSelected,") ")):""]),u=t("header",{staticClass:"b-time-header",class:{"sr-only":this.hideHeader}},[l]),d=this.normalizeSlot();return d=d?t("footer",{staticClass:"b-time-footer"},d):t(),t("div",{staticClass:"b-time d-inline-flex flex-column text-center",attrs:{role:"group",lang:this.computedLang||null,"aria-labelledby":n||null,"aria-disabled":this.disabled?"true":null,"aria-readonly":this.readonly&&!this.disabled?"true":null}},[u,a,d])}}),lv=ys("value",{type:go,defaultValue:""}),cv=lv.mixin,uv=lv.props,dv=lv.prop,hv=lv.event,fv=Qt(sv,["hidden","id","value"]),pv=Qt(op,["formattedValue","id","lang","rtl","value"]),mv=vs(ee(c(c(c(c(c({},fc),uv),fv),pv),{},{closeButtonVariant:hs(go,"outline-secondary"),labelCloseButton:hs(go,"Close"),labelNowButton:hs(go,"Select now"),labelResetButton:hs(go,"Reset"),noCloseButton:hs(ho,!1),nowButton:hs(ho,!1),nowButtonVariant:hs(go,"outline-primary"),resetButton:hs(ho,!1),resetButtonVariant:hs(go,"outline-danger"),resetValue:hs($o)})),ki),vv=i.default.extend({name:ki,mixins:[pc,cv],props:mv,data:function(){return{localHMS:this[dv]||"",localLocale:null,isRTL:!1,formattedValue:"",isVisible:!1}},computed:{computedLang:function(){return(this.localLocale||"").replace(/-u-.*$/i,"")||null}},watch:(Bh={},a(Bh,dv,(function(t){this.localHMS=t||""})),a(Bh,"localHMS",(function(t){this.isVisible&&this.$emit(hv,t||"")})),Bh),methods:{focus:function(){this.disabled||ts(this.$refs.control)},blur:function(){this.disabled||es(this.$refs.control)},setAndClose:function(t){var e=this;this.localHMS=t,this.$nextTick((function(){e.$refs.control.hide(!0)}))},onInput:function(t){this.localHMS!==t&&(this.localHMS=t)},onContext:function(t){var e=t.isRTL,i=t.locale,n=t.value,o=t.formatted;this.isRTL=e,this.localLocale=i,this.formattedValue=o,this.localHMS=n||"",this.$emit(Dn,t)},onNowButton:function(){var t=new Date,e=[t.getHours(),t.getMinutes(),this.showSeconds?t.getSeconds():0].map((function(t){return"00".concat(t||"").slice(-2)})).join(":");this.setAndClose(e)},onResetButton:function(){this.setAndClose(this.resetValue)},onCloseButton:function(){this.$refs.control.hide(!0)},onShow:function(){this.isVisible=!0},onShown:function(){var t=this;this.$nextTick((function(){ts(t.$refs.time),t.$emit(eo)}))},onHidden:function(){this.isVisible=!1,this.$emit(zn)},defaultButtonFn:function(t){var e=t.isHovered,i=t.hasFocus;return this.$createElement(e||i?$a:ka,{attrs:{"aria-hidden":"true"}})}},render:function(t){var e=this.localHMS,i=this.disabled,n=this.readonly,o=this.$props,r=Pt(this.placeholder)?this.labelNoTimeSelected:this.placeholder,s=[];if(this.nowButton){var l=this.labelNowButton;s.push(t(ml,{props:{size:"sm",disabled:i||n,variant:this.nowButtonVariant},attrs:{"aria-label":l||null},on:{click:this.onNowButton},key:"now-btn"},l))}if(this.resetButton){s.length>0&&s.push(t("span"," "));var u=this.labelResetButton;s.push(t(ml,{props:{size:"sm",disabled:i||n,variant:this.resetButtonVariant},attrs:{"aria-label":u||null},on:{click:this.onResetButton},key:"reset-btn"},u))}if(!this.noCloseButton){s.length>0&&s.push(t("span"," "));var d=this.labelCloseButton;s.push(t(ml,{props:{size:"sm",disabled:i,variant:this.closeButtonVariant},attrs:{"aria-label":d||null},on:{click:this.onCloseButton},key:"close-btn"},d))}s.length>0&&(s=[t("div",{staticClass:"b-form-date-controls d-flex flex-wrap",class:{"justify-content-between":s.length>1,"justify-content-end":s.length<2}},s)]);var h=t(av,{staticClass:"b-form-time-control",props:c(c({},ps(fv,o)),{},{value:e,hidden:!this.isVisible}),on:{input:this.onInput,context:this.onContext},ref:"time"},s);return t(rp,{staticClass:"b-form-timepicker",props:c(c({},ps(pv,o)),{},{id:this.safeId(),value:e,formattedValue:e?this.formattedValue:"",placeholder:r,rtl:this.isRTL,lang:this.computedLang}),on:{show:this.onShow,shown:this.onShown,hidden:this.onHidden},scopedSlots:a({},Eo,this.$scopedSlots["button-content"]||this.defaultButtonFn),ref:"control"},[h])}}),bv=me({components:{BFormTimepicker:vv,BTimepicker:vv}}),gv=me({components:{BImg:Lc,BImgLazy:Qc}}),yv=vs({tag:hs(go,"div")},Vi),wv=i.default.extend({name:Vi,functional:!0,props:yv,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(i.tag,F(n,{staticClass:"input-group-text"}),o)}}),Tv=vs({append:hs(ho,!1),id:hs(go),isText:hs(ho,!1),tag:hs(go,"div")},Ii),Cv=i.default.extend({name:Ii,functional:!0,props:Tv,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.append;return t(i.tag,F(n,{class:{"input-group-append":r,"input-group-prepend":!r},attrs:{id:i.id}}),i.isText?[t(wv,o)]:o)}}),xv=vs(Qt(Tv,["append"]),Pi),Sv=i.default.extend({name:Pi,functional:!0,props:xv,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(Cv,F(n,{props:c(c({},i),{},{append:!0})}),o)}}),kv=vs(Qt(Tv,["append"]),Oi),$v=i.default.extend({name:Oi,functional:!0,props:kv,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(Cv,F(n,{props:c(c({},i),{},{append:!1})}),o)}}),Bv=vs({append:hs(go),appendHtml:hs(go),id:hs(go),prepend:hs(go),prependHtml:hs(go),size:hs(go),tag:hs(go,"div")},Fi),_v=me({components:{BInputGroup:i.default.extend({name:Fi,functional:!0,props:Bv,render:function(t,e){var i=e.props,n=e.data,o=e.slots,r=e.scopedSlots,s=i.prepend,l=i.prependHtml,c=i.append,u=i.appendHtml,d=i.size,h=r||{},f=o(),p={},m=t(),v=ws(qo,h,f);(v||s||l)&&(m=t($v,[v?Ts(qo,p,h,f):t(wv,{domProps:Fl(l,s)})]));var b=t(),g=ws(Po,h,f);return(g||c||u)&&(b=t(Sv,[g?Ts(Po,p,h,f):t(wv,{domProps:Fl(u,c)})])),t(i.tag,F(n,{staticClass:"input-group",class:a({},"input-group-".concat(d),d),attrs:{id:i.id||null,role:"group"}}),[m,Ts(Ao,p,h,f),b])}}),BInputGroupAddon:Cv,BInputGroupPrepend:$v,BInputGroupAppend:Sv,BInputGroupText:wv}}),Dv=vs({fluid:hs(ko,!1),tag:hs(go,"div")},qe),Fv=i.default.extend({name:qe,functional:!0,props:Dv,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.fluid;return t(i.tag,F(n,{class:a({container:!(r||""===r),"container-fluid":!0===r||""===r},"container-".concat(r),r&&!0!==r)}),o)}}),Iv=vs({bgVariant:hs(go),borderVariant:hs(go),containerFluid:hs(ko,!1),fluid:hs(ho,!1),header:hs(go),headerHtml:hs(go),headerLevel:hs(_o,3),headerTag:hs(go,"h1"),lead:hs(go),leadHtml:hs(go),leadTag:hs(go,"p"),tag:hs(go,"div"),textVariant:hs(go)},Ei),Pv=me({components:{BJumbotron:i.default.extend({name:Ei,functional:!0,props:Iv,render:function(t,e){var i,n=e.props,o=e.data,r=e.slots,s=e.scopedSlots,l=n.header,c=n.headerHtml,u=n.lead,d=n.leadHtml,h=n.textVariant,f=n.bgVariant,p=n.borderVariant,m=s||{},v=r(),b={},g=t(),y=ws(No,m,v);if(y||l||c){var w=n.headerLevel;g=t(n.headerTag,{class:a({},"display-".concat(w),w),domProps:y?{}:Fl(c,l)},Ts(No,b,m,v))}var T=t(),C=ws(Go,m,v);(C||u||d)&&(T=t(n.leadTag,{staticClass:"lead",domProps:C?{}:Fl(d,u)},Ts(Go,b,m,v)));var x=[g,T,Ts(Ao,b,m,v)];return n.fluid&&(x=[t(Fv,{props:{fluid:n.containerFluid}},x)]),t(n.tag,F(o,{staticClass:"jumbotron",class:(i={"jumbotron-fluid":n.fluid},a(i,"text-".concat(h),h),a(i,"bg-".concat(f),f),a(i,"border-".concat(p),p),a(i,"border",p),i)}),x)}})}}),Ov=["start","end","center"],Vv=is((function(t,e){return(e=br(vr(e)))?gr(["row-cols",t,e].filter(ne).join("-")):null})),Ev=is((function(t){return gr(t.replace("cols",""))})),Lv=[],Av=me({components:{BContainer:Fv,BRow:{name:on,functional:!0,get props(){var t;return delete this.props,this.props=(t=ls().reduce((function(t,e){return t[ds(e,"cols")]=hs(_o),t}),Wt(null)),Lv=Kt(t),vs(ee(c(c({},t),{},{alignContent:hs(go,null,(function(t){return nr(or(Ov,"between","around","stretch"),t)})),alignH:hs(go,null,(function(t){return nr(or(Ov,"between","around"),t)})),alignV:hs(go,null,(function(t){return nr(or(Ov,"baseline","stretch"),t)})),noGutters:hs(ho,!1),tag:hs(go,"div")})),on)),this.props},render:function(t,e){var i,n=e.props,o=e.data,r=e.children,s=n.alignV,l=n.alignH,c=n.alignContent,u=[];return Lv.forEach((function(t){var e=Vv(Ev(t),n[t]);e&&u.push(e)})),u.push((a(i={"no-gutters":n.noGutters},"align-items-".concat(s),s),a(i,"justify-content-".concat(l),l),a(i,"align-content-".concat(c),c),i)),t(n.tag,F(o,{staticClass:"row",class:u}),r)}},BCol:Op,BFormRow:bf}}),Rv=me({components:{BLink:ol}}),Mv=vs({flush:hs(ho,!1),horizontal:hs(ko,!1),tag:hs(go,"div")},Ai),Hv=i.default.extend({name:Ai,functional:!0,props:Mv,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=""===i.horizontal||i.horizontal;r=!i.flush&&r;var s={staticClass:"list-group",class:a({"list-group-flush":i.flush,"list-group-horizontal":!0===r},"list-group-horizontal-".concat(r),Et(r))};return t(i.tag,F(n,s),o)}}),zv=["a","router-link","button","b-link"],Nv=Qt(nl,["event","routerTag"]);delete Nv.href.default,delete Nv.to.default;var jv=vs(ee(c(c({},Nv),{},{action:hs(ho,!1),button:hs(ho,!1),tag:hs(go,"div"),variant:hs(go)})),Ri),Gv=me({components:{BListGroup:Hv,BListGroupItem:i.default.extend({name:Ri,functional:!0,props:jv,render:function(t,e){var i,n=e.props,o=e.data,r=e.children,s=n.button,l=n.variant,c=n.active,u=n.disabled,d=la(n),h=s?"button":d?ol:n.tag,f=!!(n.action||d||s||nr(zv,n.tag)),p={},m={};return Br(h,"button")?(o.attrs&&o.attrs.type||(p.type="button"),n.disabled&&(p.disabled=!0)):m=ps(Nv,n),t(h,F(o,{attrs:p,props:m,staticClass:"list-group-item",class:(i={},a(i,"list-group-item-".concat(l),l),a(i,"list-group-item-action",f),a(i,"active",c),a(i,"disabled",u),i)}),r)}})}}),Wv=vs({right:hs(ho,!1),tag:hs(go,"div"),verticalAlign:hs(go,"top")},Hi),Yv=i.default.extend({name:Hi,functional:!0,props:Wv,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.verticalAlign,s="top"===r?"start":"bottom"===r?"end":r;return t(i.tag,F(n,{staticClass:"media-aside",class:a({"media-aside-right":i.right},"align-self-".concat(s),s)}),o)}}),Uv=vs({tag:hs(go,"div")},zi),qv=i.default.extend({name:zi,functional:!0,props:Uv,render:function(t,e){var i=e.props,n=e.data,o=e.children;return t(i.tag,F(n,{staticClass:"media-body"}),o)}}),Kv=vs({noBody:hs(ho,!1),rightAlign:hs(ho,!1),tag:hs(go,"div"),verticalAlign:hs(go,"top")},Mi),Xv=me({components:{BMedia:i.default.extend({name:Mi,functional:!0,props:Kv,render:function(t,e){var i=e.props,n=e.data,o=e.slots,r=e.scopedSlots,s=e.children,a=i.noBody,l=i.rightAlign,c=i.verticalAlign,u=a?s:[];if(!a){var d={},h=o(),f=r||{};u.push(t(qv,Ts(Ao,d,f,h)));var p=Ts("aside",d,f,h);p&&u[l?"push":"unshift"](t(Yv,{props:{right:l,verticalAlign:c}},p))}return t(i.tag,F(n,{staticClass:"media"}),u)}}),BMediaAside:Yv,BMediaBody:qv}}),Zv="$_bv_documentHandlers_",Jv=i.default.extend({created:function(){var t=this;M&&(this[Zv]={},this.$once(oo,(function(){var e=t[Zv]||{};delete t[Zv],Kt(e).forEach((function(t){(e[t]||[]).forEach((function(e){return ks(document,t,e,lo)}))}))})))},methods:{listenDocument:function(t,e,i){t?this.listenOnDocument(e,i):this.listenOffDocument(e,i)},listenOnDocument:function(t,e){this[Zv]&&Et(t)&&Ot(e)&&(this[Zv][t]=this[Zv][t]||[],nr(this[Zv][t],e)||(this[Zv][t].push(e),Ss(document,t,e,lo)))},listenOffDocument:function(t,e){this[Zv]&&Et(t)&&Ot(e)&&(ks(document,t,e,lo),this[Zv][t]=(this[Zv][t]||[]).filter((function(t){return t!==e})))}}}),Qv="$_bv_windowHandlers_",tb=i.default.extend({beforeCreate:function(){this[Qv]={}},beforeDestroy:function(){if(M){var t=this[Qv];delete this[Qv],Kt(t).forEach((function(e){(t[e]||[]).forEach((function(t){return ks(window,e,t,lo)}))}))}},methods:{listenWindow:function(t,e,i){t?this.listenOnWindow(e,i):this.listenOffWindow(e,i)},listenOnWindow:function(t,e){M&&this[Qv]&&Et(t)&&Ot(e)&&(this[Qv][t]=this[Qv][t]||[],nr(this[Qv][t],e)||(this[Qv][t].push(e),Ss(window,t,e,lo)))},listenOffWindow:function(t,e){M&&this[Qv]&&Et(t)&&Ot(e)&&(ks(window,t,e,lo),this[Qv][t]=(this[Qv][t]||[]).filter((function(t){return t!==e})))}}}),eb=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t&&t.$options._scopeId||e},ib=i.default.extend({computed:{scopedStyleAttrs:function(){var t=eb(this.$parent);return t?a({},t,""):{}}}}),nb=i.default.extend({abstract:!0,name:"BVTransporterTarget",props:{nodes:hs(yo)},data:function(t){return{updatedNodes:t.nodes}},destroyed:function(){var t;(t=this.$el)&&t.parentNode&&t.parentNode.removeChild(t)},render:function(t){var e=this.updatedNodes,i=Ot(e)?e({}):e;return(i=or(i).filter(ne))&&i.length>0&&!i[0].text?i[0]:t()}}),ob={container:hs([HTMLElement,go],"body"),disabled:hs(ho,!1),tag:hs(go,"div")},rb=i.default.extend({name:"BVTransporter",mixins:[Cs],props:ob,watch:{disabled:{immediate:!0,handler:function(t){t?this.unmountTarget():this.$nextTick(this.mountTarget)}}},created:function(){this.$_defaultFn=null,this.$_target=null},beforeMount:function(){this.mountTarget()},updated:function(){this.updateTarget()},beforeDestroy:function(){this.unmountTarget(),this.$_defaultFn=null},methods:{getContainer:function(){if(M){var t=this.container;return Et(t)?Or(t):t}return null},mountTarget:function(){if(!this.$_target){var t=this.getContainer();if(t){var e=document.createElement("div");t.appendChild(e),this.$_target=new nb({el:e,parent:this,propsData:{nodes:or(this.normalizeSlot())}})}}},updateTarget:function(){if(M&&this.$_target){var t=this.$scopedSlots.default;this.disabled||(t&&this.$_defaultFn!==t?this.$_target.updatedNodes=t:t||(this.$_target.updatedNodes=this.$slots.default)),this.$_defaultFn=t}},unmountTarget:function(){this.$_target&&this.$_target.$destroy(),this.$_target=null}},render:function(t){if(this.disabled){var e=or(this.normalizeSlot()).filter(ne);if(e.length>0&&!e[0].text)return e[0]}return t()}}),BvModalEvent=function(t){u(BvModalEvent,t);var e=g(BvModalEvent);function BvModalEvent(t){var i,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(this,BvModalEvent),i=e.call(this,t,n),Yt(v(i),{trigger:{enumerable:!0,configurable:!1,writable:!1}}),i}return s(BvModalEvent,null,[{key:"Defaults",get:function(){return c(c({},y(d(BvModalEvent),"Defaults",this)),{},{trigger:null})}}]),BvModalEvent}(BvEvent),sb=new(i.default.extend({data:function(){return{modals:[],baseZIndex:null,scrollbarWidth:null,isBodyOverflowing:!1}},computed:{modalCount:function(){return this.modals.length},modalsAreOpen:function(){return this.modalCount>0}},watch:{modalCount:function(t,e){M&&(this.getScrollbarWidth(),t>0&&0===e?(this.checkScrollbar(),this.setScrollbar(),Rr(document.body,"modal-open")):0===t&&e>0&&(this.resetScrollbar(),Mr(document.body,"modal-open")),zr(document.body,"data-modal-open-count",String(t)))},modals:function(t){var e=this;this.checkScrollbar(),xr((function(){e.updateModals(t||[])}))}},methods:{registerModal:function(t){var e=this;t&&-1===this.modals.indexOf(t)&&(this.modals.push(t),t.$once(oo,(function(){e.unregisterModal(t)})))},unregisterModal:function(t){var e=this.modals.indexOf(t);e>-1&&(this.modals.splice(e,1),t._isBeingDestroyed||t._isDestroyed||this.resetModal(t))},getBaseZIndex:function(){if(It(this.baseZIndex)&&M){var t=document.createElement("div");Rr(t,"modal-backdrop"),Rr(t,"d-none"),Wr(t,"display","none"),document.body.appendChild(t),this.baseZIndex=lr(Kr(t).zIndex,1040),document.body.removeChild(t)}return this.baseZIndex||1040},getScrollbarWidth:function(){if(It(this.scrollbarWidth)&&M){var t=document.createElement("div");Rr(t,"modal-scrollbar-measure"),document.body.appendChild(t),this.scrollbarWidth=qr(t).width-t.clientWidth,document.body.removeChild(t)}return this.scrollbarWidth||0},updateModals:function(t){var e=this,i=this.getBaseZIndex(),n=this.getScrollbarWidth();t.forEach((function(t,o){t.zIndex=i+o,t.scrollbarWidth=n,t.isTop=o===e.modals.length-1,t.isBodyOverflowing=e.isBodyOverflowing}))},resetModal:function(t){t&&(t.zIndex=this.getBaseZIndex(),t.isTop=!0,t.isBodyOverflowing=!1)},checkScrollbar:function(){var t=qr(document.body),e=t.left,i=t.right;this.isBodyOverflowing=e+i0&&void 0!==arguments[0]&&arguments[0];this.$_observer&&this.$_observer.disconnect(),this.$_observer=null,t&&(this.$_observer=au(this.$refs.content,this.checkModalOverflow.bind(this),bb))},updateModel:function(t){t!==this[ub]&&this.$emit(db,t)},buildEvent:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new BvModalEvent(t,c(c({cancelable:!1,target:this.$refs.modal||this.$el||null,relatedTarget:null,trigger:null},e),{},{vueTarget:this,componentId:this.modalId}))},show:function(){if(!this.isVisible&&!this.isOpening)if(this.isClosing)this.$once(zn,this.show);else{this.isOpening=!0,this.$_returnFocus=this.$_returnFocus||this.getActiveElement();var t=this.buildEvent(to,{cancelable:!0});if(this.emitEvent(t),t.defaultPrevented||this.isVisible)return this.isOpening=!1,void this.updateModel(!1);this.doShow()}},hide:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(this.isVisible&&!this.isClosing){this.isClosing=!0;var e=this.buildEvent(Nn,{cancelable:t!==hb,trigger:t||null});if(t===mb?this.$emit("ok",e):t===fb?this.$emit(kn,e):t===pb&&this.$emit(_n,e),this.emitEvent(e),e.defaultPrevented||!this.isVisible)return this.isClosing=!1,void this.updateModel(!0);this.setObserver(!1),this.isVisible=!1,this.updateModel(!1)}},toggle:function(t){t&&(this.$_returnFocus=t),this.isVisible?this.hide("toggle"):this.show()},getActiveElement:function(){var t=$r(M?[document.body]:[]);return t&&t.focus?t:null},doShow:function(){var t=this;sb.modalsAreOpen&&this.noStacking?this.listenOnRootOnce(Ds(Ni,zn),this.doShow):(sb.registerModal(this),this.isHidden=!1,this.$nextTick((function(){t.isVisible=!0,t.isOpening=!1,t.updateModel(!0),t.$nextTick((function(){t.setObserver(!0)}))})))},onBeforeEnter:function(){this.isTransitioning=!0,this.setResizeEvent(!0)},onEnter:function(){var t=this;this.isBlock=!0,xr((function(){xr((function(){t.isShow=!0}))}))},onAfterEnter:function(){var t=this;this.checkModalOverflow(),this.isTransitioning=!1,xr((function(){t.emitEvent(t.buildEvent(eo)),t.setEnforceFocus(!0),t.$nextTick((function(){t.focusFirst()}))}))},onBeforeLeave:function(){this.isTransitioning=!0,this.setResizeEvent(!1),this.setEnforceFocus(!1)},onLeave:function(){this.isShow=!1},onAfterLeave:function(){var t=this;this.isBlock=!1,this.isTransitioning=!1,this.isModalOverflowing=!1,this.isHidden=!0,this.$nextTick((function(){t.isClosing=!1,sb.unregisterModal(t),t.returnFocusTo(),t.emitEvent(t.buildEvent(zn))}))},emitEvent:function(t){var e=t.type;this.emitOnRoot(Ds(Ni,e),t,t.componentId),this.$emit(e,t)},onDialogMousedown:function(){var t=this,e=this.$refs.modal;Ss(e,"mouseup",(function i(n){ks(e,"mouseup",i,lo),n.target===e&&(t.ignoreBackdropClick=!0)}),lo)},onClickOut:function(t){this.ignoreBackdropClick?this.ignoreBackdropClick=!1:this.isVisible&&!this.noCloseOnBackdrop&&Lr(document.body,t.target)&&(Lr(this.$refs.content,t.target)||this.hide("backdrop"))},onOk:function(){this.hide(mb)},onCancel:function(){this.hide(fb)},onClose:function(){this.hide(pb)},onEsc:function(t){27===t.keyCode&&this.isVisible&&!this.noCloseOnEsc&&this.hide("esc")},focusHandler:function(t){var e=this.$refs.content,i=t.target;if(!(this.noEnforceFocus||!this.isTop||!this.isVisible||!e||document===i||Lr(e,i)||this.computeIgnoreEnforceFocusSelector&&Er(this.computeIgnoreEnforceFocusSelector,i,!0))){var n=Qr(this.$refs.content),o=this.$refs["bottom-trap"],r=this.$refs["top-trap"];if(o&&i===o){if(ts(n[0]))return}else if(r&&i===r&&ts(n[n.length-1]))return;ts(e,{preventScroll:!0})}},setEnforceFocus:function(t){this.listenDocument(t,"focusin",this.focusHandler)},setResizeEvent:function(t){this.listenWindow(t,"resize",this.checkModalOverflow),this.listenWindow(t,"orientationchange",this.checkModalOverflow)},showHandler:function(t,e){t===this.modalId&&(this.$_returnFocus=e||this.getActiveElement(),this.show())},hideHandler:function(t){t===this.modalId&&this.hide("event")},toggleHandler:function(t,e){t===this.modalId&&this.toggle(e)},modalListener:function(t){this.noStacking&&t.vueTarget!==this&&this.hide()},focusFirst:function(){var t=this;M&&xr((function(){var e=t.$refs.modal,i=t.$refs.content,n=t.getActiveElement();if(e&&i&&(!n||!Lr(i,n))){var o=t.$refs["ok-button"],r=t.$refs["cancel-button"],s=t.$refs["close-button"],a=t.autoFocusButton,l=a===mb&&o?o.$el||o:a===fb&&r?r.$el||r:a===pb&&s?s.$el||s:i;ts(l),l===i&&t.$nextTick((function(){e.scrollTop=0}))}}))},returnFocusTo:function(){var t=this.returnFocus||this.$_returnFocus||null;this.$_returnFocus=null,this.$nextTick((function(){(t=Et(t)?Or(t):t)&&(t=t.$el||t,ts(t))}))},checkModalOverflow:function(){if(this.isVisible){var t=this.$refs.modal;this.isModalOverflowing=t.scrollHeight>document.documentElement.clientHeight}},makeModal:function(t){var e=t();if(!this.hideHeader){var i=this.normalizeSlot("modal-header",this.slotScope);if(!i){var n=t();this.hideHeaderClose||(n=t(Ps,{props:{content:this.headerCloseContent,disabled:this.isTransitioning,ariaLabel:this.headerCloseLabel,textVariant:this.headerCloseVariant||this.headerTextVariant},on:{click:this.onClose},ref:"close-button"},[this.normalizeSlot("modal-header-close")])),i=[t(this.titleTag,{staticClass:"modal-title",class:this.titleClasses,attrs:{id:this.modalTitleId},domProps:this.hasNormalizedSlot(Uo)?{}:Fl(this.titleHtml,this.title)},this.normalizeSlot(Uo,this.slotScope)),n]}e=t("header",{staticClass:"modal-header",class:this.headerClasses,attrs:{id:this.modalHeaderId},ref:"header"},[i])}var o=t("div",{staticClass:"modal-body",class:this.bodyClasses,attrs:{id:this.modalBodyId},ref:"body"},this.normalizeSlot(Ao,this.slotScope)),r=t();if(!this.hideFooter){var s=this.normalizeSlot("modal-footer",this.slotScope);if(!s){var a=t();this.okOnly||(a=t(ml,{props:{variant:this.cancelVariant,size:this.buttonSize,disabled:this.cancelDisabled||this.busy||this.isTransitioning},domProps:this.hasNormalizedSlot(Wo)?{}:Fl(this.cancelTitleHtml,this.cancelTitle),on:{click:this.onCancel},ref:"cancel-button"},this.normalizeSlot(Wo))),s=[a,t(ml,{props:{variant:this.okVariant,size:this.buttonSize,disabled:this.okDisabled||this.busy||this.isTransitioning},domProps:this.hasNormalizedSlot(Yo)?{}:Fl(this.okTitleHtml,this.okTitle),on:{click:this.onOk},ref:"ok-button"},this.normalizeSlot(Yo))]}r=t("footer",{staticClass:"modal-footer",class:this.footerClasses,attrs:{id:this.modalFooterId},ref:"footer"},[s])}var l=t("div",{staticClass:"modal-content",class:this.contentClass,attrs:{id:this.modalContentId,tabindex:"-1"},ref:"content"},[e,o,r]),c=t(),u=t();this.isVisible&&!this.noEnforceFocus&&(c=t("span",{attrs:{tabindex:"0"},ref:"top-trap"}),u=t("span",{attrs:{tabindex:"0"},ref:"bottom-trap"}));var d=t("div",{staticClass:"modal-dialog",class:this.dialogClasses,on:{mousedown:this.onDialogMousedown},ref:"dialog"},[c,l,u]),h=t("div",{staticClass:"modal",class:this.modalClasses,style:this.modalStyles,attrs:this.computedModalAttrs,on:{keydown:this.onEsc,click:this.onClickOut},directives:[{name:"show",value:this.isVisible}],ref:"modal"},[d]);h=t("transition",{props:{enterClass:"",enterToClass:"",enterActiveClass:"",leaveClass:"",leaveActiveClass:"",leaveToClass:""},on:{beforeEnter:this.onBeforeEnter,enter:this.onEnter,afterEnter:this.onAfterEnter,beforeLeave:this.onBeforeLeave,leave:this.onLeave,afterLeave:this.onAfterLeave}},[h]);var f=t();return!this.hideBackdrop&&this.isVisible&&(f=t("div",{staticClass:"modal-backdrop",attrs:{id:this.modalBackdropId}},this.normalizeSlot("modal-backdrop"))),f=t(Ls,{props:{noFade:this.noFade}},[f]),t("div",{style:this.modalOuterStyle,attrs:this.computedAttrs,key:"modal-outer-".concat(this._uid)},[h,f])}},render:function(t){return this.static?this.lazy&&this.isHidden?t():this.makeModal(t):this.isHidden?t():t(rb,[this.makeModal(t)])}}),wb=Fs(Ni,to),Tb="__bv_modal_directive__",Cb=function(t){var e=t.modifiers,i=void 0===e?{}:e,n=t.arg,o=t.value;return Et(o)?o:Et(n)?n:Kt(i).reverse()[0]},xb=function(t){return t&&Vr(t,".dropdown-menu > li, li.nav-item")&&Or("a, button",t)||t},Sb=function(t){t&&"BUTTON"!==t.tagName&&(Gr(t,"role")||zr(t,"role","button"),"A"===t.tagName||Gr(t,"tabindex")||zr(t,"tabindex","0"))},kb=function(t){var e=t[Tb]||{},i=e.trigger,n=e.handler;i&&n&&(ks(i,"click",n,ao),ks(i,"keydown",n,ao),ks(t,"click",n,ao),ks(t,"keydown",n,ao)),delete t[Tb]},$b=function(t,e,i){var n=t[Tb]||{},o=Cb(e),r=xb(t);o===n.target&&r===n.trigger||(kb(t),function(t,e,i){var n=Cb(e),o=xb(t);if(n&&o){var r=function(t){var e=t.currentTarget;if(!Fr(e)){var o=t.type,r=t.keyCode;"click"!==o&&("keydown"!==o||r!==Ha&&r!==Ga)||i.context.$root.$emit(wb,n,e)}};t[Tb]={handler:r,target:n,trigger:o},Sb(o),Ss(o,"click",r,ao),"BUTTON"!==o.tagName&&"button"===jr(o,"role")&&Ss(o,"keydown",r,ao)}}(t,e,i)),Sb(r)},Bb={inserted:$b,updated:function(){},componentUpdated:$b,unbind:kb},_b="$bvModal",Db=["id"].concat(T(Kt(Qt(gb,["busy","lazy","noStacking","static","visible"])))),Fb=function(){},Ib={msgBoxContent:"default",title:"modal-title",okTitle:"modal-ok",cancelTitle:"modal-cancel"},Pb=function(t){return Db.reduce((function(e,i){return Ft(t[i])||(e[i]=t[i]),e}),{})},Ob=me({components:{BModal:yb},directives:{VBModal:Bb},plugins:{BVModalPlugin:me({plugins:{plugin:function(t){var e=t.extend({name:"BMsgBox",extends:yb,destroyed:function(){this.$el&&this.$el.parentNode&&this.$el.parentNode.removeChild(this.$el)},mounted:function(){var t=this,e=function(){t.$nextTick((function(){xr((function(){t.$destroy()}))}))};this.$parent.$once(ro,e),this.$once(zn,e),this.$router&&this.$route&&this.$once(oo,this.$watch("$router",e)),this.show()}}),i=function(t,i){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Fb;if(!ce(_b)&&!ue(_b)){var o=new e({parent:t,propsData:c(c(c({},Pb(rs(Ni))),{},{hideHeaderClose:!0,hideHeader:!(i.title||i.titleHtml)},Qt(i,Kt(Ib))),{},{lazy:!1,busy:!1,visible:!1,noStacking:!1,noEnforceFocus:!1})});return Kt(Ib).forEach((function(t){Ft(i[t])||(o.$slots[Ib[t]]=or(i[t]))})),new Promise((function(t,e){var i=!1;o.$once(ro,(function(){i||e(new Error("BootstrapVue MsgBox destroyed before resolve"))})),o.$on(Nn,(function(e){if(!e.defaultPrevented){var o=n(e);e.defaultPrevented||(i=!0,t(o))}}));var r=document.createElement("div");document.body.appendChild(r),o.$mount(r)}))}},n=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;if(e&&!ue(_b)&&!ce(_b)&&Ot(o))return i(t,c(c({},Pb(n)),{},{msgBoxContent:e}),o)},r=function(){function t(e){o(this,t),Gt(this,{_vm:e,_root:e.$root}),Yt(this,{_vm:{enumerable:!0,configurable:!1,writable:!1},_root:{enumerable:!0,configurable:!1,writable:!1}})}return s(t,[{key:"show",value:function(t){if(t&&this._root){for(var e,i=arguments.length,n=new Array(i>1?i-1:0),o=1;o1?i-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:{},i=c(c({},e),{},{okOnly:!0,okDisabled:!1,hideFooter:!1,msgBoxContent:t});return n(this._vm,t,i,(function(){return!0}))}},{key:"msgBoxConfirm",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=c(c({},e),{},{okOnly:!1,okDisabled:!1,cancelDisabled:!1,hideFooter:!1});return n(this._vm,t,i,(function(t){var e=t.trigger;return"ok"===e||"cancel"!==e&&null}))}}]),t}();t.mixin({beforeCreate:function(){this._bv__modal=new r(this)}}),Xt(t.prototype,_b)||Ut(t.prototype,_b,{get:function(){return this&&this._bv__modal||le('"'.concat(_b,'" must be accessed from a Vue instance "this" context.'),Ni),this._bv__modal}})}}})}}),Vb=vs({align:hs(go),cardHeader:hs(ho,!1),fill:hs(ho,!1),justified:hs(ho,!1),pills:hs(ho,!1),small:hs(ho,!1),tabs:hs(ho,!1),tag:hs(go,"ul"),vertical:hs(ho,!1)},ji),Eb=i.default.extend({name:ji,functional:!0,props:Vb,render:function(t,e){var i,n,o=e.props,r=e.data,s=e.children,l=o.tabs,c=o.pills,u=o.vertical,d=o.align,h=o.cardHeader;return t(o.tag,F(r,{staticClass:"nav",class:(i={"nav-tabs":l,"nav-pills":c&&!l,"card-header-tabs":!u&&h&&l,"card-header-pills":!u&&h&&c&&!l,"flex-column":u,"nav-fill":!u&&o.fill,"nav-justified":!u&&o.justified},a(i,(n=d,"justify-content-".concat(n="left"===n?"start":"right"===n?"end":n)),!u&&d),a(i,"small",o.small),i)}),s)}}),Lb=Qt(nl,["event","routerTag"]),Ab=vs(ee(c(c({},Lb),{},{linkAttrs:hs(vo,{}),linkClasses:hs(To)})),Ki),Rb=i.default.extend({name:Ki,functional:!0,props:Ab,render:function(t,e){var i=e.props,n=e.data,o=e.listeners,r=e.children;return t("li",F(Qt(n,["on"]),{staticClass:"nav-item"}),[t(ol,{staticClass:"nav-link",class:i.linkClasses,attrs:i.linkAttrs,props:ps(Lb,i),on:o},r)])}}),Mb=i.default.extend({name:"BNavText",functional:!0,props:{},render:function(t,e){var i=e.data,n=e.children;return t("li",F(i,{staticClass:"navbar-text"}),n)}}),Hb=Qt(Yh,["inline"]),zb=vs(ee(c(c({},Hb),{},{formClass:hs(To)})),qi),Nb=i.default.extend({name:qi,functional:!0,props:zb,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=e.listeners,s=t(Uh,{class:i.formClass,props:c(c({},ps(Hb,i)),{},{inline:!0}),attrs:n.attrs,on:r},o);return t("li",F(Qt(n,["attrs","on"]),{staticClass:"form-inline"}),[s])}}),jb=vs(ee(c(c({},fc),Jt(Eh,[].concat(T(Kt(Oh)),["html","lazy","menuClass","noCaret","role","text","toggleClass"])))),Xi),Gb=i.default.extend({name:Xi,mixins:[pc,Vh,Cs],props:jb,computed:{toggleId:function(){return this.safeId("_BV_toggle_")},dropdownClasses:function(){return[this.directionClass,this.boundaryClass,{show:this.visible}]},menuClasses:function(){return[this.menuClass,{"dropdown-menu-right":this.right,show:this.visible}]},toggleClasses:function(){return[this.toggleClass,{"dropdown-toggle-no-caret":this.noCaret}]}},render:function(t){var e=this.toggleId,i=this.visible,n=this.hide,o=t(ol,{staticClass:"nav-link dropdown-toggle",class:this.toggleClasses,props:{href:"#".concat(this.id||""),disabled:this.disabled},attrs:{id:e,role:"button","aria-haspopup":"true","aria-expanded":i?"true":"false"},on:{mousedown:this.onMousedown,click:this.toggle,keydown:this.toggle},ref:"toggle"},[this.normalizeSlot([Eo,"text"])||t("span",{domProps:Fl(this.html,this.text)})]),r=t("ul",{staticClass:"dropdown-menu",class:this.menuClasses,attrs:{tabindex:"-1","aria-labelledby":e},on:{keydown:this.onKeydown},ref:"menu"},!this.lazy||i?this.normalizeSlot(Ao,{hide:n}):[t()]);return t("li",{staticClass:"nav-item b-nav-dropdown dropdown",class:this.dropdownClasses,attrs:{id:this.safeId()}},[o,r])}}),Wb=me({components:{BNav:Eb,BNavItem:Rb,BNavText:Mb,BNavForm:Nb,BNavItemDropdown:Gb,BNavItemDd:Gb,BNavDropdown:Gb,BNavDd:Gb},plugins:{DropdownPlugin:tf}}),Yb=vs({fixed:hs(go),print:hs(ho,!1),sticky:hs(ho,!1),tag:hs(go,"nav"),toggleable:hs(ko,!1),type:hs(go,"light"),variant:hs(go)},Gi),Ub=i.default.extend({name:Gi,mixins:[Cs],provide:function(){return{bvNavbar:this}},props:Yb,computed:{breakpointClass:function(){var t=this.toggleable,e=ss()[0],i=null;return t&&Et(t)&&t!==e?i="navbar-expand-".concat(t):!1===t&&(i="navbar-expand"),i}},render:function(t){var e,i=this.tag,n=this.type,o=this.variant,r=this.fixed;return t(i,{staticClass:"navbar",class:[(e={"d-print":this.print,"sticky-top":this.sticky},a(e,"navbar-".concat(n),n),a(e,"bg-".concat(o),o),a(e,"fixed-".concat(r),r),e),this.breakpointClass],attrs:{role:Br(i,"nav")?null:"navigation"}},[this.normalizeSlot()])}}),qb=vs(Jt(Vb,["tag","fill","justified","align","small"]),Yi),Kb=i.default.extend({name:Yi,functional:!0,props:qb,render:function(t,e){var i,n,o=e.props,r=e.data,s=e.children,l=o.align;return t(o.tag,F(r,{staticClass:"navbar-nav",class:(i={"nav-fill":o.fill,"nav-justified":o.justified},a(i,(n=l,"justify-content-".concat(n="left"===n?"start":"right"===n?"end":n)),l),a(i,"small",o.small),i)}),s)}}),Xb=Qt(nl,["event","routerTag"]);Xb.href.default=void 0,Xb.to.default=void 0;var Zb,Jb,Qb,tg,eg,ig,ng,og,rg,sg=vs(ee(c(c({},Xb),{},{tag:hs(go,"div")})),Wi),ag=i.default.extend({name:Wi,functional:!0,props:sg,render:function(t,e){var i=e.props,n=e.data,o=e.children,r=i.to||i.href;return t(r?ol:i.tag,F(n,{staticClass:"navbar-brand",props:r?ps(Xb,i):{}}),o)}}),lg="navbar-toggler",cg=Ds(Ue,"state"),ug=Ds(Ue,"sync-state"),dg=vs({disabled:hs(ho,!1),label:hs(go,"Toggle navigation"),target:hs(Co,void 0,!0)},Ui),hg=i.default.extend({name:Ui,directives:{VBToggle:ad},mixins:[Ja,Cs],props:dg,data:function(){return{toggleState:!1}},created:function(){this.listenOnRoot(cg,this.handleStateEvt),this.listenOnRoot(ug,this.handleStateEvt)},methods:{onClick:function(t){this.disabled||this.$emit(Bn,t)},handleStateEvt:function(t,e){t===this.target&&(this.toggleState=e)}},render:function(t){var e=this.disabled;return t("button",{staticClass:lg,class:{disabled:e},directives:[{name:"VBToggle",value:this.target}],attrs:{type:"button",disabled:e,"aria-label":this.label},on:{click:this.onClick}},[this.normalizeSlot(Ao,{expanded:this.toggleState})||t("span",{staticClass:"".concat(lg,"-icon")})])}}),fg=me({components:{BNavbar:Ub,BNavbarNav:Kb,BNavbarBrand:ag,BNavbarToggle:hg,BNavToggle:hg},plugins:{NavPlugin:Wb,CollapsePlugin:cd,DropdownPlugin:tf}}),pg=vs({label:hs(go),role:hs(go,"status"),small:hs(ho,!1),tag:hs(go,"span"),type:hs(go,"border"),variant:hs(go)},dn),mg=i.default.extend({name:dn,functional:!0,props:pg,render:function(t,e){var i,n=e.props,o=e.data,r=e.slots,s=e.scopedSlots,l=r(),c=Ts(jo,{},s||{},l)||n.label;return c&&(c=t("span",{staticClass:"sr-only"},c)),t(n.tag,F(o,{attrs:{role:c?n.role||"status":null,"aria-hidden":c?null:"true"},class:(i={},a(i,"spinner-".concat(n.type),n.type),a(i,"spinner-".concat(n.type,"-sm"),n.small),a(i,"text-".concat(n.variant),n.variant),i)}),[c||t()])}}),vg={top:0,left:0,bottom:0,right:0},bg=vs({bgColor:hs(go),blur:hs(go,"2px"),fixed:hs(ho,!1),noCenter:hs(ho,!1),noFade:hs(ho,!1),noWrap:hs(ho,!1),opacity:hs(_o,.85,(function(t){var e=cr(t,0);return e>=0&&e<=1})),overlayTag:hs(go,"div"),rounded:hs(ko,!1),show:hs(ho,!1),spinnerSmall:hs(ho,!1),spinnerType:hs(go,"border"),spinnerVariant:hs(go),variant:hs(go,"light"),wrapTag:hs(go,"div"),zIndex:hs(_o,10)},Zi),gg=i.default.extend({name:Zi,mixins:[Cs],props:bg,computed:{computedRounded:function(){var t=this.rounded;return!0===t||""===t?"rounded":t?"rounded-".concat(t):""},computedVariant:function(){var t=this.variant;return t&&!this.bgColor?"bg-".concat(t):""},slotScope:function(){return{spinnerType:this.spinnerType||null,spinnerVariant:this.spinnerVariant||null,spinnerSmall:this.spinnerSmall}}},methods:{defaultOverlayFn:function(t){var e=t.spinnerType,i=t.spinnerVariant,n=t.spinnerSmall;return this.$createElement(mg,{props:{type:e,variant:i,small:n}})}},render:function(t){var e=this,i=this.show,n=this.fixed,o=this.noFade,r=this.noWrap,s=this.slotScope,a=t();if(i){var l=t("div",{staticClass:"position-absolute",class:[this.computedVariant,this.computedRounded],style:c(c({},vg),{},{opacity:this.opacity,backgroundColor:this.bgColor||null,backdropFilter:this.blur?"blur(".concat(this.blur,")"):null})}),u=t("div",{staticClass:"position-absolute",style:this.noCenter?c({},vg):{top:"50%",left:"50%",transform:"translateX(-50%) translateY(-50%)"}},[this.normalizeSlot("overlay",s)||this.defaultOverlayFn(s)]);a=t(this.overlayTag,{staticClass:"b-overlay",class:{"position-absolute":!r||r&&!n,"position-fixed":r&&n},style:c(c({},vg),{},{zIndex:this.zIndex||10}),on:{click:function(t){return e.$emit(Bn,t)}},key:"overlay"},[l,u])}return a=t(Ls,{props:{noFade:o,appear:!0},on:{"after-enter":function(){return e.$emit(eo)},"after-leave":function(){return e.$emit(zn)}}},[a]),r?a:t(this.wrapTag,{staticClass:"b-overlay-wrap position-relative",attrs:{"aria-busy":i?"true":null}},r?[a]:[this.normalizeSlot(),a])}}),yg=me({components:{BOverlay:gg}}),wg=ys("value",{type:So,defaultValue:null,validator:function(t){return!(!It(t)&&lr(t,0)<1)||(le('"v-model" value must be a number greater than "0"',Ji),!1)}}),Tg=wg.mixin,Cg=wg.props,xg=wg.prop,Sg=wg.event,kg=function(t){var e=lr(t)||1;return e<1?5:e},$g=function(t,e){var i=lr(t)||1;return i>e?e:i<1?1:i},Bg=function(t){if(t.keyCode===Ga)return Bs(t,{immediatePropagation:!0}),t.currentTarget.click(),!1},_g=vs(ee(c(c({},Cg),{},{align:hs(go,"left"),ariaLabel:hs(go,"Pagination"),disabled:hs(ho,!1),ellipsisClass:hs(To),ellipsisText:hs(go,"âĻ"),firstClass:hs(To),firstNumber:hs(ho,!1),firstText:hs(go,"ÂĢ"),hideEllipsis:hs(ho,!1),hideGotoEndButtons:hs(ho,!1),labelFirstPage:hs(go,"Go to first page"),labelLastPage:hs(go,"Go to last page"),labelNextPage:hs(go,"Go to next page"),labelPage:hs(Bo,"Go to page"),labelPrevPage:hs(go,"Go to previous page"),lastClass:hs(To),lastNumber:hs(ho,!1),lastText:hs(go,"Âģ"),limit:hs(_o,5,(function(t){return!(lr(t,0)<1)||(le('Prop "limit" must be a number greater than "0"',Ji),!1)})),nextClass:hs(To),nextText:hs(go,"âē"),pageClass:hs(To),pills:hs(ho,!1),prevClass:hs(To),prevText:hs(go,"âš"),size:hs(go)})),"pagination"),Dg=i.default.extend({mixins:[Tg,Cs],props:_g,data:function(){var t=lr(this[xg],0);return{currentPage:t=t>0?t:-1,localNumberOfPages:1,localLimit:5}},computed:{btnSize:function(){var t=this.size;return t?"pagination-".concat(t):""},alignment:function(){var t=this.align;return"center"===t?"justify-content-center":"end"===t||"right"===t?"justify-content-end":"fill"===t?"text-center":""},styleClass:function(){return this.pills?"b-pagination-pills":""},computedCurrentPage:function(){return $g(this.currentPage,this.localNumberOfPages)},paginationParams:function(){var t=this.localLimit,e=this.localNumberOfPages,i=this.computedCurrentPage,n=this.hideEllipsis,o=this.firstNumber,r=this.lastNumber,s=!1,a=!1,l=t,c=1;e<=t?l=e:i3?(n&&!r||(a=!0,l=t-(o?0:1)),l=Ys(l,t)):e-i+23?(n&&!o||(s=!0,l=t-(r?0:1)),c=e-l+1):(t>3&&(l=t-(n?0:2),s=!(n&&!o),a=!(n&&!r)),c=i-Xs(l/2)),c<1?(c=1,s=!1):c>e-l&&(c=e-l+1,a=!1),s&&o&&c<4&&(l+=2,c=1,s=!1);var u=c+l-1;return a&&r&&u>e-3&&(l+=u===e-2?2:3,a=!1),t<=3&&(o&&1===c?l=Ys(l+1,e,t+1):r&&e===c+l-1&&(c=Us(c-1,1),l=Ys(e-c+1,e,t+1))),{showFirstDots:s,showLastDots:a,numberOfLinks:l=Ys(l,e-c+1),startNumber:c}},pageList:function(){var t=this.paginationParams,e=t.numberOfLinks,i=t.startNumber,n=this.computedCurrentPage,o=function(t,e){return rr(e,(function(e,i){return{number:t+i,classes:null}}))}(i,e);if(o.length>3){var r=n-i,s="bv-d-xs-down-none";if(0===r)for(var a=3;ar+1;u--)o[u].classes=s}}return o}},watch:(Zb={},a(Zb,xg,(function(t,e){t!==e&&(this.currentPage=$g(t,this.localNumberOfPages))})),a(Zb,"currentPage",(function(t,e){t!==e&&this.$emit(Sg,t>0?t:null)})),a(Zb,"limit",(function(t,e){t!==e&&(this.localLimit=kg(t))})),Zb),created:function(){var t=this;this.localLimit=kg(this.limit),this.$nextTick((function(){t.currentPage=t.currentPage>t.localNumberOfPages?t.localNumberOfPages:t.currentPage}))},methods:{handleKeyNav:function(t){var e=t.keyCode,i=t.shiftKey;this.isNav||(e===Na||e===Wa?(Bs(t,{propagation:!1}),i?this.focusFirst():this.focusPrev()):e!==ja&&e!==Ra||(Bs(t,{propagation:!1}),i?this.focusLast():this.focusNext()))},getButtons:function(){return Pr("button.page-link, a.page-link",this.$el).filter((function(t){return Dr(t)}))},focusCurrent:function(){var t=this;this.$nextTick((function(){var e=t.getButtons().find((function(e){return lr(jr(e,"aria-posinset"),0)===t.computedCurrentPage}));ts(e)||t.focusFirst()}))},focusFirst:function(){var t=this;this.$nextTick((function(){var e=t.getButtons().find((function(t){return!Fr(t)}));ts(e)}))},focusLast:function(){var t=this;this.$nextTick((function(){var e=t.getButtons().reverse().find((function(t){return!Fr(t)}));ts(e)}))},focusPrev:function(){var t=this;this.$nextTick((function(){var e=t.getButtons(),i=e.indexOf($r());i>0&&!Fr(e[i-1])&&ts(e[i-1])}))},focusNext:function(){var t=this;this.$nextTick((function(){var e=t.getButtons(),i=e.indexOf($r());is,v=n<1?1:n>s?s:n,b={disabled:f,page:v,index:v-1},g=e.normalizeSlot(a,b)||vr(l)||t(),y=t(f?"span":r?ol:"button",{staticClass:"page-link",class:{"flex-grow-1":!r&&!f&&h},props:f||!r?{}:e.linkProps(n),attrs:{role:r?null:"menuitem",type:r||f?null:"button",tabindex:f||r?null:"-1","aria-label":o,"aria-controls":e.ariaControls||null,"aria-disabled":f?"true":null},on:f?{}:{"!click":function(t){e.onClick(t,n)},keydown:Bg}},[g]);return t("li",{key:d,staticClass:"page-item",class:[{disabled:f,"flex-fill":h,"d-flex":h&&!r&&!f},c],attrs:{role:r?null:"presentation","aria-hidden":f?"true":null}},[y])},b=function(i){return t("li",{staticClass:"page-item",class:["disabled","bv-d-xs-down-none",h?"flex-fill":"",e.ellipsisClass],attrs:{role:"separator"},key:"ellipsis-".concat(i?"last":"first")},[t("span",{staticClass:"page-link"},[e.normalizeSlot("ellipsis-text")||vr(e.ellipsisText)||t()])])},g=function(o,a){var l=o.number,c=p(l)&&!m,u=i?null:c||m&&0===a?"0":"-1",d={role:r?null:"menuitemradio",type:r||i?null:"button","aria-disabled":i?"true":null,"aria-controls":e.ariaControls||null,"aria-label":gs(n)?n(l):"".concat(Ot(n)?n():n," ").concat(l),"aria-checked":r?null:c?"true":"false","aria-current":r&&c?"page":null,"aria-posinset":r?null:l,"aria-setsize":r?null:s,tabindex:r?null:u},f=vr(e.makePage(l)),v={page:l,index:l-1,content:f,active:c,disabled:i},b=t(i?"span":r?ol:"button",{props:i||!r?{}:e.linkProps(l),staticClass:"page-link",class:{"flex-grow-1":!r&&!i&&h},attrs:d,on:i?{}:{"!click":function(t){e.onClick(t,l)},keydown:Bg}},[e.normalizeSlot("page",v)||f]);return t("li",{staticClass:"page-item",class:[{disabled:i,active:c,"flex-fill":h,"d-flex":h&&!r&&!i},o.classes,e.pageClass],attrs:{role:r?null:"presentation"},key:"page-".concat(l)},[b])},y=t();this.firstNumber||this.hideGotoEndButtons||(y=v(1,this.labelFirstPage,"first-text",this.firstText,this.firstClass,1,"pagination-goto-first")),f.push(y),f.push(v(a-1,this.labelPrevPage,"prev-text",this.prevText,this.prevClass,1,"pagination-goto-prev")),f.push(this.firstNumber&&1!==l[0]?g({number:1},0):t()),f.push(u?b(!1):t()),this.pageList.forEach((function(t,i){var n=u&&e.firstNumber&&1!==l[0]?1:0;f.push(g(t,i+n))})),f.push(d?b(!0):t()),f.push(this.lastNumber&&l[l.length-1]!==s?g({number:s},-1):t()),f.push(v(a+1,this.labelNextPage,"next-text",this.nextText,this.nextClass,s,"pagination-goto-next"));var w=t();this.lastNumber||this.hideGotoEndButtons||(w=v(s,this.labelLastPage,"last-text",this.lastText,this.lastClass,s,"pagination-goto-last")),f.push(w);var T=t("ul",{staticClass:"pagination",class:["b-pagination",this.btnSize,this.alignment,this.styleClass],attrs:{role:r?null:"menubar","aria-disabled":i?"true":"false","aria-label":r?null:o||null},on:r?{}:{keydown:this.handleKeyNav},ref:"ul"},f);return r?t("nav",{attrs:{"aria-disabled":i?"true":null,"aria-hidden":i?"true":"false","aria-label":r&&o||null}},[T]):T}}),Fg=function(t){return Us(lr(t)||20,1)},Ig=function(t){return Us(lr(t)||0,0)},Pg=vs(ee(c(c({},_g),{},{ariaControls:hs(go),perPage:hs(_o,20),totalRows:hs(_o,0)})),Ji),Og=i.default.extend({name:Ji,mixins:[Dg],props:Pg,computed:{numberOfPages:function(){var t=Ks(Ig(this.totalRows)/Fg(this.perPage));return t<1?1:t},pageSizeNumberOfPages:function(){return{perPage:Fg(this.perPage),totalRows:Ig(this.totalRows),numberOfPages:this.numberOfPages}}},watch:{pageSizeNumberOfPages:function(t,e){Pt(e)||(t.perPage!==e.perPage&&t.totalRows===e.totalRows||t.numberOfPages!==e.numberOfPages&&this.currentPage>t.numberOfPages)&&(this.currentPage=1),this.localNumberOfPages=t.numberOfPages}},created:function(){var t=this;this.localNumberOfPages=this.numberOfPages;var e=lr(this[xg],0);e>0?this.currentPage=e:this.$nextTick((function(){t.currentPage=0}))},methods:{onClick:function(t,e){var i=this;if(e!==this.currentPage){var n=t.target,o=new BvEvent(Kn,{cancelable:!0,vueTarget:this,target:n});this.$emit(o.type,o,e),o.defaultPrevented||(this.currentPage=e,this.$emit($n,this.currentPage),this.$nextTick((function(){Dr(n)&&i.$el.contains(n)?ts(n):i.focusCurrent()})))}},makePage:function(t){return t},linkProps:function(){return{}}}}),Vg=me({components:{BPagination:Og}}),Eg=Qt(nl,["event","routerTag"]),Lg=vs(ee(c(c(c({},_g),Eg),{},{baseUrl:hs(go,"/"),linkGen:hs(po),noPageDetect:hs(ho,!1),numberOfPages:hs(_o,1,(function(t){return!(lr(t,0)<1)||(le('Prop "number-of-pages" must be a number greater than "0"',Qi),!1)})),pageGen:hs(po),pages:hs(uo),useRouter:hs(ho,!1)})),Qi),Ag=i.default.extend({name:Qi,mixins:[Dg],props:Lg,computed:{isNav:function(){return!0},computedValue:function(){var t=lr(this.value,0);return t<1?null:t}},watch:{numberOfPages:function(){var t=this;this.$nextTick((function(){t.setNumberOfPages()}))},pages:function(){var t=this;this.$nextTick((function(){t.setNumberOfPages()}))}},created:function(){this.setNumberOfPages()},mounted:function(){var t=this;this.$router&&this.$watch("$route",(function(){t.$nextTick((function(){xr((function(){t.guessCurrentPage()}))}))}))},methods:{setNumberOfPages:function(){var t,e=this;Rt(this.pages)&&this.pages.length>0?this.localNumberOfPages=this.pages.length:this.localNumberOfPages=(t=this.numberOfPages,Us(lr(t,0),1)),this.$nextTick((function(){e.guessCurrentPage()}))},onClick:function(t,e){var i=this;if(e!==this.currentPage){var n=t.currentTarget||t.target,o=new BvEvent(Kn,{cancelable:!0,vueTarget:this,target:n});this.$emit(o.type,o,e),o.defaultPrevented||(xr((function(){i.currentPage=e,i.$emit($n,e)})),this.$nextTick((function(){es(n)})))}},getPageInfo:function(t){if(!Rt(this.pages)||0===this.pages.length||Ft(this.pages[t-1])){var e="".concat(this.baseUrl).concat(t);return{link:this.useRouter?{path:e}:e,text:vr(t)}}var i=this.pages[t-1];if(Mt(i)){var n=i.link;return{link:Mt(n)?n:this.useRouter?{path:n}:n,text:vr(i.text||t)}}return{link:vr(i),text:vr(t)}},makePage:function(t){var e=this.pageGen,i=this.getPageInfo(t);return gs(e)?e(t,i):i.text},makeLink:function(t){var e=this.linkGen,i=this.getPageInfo(t);return gs(e)?e(t,i):i.link},linkProps:function(t){var e=ps(Eg,this),i=this.makeLink(t);return this.useRouter||Mt(i)?e.to=i:e.href=i,e},resolveLink:function(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";try{(t=document.createElement("a")).href=ua({to:e},"a","/","/"),document.body.appendChild(t);var i=t,n=i.pathname,o=i.hash,r=i.search;return document.body.removeChild(t),{path:n,hash:o,query:aa(r)}}catch(e){try{t&&t.parentNode&&t.parentNode.removeChild(t)}catch(t){}return{}}},resolveRoute:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";try{var e=this.$router.resolve(t,this.$route).route;return{path:e.path,hash:e.hash,query:e.query}}catch(t){return{}}},guessCurrentPage:function(){var t=this.$router,e=this.$route,i=this.computedValue;if(!this.noPageDetect&&!i&&(M||!M&&t))for(var n=t&&e?{path:e.path,hash:e.hash,query:e.query}:{},o=M?window.location||document.location:null,r=o?{path:o.pathname,hash:o.hash,query:aa(o.search)}:{},s=1;!i&&s<=this.localNumberOfPages;s++){var a=this.makeLink(s);i=t&&(Mt(a)||this.useRouter)?Ua(this.resolveRoute(a),n)?s:null:M?Ua(this.resolveLink(a),r)?s:null:-1}this.currentPage=i>0?i:0}}}),Rg=me({components:{BPaginationNav:Ag}}),Mg={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",TOPLEFT:"top",TOPRIGHT:"top",RIGHTTOP:"right",RIGHTBOTTOM:"right",BOTTOMLEFT:"bottom",BOTTOMRIGHT:"bottom",LEFTTOP:"left",LEFTBOTTOM:"left"},Hg={AUTO:0,TOPLEFT:-1,TOP:0,TOPRIGHT:1,RIGHTTOP:-1,RIGHT:0,RIGHTBOTTOM:1,BOTTOMLEFT:-1,BOTTOM:0,BOTTOMRIGHT:1,LEFTTOP:-1,LEFT:0,LEFTBOTTOM:1},zg={arrowPadding:hs(_o,6),boundary:hs([HTMLElement,go],"scrollParent"),boundaryPadding:hs(_o,5),fallbackPlacement:hs(Co,"flip"),offset:hs(_o,0),placement:hs(go,"top"),target:hs([HTMLElement,SVGElement])},Ng=i.default.extend({name:"BVPopper",props:zg,data:function(){return{noFade:!1,localShow:!0,attachment:this.getAttachment(this.placement)}},computed:{templateType:function(){return"unknown"},popperConfig:function(){var t=this,e=this.placement;return{placement:this.getAttachment(e),modifiers:{offset:{offset:this.getOffset(e)},flip:{behavior:this.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{padding:this.boundaryPadding,boundariesElement:this.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t.popperPlacementChange(e)},onUpdate:function(e){t.popperPlacementChange(e)}}}},created:function(){var t=this;this.$_popper=null,this.localShow=!0,this.$on(to,(function(e){t.popperCreate(e)}));var e=function(){t.$nextTick((function(){xr((function(){t.$destroy()}))}))};this.$parent.$once(ro,e),this.$once(zn,e)},beforeMount:function(){this.attachment=this.getAttachment(this.placement)},updated:function(){this.updatePopper()},beforeDestroy:function(){this.destroyPopper()},destroyed:function(){var t=this.$el;t&&t.parentNode&&t.parentNode.removeChild(t)},methods:{hide:function(){this.localShow=!1},getAttachment:function(t){return Mg[String(t).toUpperCase()]||"auto"},getOffset:function(t){if(!this.offset){var e=this.$refs.arrow||Or(".arrow",this.$el),i=cr(Kr(e).width,0)+cr(this.arrowPadding,0);switch(Hg[String(t).toUpperCase()]||0){case 1:return"+50%p - ".concat(i,"px");case-1:return"-50%p + ".concat(i,"px");default:return 0}}return this.offset},popperCreate:function(t){this.destroyPopper(),this.$_popper=new mh(this.target,t,this.popperConfig)},destroyPopper:function(){this.$_popper&&this.$_popper.destroy(),this.$_popper=null},updatePopper:function(){this.$_popper&&this.$_popper.scheduleUpdate()},popperPlacementChange:function(t){this.attachment=this.getAttachment(t.placement)},renderTemplate:function(t){return t("div")}},render:function(t){var e=this,i=this.noFade;return t(Ls,{props:{appear:!0,noFade:i},on:{beforeEnter:function(t){return e.$emit(to,t)},afterEnter:function(t){return e.$emit(eo,t)},beforeLeave:function(t){return e.$emit(Nn,t)},afterLeave:function(t){return e.$emit(zn,t)}}},[this.localShow?this.renderTemplate(t):t()])}}),jg={html:hs(ho,!1),id:hs(go)},Gg=i.default.extend({name:"BVTooltipTemplate",extends:Ng,mixins:[ib],props:jg,data:function(){return{title:"",content:"",variant:null,customClass:null,interactive:!0}},computed:{templateType:function(){return"tooltip"},templateClasses:function(){var t,e=this.variant,i=this.attachment,n=this.templateType;return[(t={noninteractive:!this.interactive},a(t,"b-".concat(n,"-").concat(e),e),a(t,"bs-".concat(n,"-").concat(i),i),t),this.customClass]},templateAttributes:function(){var t=this.id;return c(c({},this.$parent.$parent.$attrs),{},{id:t,role:"tooltip",tabindex:"-1"},this.scopedStyleAttrs)},templateListeners:function(){var t=this;return{mouseenter:function(e){t.$emit(Wn,e)},mouseleave:function(e){t.$emit(Yn,e)},focusin:function(e){t.$emit(Rn,e)},focusout:function(e){t.$emit(Mn,e)}}}},methods:{renderTemplate:function(t){var e=this.title,i=Ot(e)?e({}):e,n=this.html&&!Ot(e)?{innerHTML:e}:{};return t("div",{staticClass:"tooltip b-tooltip",class:this.templateClasses,attrs:this.templateAttributes,on:this.templateListeners},[t("div",{staticClass:"arrow",ref:"arrow"}),t("div",{staticClass:"tooltip-inner",domProps:n},[i])])}}}),Wg=".modal-content",Yg=Ds(Ni,zn),Ug=[Wg,".b-sidebar"].join(", "),qg="data-original-title",Kg={title:"",content:"",variant:null,customClass:null,triggers:"",placement:"auto",fallbackPlacement:"flip",target:null,container:null,noFade:!1,boundary:"scrollParent",boundaryPadding:5,offset:0,delay:0,arrowPadding:6,interactive:!0,disabled:!1,id:null,html:!1},Xg=i.default.extend({name:"BVTooltip",mixins:[Ja],data:function(){return c(c({},Kg),{},{activeTrigger:{hover:!1,click:!1,focus:!1},localShow:!1})},computed:{templateType:function(){return"tooltip"},computedId:function(){return this.id||"__bv_".concat(this.templateType,"_").concat(this._uid,"__")},computedDelay:function(){var t={show:0,hide:0};return Ht(this.delay)?(t.show=Us(lr(this.delay.show,0),0),t.hide=Us(lr(this.delay.hide,0),0)):(Lt(this.delay)||Et(this.delay))&&(t.show=t.hide=Us(lr(this.delay,0),0)),t},computedTriggers:function(){return or(this.triggers).filter(ne).join(" ").trim().toLowerCase().split(/\s+/).sort()},isWithActiveTrigger:function(){for(var t in this.activeTrigger)if(this.activeTrigger[t])return!0;return!1},computedTemplateData:function(){return{title:this.title,content:this.content,variant:this.variant,customClass:this.customClass,noFade:this.noFade,interactive:this.interactive}}},watch:{computedTriggers:function(t,e){var i=this;Ua(t,e)||this.$nextTick((function(){i.unListen(),e.forEach((function(e){nr(t,e)||i.activeTrigger[e]&&(i.activeTrigger[e]=!1)})),i.listen()}))},computedTemplateData:function(){this.handleTemplateUpdate()},title:function(t,e){t===e||t||this.hide()},disabled:function(t){t?this.disable():this.enable()}},created:function(){var t=this;this.$_tip=null,this.$_hoverTimeout=null,this.$_hoverState="",this.$_visibleInterval=null,this.$_enabled=!this.disabled,this.$_noop=su.bind(this),this.$parent&&this.$parent.$once(oo,(function(){t.$nextTick((function(){xr((function(){t.$destroy()}))}))})),this.$nextTick((function(){var e=t.getTarget();e&&Lr(document.body,e)?(t.scopeId=eb(t.$parent),t.listen()):le(Et(t.target)?'Unable to find target element by ID "#'.concat(t.target,'" in document.'):"The provided target is no valid HTML element.",t.templateType)}))},updated:function(){this.$nextTick(this.handleTemplateUpdate)},deactivated:function(){this.forceHide()},beforeDestroy:function(){this.unListen(),this.setWhileOpenListeners(!1),this.clearHoverTimeout(),this.clearVisibilityInterval(),this.destroyTemplate(),this.$_noop=null},methods:{getTemplate:function(){return Gg},updateData:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=!1;Kt(Kg).forEach((function(n){Ft(e[n])||t[n]===e[n]||(t[n]=e[n],"title"===n&&(i=!0))})),i&&this.localShow&&this.fixTitle()},createTemplateAndShow:function(){var t=this.getContainer(),e=this.getTemplate(),i=this.$_tip=new e({parent:this,propsData:{id:this.computedId,html:this.html,placement:this.placement,fallbackPlacement:this.fallbackPlacement,target:this.getPlacementTarget(),boundary:this.getBoundary(),offset:lr(this.offset,0),arrowPadding:lr(this.arrowPadding,0),boundaryPadding:lr(this.boundaryPadding,0)}});this.handleTemplateUpdate(),i.$once(to,this.onTemplateShow),i.$once(eo,this.onTemplateShown),i.$once(Nn,this.onTemplateHide),i.$once(zn,this.onTemplateHidden),i.$once(ro,this.destroyTemplate),i.$on(Rn,this.handleEvent),i.$on(Mn,this.handleEvent),i.$on(Wn,this.handleEvent),i.$on(Yn,this.handleEvent),i.$mount(t.appendChild(document.createElement("div")))},hideTemplate:function(){this.$_tip&&this.$_tip.hide(),this.clearActiveTriggers(),this.$_hoverState=""},destroyTemplate:function(){this.setWhileOpenListeners(!1),this.clearHoverTimeout(),this.$_hoverState="",this.clearActiveTriggers(),this.localPlacementTarget=null;try{this.$_tip.$destroy()}catch(t){}this.$_tip=null,this.removeAriaDescribedby(),this.restoreTitle(),this.localShow=!1},getTemplateElement:function(){return this.$_tip?this.$_tip.$el:null},handleTemplateUpdate:function(){var t=this,e=this.$_tip;if(e){["title","content","variant","customClass","noFade","interactive"].forEach((function(i){e[i]!==t[i]&&(e[i]=t[i])}))}},show:function(){var t=this.getTarget();if(t&&Lr(document.body,t)&&Dr(t)&&!this.dropdownOpen()&&(!Pt(this.title)&&""!==this.title||!Pt(this.content)&&""!==this.content)&&!this.$_tip&&!this.localShow){this.localShow=!0;var e=this.buildEvent(to,{cancelable:!0});this.emitEvent(e),e.defaultPrevented?this.destroyTemplate():(this.fixTitle(),this.addAriaDescribedby(),this.createTemplateAndShow())}},hide:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this.getTemplateElement();if(e&&this.localShow){var i=this.buildEvent(Nn,{cancelable:!t});this.emitEvent(i),i.defaultPrevented||this.hideTemplate()}else this.restoreTitle()},forceHide:function(){this.getTemplateElement()&&this.localShow&&(this.setWhileOpenListeners(!1),this.clearHoverTimeout(),this.$_hoverState="",this.clearActiveTriggers(),this.$_tip&&(this.$_tip.noFade=!0),this.hide(!0))},enable:function(){this.$_enabled=!0,this.emitEvent(this.buildEvent(En))},disable:function(){this.$_enabled=!1,this.emitEvent(this.buildEvent(On))},onTemplateShow:function(){this.setWhileOpenListeners(!0)},onTemplateShown:function(){var t=this.$_hoverState;this.$_hoverState="","out"===t&&this.leave(null),this.emitEvent(this.buildEvent(eo))},onTemplateHide:function(){this.setWhileOpenListeners(!1)},onTemplateHidden:function(){this.destroyTemplate(),this.emitEvent(this.buildEvent(zn))},getTarget:function(){var t=this.target;return Et(t)?t=Ar(t.replace(/^#/,"")):Ot(t)?t=t():t&&(t=t.$el||t),kr(t)?t:null},getPlacementTarget:function(){return this.getTarget()},getTargetId:function(){var t=this.getTarget();return t&&t.id?t.id:null},getContainer:function(){var t=!!this.container&&(this.container.$el||this.container),e=document.body,i=this.getTarget();return!1===t?Er(Ug,i)||e:Et(t)&&Ar(t.replace(/^#/,""))||e},getBoundary:function(){return this.boundary?this.boundary.$el||this.boundary:"scrollParent"},isInModal:function(){var t=this.getTarget();return t&&Er(Wg,t)},isDropdown:function(){var t=this.getTarget();return t&&Hr(t,"dropdown")},dropdownOpen:function(){var t=this.getTarget();return this.isDropdown()&&t&&Or(".dropdown-menu.show",t)},clearHoverTimeout:function(){clearTimeout(this.$_hoverTimeout),this.$_hoverTimeout=null},clearVisibilityInterval:function(){clearInterval(this.$_visibleInterval),this.$_visibleInterval=null},clearActiveTriggers:function(){for(var t in this.activeTrigger)this.activeTrigger[t]=!1},addAriaDescribedby:function(){var t=this.getTarget(),e=jr(t,"aria-describedby")||"";e=e.split(/\s+/).concat(this.computedId).join(" ").trim(),zr(t,"aria-describedby",e)},removeAriaDescribedby:function(){var t=this,e=this.getTarget(),i=jr(e,"aria-describedby")||"";(i=i.split(/\s+/).filter((function(e){return e!==t.computedId})).join(" ").trim())?zr(e,"aria-describedby",i):Nr(e,"aria-describedby")},fixTitle:function(){var t=this.getTarget();if(Gr(t,"title")){var e=jr(t,"title");zr(t,"title",""),e&&zr(t,qg,e)}},restoreTitle:function(){var t=this.getTarget();if(Gr(t,qg)){var e=jr(t,qg);Nr(t,qg),e&&zr(t,"title",e)}},buildEvent:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new BvEvent(t,c({cancelable:!1,target:this.getTarget(),relatedTarget:this.getTemplateElement()||null,componentId:this.computedId,vueTarget:this},e))},emitEvent:function(t){var e=t.type;this.emitOnRoot(Ds(this.templateType,e),t),this.$emit(e,t)},listen:function(){var t=this,e=this.getTarget();e&&(this.setRootListener(!0),this.computedTriggers.forEach((function(i){"click"===i?Ss(e,"click",t.handleEvent,lo):"focus"===i?(Ss(e,"focusin",t.handleEvent,lo),Ss(e,"focusout",t.handleEvent,lo)):"blur"===i?Ss(e,"focusout",t.handleEvent,lo):"hover"===i&&(Ss(e,"mouseenter",t.handleEvent,lo),Ss(e,"mouseleave",t.handleEvent,lo))}),this))},unListen:function(){var t=this,e=this.getTarget();this.setRootListener(!1),["click","focusin","focusout","mouseenter","mouseleave"].forEach((function(i){e&&ks(e,i,t.handleEvent,lo)}),this)},setRootListener:function(t){var e=this.$root;if(e){var i=t?"$on":"$off",n=this.templateType;e[i](Fs(n,Nn),this.doHide),e[i](Fs(n,to),this.doShow),e[i](Fs(n,Pn),this.doDisable),e[i](Fs(n,Vn),this.doEnable)}},setWhileOpenListeners:function(t){this.setModalListener(t),this.setDropdownListener(t),this.visibleCheck(t),this.setOnTouchStartListener(t)},visibleCheck:function(t){var e=this;this.clearVisibilityInterval();var i=this.getTarget(),n=this.getTemplateElement();t&&(this.$_visibleInterval=setInterval((function(){!n||!e.localShow||i.parentNode&&Dr(i)||e.forceHide()}),100))},setModalListener:function(t){this.isInModal()&&this.$root[t?"$on":"$off"](Yg,this.forceHide)},setOnTouchStartListener:function(t){var e=this;"ontouchstart"in document.documentElement&&ir(document.body.children).forEach((function(i){$s(t,i,"mouseover",e.$_noop)}))},setDropdownListener:function(t){var e=this.getTarget();e&&this.$root&&this.isDropdown&&e.__vue__&&e.__vue__[t?"$on":"$off"](eo,this.forceHide)},handleEvent:function(t){var e=this.getTarget();if(e&&!Fr(e)&&this.$_enabled&&!this.dropdownOpen()){var i=t.type,n=this.computedTriggers;if("click"===i&&nr(n,"click"))this.click(t);else if("mouseenter"===i&&nr(n,"hover"))this.enter(t);else if("focusin"===i&&nr(n,"focus"))this.enter(t);else if("focusout"===i&&(nr(n,"focus")||nr(n,"blur"))||"mouseleave"===i&&nr(n,"hover")){var o=this.getTemplateElement(),r=t.target,s=t.relatedTarget;if(o&&Lr(o,r)&&Lr(e,s)||o&&Lr(e,r)&&Lr(o,s)||o&&Lr(o,r)&&Lr(o,s)||Lr(e,r)&&Lr(e,s))return;this.leave(t)}}},doHide:function(t){t&&this.getTargetId()!==t&&this.computedId!==t||this.forceHide()},doShow:function(t){t&&this.getTargetId()!==t&&this.computedId!==t||this.show()},doDisable:function(t){t&&this.getTargetId()!==t&&this.computedId!==t||this.disable()},doEnable:function(t){t&&this.getTargetId()!==t&&this.computedId!==t||this.enable()},click:function(t){this.$_enabled&&!this.dropdownOpen()&&(ts(t.currentTarget),this.activeTrigger.click=!this.activeTrigger.click,this.isWithActiveTrigger?this.enter(null):this.leave(null))},toggle:function(){this.$_enabled&&!this.dropdownOpen()&&(this.localShow?this.leave(null):this.enter(null))},enter:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;e&&(this.activeTrigger["focusin"===e.type?"focus":"hover"]=!0),this.localShow||"in"===this.$_hoverState?this.$_hoverState="in":(this.clearHoverTimeout(),this.$_hoverState="in",this.computedDelay.show?(this.fixTitle(),this.$_hoverTimeout=setTimeout((function(){"in"===t.$_hoverState?t.show():t.localShow||t.restoreTitle()}),this.computedDelay.show)):this.show())},leave:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;e&&(this.activeTrigger["focusout"===e.type?"focus":"hover"]=!1,"focusout"===e.type&&nr(this.computedTriggers,"blur")&&(this.activeTrigger.click=!1,this.activeTrigger.hover=!1)),this.isWithActiveTrigger||(this.clearHoverTimeout(),this.$_hoverState="out",this.computedDelay.hide?this.$_hoverTimeout=setTimeout((function(){"out"===t.$_hoverState&&t.hide()}),this.computedDelay.hide):this.hide())}}}),Zg="disabled",Jg="update:disabled",Qg="show",ty=vs((a(Jb={boundary:hs([HTMLElement,vo,go],"scrollParent"),boundaryPadding:hs(_o,50),container:hs([HTMLElement,vo,go]),customClass:hs(go),delay:hs(Do,50)},Zg,hs(ho,!1)),a(Jb,"fallbackPlacement",hs(Co,"flip")),a(Jb,"id",hs(go)),a(Jb,"noFade",hs(ho,!1)),a(Jb,"noninteractive",hs(ho,!1)),a(Jb,"offset",hs(_o,0)),a(Jb,"placement",hs(go,"top")),a(Jb,Qg,hs(ho,!1)),a(Jb,"target",hs([HTMLElement,SVGElement,po,vo,go],void 0,!0)),a(Jb,"title",hs(go)),a(Jb,"triggers",hs(Co,"hover focus")),a(Jb,"variant",hs(go)),Jb),Sn),ey=i.default.extend({name:Sn,mixins:[Cs],inheritAttrs:!1,props:ty,data:function(){return{localShow:this.show,localTitle:"",localContent:""}},computed:{templateData:function(){return c({title:this.localTitle,content:this.localContent,interactive:!this.noninteractive},Jt(this.$props,["boundary","boundaryPadding","container","customClass","delay","fallbackPlacement","id","noFade","offset","placement","target","target","triggers","variant",Zg]))},templateTitleContent:function(){return{title:this.title,content:this.content}}},watch:(Qb={},a(Qb,Qg,(function(t,e){t!==e&&t!==this.localShow&&this.$_toolpop&&(t?this.$_toolpop.show():this.$_toolpop.forceHide())})),a(Qb,Zg,(function(t){t?this.doDisable():this.doEnable()})),a(Qb,"localShow",(function(t){this.$emit("update:show",t)})),a(Qb,"templateData",(function(){var t=this;this.$nextTick((function(){t.$_toolpop&&t.$_toolpop.updateData(t.templateData)}))})),a(Qb,"templateTitleContent",(function(){this.$nextTick(this.updateContent)})),Qb),created:function(){this.$_toolpop=null},updated:function(){this.$nextTick(this.updateContent)},beforeDestroy:function(){this.$off(qn,this.doOpen),this.$off(_n,this.doClose),this.$off(Pn,this.doDisable),this.$off(Vn,this.doEnable),this.$_toolpop&&(this.$_toolpop.$destroy(),this.$_toolpop=null)},mounted:function(){var t=this;this.$nextTick((function(){var e=t.getComponent();t.updateContent();var i=eb(t)||eb(t.$parent),n=t.$_toolpop=new e({parent:t,_scopeId:i||void 0});n.updateData(t.templateData),n.$on(to,t.onShow),n.$on(eo,t.onShown),n.$on(Nn,t.onHide),n.$on(zn,t.onHidden),n.$on(On,t.onDisabled),n.$on(En,t.onEnabled),t.disabled&&t.doDisable(),t.$on(qn,t.doOpen),t.$on(_n,t.doClose),t.$on(Pn,t.doDisable),t.$on(Vn,t.doEnable),t.localShow&&n.show()}))},methods:{getComponent:function(){return Xg},updateContent:function(){this.setTitle(this.normalizeSlot()||this.title)},setTitle:function(t){t=Pt(t)?"":t,this.localTitle!==t&&(this.localTitle=t)},setContent:function(t){t=Pt(t)?"":t,this.localContent!==t&&(this.localContent=t)},onShow:function(t){this.$emit(to,t),t&&(this.localShow=!t.defaultPrevented)},onShown:function(t){this.localShow=!0,this.$emit(eo,t)},onHide:function(t){this.$emit(Nn,t)},onHidden:function(t){this.$emit(zn,t),this.localShow=!1},onDisabled:function(t){t&&t.type===On&&(this.$emit(Jg,!0),this.$emit(On,t))},onEnabled:function(t){t&&t.type===En&&(this.$emit(Jg,!1),this.$emit(En,t))},doOpen:function(){!this.localShow&&this.$_toolpop&&this.$_toolpop.show()},doClose:function(){this.localShow&&this.$_toolpop&&this.$_toolpop.hide()},doDisable:function(){this.$_toolpop&&this.$_toolpop.disable()},doEnable:function(){this.$_toolpop&&this.$_toolpop.enable()}},render:function(t){return t()}}),iy=i.default.extend({name:"BVPopoverTemplate",extends:Gg,computed:{templateType:function(){return"popover"}},methods:{renderTemplate:function(t){var e=this.title,i=this.content,n=Ot(e)?e({}):e,o=Ot(i)?i({}):i,r=this.html&&!Ot(e)?{innerHTML:e}:{},s=this.html&&!Ot(i)?{innerHTML:i}:{};return t("div",{staticClass:"popover b-popover",class:this.templateClasses,attrs:this.templateAttributes,on:this.templateListeners},[t("div",{staticClass:"arrow",ref:"arrow"}),Pt(n)||""===n?t():t("h3",{staticClass:"popover-header",domProps:r},[n]),Pt(o)||""===o?t():t("div",{staticClass:"popover-body",domProps:s},[o])])}}}),ny=i.default.extend({name:"BVPopover",extends:Xg,computed:{templateType:function(){return"popover"}},methods:{getTemplate:function(){return iy}}}),oy=vs(ee(c(c({},ty),{},{content:hs(go),placement:hs(go,"right"),triggers:hs(Co,Bn)})),tn),ry=i.default.extend({name:tn,extends:ey,inheritAttrs:!1,props:oy,methods:{getComponent:function(){return ny},updateContent:function(){this.setContent(this.normalizeSlot()||this.content),this.setTitle(this.normalizeSlot(tr)||this.title)}}}),sy="__BV_Popover__",ay={focus:!0,hover:!0,click:!0,blur:!0,manual:!0},ly=/^html$/i,cy=/^nofade$/i,uy=/^(auto|top(left|right)?|bottom(left|right)?|left(top|bottom)?|right(top|bottom)?)$/i,dy=/^(window|viewport|scrollParent)$/i,hy=/^d\d+$/i,fy=/^ds\d+$/i,py=/^dh\d+$/i,my=/^o-?\d+$/i,vy=/^v-.+$/i,by=/\s+/,gy=function(t,e,i){if(M){var n=function(t,e){var i={title:void 0,content:void 0,trigger:"",placement:"right",fallbackPlacement:"flip",container:!1,animation:!0,offset:0,disabled:!1,id:null,html:!1,delay:rs(tn,"delay",50),boundary:String(rs(tn,"boundary","scrollParent")),boundaryPadding:lr(rs(tn,"boundaryPadding",5),0),variant:rs(tn,"variant"),customClass:rs(tn,"customClass")};if(Et(t.value)||Lt(t.value)||Ot(t.value)?i.content=t.value:Ht(t.value)&&(i=c(c({},i),t.value)),t.arg&&(i.container="#".concat(t.arg)),Ft(i.title)){var n=e.data||{};i.title=n.attrs&&!Pt(n.attrs.title)?n.attrs.title:void 0}Ht(i.delay)||(i.delay={show:lr(i.delay,0),hide:lr(i.delay,0)}),Kt(t.modifiers).forEach((function(t){if(ly.test(t))i.html=!0;else if(cy.test(t))i.animation=!1;else if(uy.test(t))i.placement=t;else if(dy.test(t))t="scrollparent"===t?"scrollParent":t,i.boundary=t;else if(hy.test(t)){var e=lr(t.slice(1),0);i.delay.show=e,i.delay.hide=e}else fy.test(t)?i.delay.show=lr(t.slice(2),0):py.test(t)?i.delay.hide=lr(t.slice(2),0):my.test(t)?i.offset=lr(t.slice(1),0):vy.test(t)&&(i.variant=t.slice(2)||null)}));var o={};return or(i.trigger||"").filter(ne).join(" ").trim().toLowerCase().split(by).forEach((function(t){ay[t]&&(o[t]=!0)})),Kt(t.modifiers).forEach((function(t){t=t.toLowerCase(),ay[t]&&(o[t]=!0)})),i.trigger=Kt(o).join(" "),"blur"===i.trigger&&(i.trigger="focus"),i.trigger||(i.trigger="click"),i}(e,i);if(!t[sy]){var o=i.context;t[sy]=new ny({parent:o,_scopeId:eb(o,void 0)}),t[sy].__bv_prev_data__={},t[sy].$on(to,(function(){var e={};Ot(n.title)&&(e.title=n.title(t)),Ot(n.content)&&(e.content=n.content(t)),Kt(e).length>0&&t[sy].updateData(e)}))}var r={title:n.title,content:n.content,triggers:n.trigger,placement:n.placement,fallbackPlacement:n.fallbackPlacement,variant:n.variant,customClass:n.customClass,container:n.container,boundary:n.boundary,delay:n.delay,offset:n.offset,noFade:!n.animation,id:n.id,disabled:n.disabled,html:n.html},s=t[sy].__bv_prev_data__;if(t[sy].__bv_prev_data__=r,!Ua(r,s)){var a={target:t};Kt(r).forEach((function(e){r[e]!==s[e]&&(a[e]="title"!==e&&"content"!==e||!Ot(r[e])?r[e]:r[e](t))})),t[sy].updateData(a)}}},yy=me({directives:{VBPopover:{bind:function(t,e,i){gy(t,e,i)},componentUpdated:function(t,e,i){i.context.$nextTick((function(){gy(t,e,i)}))},unbind:function(t){!function(t){t[sy]&&(t[sy].$destroy(),t[sy]=null),delete t[sy]}(t)}}}}),wy=me({components:{BPopover:ry},plugins:{VBPopoverPlugin:yy}}),Ty=vs({animated:hs(ho,null),label:hs(go),labelHtml:hs(go),max:hs(_o,null),precision:hs(_o,null),showProgress:hs(ho,null),showValue:hs(ho,null),striped:hs(ho,null),value:hs(_o,0),variant:hs(go)},nn),Cy=i.default.extend({name:nn,mixins:[Cs],inject:{bvProgress:{default:function(){return{}}}},props:Ty,computed:{progressBarClasses:function(){var t=this.computedAnimated,e=this.computedVariant;return[e?"bg-".concat(e):"",this.computedStriped||t?"progress-bar-striped":"",t?"progress-bar-animated":""]},progressBarStyles:function(){return{width:this.computedValue/this.computedMax*100+"%"}},computedValue:function(){return cr(this.value,0)},computedMax:function(){var t=cr(this.max)||cr(this.bvProgress.max,0);return t>0?t:100},computedPrecision:function(){return Us(lr(this.precision,lr(this.bvProgress.precision,0)),0)},computedProgress:function(){var t=this.computedPrecision,e=Zs(10,t);return ur(100*e*this.computedValue/this.computedMax/e,t)},computedVariant:function(){return this.variant||this.bvProgress.variant},computedStriped:function(){return Vt(this.striped)?this.striped:this.bvProgress.striped||!1},computedAnimated:function(){return Vt(this.animated)?this.animated:this.bvProgress.animated||!1},computedShowProgress:function(){return Vt(this.showProgress)?this.showProgress:this.bvProgress.showProgress||!1},computedShowValue:function(){return Vt(this.showValue)?this.showValue:this.bvProgress.showValue||!1}},render:function(t){var e,i=this.label,n=this.labelHtml,o=this.computedValue,r=this.computedPrecision,s={};return this.hasNormalizedSlot()?e=this.normalizeSlot():i||n?s=Fl(n,i):this.computedShowProgress?e=this.computedProgress:this.computedShowValue&&(e=ur(o,r)),t("div",{staticClass:"progress-bar",class:this.progressBarClasses,style:this.progressBarStyles,attrs:{role:"progressbar","aria-valuemin":"0","aria-valuemax":vr(this.computedMax),"aria-valuenow":ur(o,r)},domProps:s},e)}}),xy=Qt(Ty,["label","labelHtml"]),Sy=vs(ee(c(c({},xy),{},{animated:hs(ho,!1),height:hs(go),max:hs(_o,100),precision:hs(_o,0),showProgress:hs(ho,!1),showValue:hs(ho,!1),striped:hs(ho,!1)})),en),ky=me({components:{BProgress:i.default.extend({name:en,mixins:[Cs],provide:function(){return{bvProgress:this}},props:Sy,computed:{progressHeight:function(){return{height:this.height||null}}},render:function(t){var e=this.normalizeSlot();return e||(e=t(Cy,{props:ps(xy,this.$props)})),t("div",{staticClass:"progress",style:this.progressHeight},[e])}}),BProgressBar:Cy}}),$y="b-sidebar",By=Fs(Ue,"request-state"),_y=Fs(Ue,"toggle"),Dy=Ds(Ue,"state"),Fy=Ds(Ue,"sync-state"),Iy=ys("visible",{type:ho,defaultValue:!1,event:$n}),Py=Iy.mixin,Oy=Iy.props,Vy=Iy.prop,Ey=Iy.event,Ly=vs(ee(c(c(c({},fc),Oy),{},{ariaLabel:hs(go),ariaLabelledby:hs(go),backdrop:hs(ho,!1),backdropVariant:hs(go,"dark"),bgVariant:hs(go,"light"),bodyClass:hs(To),closeLabel:hs(go),footerClass:hs(To),headerClass:hs(To),lazy:hs(ho,!1),noCloseOnBackdrop:hs(ho,!1),noCloseOnEsc:hs(ho,!1),noCloseOnRouteChange:hs(ho,!1),noEnforceFocus:hs(ho,!1),noHeader:hs(ho,!1),noHeaderClose:hs(ho,!1),noSlide:hs(ho,!1),right:hs(ho,!1),shadow:hs(ko,!1),sidebarClass:hs(To),tag:hs(go,"div"),textVariant:hs(go,"dark"),title:hs(go),width:hs(go),zIndex:hs(_o)})),rn),Ay=function(t,e){if(e.noHeader)return t();var i=e.normalizeSlot(No,e.slotScope);if(!i){var n=function(t,e){var i=e.normalizeSlot(tr,e.slotScope)||e.title;return i?t("strong",{attrs:{id:e.safeId("__title__")}},[i]):t("span")}(t,e),o=function(t,e){if(e.noHeaderClose)return t();var i=e.closeLabel,n=e.textVariant,o=e.hide;return t(Ps,{props:{ariaLabel:i,textVariant:n},on:{click:o},ref:"close-button"},[e.normalizeSlot("header-close")||t(Oa)])}(t,e);i=e.right?[o,n]:[n,o]}return t("header",{staticClass:"".concat($y,"-header"),class:e.headerClass,key:"header"},i)},Ry=function(t,e){return t("div",{staticClass:"".concat($y,"-body"),class:e.bodyClass,key:"body"},[e.normalizeSlot(Ao,e.slotScope)])},My=function(t,e){var i=e.normalizeSlot(zo,e.slotScope);return i?t("footer",{staticClass:"".concat($y,"-footer"),class:e.footerClass,key:"footer"},[i]):t()},Hy=function(t,e){var i=Ay(t,e);return e.lazy&&!e.isOpen?i:[i,Ry(t,e),My(t,e)]},zy=function(t,e){if(!e.backdrop)return t();var i=e.backdropVariant;return t("div",{directives:[{name:"show",value:e.localShow}],staticClass:"b-sidebar-backdrop",class:a({},"bg-".concat(i),i),on:{click:e.onBackdropClick}})},Ny=me({components:{BSidebar:i.default.extend({name:rn,mixins:[Za,pc,Py,Ja,Cs],inheritAttrs:!1,props:Ly,data:function(){var t=!!this[Vy];return{localShow:t,isOpen:t}},computed:{transitionProps:function(){return this.noSlide?{css:!0}:{css:!0,enterClass:"",enterActiveClass:"slide",enterToClass:"show",leaveClass:"show",leaveActiveClass:"slide",leaveToClass:""}},slotScope:function(){return{hide:this.hide,right:this.right,visible:this.localShow}},hasTitle:function(){var t=this.$scopedSlots,e=this.$slots;return!(this.noHeader||this.hasNormalizedSlot(No)||!this.normalizeSlot(tr,this.slotScope,t,e)&&!this.title)},titleId:function(){return this.hasTitle?this.safeId("__title__"):null},computedAttrs:function(){return c(c({},this.bvAttrs),{},{id:this.safeId(),tabindex:"-1",role:"dialog","aria-modal":this.backdrop?"true":"false","aria-hidden":this.localShow?null:"true","aria-label":this.ariaLabel||null,"aria-labelledby":this.ariaLabelledby||this.titleId||null})}},watch:(tg={},a(tg,Vy,(function(t,e){t!==e&&(this.localShow=t)})),a(tg,"localShow",(function(t,e){t!==e&&(this.emitState(t),this.$emit(Ey,t))})),a(tg,"$route",(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.noCloseOnRouteChange||t.fullPath===e.fullPath||this.hide()})),tg),created:function(){this.$_returnFocusEl=null},mounted:function(){var t=this;this.listenOnRoot(_y,this.handleToggle),this.listenOnRoot(By,this.handleSync),this.$nextTick((function(){t.emitState(t.localShow)}))},activated:function(){this.emitSync()},beforeDestroy:function(){this.localShow=!1,this.$_returnFocusEl=null},methods:{hide:function(){this.localShow=!1},emitState:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.localShow;this.emitOnRoot(Dy,this.safeId(),t)},emitSync:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.localShow;this.emitOnRoot(Fy,this.safeId(),t)},handleToggle:function(t){t&&t===this.safeId()&&(this.localShow=!this.localShow)},handleSync:function(t){var e=this;t&&t===this.safeId()&&this.$nextTick((function(){e.emitSync(e.localShow)}))},onKeydown:function(t){var e=t.keyCode;!this.noCloseOnEsc&&27===e&&this.localShow&&this.hide()},onBackdropClick:function(){this.localShow&&!this.noCloseOnBackdrop&&this.hide()},onTopTrapFocus:function(){var t=Qr(this.$refs.content);this.enforceFocus(t.reverse()[0])},onBottomTrapFocus:function(){var t=Qr(this.$refs.content);this.enforceFocus(t[0])},onBeforeEnter:function(){this.$_returnFocusEl=$r(M?[document.body]:[]),this.isOpen=!0},onAfterEnter:function(t){Lr(t,$r())||this.enforceFocus(t),this.$emit(eo)},onAfterLeave:function(){this.enforceFocus(this.$_returnFocusEl),this.$_returnFocusEl=null,this.isOpen=!1,this.$emit(zn)},enforceFocus:function(t){this.noEnforceFocus||ts(t)}},render:function(t){var e,i=this.bgVariant,n=this.width,o=this.textVariant,r=this.localShow,s=""===this.shadow||this.shadow,l=t(this.tag,{staticClass:$y,class:[(e={shadow:!0===s},a(e,"shadow-".concat(s),s&&!0!==s),a(e,"".concat($y,"-right"),this.right),a(e,"bg-".concat(i),i),a(e,"text-".concat(o),o),e),this.sidebarClass],style:{width:n},attrs:this.computedAttrs,directives:[{name:"show",value:r}],ref:"content"},[Hy(t,this)]);l=t("transition",{props:this.transitionProps,on:{beforeEnter:this.onBeforeEnter,afterEnter:this.onAfterEnter,afterLeave:this.onAfterLeave}},[l]);var c=t(Ls,{props:{noFade:this.noSlide}},[zy(t,this)]),u=t(),d=t();return this.backdrop&&r&&(u=t("div",{attrs:{tabindex:"0"},on:{focus:this.onTopTrapFocus}}),d=t("div",{attrs:{tabindex:"0"},on:{focus:this.onBottomTrapFocus}})),t("div",{staticClass:"b-sidebar-outer",style:{zIndex:this.zIndex},attrs:{tabindex:"-1"},on:{keydown:this.onKeydown}},[u,l,d,c])}})},plugins:{VBTogglePlugin:ld}}),jy=vs({animation:hs(go,"wave"),height:hs(go),size:hs(go),type:hs(go,"text"),variant:hs(go),width:hs(go)},sn),Gy=i.default.extend({name:sn,functional:!0,props:jy,render:function(t,e){var i,n=e.data,o=e.props,r=o.size,s=o.animation,l=o.variant;return t("div",F(n,{staticClass:"b-skeleton",style:{width:r||o.width,height:r||o.height},class:(i={},a(i,"b-skeleton-".concat(o.type),!0),a(i,"b-skeleton-animate-".concat(s),s),a(i,"bg-".concat(l),l),i)}))}}),Wy=(vs(Qt(fa,["content","stacked"]),"BIconstack"),vs({animation:hs(go,"wave"),icon:hs(go),iconProps:hs(vo,{})},an)),Yy=i.default.extend({name:an,functional:!0,props:Wy,render:function(t,e){var i=e.props,n=i.icon,o=i.animation,r=t(Aa,{staticClass:"b-skeleton-icon",props:c(c({},i.iconProps),{},{icon:n})});return t("div",{staticClass:"b-skeleton-icon-wrapper position-relative d-inline-block overflow-hidden",class:a({},"b-skeleton-animate-".concat(o),o)},[r])}}),Uy=vs({animation:hs(go),aspect:hs(go,"16:9"),cardImg:hs(go),height:hs(go),noAspect:hs(ho,!1),variant:hs(go),width:hs(go)},ln),qy=i.default.extend({name:ln,functional:!0,props:Uy,render:function(t,e){var i=e.props,n=i.aspect,o=i.width,r=i.height,s=i.animation,l=i.variant,c=i.cardImg,u=t(Gy,{props:{type:"img",width:o,height:r,animation:s,variant:l},class:a({},"card-img-".concat(c),c)});return i.noAspect?u:t(ea,{props:{aspect:n}},[u])}}),Ky=i.default.extend({methods:{hasListener:function(t){var e=this.$listeners||{},i=this._events||{};return!Ft(e[t])||Rt(i[t])&&i[t].length>0}}}),Xy="light",Zy="dark",Jy=vs({variant:hs(go)},"BTr"),Qy=i.default.extend({name:"BTr",mixins:[Za,Qa,Cs],provide:function(){return{bvTableTr:this}},inject:{bvTableRowGroup:{default:function(){return{}}}},inheritAttrs:!1,props:Jy,computed:{inTbody:function(){return this.bvTableRowGroup.isTbody},inThead:function(){return this.bvTableRowGroup.isThead},inTfoot:function(){return this.bvTableRowGroup.isTfoot},isDark:function(){return this.bvTableRowGroup.isDark},isStacked:function(){return this.bvTableRowGroup.isStacked},isResponsive:function(){return this.bvTableRowGroup.isResponsive},isStickyHeader:function(){return this.bvTableRowGroup.isStickyHeader},hasStickyHeader:function(){return!this.isStacked&&this.bvTableRowGroup.hasStickyHeader},tableVariant:function(){return this.bvTableRowGroup.tableVariant},headVariant:function(){return this.inThead?this.bvTableRowGroup.headVariant:null},footVariant:function(){return this.inTfoot?this.bvTableRowGroup.footVariant:null},isRowDark:function(){return this.headVariant!==Xy&&this.footVariant!==Xy&&(this.headVariant===Zy||this.footVariant===Zy||this.isDark)},trClasses:function(){var t=this.variant;return[t?"".concat(this.isRowDark?"bg":"table","-").concat(t):null]},trAttrs:function(){return c({role:"row"},this.bvAttrs)}},render:function(t){return t("tr",{class:this.trClasses,attrs:this.trAttrs,on:this.bvListeners},this.normalizeSlot())}}),tw={},ew=i.default.extend({props:tw,methods:{renderBottomRow:function(){var t=this.computedFields,e=this.stacked,i=this.tbodyTrClass,n=this.tbodyTrAttr,o=this.$createElement;return this.hasNormalizedSlot(Vo)&&!0!==e&&""!==e?o(Qy,{staticClass:"b-table-bottom-row",class:[Ot(i)?i(null,"row-bottom"):i],attrs:Ot(n)?n(null,"row-bottom"):n,key:"b-bottom-row"},this.normalizeSlot(Vo,{columns:t.length,fields:t})):o()}}}),iw=function(t){return(t=lr(t,0))>0?t:null},nw=function(t){return Pt(t)||iw(t)>0},ow=vs({colspan:hs(_o,null,nw),rowspan:hs(_o,null,nw),stackedHeading:hs(go),stickyColumn:hs(ho,!1),variant:hs(go)},pn),rw=i.default.extend({name:pn,mixins:[Za,Qa,Cs],inject:{bvTableTr:{default:function(){return{}}}},inheritAttrs:!1,props:ow,computed:{tag:function(){return"td"},inTbody:function(){return this.bvTableTr.inTbody},inThead:function(){return this.bvTableTr.inThead},inTfoot:function(){return this.bvTableTr.inTfoot},isDark:function(){return this.bvTableTr.isDark},isStacked:function(){return this.bvTableTr.isStacked},isStackedCell:function(){return this.inTbody&&this.isStacked},isResponsive:function(){return this.bvTableTr.isResponsive},isStickyHeader:function(){return this.bvTableTr.isStickyHeader},hasStickyHeader:function(){return this.bvTableTr.hasStickyHeader},isStickyColumn:function(){return!this.isStacked&&(this.isResponsive||this.hasStickyHeader)&&this.stickyColumn},rowVariant:function(){return this.bvTableTr.variant},headVariant:function(){return this.bvTableTr.headVariant},footVariant:function(){return this.bvTableTr.footVariant},tableVariant:function(){return this.bvTableTr.tableVariant},computedColspan:function(){return iw(this.colspan)},computedRowspan:function(){return iw(this.rowspan)},cellClasses:function(){var t=this.variant,e=this.headVariant,i=this.isStickyColumn;return(!t&&this.isStickyHeader&&!e||!t&&i&&this.inTfoot&&!this.footVariant||!t&&i&&this.inThead&&!e||!t&&i&&this.inTbody)&&(t=this.rowVariant||this.tableVariant||"b-table-default"),[t?"".concat(this.isDark?"bg":"table","-").concat(t):null,i?"b-table-sticky-column":null]},cellAttrs:function(){var t=this.stackedHeading,e=this.inThead||this.inTfoot,i=this.computedColspan,n=this.computedRowspan,o="cell",r=null;return e?(o="columnheader",r=i>0?"colspan":"col"):Br(this.tag,"th")&&(o="rowheader",r=n>0?"rowgroup":"row"),c(c({colspan:i,rowspan:n,role:o,scope:r},this.bvAttrs),{},{"data-label":this.isStackedCell&&!Pt(t)?vr(t):null})}},render:function(t){var e=[this.normalizeSlot()];return t(this.tag,{class:this.cellClasses,attrs:this.cellAttrs,on:this.bvListeners},[this.isStackedCell?t("div",[e]):e])}}),sw="busy",aw=a({},sw,hs(ho,!1)),lw=i.default.extend({props:aw,data:function(){return{localBusy:!1}},computed:{computedBusy:function(){return this.busy||this.localBusy}},watch:{localBusy:function(t,e){t!==e&&this.$emit("update:busy",t)}},methods:{stopIfBusy:function(t){return!!this.computedBusy&&(Bs(t),!0)},renderBusy:function(){var t=this.tbodyTrClass,e=this.tbodyTrAttr,i=this.$createElement;return this.computedBusy&&this.hasNormalizedSlot(Xo)?i(Qy,{staticClass:"b-table-busy-slot",class:[Ot(t)?t(null,Xo):t],attrs:Ot(e)?e(null,Xo):e,key:"table-busy-slot"},[i(rw,{props:{colspan:this.computedFields.length||null}},[this.normalizeSlot(Xo)])]):null}}}),cw={caption:hs(go),captionHtml:hs(go)},uw=i.default.extend({props:cw,computed:{captionId:function(){return this.isStacked?this.safeId("_caption_"):null}},methods:{renderCaption:function(){var t=this.caption,e=this.captionHtml,i=this.$createElement,n=i(),o=this.hasNormalizedSlot(Zo);return(o||t||e)&&(n=i("caption",{attrs:{id:this.captionId},domProps:o?{}:Fl(e,t),key:"caption",ref:"caption"},this.normalizeSlot(Zo))),n}}}),dw={},hw=i.default.extend({methods:{renderColgroup:function(){var t=this.computedFields,e=this.$createElement,i=e();return this.hasNormalizedSlot(Jo)&&(i=e("colgroup",{key:"colgroup"},[this.normalizeSlot(Jo,{columns:t.length,fields:t})])),i}}}),fw={emptyFilteredHtml:hs(go),emptyFilteredText:hs(go,"There are no records matching your request"),emptyHtml:hs(go),emptyText:hs(go,"There are no records to show"),showEmpty:hs(ho,!1)},pw=i.default.extend({props:fw,methods:{renderEmpty:function(){var t=this.computedItems,e=this.$createElement,i=e();if(this.showEmpty&&(!t||0===t.length)&&(!this.computedBusy||!this.hasNormalizedSlot(Xo))){var n=this.computedFields,o=this.isFiltered,r=this.emptyText,s=this.emptyHtml,a=this.emptyFilteredText,l=this.emptyFilteredHtml,c=this.tbodyTrClass,u=this.tbodyTrAttr;(i=this.normalizeSlot(o?"emptyfiltered":Ro,{emptyFilteredHtml:l,emptyFilteredText:a,emptyHtml:s,emptyText:r,fields:n,items:t}))||(i=e("div",{class:["text-center","my-2"],domProps:o?Fl(l,a):Fl(s,r)})),i=e(rw,{props:{colspan:n.length||null}},[e("div",{attrs:{role:"alert","aria-live":"polite"}},[i])]),i=e(Qy,{staticClass:"b-table-empty-row",class:[Ot(c)?c(null,"row-empty"):c],attrs:Ot(u)?u(null,"row-empty"):u,key:o?"b-empty-filtered-row":"b-empty-row"},[i])}return i}}}),mw=function t(e){return Pt(e)?"":Mt(e)&&!zt(e)?Kt(e).sort().map((function(i){return t(e[i])})).filter((function(t){return!!t})).join(" "):vr(e)},vw="_cellVariants",bw="_rowVariant",gw="_showDetails",yw=[vw,bw,gw].reduce((function(t,e){return c(c({},t),{},a({},e,!0))}),{}),ww=["a","a *","button","button *","input:not(.disabled):not([disabled])","select:not(.disabled):not([disabled])","textarea:not(.disabled):not([disabled])",'[role="link"]','[role="link"] *','[role="button"]','[role="button"] *',"[tabindex]:not(.disabled):not([disabled])"].join(","),Tw=function(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=Kt(n).reduce((function(e,i){var o=n[i],r=o.filterByFormatted,s=Ot(r)?r:r?o.formatter:null;return Ot(s)&&(e[i]=s(t[i],i,t)),e}),Zt(t)),r=Kt(o).filter((function(t){return!(yw[t]||Rt(e)&&e.length>0&&nr(e,t)||Rt(i)&&i.length>0&&!nr(i,t))}));return Jt(o,r)},Cw={filter:hs([].concat(T(To),[bo])),filterDebounce:hs(_o,0,(function(t){return Q.test(String(t))})),filterFunction:hs(po),filterIgnoredFields:hs(uo,[]),filterIncludedFields:hs(uo,[])},xw=i.default.extend({props:Cw,data:function(){return{isFiltered:!1,localFilter:this.filterSanitize(this.filter)}},computed:{computedFilterIgnored:function(){return or(this.filterIgnoredFields||[]).filter(ne)},computedFilterIncluded:function(){return or(this.filterIncludedFields||[]).filter(ne)},computedFilterDebounce:function(){var t=lr(this.filterDebounce,0);return t>0&&le('Prop "filter-debounce" is deprecated. Use the debounce feature of "" instead.',fn),t},localFiltering:function(){return!this.hasProvider||!!this.noProviderFiltering},filteredCheck:function(){return{filteredItems:this.filteredItems,localItems:this.localItems,localFilter:this.localFilter}},localFilterFn:function(){var t=this.filterFunction;return gs(t)?t:null},filteredItems:function(){var t=this.localItems,e=this.localFilter,i=this.localFiltering?this.filterFnFactory(this.localFilterFn,e)||this.defaultFilterFnFactory(e):null;return i&&t.length>0?t.filter(i):t}},watch:{computedFilterDebounce:function(t){!t&&this.$_filterTimer&&(this.clearFilterTimer(),this.localFilter=this.filterSanitize(this.filter))},filter:{deep:!0,handler:function(t){var e=this,i=this.computedFilterDebounce;this.clearFilterTimer(),i&&i>0?this.$_filterTimer=setTimeout((function(){e.localFilter=e.filterSanitize(t)}),i):this.localFilter=this.filterSanitize(t)}},filteredCheck:function(t){var e=t.filteredItems,i=t.localFilter,n=!1;i?Ua(i,[])||Ua(i,{})?n=!1:i&&(n=!0):n=!1,n&&this.$emit(Ln,e,e.length),this.isFiltered=n},isFiltered:function(t,e){if(!1===t&&!0===e){var i=this.localItems;this.$emit(Ln,i,i.length)}}},created:function(){var t=this;this.$_filterTimer=null,this.$nextTick((function(){t.isFiltered=Boolean(t.localFilter)}))},beforeDestroy:function(){this.clearFilterTimer()},methods:{clearFilterTimer:function(){clearTimeout(this.$_filterTimer),this.$_filterTimer=null},filterSanitize:function(t){return!this.localFiltering||this.localFilterFn||Et(t)||jt(t)?ie(t):""},filterFnFactory:function(t,e){if(!t||!Ot(t)||!e||Ua(e,[])||Ua(e,{}))return null;return function(i){return t(i,e)}},defaultFilterFnFactory:function(t){var e=this;if(!t||!Et(t)&&!jt(t))return null;var i=t;if(Et(i)){var n=mr(t).replace(ct,"\\s+");i=new RegExp(".*".concat(n,".*"),"i")}return function(t){return i.lastIndex=0,i.test((n=t,o=e.computedFilterIgnored,r=e.computedFilterIncluded,s=e.computedFieldsObj,Mt(n)?mw(Tw(n,o,r,s)):""));var n,o,r,s}}}}),Sw=function(t,e){var i=[];if(Rt(t)&&t.filter(ne).forEach((function(t){if(Et(t))i.push({key:t,label:fr(t)});else if(Mt(t)&&t.key&&Et(t.key))i.push(Zt(t));else if(Mt(t)&&1===Kt(t).length){var e=Kt(t)[0],n=function(t,e){var i=null;return Et(e)?i={key:t,label:e}:Ot(e)?i={key:t,formatter:e}:Mt(e)?(i=Zt(e)).key=i.key||t:!1!==e&&(i={key:t}),i}(e,t[e]);n&&i.push(n)}})),0===i.length&&Rt(e)&&e.length>0){var n=e[0];Kt(n).forEach((function(t){yw[t]||i.push({key:t,label:fr(t)})}))}var o={};return i.filter((function(t){return!o[t.key]&&(o[t.key]=!0,t.label=Et(t.label)?t.label:fr(t.key),!0)}))},kw=ys("value",{type:uo,defaultValue:[]}),$w=kw.mixin,Bw=kw.props,_w=kw.prop,Dw=kw.event,Fw=ee(c(c({},Bw),{},a({fields:hs(uo,null),items:hs(uo,[]),primaryKey:hs(go)},_w,hs(uo,[])))),Iw=i.default.extend({mixins:[$w],props:Fw,data:function(){var t=this.items;return{localItems:Rt(t)?t.slice():[]}},computed:{computedFields:function(){return Sw(this.fields,this.localItems)},computedFieldsObj:function(){var t=this.$parent;return this.computedFields.reduce((function(e,i){if(e[i.key]=Zt(i),i.formatter){var n=i.formatter;Et(n)&&Ot(t[n])?n=t[n]:Ot(n)||(n=void 0),e[i.key].formatter=n}return e}),{})},computedItems:function(){return(this.paginatedItems||this.sortedItems||this.filteredItems||this.localItems||[]).slice()},context:function(){return{filter:this.localFilter,sortBy:this.localSortBy,sortDesc:this.localSortDesc,perPage:Us(lr(this.perPage,0),0),currentPage:Us(lr(this.currentPage,0),1),apiUrl:this.apiUrl}}},watch:{items:function(t){this.localItems=Rt(t)?t.slice():[]},computedItems:function(t,e){Ua(t,e)||this.$emit(Dw,t)},context:function(t,e){Ua(t,e)||this.$emit(Fn,t)}},mounted:function(){this.$emit(Dw,this.computedItems)},methods:{getFieldFormatter:function(t){var e=this.computedFieldsObj[t];return e?e.formatter:void 0}}}),Pw={currentPage:hs(_o,1),perPage:hs(_o,0)},Ow=i.default.extend({props:Pw,computed:{localPaging:function(){return!this.hasProvider||!!this.noProviderPaging},paginatedItems:function(){var t=this.sortedItems||this.filteredItems||this.localItems||[],e=Us(lr(this.currentPage,1),1),i=Us(lr(this.perPage,0),0);return this.localPaging&&i&&(t=t.slice((e-1)*i,e*i)),t}}}),Vw=Ds(fn,Zn),Ew=Fs(fn,"refresh"),Lw={apiUrl:hs(go),items:hs(yo,[]),noProviderFiltering:hs(ho,!1),noProviderPaging:hs(ho,!1),noProviderSorting:hs(ho,!1)},Aw=i.default.extend({mixins:[Ja],props:Lw,computed:{hasProvider:function(){return Ot(this.items)},providerTriggerContext:function(){var t={apiUrl:this.apiUrl,filter:null,sortBy:null,sortDesc:null,perPage:null,currentPage:null};return this.noProviderFiltering||(t.filter=this.localFilter),this.noProviderSorting||(t.sortBy=this.localSortBy,t.sortDesc=this.localSortDesc),this.noProviderPaging||(t.perPage=this.perPage,t.currentPage=this.currentPage),Zt(t)}},watch:{items:function(t){(this.hasProvider||Ot(t))&&this.$nextTick(this._providerUpdate)},providerTriggerContext:function(t,e){Ua(t,e)||this.$nextTick(this._providerUpdate)}},mounted:function(){var t=this;!this.hasProvider||this.localItems&&0!==this.localItems.length||this._providerUpdate(),this.listenOnRoot(Ew,(function(e){e!==t.id&&e!==t||t.refresh()}))},methods:{refresh:function(){var t=this.items,e=this.refresh;this.$off(Zn,e),this.computedBusy?this.localBusy&&this.hasProvider&&this.$on(Zn,e):(this.clearSelected(),this.hasProvider?this.$nextTick(this._providerUpdate):this.localItems=Rt(t)?t.slice():[])},_providerSetLocal:function(t){this.localItems=Rt(t)?t.slice():[],this.localBusy=!1,this.$emit(Zn),this.id&&this.emitOnRoot(Vw,this.id)},_providerUpdate:function(){var t=this;this.hasProvider&&(this.computedBusy?this.$nextTick(this.refresh):(this.localBusy=!0,this.$nextTick((function(){try{var e=t.items(t.context,t._providerSetLocal);!Pt(i=e)&&Ot(i.then)&&Ot(i.catch)?e.then((function(e){t._providerSetLocal(e)})):Rt(e)?t._providerSetLocal(e):2!==t.items.length&&(le("Provider function didn't request callback and did not return a promise or data.",fn),t.localBusy=!1)}catch(e){le("Provider function error [".concat(e.name,"] ").concat(e.message,"."),fn),t.localBusy=!1,t.$off(Zn,t.refresh)}var i}))))}}}),Rw=["range","multi","single"],Mw={noSelectOnClick:hs(ho,!1),selectMode:hs(go,"multi",(function(t){return nr(Rw,t)})),selectable:hs(ho,!1),selectedVariant:hs(go,"active")},Hw=i.default.extend({props:Mw,data:function(){return{selectedRows:[],selectedLastRow:-1}},computed:{isSelectable:function(){return this.selectable&&this.selectMode},hasSelectableRowClick:function(){return this.isSelectable&&!this.noSelectOnClick},supportsSelectableRows:function(){return!0},selectableHasSelection:function(){var t=this.selectedRows;return this.isSelectable&&t&&t.length>0&&t.some(ne)},selectableIsMultiSelect:function(){return this.isSelectable&&nr(["range","multi"],this.selectMode)},selectableTableClasses:function(){var t,e=this.isSelectable;return a(t={"b-table-selectable":e},"b-table-select-".concat(this.selectMode),e),a(t,"b-table-selecting",this.selectableHasSelection),a(t,"b-table-selectable-no-click",e&&!this.hasSelectableRowClick),t},selectableTableAttrs:function(){return{"aria-multiselectable":this.isSelectable?this.selectableIsMultiSelect?"true":"false":null}}},watch:{computedItems:function(t,e){var i=!1;if(this.isSelectable&&this.selectedRows.length>0){i=Rt(t)&&Rt(e)&&t.length===e.length;for(var n=0;i&&n=0&&t0&&(this.selectedLastClicked=-1,this.selectedRows=this.selectableIsMultiSelect?rr(t,!0):[!0])},isRowSelected:function(t){return!(!Lt(t)||!this.selectedRows[t])},clearSelected:function(){this.selectedLastClicked=-1,this.selectedRows=[]},selectableRowClasses:function(t){if(this.isSelectable&&this.isRowSelected(t)){var e=this.selectedVariant;return a({"b-table-row-selected":!0},"".concat(this.dark?"bg":"table","-").concat(e),e)}return{}},selectableRowAttrs:function(t){return{"aria-selected":this.isSelectable?this.isRowSelected(t)?"true":"false":null}},setSelectionHandlers:function(t){var e=t&&!this.noSelectOnClick?"$on":"$off";this[e](Jn,this.selectionHandler),this[e](Ln,this.clearSelected),this[e](Fn,this.clearSelected)},selectionHandler:function(t,e,i){if(this.isSelectable&&!this.noSelectOnClick){var n=this.selectMode,o=this.selectedLastRow,r=this.selectedRows.slice(),s=!r[e];if("single"===n)r=[];else if("range"===n)if(o>-1&&i.shiftKey){for(var a=Ys(o,e);a<=Us(o,e);a++)r[a]=!0;s=!0}else i.ctrlKey||i.metaKey||(r=[],s=!0),this.selectedLastRow=s?e:-1;r[e]=s,this.selectedRows=r}else this.clearSelected()}}}),zw=function(t,e){return t.map((function(t,e){return[e,t]})).sort(function(t,e){return this(t[1],e[1])||t[0]-e[0]}.bind(e)).map((function(t){return t[1]}))},Nw=function(t){return Pt(t)?"":At(t)?cr(t,t):t},jw="sortBy",Gw="sortDesc",Ww="asc",Yw="desc",Uw=[Ww,Yw,"last"],qw=(a(eg={labelSortAsc:hs(go,"Click to sort Ascending"),labelSortClear:hs(go,"Click to clear sorting"),labelSortDesc:hs(go,"Click to sort Descending"),noFooterSorting:hs(ho,!1),noLocalSorting:hs(ho,!1),noSortReset:hs(ho,!1)},jw,hs(go)),a(eg,"sortCompare",hs(po)),a(eg,"sortCompareLocale",hs(Co)),a(eg,"sortCompareOptions",hs(vo,{numeric:!0})),a(eg,Gw,hs(ho,!1)),a(eg,"sortDirection",hs(go,Ww,(function(t){return nr(Uw,t)}))),a(eg,"sortIconLeft",hs(ho,!1)),a(eg,"sortNullLast",hs(ho,!1)),eg),Kw=i.default.extend({props:qw,data:function(){return{localSortBy:this.sortBy||"",localSortDesc:this.sortDesc||!1}},computed:{localSorting:function(){return this.hasProvider?!!this.noProviderSorting:!this.noLocalSorting},isSortable:function(){return this.computedFields.some((function(t){return t.sortable}))},sortedItems:function(){var t=this.localSortBy,e=this.localSortDesc,i=this.sortCompareLocale,n=this.sortNullLast,o=this.sortCompare,r=this.localSorting,s=(this.filteredItems||this.localItems||[]).slice(),a=c(c({},this.sortCompareOptions),{},{usage:"sort"});if(t&&r){var l=(this.computedFieldsObj[t]||{}).sortByFormatted,u=Ot(l)?l:l?this.getFieldFormatter(t):void 0;return zw(s,(function(r,s){var l=null;return Ot(o)&&(l=o(r,s,t,e,u,a,i)),(Pt(l)||!1===l)&&(l=function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=i.sortBy,o=void 0===n?null:n,r=i.formatter,s=void 0===r?null:r,a=i.locale,l=void 0===a?void 0:a,c=i.localeOptions,u=void 0===c?{}:c,d=i.nullLast,h=void 0!==d&&d,f=re(t,o,null),p=re(e,o,null);return Ot(s)&&(f=s(f,o,t),p=s(p,o,e)),f=Nw(f),p=Nw(p),zt(f)&&zt(p)||Lt(f)&&Lt(p)?fp?1:0:h&&""===f&&""!==p?1:h&&""!==f&&""===p?-1:mw(f).localeCompare(mw(p),l,u)}(r,s,{sortBy:t,formatter:u,locale:i,localeOptions:a,nullLast:n})),(l||0)*(e?-1:1)}))}return s}},watch:(ig={isSortable:function(t){t?this.isSortable&&this.$on(Hn,this.handleSort):this.$off(Hn,this.handleSort)}},a(ig,Gw,(function(t){t!==this.localSortDesc&&(this.localSortDesc=t||!1)})),a(ig,jw,(function(t){t!==this.localSortBy&&(this.localSortBy=t||"")})),a(ig,"localSortDesc",(function(t,e){t!==e&&this.$emit("update:sortDesc",t)})),a(ig,"localSortBy",(function(t,e){t!==e&&this.$emit("update:sortBy",t)})),ig),created:function(){this.isSortable&&this.$on(Hn,this.handleSort)},methods:{handleSort:function(t,e,i,n){var o=this;if(this.isSortable&&(!n||!this.noFooterSorting)){var r=!1,s=function(){var t=e.sortDirection||o.sortDirection;t===Ww?o.localSortDesc=!1:t===Yw&&(o.localSortDesc=!0)};if(e.sortable){var a=!this.localSorting&&e.sortKey?e.sortKey:t;this.localSortBy===a?this.localSortDesc=!this.localSortDesc:(this.localSortBy=a,s()),r=!0}else this.localSortBy&&!this.noSortReset&&(this.localSortBy="",s(),r=!0);r&&this.$emit("sort-changed",this.context)}},sortTheadThClasses:function(t,e,i){return{"b-table-sort-icon-left":e.sortable&&this.sortIconLeft&&!(i&&this.noFooterSorting)}},sortTheadThAttrs:function(t,e,i){if(!this.isSortable||i&&this.noFooterSorting)return{};var n=e.sortable;return{"aria-sort":n&&this.localSortBy===t?this.localSortDesc?"descending":"ascending":n?"none":null}},sortTheadThLabel:function(t,e,i){if(!this.isSortable||i&&this.noFooterSorting)return null;var n="";if(e.sortable)if(this.localSortBy===t)n=this.localSortDesc?this.labelSortAsc:this.labelSortDesc;else{n=this.localSortDesc?this.labelSortDesc:this.labelSortAsc;var o=this.sortDirection||e.sortDirection;o===Ww?n=this.labelSortAsc:o===Yw&&(n=this.labelSortDesc)}else this.noSortReset||(n=this.localSortBy?this.labelSortClear:"");return br(n)||null}}}),Xw={stacked:hs(ko,!1)},Zw=i.default.extend({props:Xw,computed:{isStacked:function(){var t=this.stacked;return""===t||t},isStackedAlways:function(){return!0===this.isStacked},stackedTableClasses:function(){var t=this.isStackedAlways;return a({"b-table-stacked":t},"b-table-stacked-".concat(this.stacked),!t&&this.isStacked)}}}),Jw={bordered:hs(ho,!1),borderless:hs(ho,!1),captionTop:hs(ho,!1),dark:hs(ho,!1),fixed:hs(ho,!1),hover:hs(ho,!1),noBorderCollapse:hs(ho,!1),outlined:hs(ho,!1),responsive:hs(ko,!1),small:hs(ho,!1),stickyHeader:hs(ko,!1),striped:hs(ho,!1),tableClass:hs(To),tableVariant:hs(go)},Qw=i.default.extend({mixins:[Za],provide:function(){return{bvTable:this}},inheritAttrs:!1,props:Jw,computed:{isResponsive:function(){var t=this.responsive;return""===t||t},isStickyHeader:function(){var t=this.stickyHeader;return t=""===t||t,!this.isStacked&&t},wrapperClasses:function(){var t=this.isResponsive;return[this.isStickyHeader?"b-table-sticky-header":"",!0===t?"table-responsive":t?"table-responsive-".concat(this.responsive):""].filter(ne)},wrapperStyles:function(){var t=this.isStickyHeader;return t&&!Vt(t)?{maxHeight:t}:{}},tableClasses:function(){var t=this.hover,e=this.tableVariant;return t=this.isTableSimple?t:t&&this.computedItems.length>0&&!this.computedBusy,[this.tableClass,{"table-striped":this.striped,"table-hover":t,"table-dark":this.dark,"table-bordered":this.bordered,"table-borderless":this.borderless,"table-sm":this.small,border:this.outlined,"b-table-fixed":this.fixed,"b-table-caption-top":this.captionTop,"b-table-no-border-collapse":this.noBorderCollapse},e?"".concat(this.dark?"bg":"table","-").concat(e):"",this.stackedTableClasses,this.selectableTableClasses]},tableAttrs:function(){var t=this.computedItems,e=this.filteredItems,i=this.computedFields,n=this.selectableTableAttrs,o=this.isTableSimple?{}:{"aria-busy":this.computedBusy?"true":"false","aria-colcount":vr(i.length),"aria-describedby":this.bvAttrs["aria-describedby"]||this.$refs.caption?this.captionId:null};return c(c(c({"aria-rowcount":t&&e&&e.length>t.length?vr(e.length):null},this.bvAttrs),{},{id:this.safeId(),role:"table"},o),n)}},render:function(t){var e=this.wrapperClasses,i=this.renderCaption,n=this.renderColgroup,o=this.renderThead,r=this.renderTbody,s=this.renderTfoot,a=[];this.isTableSimple?a.push(this.normalizeSlot()):(a.push(i?i():null),a.push(n?n():null),a.push(o?o():null),a.push(r?r():null),a.push(s?s():null));var l=t("table",{staticClass:"table b-table",class:this.tableClasses,attrs:this.tableAttrs,key:"b-table"},a.filter(ne));return e.length>0?t("div",{class:e,style:this.wrapperStyles,key:"wrap"},[l]):l}}),tT=vs({tbodyTransitionHandlers:hs(vo),tbodyTransitionProps:hs(vo)},gn),eT=i.default.extend({name:gn,mixins:[Za,Qa,Cs],provide:function(){return{bvTableRowGroup:this}},inject:{bvTable:{default:function(){return{}}}},inheritAttrs:!1,props:tT,computed:{isTbody:function(){return!0},isDark:function(){return this.bvTable.dark},isStacked:function(){return this.bvTable.isStacked},isResponsive:function(){return this.bvTable.isResponsive},isStickyHeader:function(){return!1},hasStickyHeader:function(){return!this.isStacked&&this.bvTable.stickyHeader},tableVariant:function(){return this.bvTable.tableVariant},isTransitionGroup:function(){return this.tbodyTransitionProps||this.tbodyTransitionHandlers},tbodyAttrs:function(){return c({role:"rowgroup"},this.bvAttrs)},tbodyProps:function(){var t=this.tbodyTransitionProps;return t?c(c({},t),{},{tag:"tbody"}):{}}},render:function(t){var e={props:this.tbodyProps,attrs:this.tbodyAttrs};return this.isTransitionGroup?(e.on=this.tbodyTransitionHandlers||{},e.nativeOn=this.bvListeners):e.on=this.bvListeners,t(this.isTransitionGroup?"transition-group":"tbody",e,this.normalizeSlot())}}),iT=["TD","TH","TR"],nT=function(t){if(!t||!t.target)return!1;var e=t.target;if(e.disabled||-1!==iT.indexOf(e.tagName))return!1;if(Er(".dropdown-menu",e))return!0;var i="LABEL"===e.tagName?e:Er("label",e);if(i){var n=jr(i,"for"),o=n?Ar(n):Or("input, select, textarea",i);if(o&&!o.disabled)return!0}return Vr(e,ww)},oT=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,e=Xr();return!!(e&&""!==e.toString().trim()&&e.containsNode&&kr(t))&&e.containsNode(t,!0)},rT=vs(ow,"BTh"),sT=i.default.extend({name:"BTh",extends:rw,props:rT,computed:{tag:function(){return"th"}}}),aT={detailsTdClass:hs(To),tbodyTrAttr:hs(Fo),tbodyTrClass:hs([].concat(T(To),[po]))},lT=i.default.extend({props:aT,methods:{getTdValues:function(t,e,i,n){var o=this.$parent;if(i){var r=re(t,e,"");return Ot(i)?i(r,e,t):Et(i)&&Ot(o[i])?o[i](r,e,t):i}return n},getThValues:function(t,e,i,n,o){var r=this.$parent;if(i){var s=re(t,e,"");return Ot(i)?i(s,e,t,n):Et(i)&&Ot(r[i])?r[i](s,e,t,n):i}return o},getFormattedValue:function(t,e){var i=e.key,n=this.getFieldFormatter(i),o=re(t,i,null);return Ot(n)&&(o=n(o,i,t)),Pt(o)?"":o},toggleDetailsFactory:function(t,e){var i=this;return function(){t&&i.$set(e,gw,!e[gw])}},rowHovered:function(t){this.tbodyRowEvtStopped(t)||this.emitTbodyRowEvent("row-hovered",t)},rowUnhovered:function(t){this.tbodyRowEvtStopped(t)||this.emitTbodyRowEvent("row-unhovered",t)},renderTbodyRowCell:function(t,e,i,n){var o=this,r=this.isStacked,s=t.key,a=t.label,l=t.isRowHeader,u=this.$createElement,d=this.hasNormalizedSlot(Ko),h=this.getFormattedValue(i,t),f=!r&&(this.isResponsive||this.stickyHeader)&&t.stickyColumn,p=f?l?sT:rw:l?"th":"td",m=i[vw]&&i[vw][s]?i[vw][s]:t.variant||null,v={class:[t.class?t.class:"",this.getTdValues(i,s,t.tdClass,"")],props:{},attrs:c({"aria-colindex":String(e+1)},l?this.getThValues(i,s,t.thAttr,"row",{}):this.getTdValues(i,s,t.tdAttr,{})),key:"row-".concat(n,"-cell-").concat(e,"-").concat(s)};f?v.props={stackedHeading:r?a:null,stickyColumn:!0,variant:m}:(v.attrs["data-label"]=r&&!Pt(a)?vr(a):null,v.attrs.role=l?"rowheader":"cell",v.attrs.scope=l?"row":null,m&&v.class.push("".concat(this.dark?"bg":"table","-").concat(m)));var b={item:i,index:n,field:t,unformatted:re(i,s,""),value:h,toggleDetails:this.toggleDetailsFactory(d,i),detailsShowing:Boolean(i[gw])};this.supportsSelectableRows&&(b.rowSelected=this.isRowSelected(n),b.selectRow=function(){return o.selectRow(n)},b.unselectRow=function(){return o.unselectRow(n)});var g=this.$_bodyFieldSlotNameCache[s],y=g?this.normalizeSlot(g,b):vr(h);return this.isStacked&&(y=[u("div",[y])]),u(p,v,[y])},renderTbodyRow:function(t,e){var i=this,n=this.computedFields,o=this.striped,r=this.primaryKey,s=this.currentPage,a=this.perPage,l=this.tbodyTrClass,u=this.tbodyTrAttr,d=this.$createElement,h=this.hasNormalizedSlot(Ko),f=t[gw]&&h,p=this.$listeners["row-clicked"]||this.hasSelectableRowClick,m=[],v=f?this.safeId("_details_".concat(e,"_")):null,b=n.map((function(n,o){return i.renderTbodyRowCell(n,o,t,e)})),g=null;s&&a&&a>0&&(g=String((s-1)*a+e+1));var y=vr(re(t,r))||null,w=y||vr(e),T=y?this.safeId("_row_".concat(y)):null,C=this.selectableRowClasses?this.selectableRowClasses(e):{},x=this.selectableRowAttrs?this.selectableRowAttrs(e):{},S=Ot(l)?l(t,"row"):l,k=Ot(u)?u(t,"row"):u;if(m.push(d(Qy,{class:[S,C,f?"b-table-has-details":""],props:{variant:t[bw]||null},attrs:c(c({id:T},k),{},{tabindex:p?"0":null,"data-pk":y||null,"aria-details":v,"aria-owns":v,"aria-rowindex":g},x),on:{mouseenter:this.rowHovered,mouseleave:this.rowUnhovered},key:"__b-table-row-".concat(w,"__"),ref:"item-rows",refInFor:!0},b)),f){var $={item:t,index:e,fields:n,toggleDetails:this.toggleDetailsFactory(h,t)};this.supportsSelectableRows&&($.rowSelected=this.isRowSelected(e),$.selectRow=function(){return i.selectRow(e)},$.unselectRow=function(){return i.unselectRow(e)});var B=d(rw,{props:{colspan:n.length},class:this.detailsTdClass},[this.normalizeSlot(Ko,$)]);o&&m.push(d("tr",{staticClass:"d-none",attrs:{"aria-hidden":"true",role:"presentation"},key:"__b-table-details-stripe__".concat(w)}));var _=Ot(this.tbodyTrClass)?this.tbodyTrClass(t,Ko):this.tbodyTrClass,D=Ot(this.tbodyTrAttr)?this.tbodyTrAttr(t,Ko):this.tbodyTrAttr;m.push(d(Qy,{staticClass:"b-table-details",class:[_],props:{variant:t[bw]||null},attrs:c(c({},D),{},{id:v,tabindex:"-1"}),key:"__b-table-details__".concat(w)},[B]))}else h&&(m.push(d()),o&&m.push(d()));return m}}}),cT=function(t){return"cell(".concat(t||"",")")},uT=ee(c(c(c({},tT),aT),{},{tbodyClass:hs(To)})),dT=i.default.extend({mixins:[lT],props:uT,beforeDestroy:function(){this.$_bodyFieldSlotNameCache=null},methods:{getTbodyTrs:function(){var t=this.$refs,e=t.tbody?t.tbody.$el||t.tbody:null,i=(t["item-rows"]||[]).map((function(t){return t.$el||t}));return e&&e.children&&e.children.length>0&&i&&i.length>0?ir(e.children).filter((function(t){return nr(i,t)})):[]},getTbodyTrIndex:function(t){if(!kr(t))return-1;var e="TR"===t.tagName?t:Er("tr",t,!0);return e?this.getTbodyTrs().indexOf(e):-1},emitTbodyRowEvent:function(t,e){if(t&&this.hasListener(t)&&e&&e.target){var i=this.getTbodyTrIndex(e.target);if(i>-1){var n=this.computedItems[i];this.$emit(t,n,i,e)}}},tbodyRowEvtStopped:function(t){return this.stopIfBusy&&this.stopIfBusy(t)},onTbodyRowKeydown:function(t){var e=t.target,i=t.keyCode;if(!this.tbodyRowEvtStopped(t)&&"TR"===e.tagName&&_r(e)&&0===e.tabIndex)if(nr([Ha,Ga],i))Bs(t),this.onTBodyRowClicked(t);else if(nr([Wa,Ra,za,Ma],i)){var n=this.getTbodyTrIndex(e);if(n>-1){Bs(t);var o=this.getTbodyTrs(),r=t.shiftKey;i===za||r&&i===Wa?ts(o[0]):i===Ma||r&&i===Ra?ts(o[o.length-1]):i===Wa&&n>0?ts(o[n-1]):i===Ra&&n0&&void 0!==arguments[0]&&arguments[0],i=this.computedFields,n=this.isSortable,o=this.isSelectable,r=this.headVariant,s=this.footVariant,a=this.headRowVariant,l=this.footRowVariant,u=this.$createElement;if(this.isStackedAlways||0===i.length)return u();var d=n||this.hasListener(Hn),h=o?this.selectAllRows:su,f=o?this.clearSelected:su,p=function(i,o){var r=i.label,s=i.labelHtml,a=i.variant,l=i.stickyColumn,p=i.key,m=null;i.label.trim()||i.headerTitle||(m=fr(i.key));var v={};d&&(v.click=function(n){t.headClicked(n,i,e)},v.keydown=function(n){var o=n.keyCode;o!==Ha&&o!==Ga||t.headClicked(n,i,e)});var b=n?t.sortTheadThAttrs(p,i,e):{},g=n?t.sortTheadThClasses(p,i,e):null,y=n?t.sortTheadThLabel(p,i,e):null,w={class:[t.fieldClasses(i),g],props:{variant:a,stickyColumn:l},style:i.thStyle||{},attrs:c(c({tabindex:d&&i.sortable?"0":null,abbr:i.headerAbbr||null,title:i.headerTitle||null,"aria-colindex":o+1,"aria-label":m},t.getThValues(null,p,i.thAttr,e?"foot":"head",{})),b),on:v,key:p},C=[gT(p),gT(p.toLowerCase()),gT()];e&&(C=[yT(p),yT(p.toLowerCase()),yT()].concat(T(C)));var x={label:r,column:p,field:i,isFoot:e,selectAllRows:h,clearSelected:f},S=t.normalizeSlot(C,x)||u("div",{domProps:Fl(s,r)}),k=y?u("span",{staticClass:"sr-only"}," (".concat(y,")")):null;return u(sT,w,[S,k].filter(ne))},m=i.map(p).filter(ne),v=[];if(e)v.push(u(Qy,{class:this.tfootTrClass,props:{variant:Pt(l)?a:l}},m));else{var b={columns:i.length,fields:i,selectAllRows:h,clearSelected:f};v.push(this.normalizeSlot(Qo,b)||u()),v.push(u(Qy,{class:this.theadTrClass,props:{variant:a}},m))}return u(e?fT:bT,{class:(e?this.tfootClass:this.theadClass)||null,props:e?{footVariant:s||r||null}:{headVariant:r||null},key:e?"bv-tfoot":"bv-thead"},v)}}}),CT=i.default.extend({methods:{renderTopRow:function(){var t=this.computedFields,e=this.stacked,i=this.tbodyTrClass,n=this.tbodyTrAttr,o=this.$createElement;return this.hasNormalizedSlot(er)&&!0!==e&&""!==e?o(Qy,{staticClass:"b-table-top-row",class:[Ot(i)?i(null,"row-top"):i],attrs:Ot(n)?n(null,"row-top"):n,key:"b-top-row"},[this.normalizeSlot(er,{columns:t.length,fields:t})]):o()}}}),xT=vs(ee(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c(c({},fc),tw),aw),cw),dw),fw),Cw),Fw),Pw),Lw),Mw),qw),Xw),Jw),uT),pT),wT),{})),fn),ST=i.default.extend({name:fn,mixins:[Za,Ky,pc,Cs,Iw,Qw,Zw,TT,mT,dT,Zw,xw,Kw,Ow,uw,hw,Hw,pw,CT,ew,lw,Aw],props:xT}),kT=vs(ee(c(c(c(c(c(c(c(c(c({},fc),cw),dw),Fw),Xw),Jw),uT),pT),wT)),mn),$T=i.default.extend({name:mn,mixins:[Za,Ky,pc,Cs,Iw,Qw,Zw,TT,mT,dT,uw,hw],props:kT}),BT=vs(ee(c(c(c({},fc),Xw),Jw)),vn),_T=i.default.extend({name:vn,mixins:[Za,Ky,pc,Cs,Qw,Zw],props:BT,computed:{isTableSimple:function(){return!0}}}),DT=me({components:{BTable:ST},plugins:{TableLitePlugin:me({components:{BTableLite:$T}}),TableSimplePlugin:me({components:{BTableSimple:_T,BTbody:eT,BThead:bT,BTfoot:fT,BTr:Qy,BTd:rw,BTh:sT}})}}),FT=function(t){return t>0},IT=vs({animation:hs(go),columns:hs(mo,5,FT),hideHeader:hs(ho,!1),rows:hs(mo,3,FT),showFooter:hs(ho,!1),tableProps:hs(vo,{})},cn),PT=i.default.extend({name:cn,functional:!0,props:IT,render:function(t,e){var i=e.props,n=i.animation,o=i.columns,r=t("th",[t(Gy,{props:{animation:n}})]),s=t("tr",rr(o,r)),a=t("td",[t(Gy,{props:{width:"75%",animation:n}})]),l=t("tr",rr(o,a)),u=t("tbody",rr(i.rows,l)),d=i.hideHeader?t():t("thead",[s]),h=i.showFooter?t("tfoot",[s]):t();return t(_T,{props:c({},i.tableProps)},[d,u,h])}}),OT=vs({loading:hs(ho,!1)},un),VT=me({components:{BSkeleton:Gy,BSkeletonIcon:Yy,BSkeletonImg:qy,BSkeletonTable:PT,BSkeletonWrapper:i.default.extend({name:un,functional:!0,props:OT,render:function(t,e){var i=e.data,n=e.props,o=e.slots,r=e.scopedSlots,s=o(),a=r||{},l={};return n.loading?t("div",F(i,{attrs:{role:"alert","aria-live":"polite","aria-busy":!0},staticClass:"b-skeleton-wrapper",key:"loading"}),Ts("loading",l,a,s)):Ts(Ao,l,a,s)}})}}),ET=me({components:{BSpinner:mg}}),LT=ys("value",{type:mo}),AT=LT.mixin,RT=LT.props,MT=LT.prop,HT=LT.event,zT=function(t){return!t.disabled},NT=i.default.extend({name:"BVTabButton",inject:{bvTabs:{default:function(){return{}}}},props:{controls:hs(go),id:hs(go),noKeyNav:hs(ho,!1),posInSet:hs(mo),setSize:hs(mo),tab:hs(),tabIndex:hs(mo)},methods:{focus:function(){ts(this.$refs.link)},handleEvt:function(t){if(!this.tab.disabled){var e=t.type,i=t.keyCode,n=t.shiftKey;"click"===e||"keydown"===e&&i===Ga?(Bs(t),this.$emit(Bn,t)):"keydown"!==e||this.noKeyNav||(-1!==[Wa,Na,za].indexOf(i)?(Bs(t),n||i===za?this.$emit(An,t):this.$emit(Xn,t)):-1!==[Ra,ja,Ma].indexOf(i)&&(Bs(t),n||i===Ma?this.$emit(Gn,t):this.$emit(Un,t)))}}},render:function(t){var e=this.id,i=this.tabIndex,n=this.setSize,o=this.posInSet,r=this.controls,s=this.handleEvt,a=this.tab,l=a.title,u=a.localActive,d=a.disabled,h=a.titleItemClass,f=a.titleLinkClass,p=a.titleLinkAttributes,m=t(ol,{staticClass:"nav-link",class:[{active:u&&!d,disabled:d},f,u?this.bvTabs.activeNavItemClass:null],props:{disabled:d},attrs:c(c({},p),{},{id:e,role:"tab",tabindex:i,"aria-selected":u&&!d?"true":"false","aria-setsize":n,"aria-posinset":o,"aria-controls":r}),on:{click:s,keydown:s},ref:"link"},[this.tab.normalizeSlot(tr)||l]);return t("li",{staticClass:"nav-item",class:[h],attrs:{role:"presentation"}},[m])}}),jT=Qt(Vb,["tabs","isNavBar","cardHeader"]),GT=vs(ee(c(c(c(c({},fc),RT),jT),{},{activeNavItemClass:hs(To),activeTabClass:hs(To),card:hs(ho,!1),contentClass:hs(To),end:hs(ho,!1),lazy:hs(ho,!1),navClass:hs(To),navWrapperClass:hs(To),noFade:hs(ho,!1),noKeyNav:hs(ho,!1),noNavStyle:hs(ho,!1),tag:hs(go,"div")})),bn),WT=i.default.extend({name:bn,mixins:[pc,AT,Cs],provide:function(){return{bvTabs:this}},props:GT,data:function(){return{currentTab:lr(this[MT],-1),tabs:[],registeredTabs:[]}},computed:{fade:function(){return!this.noFade},localNavClass:function(){var t=[];return this.card&&this.vertical&&t.push("card-header","h-100","border-bottom-0","rounded-0"),[].concat(t,[this.navClass])}},watch:(ng={},a(ng,MT,(function(t,e){if(t!==e){t=lr(t,-1),e=lr(e,0);var i=this.tabs[t];i&&!i.disabled?this.activateTab(i):t0&&void 0!==arguments[0])||arguments[0];if(this.$_observer&&this.$_observer.disconnect(),this.$_observer=null,e){var i=function(){t.$nextTick((function(){xr((function(){t.updateTabs()}))}))};this.$_observer=au(this.$refs.content,i,{childList:!0,subtree:!1,attributes:!0,attributeFilter:["id"]})}},getTabs:function(){var t=this.registeredTabs.filter((function(t){return 0===t.$children.filter((function(t){return t._isTab})).length})),e=[];if(M&&t.length>0){var i=t.map((function(t){return"#".concat(t.safeId())})).join(", ");e=Pr(i,this.$el).map((function(t){return t.id})).filter(ne)}return zw(t,(function(t,i){return e.indexOf(t.safeId())-e.indexOf(i.safeId())}))},updateTabs:function(){var t=this.getTabs(),e=t.indexOf(t.slice().reverse().find((function(t){return t.localActive&&!t.disabled})));if(e<0){var i=this.currentTab;i>=t.length?e=t.indexOf(t.slice().reverse().find(zT)):t[i]&&!t[i].disabled&&(e=i)}e<0&&(e=t.indexOf(t.find(zT))),t.forEach((function(t,i){t.localActive=i===e})),this.tabs=t,this.currentTab=e},getButtonForTab:function(t){return(this.$refs.buttons||[]).find((function(e){return e.tab===t}))},updateButton:function(t){var e=this.getButtonForTab(t);e&&e.$forceUpdate&&e.$forceUpdate()},activateTab:function(t){var e=this.currentTab,i=this.tabs,n=!1;if(t){var o=i.indexOf(t);if(o!==e&&o>-1&&!t.disabled){var r=new BvEvent("activate-tab",{cancelable:!0,vueTarget:this,componentId:this.safeId()});this.$emit(r.type,o,e,r),r.defaultPrevented||(this.currentTab=o,n=!0)}}return n||this[MT]===e||this.$emit(HT,e),n},deactivateTab:function(t){return!!t&&this.activateTab(this.tabs.filter((function(e){return e!==t})).find(zT))},focusButton:function(t){var e=this;this.$nextTick((function(){ts(e.getButtonForTab(t))}))},emitTabClick:function(t,e){Nt(e)&&t&&t.$emit&&!t.disabled&&t.$emit(Bn,e)},clickTab:function(t,e){this.activateTab(t),this.emitTabClick(t,e)},firstTab:function(t){var e=this.tabs.find(zT);this.activateTab(e)&&t&&(this.focusButton(e),this.emitTabClick(e,t))},previousTab:function(t){var e=Us(this.currentTab,0),i=this.tabs.slice(0,e).reverse().find(zT);this.activateTab(i)&&t&&(this.focusButton(i),this.emitTabClick(i,t))},nextTab:function(t){var e=Us(this.currentTab,-1),i=this.tabs.slice(e+1).find(zT);this.activateTab(i)&&t&&(this.focusButton(i),this.emitTabClick(i,t))},lastTab:function(t){var e=this.tabs.slice().reverse().find(zT);this.activateTab(e)&&t&&(this.focusButton(e),this.emitTabClick(e,t))}},render:function(t){var e=this,i=this.align,n=this.card,o=this.end,r=this.fill,s=this.firstTab,l=this.justified,c=this.lastTab,u=this.nextTab,d=this.noKeyNav,h=this.noNavStyle,f=this.pills,p=this.previousTab,m=this.small,v=this.tabs,b=this.vertical,g=v.find((function(t){return t.localActive&&!t.disabled})),y=v.find((function(t){return!t.disabled})),w=v.map((function(i,n){var o,r=i.safeId,l=null;return d||(l=-1,(i===g||!g&&i===y)&&(l=null)),t(NT,{props:{controls:r?r():null,id:i.controlledBy||(r?r("_BV_tab_button_"):null),noKeyNav:d,posInSet:n+1,setSize:v.length,tab:i,tabIndex:l},on:(o={},a(o,Bn,(function(t){e.clickTab(i,t)})),a(o,An,s),a(o,Xn,p),a(o,Un,u),a(o,Gn,c),o),key:i._uid||n,ref:"buttons",refInFor:!0})})),T=t(Eb,{class:this.localNavClass,attrs:{role:"tablist",id:this.safeId("_BV_tab_controls_")},props:{fill:r,justified:l,align:i,tabs:!h&&!f,pills:!h&&f,vertical:b,small:m,cardHeader:n&&!b},ref:"nav"},[this.normalizeSlot("tabs-start")||t(),w,this.normalizeSlot("tabs-end")||t()]);T=t("div",{class:[{"card-header":n&&!b&&!o,"card-footer":n&&!b&&o,"col-auto":b},this.navWrapperClass],key:"bv-tabs-nav"},[T]);var C=this.normalizeSlot()||[],x=t();0===C.length&&(x=t("div",{class:["tab-pane","active",{"card-body":n}],key:"bv-empty-tab"},this.normalizeSlot(Ro)));var S=t("div",{staticClass:"tab-content",class:[{col:b},this.contentClass],attrs:{id:this.safeId("_BV_tab_container_")},key:"bv-content",ref:"content"},[C,x]);return t(this.tag,{staticClass:"tabs",class:{row:b,"no-gutters":b&&n},attrs:{id:this.safeId()}},[o?S:t(),T,o?t():S])}}),YT="active",UT="update:active",qT=vs(ee(c(c({},fc),{},(a(og={},YT,hs(ho,!1)),a(og,"buttonId",hs(go)),a(og,"disabled",hs(ho,!1)),a(og,"lazy",hs(ho,!1)),a(og,"noBody",hs(ho,!1)),a(og,"tag",hs(go,"div")),a(og,"title",hs(go)),a(og,"titleItemClass",hs(To)),a(og,"titleLinkAttributes",hs(vo)),a(og,"titleLinkClass",hs(To)),og))),hn),KT=me({components:{BTabs:WT,BTab:i.default.extend({name:hn,mixins:[pc,Cs],inject:{bvTabs:{default:function(){return{}}}},props:qT,data:function(){return{localActive:this.active&&!this.disabled}},computed:{_isTab:function(){return!0},tabClasses:function(){var t=this.localActive;return[{active:t,disabled:this.disabled,"card-body":this.bvTabs.card&&!this.noBody},t?this.bvTabs.activeTabClass:null]},controlledBy:function(){return this.buttonId||this.safeId("__BV_tab_button__")},computedNoFade:function(){return!this.bvTabs.fade},computedLazy:function(){return this.bvTabs.lazy||this.lazy}},watch:(rg={},a(rg,YT,(function(t,e){t!==e&&(t?this.activate():this.deactivate()||this.$emit(UT,this.localActive))})),a(rg,"disabled",(function(t,e){if(t!==e){var i=this.bvTabs.firstTab;t&&this.localActive&&i&&(this.localActive=!1,i())}})),a(rg,"localActive",(function(t){this.$emit(UT,t)})),rg),mounted:function(){this.registerTab()},updated:function(){var t=this.bvTabs.updateButton;t&&this.hasNormalizedSlot(tr)&&t(this)},beforeDestroy:function(){this.unregisterTab()},methods:{registerTab:function(){var t=this.bvTabs.registerTab;t&&t(this)},unregisterTab:function(){var t=this.bvTabs.unregisterTab;t&&t(this)},activate:function(){var t=this.bvTabs.activateTab;return!(!t||this.disabled)&&t(this)},deactivate:function(){var t=this.bvTabs.deactivateTab;return!(!t||!this.localActive)&&t(this)}},render:function(t){var e=this.localActive,i=t(this.tag,{staticClass:"tab-pane",class:this.tabClasses,directives:[{name:"show",value:e}],attrs:{role:"tabpanel",id:this.safeId(),"aria-hidden":e?"false":"true","aria-labelledby":this.controlledBy||null},ref:"panel"},[e||!this.computedLazy?this.normalizeSlot():t()]);return t(Ls,{props:{mode:"out-in",noFade:this.computedNoFade}},[i])}})}}),XT=me({components:{BTime:av}});function ZT(t){return(ZT="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function JT(t){return function(t){if(Array.isArray(t)){for(var e=0,i=new Array(t.length);e1&&void 0!==arguments[1]&&arguments[1],i=t.to,n=t.from;if(i&&(n||!1!==e)&&this.transports[i])if(e)this.transports[i]=[];else{var o=this.$_getTransportIndex(t);if(o>=0){var r=this.transports[i].slice(0);r.splice(o,1),this.transports[i]=r}}},registerTarget:function(t,e,i){QT&&(this.trackInstances&&!i&&this.targets[t]&&console.warn("[portal-vue]: Target ".concat(t," already exists")),this.$set(this.targets,t,Object.freeze([e])))},unregisterTarget:function(t){this.$delete(this.targets,t)},registerSource:function(t,e,i){QT&&(this.trackInstances&&!i&&this.sources[t]&&console.warn("[portal-vue]: source ".concat(t," already exists")),this.$set(this.sources,t,Object.freeze([e])))},unregisterSource:function(t){this.$delete(this.sources,t)},hasTarget:function(t){return!(!this.targets[t]||!this.targets[t][0])},hasSource:function(t){return!(!this.sources[t]||!this.sources[t][0])},hasContentFor:function(t){return!!this.transports[t]&&!!this.transports[t].length},$_getTransportIndex:function(t){var e=t.to,i=t.from;for(var n in this.transports[e])if(this.transports[e][n].from===i)return+n;return-1}}}))(nC),aC=1,lC=i.default.extend({name:"portal",props:{disabled:{type:Boolean},name:{type:String,default:function(){return String(aC++)}},order:{type:Number,default:0},slim:{type:Boolean},slotProps:{type:Object,default:function(){return{}}},tag:{type:String,default:"DIV"},to:{type:String,default:function(){return String(Math.round(1e7*Math.random()))}}},created:function(){var t=this;this.$nextTick((function(){sC.registerSource(t.name,t)}))},mounted:function(){this.disabled||this.sendUpdate()},updated:function(){this.disabled?this.clear():this.sendUpdate()},beforeDestroy:function(){sC.unregisterSource(this.name),this.clear()},watch:{to:function(t,e){e&&e!==t&&this.clear(e),this.sendUpdate()}},methods:{clear:function(t){var e={from:this.name,to:t||this.to};sC.close(e)},normalizeSlots:function(){return this.$scopedSlots.default?[this.$scopedSlots.default]:this.$slots.default},normalizeOwnChildren:function(t){return"function"==typeof t?t(this.slotProps):t},sendUpdate:function(){var t=this.normalizeSlots();if(t){var e={from:this.name,to:this.to,passengers:JT(t),order:this.order};sC.open(e)}else this.clear()}},render:function(t){var e=this.$slots.default||this.$scopedSlots.default||[],i=this.tag;return e&&this.disabled?e.length<=1&&this.slim?this.normalizeOwnChildren(e)[0]:t(i,[this.normalizeOwnChildren(e)]):this.slim?t():t(i,{class:{"v-portal":!0},style:{display:"none"},key:"v-portal-placeholder"})}}),cC=i.default.extend({name:"portalTarget",props:{multiple:{type:Boolean,default:!1},name:{type:String,required:!0},slim:{type:Boolean,default:!1},slotProps:{type:Object,default:function(){return{}}},tag:{type:String,default:"div"},transition:{type:[String,Object,Function]}},data:function(){return{transports:sC.transports,firstRender:!0}},created:function(){var t=this;this.$nextTick((function(){sC.registerTarget(t.name,t)}))},watch:{ownTransports:function(){this.$emit("change",this.children().length>0)},name:function(t,e){sC.unregisterTarget(e),sC.registerTarget(t,this)}},mounted:function(){var t=this;this.transition&&this.$nextTick((function(){t.firstRender=!1}))},beforeDestroy:function(){sC.unregisterTarget(this.name)},computed:{ownTransports:function(){var t=this.transports[this.name]||[];return this.multiple?t:0===t.length?[]:[t[t.length-1]]},passengers:function(){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.reduce((function(t,i){var n=i.passengers[0],o="function"==typeof n?n(e):i.passengers;return t.concat(o)}),[])}(this.ownTransports,this.slotProps)}},methods:{children:function(){return 0!==this.passengers.length?this.passengers:this.$scopedSlots.default?this.$scopedSlots.default(this.slotProps):this.$slots.default||[]},noWrapper:function(){var t=this.slim&&!this.transition;return t&&this.children().length>1&&console.warn("[portal-vue]: PortalTarget with `slim` option received more than one child element."),t}},render:function(t){var e=this.noWrapper(),i=this.children(),n=this.transition||this.tag;return e?i[0]:this.slim&&!n?t():t(n,{props:{tag:this.transition&&this.tag?this.tag:void 0},class:{"vue-portal-target":!0}},i)}}),uC=0,dC=["disabled","name","order","slim","slotProps","tag","to"],hC=["multiple","transition"],fC=(i.default.extend({name:"MountingPortal",inheritAttrs:!1,props:{append:{type:[Boolean,String]},bail:{type:Boolean},mountTo:{type:String,required:!0},disabled:{type:Boolean},name:{type:String,default:function(){return"mounted_"+String(uC++)}},order:{type:Number,default:0},slim:{type:Boolean},slotProps:{type:Object,default:function(){return{}}},tag:{type:String,default:"DIV"},to:{type:String,default:function(){return String(Math.round(1e7*Math.random()))}},multiple:{type:Boolean,default:!1},targetSlim:{type:Boolean},targetSlotProps:{type:Object,default:function(){return{}}},targetTag:{type:String,default:"div"},transition:{type:[String,Object,Function]}},created:function(){if("undefined"!=typeof document){var t=document.querySelector(this.mountTo);if(t){var e=this.$props;if(sC.targets[e.name])e.bail?console.warn("[portal-vue]: Target ".concat(e.name," is already mounted.\n Aborting because 'bail: true' is set")):this.portalTarget=sC.targets[e.name];else{var i=e.append;if(i){var n="string"==typeof i?i:"DIV",o=document.createElement(n);t.appendChild(o),t=o}var r=tC(this.$props,hC);r.slim=this.targetSlim,r.tag=this.targetTag,r.slotProps=this.targetSlotProps,r.name=this.to,this.portalTarget=new cC({el:t,parent:this.$parent||this,propsData:r})}}else console.error("[portal-vue]: Mount Point '".concat(this.mountTo,"' not found in document"))}},beforeDestroy:function(){var t=this.portalTarget;if(this.append){var e=t.$el;e.parentNode.removeChild(e)}t.$destroy()},render:function(t){if(!this.portalTarget)return console.warn("[portal-vue] Target wasn't mounted"),t();if(!this.$scopedSlots.manual){var e=tC(this.$props,dC);return t(lC,{props:e,attrs:this.$attrs,on:this.$listeners,scopedSlots:this.$scopedSlots},this.$slots.default)}var i=this.$scopedSlots.manual({to:this.to});return Array.isArray(i)&&(i=i[0]),i||t()}}),i.default.extend({mixins:[Cs],data:function(){return{name:"b-toaster"}},methods:{onAfterEnter:function(t){var e=this;xr((function(){Mr(t,"".concat(e.name,"-enter-to"))}))}},render:function(t){return t("transition-group",{props:{tag:"div",name:this.name},on:{afterEnter:this.onAfterEnter}},this.normalizeSlot())}})),pC=vs({ariaAtomic:hs(go),ariaLive:hs(go),name:hs(go,void 0,!0),role:hs(go)},xn),mC=i.default.extend({name:xn,mixins:[Ja],props:pC,data:function(){return{doRender:!1,dead:!1,staticName:this.name}},beforeMount:function(){var t=this,e=this.name;this.staticName=e,sC.hasTarget(e)?(le('A "" with name "'.concat(e,'" already exists in the document.'),xn),this.dead=!0):(this.doRender=!0,this.$once(oo,(function(){t.emitOnRoot(Ds(xn,In),e)})))},destroyed:function(){var t=this.$el;t&&t.parentNode&&t.parentNode.removeChild(t)},render:function(t){var e=t("div",{class:["d-none",{"b-dead-toaster":this.dead}]});if(this.doRender){var i=t(cC,{staticClass:"b-toaster-slot",props:{name:this.staticName,multiple:!0,tag:"div",slim:!1,transition:fC}});e=t("div",{staticClass:"b-toaster",class:[this.staticName],attrs:{id:this.staticName,role:this.role||null,"aria-live":this.ariaLive,"aria-atomic":this.ariaAtomic}},[i])}return e}}),vC=ys("visible",{type:ho,defaultValue:!1,event:$n}),bC=vC.mixin,gC=vC.props,yC=vC.prop,wC=vC.event,TC=Jt(nl,["href","to"]),CC=vs(ee(c(c(c(c({},fc),gC),TC),{},{appendToast:hs(ho,!1),autoHideDelay:hs(_o,5e3),bodyClass:hs(To),headerClass:hs(To),isStatus:hs(ho,!1),noAutoHide:hs(ho,!1),noCloseButton:hs(ho,!1),noFade:hs(ho,!1),noHoverPause:hs(ho,!1),solid:hs(ho,!1),static:hs(ho,!1),title:hs(go),toastClass:hs(To),toaster:hs(go,"b-toaster-top-right"),variant:hs(go)})),Cn),xC=i.default.extend({name:Cn,mixins:[Za,pc,bC,Ja,Cs,ib],inheritAttrs:!1,props:CC,data:function(){return{isMounted:!1,doRender:!1,localShow:!1,isTransitioning:!1,isHiding:!1,order:0,dismissStarted:0,resumeDismiss:0}},computed:{toastClasses:function(){var t=this.appendToast,e=this.variant;return a({"b-toast-solid":this.solid,"b-toast-append":t,"b-toast-prepend":!t},"b-toast-".concat(e),e)},slotScope:function(){return{hide:this.hide}},computedDuration:function(){return Us(lr(this.autoHideDelay,0),1e3)},computedToaster:function(){return String(this.toaster)},transitionHandlers:function(){return{beforeEnter:this.onBeforeEnter,afterEnter:this.onAfterEnter,beforeLeave:this.onBeforeLeave,afterLeave:this.onAfterLeave}},computedAttrs:function(){return c(c({},this.bvAttrs),{},{id:this.safeId(),tabindex:"0"})}},watch:(eC={},a(eC,yC,(function(t){this[t?"show":"hide"]()})),a(eC,"localShow",(function(t){t!==this[yC]&&this.$emit(wC,t)})),a(eC,"toaster",(function(){this.$nextTick(this.ensureToaster)})),a(eC,"static",(function(t){t&&this.localShow&&this.ensureToaster()})),eC),created:function(){this.$_dismissTimer=null},mounted:function(){var t=this;this.isMounted=!0,this.$nextTick((function(){t[yC]&&xr((function(){t.show()}))})),this.listenOnRoot(Fs(Cn,to),(function(e){e===t.safeId()&&t.show()})),this.listenOnRoot(Fs(Cn,Nn),(function(e){e&&e!==t.safeId()||t.hide()})),this.listenOnRoot(Ds(xn,In),(function(e){e===t.computedToaster&&t.hide()}))},beforeDestroy:function(){this.clearDismissTimer()},methods:{show:function(){var t=this;if(!this.localShow){this.ensureToaster();var e=this.buildEvent(to);this.emitEvent(e),this.dismissStarted=this.resumeDismiss=0,this.order=Date.now()*(this.appendToast?1:-1),this.isHiding=!1,this.doRender=!0,this.$nextTick((function(){xr((function(){t.localShow=!0}))}))}},hide:function(){var t=this;if(this.localShow){var e=this.buildEvent(Nn);this.emitEvent(e),this.setHoverHandler(!1),this.dismissStarted=this.resumeDismiss=0,this.clearDismissTimer(),this.isHiding=!0,xr((function(){t.localShow=!1}))}},buildEvent:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new BvEvent(t,c(c({cancelable:!1,target:this.$el||null,relatedTarget:null},e),{},{vueTarget:this,componentId:this.safeId()}))},emitEvent:function(t){var e=t.type;this.emitOnRoot(Ds(Cn,e),t),this.$emit(e,t)},ensureToaster:function(){if(!this.static){var t=this.computedToaster;if(!sC.hasTarget(t)){var e=document.createElement("div");document.body.appendChild(e),new mC({parent:this.$root,propsData:{name:t}}).$mount(e)}}},startDismissTimer:function(){this.clearDismissTimer(),this.noAutoHide||(this.$_dismissTimer=setTimeout(this.hide,this.resumeDismiss||this.computedDuration),this.dismissStarted=Date.now(),this.resumeDismiss=0)},clearDismissTimer:function(){clearTimeout(this.$_dismissTimer),this.$_dismissTimer=null},setHoverHandler:function(t){var e=this.$refs["b-toast"];$s(t,e,"mouseenter",this.onPause,lo),$s(t,e,"mouseleave",this.onUnPause,lo)},onPause:function(){if(!this.noAutoHide&&!this.noHoverPause&&this.$_dismissTimer&&!this.resumeDismiss){var t=Date.now()-this.dismissStarted;t>0&&(this.clearDismissTimer(),this.resumeDismiss=Us(this.computedDuration-t,1e3))}},onUnPause:function(){this.noAutoHide||this.noHoverPause||!this.resumeDismiss?this.resumeDismiss=this.dismissStarted=0:this.startDismissTimer()},onLinkClick:function(){var t=this;this.$nextTick((function(){xr((function(){t.hide()}))}))},onBeforeEnter:function(){this.isTransitioning=!0},onAfterEnter:function(){this.isTransitioning=!1;var t=this.buildEvent(eo);this.emitEvent(t),this.startDismissTimer(),this.setHoverHandler(!0)},onBeforeLeave:function(){this.isTransitioning=!0},onAfterLeave:function(){this.isTransitioning=!1,this.order=0,this.resumeDismiss=this.dismissStarted=0;var t=this.buildEvent(zn);this.emitEvent(t),this.doRender=!1},makeToast:function(t){var e=this,i=this.title,n=this.slotScope,o=la(this),r=[],s=this.normalizeSlot("toast-title",n);s?r.push(s):i&&r.push(t("strong",{staticClass:"mr-2"},i)),this.noCloseButton||r.push(t(Ps,{staticClass:"ml-auto mb-1",on:{click:function(){e.hide()}}}));var a=t();r.length>0&&(a=t("header",{staticClass:"toast-header",class:this.headerClass},r));var l=t(o?ol:"div",{staticClass:"toast-body",class:this.bodyClass,props:o?ps(TC,this):{},on:o?{click:this.onLinkClick}:{}},this.normalizeSlot(Ao,n));return t("div",{staticClass:"toast",class:this.toastClass,attrs:this.computedAttrs,key:"toast-".concat(this._uid),ref:"toast"},[a,l])}},render:function(t){if(!this.doRender||!this.isMounted)return t();var e=this.order,i=this.static,n=this.isHiding,o=this.isStatus,r="b-toast-".concat(this._uid),s=t("div",{staticClass:"b-toast",class:this.toastClasses,attrs:c(c({},i?{}:this.scopedStyleAttrs),{},{id:this.safeId("_toast_outer"),role:n?null:o?"status":"alert","aria-live":n?null:o?"polite":"assertive","aria-atomic":n?null:"true"}),key:r,ref:"b-toast"},[t(Ls,{props:{noFade:this.noFade},on:this.transitionHandlers},[this.localShow?this.makeToast(t):t()])]);return t(lC,{props:{name:r,to:this.computedToaster,order:e,slim:!0,disabled:i}},[s])}}),SC="$bvToast",kC=["id"].concat(T(Kt(Qt(CC,["static","visible"])))),$C={toastContent:"default",title:"toast-title"},BC=function(t){return kC.reduce((function(e,i){return Ft(t[i])||(e[i]=t[i]),e}),{})},_C=me({components:{BToast:xC,BToaster:mC},plugins:{BVToastPlugin:me({plugins:{plugin:function(t){var e=t.extend({name:"BVToastPop",extends:xC,destroyed:function(){var t=this.$el;t&&t.parentNode&&t.parentNode.removeChild(t)},mounted:function(){var t=this,e=function(){t.localShow=!1,t.doRender=!1,t.$nextTick((function(){t.$nextTick((function(){xr((function(){t.$destroy()}))}))}))};this.$parent.$once(ro,e),this.$once(zn,e),this.listenOnRoot(Ds(xn,In),(function(i){i===t.toaster&&e()}))}}),i=function(t,i){if(!ce(SC)){var n=new e({parent:i,propsData:c(c(c({},BC(rs(Cn))),Qt(t,Kt($C))),{},{static:!1,visible:!0})});Kt($C).forEach((function(e){var o=t[e];Ft(o)||("title"===e&&Et(o)&&(o=[i.$createElement("strong",{class:"mr-2"},o)]),n.$slots[$C[e]]=or(o))}));var o=document.createElement("div");document.body.appendChild(o),n.$mount(o)}},n=function(){function t(e){o(this,t),Gt(this,{_vm:e,_root:e.$root}),Yt(this,{_vm:{enumerable:!0,configurable:!1,writable:!1},_root:{enumerable:!0,configurable:!1,writable:!1}})}return s(t,[{key:"toast",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t&&!ce(SC)&&i(c(c({},BC(e)),{},{toastContent:t}),this._vm)}},{key:"show",value:function(t){t&&this._root.$emit(Fs(Cn,to),t)}},{key:"hide",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;this._root.$emit(Fs(Cn,Nn),t)}}]),t}();t.mixin({beforeCreate:function(){this._bv__toast=new n(this)}}),Xt(t.prototype,SC)||Ut(t.prototype,SC,{get:function(){return this&&this._bv__toast||le('"'.concat(SC,'" must be accessed from a Vue instance "this" context.'),Cn),this._bv__toast}})}}})}}),DC="__BV_Tooltip__",FC={focus:!0,hover:!0,click:!0,blur:!0,manual:!0},IC=/^html$/i,PC=/^noninteractive$/i,OC=/^nofade$/i,VC=/^(auto|top(left|right)?|bottom(left|right)?|left(top|bottom)?|right(top|bottom)?)$/i,EC=/^(window|viewport|scrollParent)$/i,LC=/^d\d+$/i,AC=/^ds\d+$/i,RC=/^dh\d+$/i,MC=/^o-?\d+$/i,HC=/^v-.+$/i,zC=/\s+/,NC=function(t,e,i){if(M){var n=function(t,e){var i={title:void 0,trigger:"",placement:"top",fallbackPlacement:"flip",container:!1,animation:!0,offset:0,id:null,html:!1,interactive:!0,disabled:!1,delay:rs(Sn,"delay",50),boundary:String(rs(Sn,"boundary","scrollParent")),boundaryPadding:lr(rs(Sn,"boundaryPadding",5),0),variant:rs(Sn,"variant"),customClass:rs(Sn,"customClass")};if(Et(t.value)||Lt(t.value)||Ot(t.value)?i.title=t.value:Ht(t.value)&&(i=c(c({},i),t.value)),Ft(i.title)){var n=e.data||{};i.title=n.attrs&&!Pt(n.attrs.title)?n.attrs.title:void 0}Ht(i.delay)||(i.delay={show:lr(i.delay,0),hide:lr(i.delay,0)}),t.arg&&(i.container="#".concat(t.arg)),Kt(t.modifiers).forEach((function(t){if(IC.test(t))i.html=!0;else if(PC.test(t))i.interactive=!1;else if(OC.test(t))i.animation=!1;else if(VC.test(t))i.placement=t;else if(EC.test(t))t="scrollparent"===t?"scrollParent":t,i.boundary=t;else if(LC.test(t)){var e=lr(t.slice(1),0);i.delay.show=e,i.delay.hide=e}else AC.test(t)?i.delay.show=lr(t.slice(2),0):RC.test(t)?i.delay.hide=lr(t.slice(2),0):MC.test(t)?i.offset=lr(t.slice(1),0):HC.test(t)&&(i.variant=t.slice(2)||null)}));var o={};return or(i.trigger||"").filter(ne).join(" ").trim().toLowerCase().split(zC).forEach((function(t){FC[t]&&(o[t]=!0)})),Kt(t.modifiers).forEach((function(t){t=t.toLowerCase(),FC[t]&&(o[t]=!0)})),i.trigger=Kt(o).join(" "),"blur"===i.trigger&&(i.trigger="focus"),i.trigger||(i.trigger="hover focus"),i}(e,i);if(!t[DC]){var o=i.context;t[DC]=new Xg({parent:o,_scopeId:eb(o,void 0)}),t[DC].__bv_prev_data__={},t[DC].$on(to,(function(){Ot(n.title)&&t[DC].updateData({title:n.title(t)})}))}var r={title:n.title,triggers:n.trigger,placement:n.placement,fallbackPlacement:n.fallbackPlacement,variant:n.variant,customClass:n.customClass,container:n.container,boundary:n.boundary,delay:n.delay,offset:n.offset,noFade:!n.animation,id:n.id,interactive:n.interactive,disabled:n.disabled,html:n.html},s=t[DC].__bv_prev_data__;if(t[DC].__bv_prev_data__=r,!Ua(r,s)){var a={target:t};Kt(r).forEach((function(e){r[e]!==s[e]&&(a[e]="title"===e&&Ot(r[e])?r[e](t):r[e])})),t[DC].updateData(a)}}},jC=me({directives:{VBTooltip:{bind:function(t,e,i){NC(t,e,i)},componentUpdated:function(t,e,i){i.context.$nextTick((function(){NC(t,e,i)}))},unbind:function(t){!function(t){t[DC]&&(t[DC].$destroy(),t[DC]=null),delete t[DC]}(t)}}}}),GC=me({plugins:{AlertPlugin:Ws,AspectPlugin:ia,AvatarPlugin:xl,BadgePlugin:_l,BreadcrumbPlugin:Ll,ButtonPlugin:Al,ButtonGroupPlugin:Hl,ButtonToolbarPlugin:Gl,CalendarPlugin:Cc,CardPlugin:ru,CarouselPlugin:wu,CollapsePlugin:cd,DropdownPlugin:tf,EmbedPlugin:rf,FormPlugin:gf,FormCheckboxPlugin:Jf,FormDatepickerPlugin:mp,FormFilePlugin:Bp,FormGroupPlugin:Rp,FormInputPlugin:Zp,FormRadioPlugin:tm,FormRatingPlugin:dm,FormSelectPlugin:km,FormSpinbuttonPlugin:Vm,FormTagsPlugin:qm,FormTextareaPlugin:Zm,FormTimepickerPlugin:bv,ImagePlugin:gv,InputGroupPlugin:_v,JumbotronPlugin:Pv,LayoutPlugin:Av,LinkPlugin:Rv,ListGroupPlugin:Gv,MediaPlugin:Xv,ModalPlugin:Ob,NavPlugin:Wb,NavbarPlugin:fg,OverlayPlugin:yg,PaginationPlugin:Vg,PaginationNavPlugin:Rg,PopoverPlugin:wy,ProgressPlugin:ky,SidebarPlugin:Ny,SkeletonPlugin:VT,SpinnerPlugin:ET,TablePlugin:DT,TabsPlugin:KT,TimePlugin:XT,ToastPlugin:_C,TooltipPlugin:me({components:{BTooltip:ey},plugins:{VBTooltipPlugin:jC}})}}),WC=me({directives:{VBHover:np}}),YC=me({directives:{VBModal:Bb}}),UC="active",qC=".nav-link",KC=".nav-item",XC=".list-group-item",ZC=".dropdown-item",JC=Ds("BVScrollspy","activate"),QC="position",tx={element:"body",offset:10,method:"auto",throttle:75},ex={element:"(string|element|component)",offset:"number",method:"string",throttle:"number"},ix=["webkitTransitionEnd","transitionend","otransitionend","oTransitionEnd"],nx=function(t){return function(t){return Object.prototype.toString.call(t)}(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()},ox=function(){function t(e,i,n){o(this,t),this.$el=e,this.$scroller=null,this.$selector=[qC,XC,ZC].join(","),this.$offsets=[],this.$targets=[],this.$activeTarget=null,this.$scrollHeight=0,this.$resizeTimeout=null,this.$scrollerObserver=null,this.$targetsObserver=null,this.$root=n||null,this.$config=null,this.updateConfig(i)}return s(t,[{key:"updateConfig",value:function(t,e){this.$scroller&&(this.unlisten(),this.$scroller=null);var i=c(c({},this.constructor.Default),t);if(e&&(this.$root=e),function(t,e,i){for(var n in i)if(Xt(i,n)){var o=i[n],r=e[n],s=r&&kr(r)?"element":nx(r);s=r&&r._isVue?"component":s,new RegExp(o).test(s)||le("".concat(t,': Option "').concat(n,'" provided type "').concat(s,'" but expected type "').concat(o,'"'))}}(this.constructor.Name,i,this.constructor.DefaultType),this.$config=i,this.$root){var n=this;this.$root.$nextTick((function(){n.listen()}))}else this.listen()}},{key:"dispose",value:function(){this.unlisten(),clearTimeout(this.$resizeTimeout),this.$resizeTimeout=null,this.$el=null,this.$config=null,this.$scroller=null,this.$selector=null,this.$offsets=null,this.$targets=null,this.$activeTarget=null,this.$scrollHeight=null}},{key:"listen",value:function(){var t=this,e=this.getScroller();e&&"BODY"!==e.tagName&&Ss(e,"scroll",this,lo),Ss(window,"scroll",this,lo),Ss(window,"resize",this,lo),Ss(window,"orientationchange",this,lo),ix.forEach((function(e){Ss(window,e,t,lo)})),this.setObservers(!0),this.handleEvent("refresh")}},{key:"unlisten",value:function(){var t=this,e=this.getScroller();this.setObservers(!1),e&&"BODY"!==e.tagName&&ks(e,"scroll",this,lo),ks(window,"scroll",this,lo),ks(window,"resize",this,lo),ks(window,"orientationchange",this,lo),ix.forEach((function(e){ks(window,e,t,lo)}))}},{key:"setObservers",value:function(t){var e=this;this.$scrollerObserver&&this.$scrollerObserver.disconnect(),this.$targetsObserver&&this.$targetsObserver.disconnect(),this.$scrollerObserver=null,this.$targetsObserver=null,t&&(this.$targetsObserver=au(this.$el,(function(){e.handleEvent("mutation")}),{subtree:!0,childList:!0,attributes:!0,attributeFilter:["href"]}),this.$scrollerObserver=au(this.getScroller(),(function(){e.handleEvent("mutation")}),{subtree:!0,childList:!0,characterData:!0,attributes:!0,attributeFilter:["id","style","class"]}))}},{key:"handleEvent",value:function(t){var e=Et(t)?t:t.type,i=this;"scroll"===e?(this.$scrollerObserver||this.listen(),this.process()):/(resize|orientationchange|mutation|refresh)/.test(e)&&(i.$resizeTimeout||(i.$resizeTimeout=setTimeout((function(){i.refresh(),i.process(),i.$resizeTimeout=null}),i.$config.throttle)))}},{key:"refresh",value:function(){var t=this,e=this.getScroller();if(e){var i=e!==e.window?QC:"offset",n="auto"===this.$config.method?i:this.$config.method,o=n===QC?Jr:Zr,r=n===QC?this.getScrollTop():0;return this.$offsets=[],this.$targets=[],this.$scrollHeight=this.getScrollHeight(),Pr(this.$selector,this.$el).map((function(t){return jr(t,"href")})).filter((function(t){return t&&yt.test(t||"")})).map((function(t){var i=t.replace(yt,"$1").trim();if(!i)return null;var n=Or(i,e);return n&&Dr(n)?{offset:lr(o(n).top,0)+r,target:i}:null})).filter(ne).sort((function(t,e){return t.offset-e.offset})).reduce((function(e,i){return e[i.target]||(t.$offsets.push(i.offset),t.$targets.push(i.target),e[i.target]=!0),e}),{}),this}}},{key:"process",value:function(){var t=this.getScrollTop()+this.$config.offset,e=this.getScrollHeight(),i=this.$config.offset+e-this.getOffsetHeight();if(this.$scrollHeight!==e&&this.refresh(),t>=i){var n=this.$targets[this.$targets.length-1];this.$activeTarget!==n&&this.activate(n)}else{if(this.$activeTarget&&t0)return this.$activeTarget=null,void this.clear();for(var o=this.$offsets.length;o--;){this.$activeTarget!==this.$targets[o]&&t>=this.$offsets[o]&&(Ft(this.$offsets[o+1])||t0&&this.$root&&this.$root.$emit(JC,t,i)}},{key:"clear",value:function(){var t=this;Pr("".concat(this.$selector,", ").concat(KC),this.$el).filter((function(t){return Hr(t,UC)})).forEach((function(e){return t.setActiveState(e,!1)}))}},{key:"setActiveState",value:function(t,e){t&&(e?Rr(t,UC):Mr(t,UC))}}],[{key:"Name",get:function(){return"v-b-scrollspy"}},{key:"Default",get:function(){return tx}},{key:"DefaultType",get:function(){return ex}}]),t}(),rx="__BV_ScrollSpy__",sx=/^\d+$/,ax=/^(auto|position|offset)$/,lx=function(t,e,i){if(M){var n=function(t){var e={};return t.arg&&(e.element="#".concat(t.arg)),Kt(t.modifiers).forEach((function(t){sx.test(t)?e.offset=lr(t,0):ax.test(t)&&(e.method=t)})),Et(t.value)?e.element=t.value:Lt(t.value)?e.offset=Js(t.value):Mt(t.value)&&Kt(t.value).filter((function(t){return!!ox.DefaultType[t]})).forEach((function(i){e[i]=t.value[i]})),e}(e);t[rx]?t[rx].updateConfig(n,i.context.$root):t[rx]=new ox(t,n,i.context.$root)}},cx={install:pe({plugins:{componentsPlugin:GC,directivesPlugin:me({plugins:{VBHoverPlugin:WC,VBModalPlugin:YC,VBPopoverPlugin:yy,VBScrollspyPlugin:me({directives:{VBScrollspy:{bind:function(t,e,i){lx(t,e,i)},inserted:function(t,e,i){lx(t,e,i)},update:function(t,e,i){e.value!==e.oldValue&&lx(t,e,i)},componentUpdated:function(t,e,i){e.value!==e.oldValue&&lx(t,e,i)},unbind:function(t){!function(t){t[rx]&&(t[rx].dispose(),t[rx]=null,delete t[rx])}(t)}}}}),VBTogglePlugin:ld,VBTooltipPlugin:jC,VBVisiblePlugin:me({directives:{VBVisible:Kc}})}})}}),NAME:"BootstrapVue"};return iC=cx,V&&window.Vue&&window.Vue.use(iC),V&&iC.NAME&&(window[iC.NAME]=iC),cx}));
+//# sourceMappingURL=bootstrap-vue.min.js.map
\ No newline at end of file
diff --git a/src/renderer/js/bootstrap.min.js b/src/renderer/lib/bootstrap.min.js
similarity index 100%
rename from src/renderer/js/bootstrap.min.js
rename to src/renderer/lib/bootstrap.min.js
diff --git a/src/renderer/lib/fast-plural-rules.js b/src/renderer/lib/fast-plural-rules.js
new file mode 100644
index 00000000..b0b5c857
--- /dev/null
+++ b/src/renderer/lib/fast-plural-rules.js
@@ -0,0 +1 @@
+!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n="undefined"!=typeof globalThis?globalThis:n||self).fastPluralRules={})}(this,(function(n){"use strict";var e=[function(){return 0},function(n){return 1===n?0:1},function(n){return n<=1?0:1},function(n){return n%10==1&&n%100!=11?1:n%10!=0?2:0},function(n){return 1===n||11===n?0:2===n||12===n?1:n>2&&n<20?2:3},function(n){return 1===n?0:0===n||n%100>0&&n%100<20?1:2},function(n){return n%10==1&&n%100!=11?0:n%10>=2&&(n%100<10||n%100>=20)?2:1},function(n){return n%10==1&&n%100!=11?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2},function(n){return 1===n?0:n>=2&&n<=4?1:2},function(n){return 1===n?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2},function(n){return n%100==1?0:n%100==2?1:n%100==3||n%100==4?2:3},function(n){return 1===n?0:2===n?1:n>2&&n<7?2:n>6&&n<11?3:4},function(n){return 1===n?0:2===n?1:n%100>=3&&n%100<=10?2:n%100>=11?3:0!==n?4:5},function(n){return 1===n?0:0===n||n%100>0&&n%100<11?1:n%100>10&&n%100<20?2:3},function(n){return n%10==1?0:n%10==2?1:2},function(n){return n%10==1&&n%100!=11?0:1},function(n){return n%10==1&&n%100!=11&&n%100!=71&&n%100!=91?0:n%10==2&&n%100!=12&&n%100!=72&&n%100!=92?1:n%10!=3&&n%10!=4&&n%10!=9||n%100==13||n%100==73||n%100==93||n%100==14||n%100==74||n%100==94||n%100==19||n%100==79||n%100==99?0!==n&&n%1e6==0?3:4:2},function(n){return 0!==n?1:0},function(n){return 1===n?1:2===n?2:3===n?3:6===n?4:0!==n?5:0},function(n){return 1===n?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2},function(n){return 1===n?0:2===n?1:3===n?2:3},function(n){return n%10==1&&n%100!=11?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2},function(n){return 0===n?0:1===n?1:2}],r={ach:2,af:1,ak:2,am:2,an:1,anp:1,ar:12,arn:2,as:1,ast:1,ay:0,az:1,be:7,bg:1,bn:1,bo:0,br:2,brx:1,bs:7,ca:1,cgg:0,cs:8,csb:19,cy:18,da:1,de:1,doi:1,dz:0,el:1,en:1,eo:1,es:1,"es-ar":1,et:1,eu:1,fa:2,ff:1,fi:1,fil:2,fo:1,fr:2,fur:1,fy:1,ga:11,gd:4,gl:1,gu:1,gun:2,ha:1,he:1,hi:1,hne:1,hr:7,hu:1,hy:1,ia:1,id:0,is:15,it:1,ja:0,jbo:0,jv:17,ka:0,kk:1,kl:1,km:0,kn:1,ko:0,ku:1,kw:20,ky:1,lb:1,ln:2,lo:0,lt:6,lv:3,mai:1,me:21,mfe:2,mg:2,mi:2,mk:15,ml:1,mn:1,mni:1,mnk:22,mr:1,ms:0,mt:13,my:0,nah:1,nap:1,nb:1,ne:1,nl:1,nn:1,no:1,nso:1,oc:2,or:1,pa:1,pap:1,pl:9,pms:1,ps:1,pt:1,"pt-br":2,rm:1,ro:5,ru:7,rw:1,sah:0,sat:1,sco:1,sd:1,se:1,si:1,sk:8,sl:10,so:1,son:1,sq:1,sr:7,su:0,sv:1,sw:1,ta:1,te:1,tg:2,th:0,ti:2,tk:1,tr:2,tt:0,ug:0,uk:7,ur:1,uz:2,vi:0,wa:2,wo:0,yo:1,"zh-cn":0,"zh-tw":2},o=[["other"],["one","other"],["one","other"],["zero","one","other"],["one","two","few","other"],["one","few","other"],["one","few","other"],["one","few","other"],["one","few","other"],["one","few","other"],["one","two","few","other"],["one","two","few","many","other"],["one","two","few","many","other","zero"],["one","few","many","other"],["one","few","other"],["one","other"],["one","two","few","many","other"],["zero","other"],["zero","one","two","few","many","other"],["one","few","other"],["one","two","few","other"],["one","few","other"],["zero","one","other"]];function t(n){n=function(n){return n.toLowerCase().replace("_","-")}(n);var e=r[n];if(void 0===e){var o=function(n){var e=n.indexOf("-");return e>0?n.substr(0,e):n}(n);e=r[o]}if(void 0===e)throw new Error('Unrecognized locale: "'+n+'".');return e}function u(n,e){var r=o[e];return function(e){return r[n(e)]}}function a(n){var r=t(n);return e[r]}function i(n){var r=e[n];if(void 0===r)throw new Error('Invalid index: "'+n+'".');return r}function f(n){var r=t(n);return u(e[r],r)}function l(n){if(void 0===e[n])throw new Error('Invalid index: "'+n+'".');return u(e[n],n)}n.getPluralFormForCardinalByIndex=function(n,e){return i(n)(e)},n.getPluralFormForCardinalByLocale=function(n,e){return a(n)(e)},n.getPluralFormNameForCardinalByIndex=function(n,e){return l(n)(e)},n.getPluralFormNameForCardinalByLocale=function(n,e){return f(n)(e)},n.getPluralRuleForCardinalsByIndex=i,n.getPluralRuleForCardinalsByLocale=a,n.getPluralRuleForNamedFormsForCardinalsByIndex=l,n.getPluralRuleForNamedFormsForCardinalsByLocale=f,Object.defineProperty(n,"__esModule",{value:!0})}));
\ No newline at end of file
diff --git a/src/renderer/js/jquery-3.2.1.slim.min.js b/src/renderer/lib/jquery-3.2.1.slim.min.js
similarity index 100%
rename from src/renderer/js/jquery-3.2.1.slim.min.js
rename to src/renderer/lib/jquery-3.2.1.slim.min.js
diff --git a/src/renderer/js/less.js b/src/renderer/lib/less.js
similarity index 100%
rename from src/renderer/js/less.js
rename to src/renderer/lib/less.js
diff --git a/src/renderer/js/notyf.min.js b/src/renderer/lib/notyf.min.js
similarity index 100%
rename from src/renderer/js/notyf.min.js
rename to src/renderer/lib/notyf.min.js
diff --git a/src/renderer/js/popper.min.js b/src/renderer/lib/popper.min.js
similarity index 100%
rename from src/renderer/js/popper.min.js
rename to src/renderer/lib/popper.min.js
diff --git a/src/renderer/lib/resonance-audio.min.js b/src/renderer/lib/resonance-audio.min.js
new file mode 100644
index 00000000..7d4349e1
--- /dev/null
+++ b/src/renderer/lib/resonance-audio.min.js
@@ -0,0 +1,181 @@
+!function(A,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e=t();for(var i in e)("object"==typeof exports?exports:A)[i]=e[i]}}(this,function(){return function(A){function t(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return A[i].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var e={};return t.m=A,t.c=e,t.d=function(A,e,i){t.o(A,e)||Object.defineProperty(A,e,{configurable:!1,enumerable:!0,get:i})},t.n=function(A){var e=A&&A.__esModule?function(){return A.default}:function(){return A};return t.d(e,"a",e),e},t.o=function(A,t){return Object.prototype.hasOwnProperty.call(A,t)},t.p="",t(t.s=10)}([function(A,t,e){"use strict";/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+function i(){}i.DEFAULT_SOURCE_GAIN=1,i.LISTENER_MAX_OUTSIDE_ROOM_DISTANCE=1,i.SOURCE_MAX_OUTSIDE_ROOM_DISTANCE=1,i.DEFAULT_SOURCE_DISTANCE=1,i.DEFAULT_POSITION=[0,0,0],i.DEFAULT_FORWARD=[0,0,-1],i.DEFAULT_UP=[0,1,0],i.DEFAULT_RIGHT=[1,0,0],i.DEFAULT_SPEED_OF_SOUND=343,i.ATTENUATION_ROLLOFFS=["logarithmic","linear","none"],i.DEFAULT_ATTENUATION_ROLLOFF="logarithmic",i.DEFAULT_MIN_DISTANCE=1,i.DEFAULT_MAX_DISTANCE=1e3,i.DEFAULT_DIRECTIVITY_ALPHA=0,i.DEFAULT_DIRECTIVITY_SHARPNESS=1,i.DEFAULT_AZIMUTH=0,i.DEFAULT_ELEVATION=0,i.DEFAULT_AMBISONIC_ORDER=1,i.DEFAULT_SOURCE_WIDTH=0,i.DEFAULT_REFLECTION_MAX_DURATION=.5,i.DEFAULT_REFLECTION_CUTOFF_FREQUENCY=6400,i.DEFAULT_REFLECTION_COEFFICIENTS={left:0,right:0,front:0,back:0,down:0,up:0},i.DEFAULT_REFLECTION_MIN_DISTANCE=1,i.DEFAULT_ROOM_DIMENSIONS={width:0,height:0,depth:0},i.DEFAULT_REFLECTION_MULTIPLIER=1,i.DEFAULT_REVERB_BANDWIDTH=1,i.DEFAULT_REVERB_DURATION_MULTIPLIER=1,i.DEFAULT_REVERB_PREDELAY=1.5,i.DEFAULT_REVERB_TAIL_ONSET=3.8,i.DEFAULT_REVERB_GAIN=.01,i.DEFAULT_REVERB_MAX_DURATION=3,i.NUMBER_REVERB_FREQUENCY_BANDS=(i.DEFAULT_REVERB_FREQUENCY_BANDS=[31.25,62.5,125,250,500,1e3,2e3,4e3,8e3]).length,i.DEFAULT_REVERB_DURATIONS=new Float32Array(i.NUMBER_REVERB_FREQUENCY_BANDS),i.ROOM_MATERIAL_COEFFICIENTS={transparent:[1,1,1,1,1,1,1,1,1],"acoustic-ceiling-tiles":[.672,.675,.7,.66,.72,.92,.88,.75,1],"brick-bare":[.03,.03,.03,.03,.03,.04,.05,.07,.14],"brick-painted":[.006,.007,.01,.01,.02,.02,.02,.03,.06],"concrete-block-coarse":[.36,.36,.36,.44,.31,.29,.39,.25,.5],"concrete-block-painted":[.092,.09,.1,.05,.06,.07,.09,.08,.16],"curtain-heavy":[.073,.106,.14,.35,.55,.72,.7,.65,1],"fiber-glass-insulation":[.193,.22,.22,.82,.99,.99,.99,.99,1],"glass-thin":[.18,.169,.18,.06,.04,.03,.02,.02,.04],"glass-thick":[.35,.35,.35,.25,.18,.12,.07,.04,.08],grass:[.05,.05,.15,.25,.4,.55,.6,.6,.6],"linoleum-on-concrete":[.02,.02,.02,.03,.03,.03,.03,.02,.04],marble:[.01,.01,.01,.01,.01,.01,.02,.02,.04],metal:[.03,.035,.04,.04,.05,.05,.05,.07,.09],"parquet-on-concrete":[.028,.03,.04,.04,.07,.06,.06,.07,.14],"plaster-rough":[.017,.018,.02,.03,.04,.05,.04,.03,.06],"plaster-smooth":[.011,.012,.013,.015,.02,.03,.04,.05,.1],"plywood-panel":[.4,.34,.28,.22,.17,.09,.1,.11,.22],"polished-concrete-or-tile":[.008,.008,.01,.01,.015,.02,.02,.02,.04],"sheet-rock":[.29,.279,.29,.1,.05,.04,.07,.09,.18],"water-or-ice-surface":[.006,.006,.008,.008,.013,.015,.02,.025,.05],"wood-ceiling":[.15,.147,.15,.11,.1,.07,.06,.07,.14],"wood-panel":[.28,.28,.28,.22,.17,.09,.1,.11,.22],uniform:[.5,.5,.5,.5,.5,.5,.5,.5,.5]},i.DEFAULT_ROOM_MATERIALS={left:"transparent",right:"transparent",front:"transparent",back:"transparent",down:"transparent",up:"transparent"},i.NUMBER_REFLECTION_AVERAGING_BANDS=3,i.ROOM_STARTING_AVERAGING_BAND=4,i.ROOM_MIN_VOLUME=1e-4,i.ROOM_AIR_ABSORPTION_COEFFICIENTS=[6e-4,6e-4,7e-4,8e-4,.001,.0015,.0026,.006,.0207],i.ROOM_EYRING_CORRECTION_COEFFICIENT=1.38,i.TWO_PI=6.28318530717959,i.TWENTY_FOUR_LOG10=55.2620422318571,i.LOG1000=6.90775527898214,i.LOG2_DIV2=.346573590279973,i.DEGREES_TO_RADIANS=.017453292519943,i.RADIANS_TO_DEGREES=57.29577951308232,i.EPSILON_FLOAT=1e-8,i.log=function(){window.console.log.apply(window.console,["%c[ResonanceAudio]%c "+Array.prototype.slice.call(arguments).join(" ")+" %c(@"+performance.now().toFixed(2)+"ms)","background: #BBDEFB; color: #FF5722; font-weight: 700","font-weight: 400","color: #AAA"])},i.normalizeVector=function(A){let e=Math.sqrt(A[0]*A[0]+A[1]*A[1]+A[2]*A[2]);return e>t.EPSILON_FLOAT&&(e=1/e,A[0]*=e,A[1]*=e,A[2]*=e),A},i.crossProduct=function(A,t){return[A[1]*t[2]-A[2]*t[1],A[2]*t[0]-A[0]*t[2],A[0]*t[1]-A[1]*t[0]]},A.exports=i},function(A,t,e){"use strict";function i(A,t){void 0==t&&(t={}),void 0==t.ambisonicOrder&&(t.ambisonicOrder=s.DEFAULT_AMBISONIC_ORDER),void 0==t.azimuth&&(t.azimuth=s.DEFAULT_AZIMUTH),void 0==t.elevation&&(t.elevation=s.DEFAULT_ELEVATION),void 0==t.sourceWidth&&(t.sourceWidth=s.DEFAULT_SOURCE_WIDTH),this._context=A,this.input=A.createGain(),this._channelGain=[],this._merger=void 0,this.output=A.createGain(),this.setAmbisonicOrder(t.ambisonicOrder),this._azimuth=t.azimuth,this._elevation=t.elevation,this.setSourceWidth(t.sourceWidth)}/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+const n=e(3),s=e(0);i.prototype.setAmbisonicOrder=function(A){this._ambisonicOrder=i.validateAmbisonicOrder(A),this.input.disconnect();for(let e=0;en.SPHERICAL_HARMONICS_MAX_ORDER&&(s.log("Error: Unable to render ambisonic order",options.ambisonicOrder,"(Max order is",n.SPHERICAL_HARMONICS_MAX_ORDER,")\nUsing max order instead."),options.ambisonicOrder=n.SPHERICAL_HARMONICS_MAX_ORDER),A},A.exports=i},function(A,t,e){"use strict";function i(A,t){void 0==t&&(t={}),void 0==t.ambisonicOrder&&(t.ambisonicOrder=o.DEFAULT_AMBISONIC_ORDER),void 0==t.position&&(t.position=o.DEFAULT_POSITION.slice()),void 0==t.forward&&(t.forward=o.DEFAULT_FORWARD.slice()),void 0==t.up&&(t.up=o.DEFAULT_UP.slice()),this.position=new Float32Array(3),this._tempMatrix3=new Float32Array(9),this._ambisonicOrder=s.validateAmbisonicOrder(t.ambisonicOrder),this._context=A,1==this._ambisonicOrder?this._renderer=n.Omnitone.createFOARenderer(A,{}):this._ambisonicOrder>1&&(this._renderer=n.Omnitone.createHOARenderer(A,{ambisonicOrder:this._ambisonicOrder})),this.input=A.createGain(),this.output=A.createGain(),this.ambisonicOutput=A.createGain();let e=this;this._renderer.initialize().then(function(){e.input.connect(e._renderer.input),e._ambisonicOrder>1?e._renderer._hoaRotator.output.connect(e.ambisonicOutput):e._renderer._foaRotator.output.connect(e.ambisonicOutput),e._renderer.output.connect(e.output)}),this.setOrientation(t.forward[0],t.forward[1],t.forward[2],t.up[0],t.up[1],t.up[2])}/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+const n=e(12),s=e(1),o=e(0);i.prototype.setOrientation=function(A,t,e,i,n,s){let r=o.crossProduct([A,t,e],[i,n,s]);this._tempMatrix3[0]=r[0],this._tempMatrix3[1]=r[1],this._tempMatrix3[2]=r[2],this._tempMatrix3[3]=i,this._tempMatrix3[4]=n,this._tempMatrix3[5]=s,this._tempMatrix3[6]=A,this._tempMatrix3[7]=t,this._tempMatrix3[8]=e,this._renderer.setRotationMatrix3(this._tempMatrix3)},i.prototype.setFromMatrix=function(A){this._renderer.setRotationMatrix4(A.elements),this.position[0]=A.elements[12],this.position[1]=A.elements[13],this.position[2]=A.elements[14]},A.exports=i},function(A,t,e){"use strict";t.SPHERICAL_HARMONICS=[[[0,0,0,1,1,1],[.052336,.034899,.017452,.999848,.999391,.99863],[.104528,.069756,.034899,.999391,.997564,.994522],[.156434,.104528,.052336,.99863,.994522,.987688],[.207912,.139173,.069756,.997564,.990268,.978148],[.258819,.173648,.087156,.996195,.984808,.965926],[.309017,.207912,.104528,.994522,.978148,.951057],[.358368,.241922,.121869,.992546,.970296,.93358],[.406737,.275637,.139173,.990268,.961262,.913545],[.45399,.309017,.156434,.987688,.951057,.891007],[.5,.34202,.173648,.984808,.939693,.866025],[.544639,.374607,.190809,.981627,.927184,.838671],[.587785,.406737,.207912,.978148,.913545,.809017],[.62932,.438371,.224951,.97437,.898794,.777146],[.669131,.469472,.241922,.970296,.882948,.743145],[.707107,.5,.258819,.965926,.866025,.707107],[.743145,.529919,.275637,.961262,.848048,.669131],[.777146,.559193,.292372,.956305,.829038,.62932],[.809017,.587785,.309017,.951057,.809017,.587785],[.838671,.615661,.325568,.945519,.788011,.544639],[.866025,.642788,.34202,.939693,.766044,.5],[.891007,.669131,.358368,.93358,.743145,.45399],[.913545,.694658,.374607,.927184,.71934,.406737],[.93358,.71934,.390731,.920505,.694658,.358368],[.951057,.743145,.406737,.913545,.669131,.309017],[.965926,.766044,.422618,.906308,.642788,.258819],[.978148,.788011,.438371,.898794,.615661,.207912],[.987688,.809017,.45399,.891007,.587785,.156434],[.994522,.829038,.469472,.882948,.559193,.104528],[.99863,.848048,.48481,.87462,.529919,.052336],[1,.866025,.5,.866025,.5,0],[.99863,.882948,.515038,.857167,.469472,-.052336],[.994522,.898794,.529919,.848048,.438371,-.104528],[.987688,.913545,.544639,.838671,.406737,-.156434],[.978148,.927184,.559193,.829038,.374607,-.207912],[.965926,.939693,.573576,.819152,.34202,-.258819],[.951057,.951057,.587785,.809017,.309017,-.309017],[.93358,.961262,.601815,.798636,.275637,-.358368],[.913545,.970296,.615661,.788011,.241922,-.406737],[.891007,.978148,.62932,.777146,.207912,-.45399],[.866025,.984808,.642788,.766044,.173648,-.5],[.838671,.990268,.656059,.75471,.139173,-.544639],[.809017,.994522,.669131,.743145,.104528,-.587785],[.777146,.997564,.681998,.731354,.069756,-.62932],[.743145,.999391,.694658,.71934,.034899,-.669131],[.707107,1,.707107,.707107,0,-.707107],[.669131,.999391,.71934,.694658,-.034899,-.743145],[.62932,.997564,.731354,.681998,-.069756,-.777146],[.587785,.994522,.743145,.669131,-.104528,-.809017],[.544639,.990268,.75471,.656059,-.139173,-.838671],[.5,.984808,.766044,.642788,-.173648,-.866025],[.45399,.978148,.777146,.62932,-.207912,-.891007],[.406737,.970296,.788011,.615661,-.241922,-.913545],[.358368,.961262,.798636,.601815,-.275637,-.93358],[.309017,.951057,.809017,.587785,-.309017,-.951057],[.258819,.939693,.819152,.573576,-.34202,-.965926],[.207912,.927184,.829038,.559193,-.374607,-.978148],[.156434,.913545,.838671,.544639,-.406737,-.987688],[.104528,.898794,.848048,.529919,-.438371,-.994522],[.052336,.882948,.857167,.515038,-.469472,-.99863],[0,.866025,.866025,.5,-.5,-1],[-.052336,.848048,.87462,.48481,-.529919,-.99863],[-.104528,.829038,.882948,.469472,-.559193,-.994522],[-.156434,.809017,.891007,.45399,-.587785,-.987688],[-.207912,.788011,.898794,.438371,-.615661,-.978148],[-.258819,.766044,.906308,.422618,-.642788,-.965926],[-.309017,.743145,.913545,.406737,-.669131,-.951057],[-.358368,.71934,.920505,.390731,-.694658,-.93358],[-.406737,.694658,.927184,.374607,-.71934,-.913545],[-.45399,.669131,.93358,.358368,-.743145,-.891007],[-.5,.642788,.939693,.34202,-.766044,-.866025],[-.544639,.615661,.945519,.325568,-.788011,-.838671],[-.587785,.587785,.951057,.309017,-.809017,-.809017],[-.62932,.559193,.956305,.292372,-.829038,-.777146],[-.669131,.529919,.961262,.275637,-.848048,-.743145],[-.707107,.5,.965926,.258819,-.866025,-.707107],[-.743145,.469472,.970296,.241922,-.882948,-.669131],[-.777146,.438371,.97437,.224951,-.898794,-.62932],[-.809017,.406737,.978148,.207912,-.913545,-.587785],[-.838671,.374607,.981627,.190809,-.927184,-.544639],[-.866025,.34202,.984808,.173648,-.939693,-.5],[-.891007,.309017,.987688,.156434,-.951057,-.45399],[-.913545,.275637,.990268,.139173,-.961262,-.406737],[-.93358,.241922,.992546,.121869,-.970296,-.358368],[-.951057,.207912,.994522,.104528,-.978148,-.309017],[-.965926,.173648,.996195,.087156,-.984808,-.258819],[-.978148,.139173,.997564,.069756,-.990268,-.207912],[-.987688,.104528,.99863,.052336,-.994522,-.156434],[-.994522,.069756,.999391,.034899,-.997564,-.104528],[-.99863,.034899,.999848,.017452,-.999391,-.052336],[-1,0,1,0,-1,-0],[-.99863,-.034899,.999848,-.017452,-.999391,.052336],[-.994522,-.069756,.999391,-.034899,-.997564,.104528],[-.987688,-.104528,.99863,-.052336,-.994522,.156434],[-.978148,-.139173,.997564,-.069756,-.990268,.207912],[-.965926,-.173648,.996195,-.087156,-.984808,.258819],[-.951057,-.207912,.994522,-.104528,-.978148,.309017],[-.93358,-.241922,.992546,-.121869,-.970296,.358368],[-.913545,-.275637,.990268,-.139173,-.961262,.406737],[-.891007,-.309017,.987688,-.156434,-.951057,.45399],[-.866025,-.34202,.984808,-.173648,-.939693,.5],[-.838671,-.374607,.981627,-.190809,-.927184,.544639],[-.809017,-.406737,.978148,-.207912,-.913545,.587785],[-.777146,-.438371,.97437,-.224951,-.898794,.62932],[-.743145,-.469472,.970296,-.241922,-.882948,.669131],[-.707107,-.5,.965926,-.258819,-.866025,.707107],[-.669131,-.529919,.961262,-.275637,-.848048,.743145],[-.62932,-.559193,.956305,-.292372,-.829038,.777146],[-.587785,-.587785,.951057,-.309017,-.809017,.809017],[-.544639,-.615661,.945519,-.325568,-.788011,.838671],[-.5,-.642788,.939693,-.34202,-.766044,.866025],[-.45399,-.669131,.93358,-.358368,-.743145,.891007],[-.406737,-.694658,.927184,-.374607,-.71934,.913545],[-.358368,-.71934,.920505,-.390731,-.694658,.93358],[-.309017,-.743145,.913545,-.406737,-.669131,.951057],[-.258819,-.766044,.906308,-.422618,-.642788,.965926],[-.207912,-.788011,.898794,-.438371,-.615661,.978148],[-.156434,-.809017,.891007,-.45399,-.587785,.987688],[-.104528,-.829038,.882948,-.469472,-.559193,.994522],[-.052336,-.848048,.87462,-.48481,-.529919,.99863],[-0,-.866025,.866025,-.5,-.5,1],[.052336,-.882948,.857167,-.515038,-.469472,.99863],[.104528,-.898794,.848048,-.529919,-.438371,.994522],[.156434,-.913545,.838671,-.544639,-.406737,.987688],[.207912,-.927184,.829038,-.559193,-.374607,.978148],[.258819,-.939693,.819152,-.573576,-.34202,.965926],[.309017,-.951057,.809017,-.587785,-.309017,.951057],[.358368,-.961262,.798636,-.601815,-.275637,.93358],[.406737,-.970296,.788011,-.615661,-.241922,.913545],[.45399,-.978148,.777146,-.62932,-.207912,.891007],[.5,-.984808,.766044,-.642788,-.173648,.866025],[.544639,-.990268,.75471,-.656059,-.139173,.838671],[.587785,-.994522,.743145,-.669131,-.104528,.809017],[.62932,-.997564,.731354,-.681998,-.069756,.777146],[.669131,-.999391,.71934,-.694658,-.034899,.743145],[.707107,-1,.707107,-.707107,-0,.707107],[.743145,-.999391,.694658,-.71934,.034899,.669131],[.777146,-.997564,.681998,-.731354,.069756,.62932],[.809017,-.994522,.669131,-.743145,.104528,.587785],[.838671,-.990268,.656059,-.75471,.139173,.544639],[.866025,-.984808,.642788,-.766044,.173648,.5],[.891007,-.978148,.62932,-.777146,.207912,.45399],[.913545,-.970296,.615661,-.788011,.241922,.406737],[.93358,-.961262,.601815,-.798636,.275637,.358368],[.951057,-.951057,.587785,-.809017,.309017,.309017],[.965926,-.939693,.573576,-.819152,.34202,.258819],[.978148,-.927184,.559193,-.829038,.374607,.207912],[.987688,-.913545,.544639,-.838671,.406737,.156434],[.994522,-.898794,.529919,-.848048,.438371,.104528],[.99863,-.882948,.515038,-.857167,.469472,.052336],[1,-.866025,.5,-.866025,.5,0],[.99863,-.848048,.48481,-.87462,.529919,-.052336],[.994522,-.829038,.469472,-.882948,.559193,-.104528],[.987688,-.809017,.45399,-.891007,.587785,-.156434],[.978148,-.788011,.438371,-.898794,.615661,-.207912],[.965926,-.766044,.422618,-.906308,.642788,-.258819],[.951057,-.743145,.406737,-.913545,.669131,-.309017],[.93358,-.71934,.390731,-.920505,.694658,-.358368],[.913545,-.694658,.374607,-.927184,.71934,-.406737],[.891007,-.669131,.358368,-.93358,.743145,-.45399],[.866025,-.642788,.34202,-.939693,.766044,-.5],[.838671,-.615661,.325568,-.945519,.788011,-.544639],[.809017,-.587785,.309017,-.951057,.809017,-.587785],[.777146,-.559193,.292372,-.956305,.829038,-.62932],[.743145,-.529919,.275637,-.961262,.848048,-.669131],[.707107,-.5,.258819,-.965926,.866025,-.707107],[.669131,-.469472,.241922,-.970296,.882948,-.743145],[.62932,-.438371,.224951,-.97437,.898794,-.777146],[.587785,-.406737,.207912,-.978148,.913545,-.809017],[.544639,-.374607,.190809,-.981627,.927184,-.838671],[.5,-.34202,.173648,-.984808,.939693,-.866025],[.45399,-.309017,.156434,-.987688,.951057,-.891007],[.406737,-.275637,.139173,-.990268,.961262,-.913545],[.358368,-.241922,.121869,-.992546,.970296,-.93358],[.309017,-.207912,.104528,-.994522,.978148,-.951057],[.258819,-.173648,.087156,-.996195,.984808,-.965926],[.207912,-.139173,.069756,-.997564,.990268,-.978148],[.156434,-.104528,.052336,-.99863,.994522,-.987688],[.104528,-.069756,.034899,-.999391,.997564,-.994522],[.052336,-.034899,.017452,-.999848,.999391,-.99863],[0,-0,0,-1,1,-1],[-.052336,.034899,-.017452,-.999848,.999391,-.99863],[-.104528,.069756,-.034899,-.999391,.997564,-.994522],[-.156434,.104528,-.052336,-.99863,.994522,-.987688],[-.207912,.139173,-.069756,-.997564,.990268,-.978148],[-.258819,.173648,-.087156,-.996195,.984808,-.965926],[-.309017,.207912,-.104528,-.994522,.978148,-.951057],[-.358368,.241922,-.121869,-.992546,.970296,-.93358],[-.406737,.275637,-.139173,-.990268,.961262,-.913545],[-.45399,.309017,-.156434,-.987688,.951057,-.891007],[-.5,.34202,-.173648,-.984808,.939693,-.866025],[-.544639,.374607,-.190809,-.981627,.927184,-.838671],[-.587785,.406737,-.207912,-.978148,.913545,-.809017],[-.62932,.438371,-.224951,-.97437,.898794,-.777146],[-.669131,.469472,-.241922,-.970296,.882948,-.743145],[-.707107,.5,-.258819,-.965926,.866025,-.707107],[-.743145,.529919,-.275637,-.961262,.848048,-.669131],[-.777146,.559193,-.292372,-.956305,.829038,-.62932],[-.809017,.587785,-.309017,-.951057,.809017,-.587785],[-.838671,.615661,-.325568,-.945519,.788011,-.544639],[-.866025,.642788,-.34202,-.939693,.766044,-.5],[-.891007,.669131,-.358368,-.93358,.743145,-.45399],[-.913545,.694658,-.374607,-.927184,.71934,-.406737],[-.93358,.71934,-.390731,-.920505,.694658,-.358368],[-.951057,.743145,-.406737,-.913545,.669131,-.309017],[-.965926,.766044,-.422618,-.906308,.642788,-.258819],[-.978148,.788011,-.438371,-.898794,.615661,-.207912],[-.987688,.809017,-.45399,-.891007,.587785,-.156434],[-.994522,.829038,-.469472,-.882948,.559193,-.104528],[-.99863,.848048,-.48481,-.87462,.529919,-.052336],[-1,.866025,-.5,-.866025,.5,0],[-.99863,.882948,-.515038,-.857167,.469472,.052336],[-.994522,.898794,-.529919,-.848048,.438371,.104528],[-.987688,.913545,-.544639,-.838671,.406737,.156434],[-.978148,.927184,-.559193,-.829038,.374607,.207912],[-.965926,.939693,-.573576,-.819152,.34202,.258819],[-.951057,.951057,-.587785,-.809017,.309017,.309017],[-.93358,.961262,-.601815,-.798636,.275637,.358368],[-.913545,.970296,-.615661,-.788011,.241922,.406737],[-.891007,.978148,-.62932,-.777146,.207912,.45399],[-.866025,.984808,-.642788,-.766044,.173648,.5],[-.838671,.990268,-.656059,-.75471,.139173,.544639],[-.809017,.994522,-.669131,-.743145,.104528,.587785],[-.777146,.997564,-.681998,-.731354,.069756,.62932],[-.743145,.999391,-.694658,-.71934,.034899,.669131],[-.707107,1,-.707107,-.707107,0,.707107],[-.669131,.999391,-.71934,-.694658,-.034899,.743145],[-.62932,.997564,-.731354,-.681998,-.069756,.777146],[-.587785,.994522,-.743145,-.669131,-.104528,.809017],[-.544639,.990268,-.75471,-.656059,-.139173,.838671],[-.5,.984808,-.766044,-.642788,-.173648,.866025],[-.45399,.978148,-.777146,-.62932,-.207912,.891007],[-.406737,.970296,-.788011,-.615661,-.241922,.913545],[-.358368,.961262,-.798636,-.601815,-.275637,.93358],[-.309017,.951057,-.809017,-.587785,-.309017,.951057],[-.258819,.939693,-.819152,-.573576,-.34202,.965926],[-.207912,.927184,-.829038,-.559193,-.374607,.978148],[-.156434,.913545,-.838671,-.544639,-.406737,.987688],[-.104528,.898794,-.848048,-.529919,-.438371,.994522],[-.052336,.882948,-.857167,-.515038,-.469472,.99863],[-0,.866025,-.866025,-.5,-.5,1],[.052336,.848048,-.87462,-.48481,-.529919,.99863],[.104528,.829038,-.882948,-.469472,-.559193,.994522],[.156434,.809017,-.891007,-.45399,-.587785,.987688],[.207912,.788011,-.898794,-.438371,-.615661,.978148],[.258819,.766044,-.906308,-.422618,-.642788,.965926],[.309017,.743145,-.913545,-.406737,-.669131,.951057],[.358368,.71934,-.920505,-.390731,-.694658,.93358],[.406737,.694658,-.927184,-.374607,-.71934,.913545],[.45399,.669131,-.93358,-.358368,-.743145,.891007],[.5,.642788,-.939693,-.34202,-.766044,.866025],[.544639,.615661,-.945519,-.325568,-.788011,.838671],[.587785,.587785,-.951057,-.309017,-.809017,.809017],[.62932,.559193,-.956305,-.292372,-.829038,.777146],[.669131,.529919,-.961262,-.275637,-.848048,.743145],[.707107,.5,-.965926,-.258819,-.866025,.707107],[.743145,.469472,-.970296,-.241922,-.882948,.669131],[.777146,.438371,-.97437,-.224951,-.898794,.62932],[.809017,.406737,-.978148,-.207912,-.913545,.587785],[.838671,.374607,-.981627,-.190809,-.927184,.544639],[.866025,.34202,-.984808,-.173648,-.939693,.5],[.891007,.309017,-.987688,-.156434,-.951057,.45399],[.913545,.275637,-.990268,-.139173,-.961262,.406737],[.93358,.241922,-.992546,-.121869,-.970296,.358368],[.951057,.207912,-.994522,-.104528,-.978148,.309017],[.965926,.173648,-.996195,-.087156,-.984808,.258819],[.978148,.139173,-.997564,-.069756,-.990268,.207912],[.987688,.104528,-.99863,-.052336,-.994522,.156434],[.994522,.069756,-.999391,-.034899,-.997564,.104528],[.99863,.034899,-.999848,-.017452,-.999391,.052336],[1,0,-1,-0,-1,0],[.99863,-.034899,-.999848,.017452,-.999391,-.052336],[.994522,-.069756,-.999391,.034899,-.997564,-.104528],[.987688,-.104528,-.99863,.052336,-.994522,-.156434],[.978148,-.139173,-.997564,.069756,-.990268,-.207912],[.965926,-.173648,-.996195,.087156,-.984808,-.258819],[.951057,-.207912,-.994522,.104528,-.978148,-.309017],[.93358,-.241922,-.992546,.121869,-.970296,-.358368],[.913545,-.275637,-.990268,.139173,-.961262,-.406737],[.891007,-.309017,-.987688,.156434,-.951057,-.45399],[.866025,-.34202,-.984808,.173648,-.939693,-.5],[.838671,-.374607,-.981627,.190809,-.927184,-.544639],[.809017,-.406737,-.978148,.207912,-.913545,-.587785],[.777146,-.438371,-.97437,.224951,-.898794,-.62932],[.743145,-.469472,-.970296,.241922,-.882948,-.669131],[.707107,-.5,-.965926,.258819,-.866025,-.707107],[.669131,-.529919,-.961262,.275637,-.848048,-.743145],[.62932,-.559193,-.956305,.292372,-.829038,-.777146],[.587785,-.587785,-.951057,.309017,-.809017,-.809017],[.544639,-.615661,-.945519,.325568,-.788011,-.838671],[.5,-.642788,-.939693,.34202,-.766044,-.866025],[.45399,-.669131,-.93358,.358368,-.743145,-.891007],[.406737,-.694658,-.927184,.374607,-.71934,-.913545],[.358368,-.71934,-.920505,.390731,-.694658,-.93358],[.309017,-.743145,-.913545,.406737,-.669131,-.951057],[.258819,-.766044,-.906308,.422618,-.642788,-.965926],[.207912,-.788011,-.898794,.438371,-.615661,-.978148],[.156434,-.809017,-.891007,.45399,-.587785,-.987688],[.104528,-.829038,-.882948,.469472,-.559193,-.994522],[.052336,-.848048,-.87462,.48481,-.529919,-.99863],[0,-.866025,-.866025,.5,-.5,-1],[-.052336,-.882948,-.857167,.515038,-.469472,-.99863],[-.104528,-.898794,-.848048,.529919,-.438371,-.994522],[-.156434,-.913545,-.838671,.544639,-.406737,-.987688],[-.207912,-.927184,-.829038,.559193,-.374607,-.978148],[-.258819,-.939693,-.819152,.573576,-.34202,-.965926],[-.309017,-.951057,-.809017,.587785,-.309017,-.951057],[-.358368,-.961262,-.798636,.601815,-.275637,-.93358],[-.406737,-.970296,-.788011,.615661,-.241922,-.913545],[-.45399,-.978148,-.777146,.62932,-.207912,-.891007],[-.5,-.984808,-.766044,.642788,-.173648,-.866025],[-.544639,-.990268,-.75471,.656059,-.139173,-.838671],[-.587785,-.994522,-.743145,.669131,-.104528,-.809017],[-.62932,-.997564,-.731354,.681998,-.069756,-.777146],[-.669131,-.999391,-.71934,.694658,-.034899,-.743145],[-.707107,-1,-.707107,.707107,-0,-.707107],[-.743145,-.999391,-.694658,.71934,.034899,-.669131],[-.777146,-.997564,-.681998,.731354,.069756,-.62932],[-.809017,-.994522,-.669131,.743145,.104528,-.587785],[-.838671,-.990268,-.656059,.75471,.139173,-.544639],[-.866025,-.984808,-.642788,.766044,.173648,-.5],[-.891007,-.978148,-.62932,.777146,.207912,-.45399],[-.913545,-.970296,-.615661,.788011,.241922,-.406737],[-.93358,-.961262,-.601815,.798636,.275637,-.358368],[-.951057,-.951057,-.587785,.809017,.309017,-.309017],[-.965926,-.939693,-.573576,.819152,.34202,-.258819],[-.978148,-.927184,-.559193,.829038,.374607,-.207912],[-.987688,-.913545,-.544639,.838671,.406737,-.156434],[-.994522,-.898794,-.529919,.848048,.438371,-.104528],[-.99863,-.882948,-.515038,.857167,.469472,-.052336],[-1,-.866025,-.5,.866025,.5,-0],[-.99863,-.848048,-.48481,.87462,.529919,.052336],[-.994522,-.829038,-.469472,.882948,.559193,.104528],[-.987688,-.809017,-.45399,.891007,.587785,.156434],[-.978148,-.788011,-.438371,.898794,.615661,.207912],[-.965926,-.766044,-.422618,.906308,.642788,.258819],[-.951057,-.743145,-.406737,.913545,.669131,.309017],[-.93358,-.71934,-.390731,.920505,.694658,.358368],[-.913545,-.694658,-.374607,.927184,.71934,.406737],[-.891007,-.669131,-.358368,.93358,.743145,.45399],[-.866025,-.642788,-.34202,.939693,.766044,.5],[-.838671,-.615661,-.325568,.945519,.788011,.544639],[-.809017,-.587785,-.309017,.951057,.809017,.587785],[-.777146,-.559193,-.292372,.956305,.829038,.62932],[-.743145,-.529919,-.275637,.961262,.848048,.669131],[-.707107,-.5,-.258819,.965926,.866025,.707107],[-.669131,-.469472,-.241922,.970296,.882948,.743145],[-.62932,-.438371,-.224951,.97437,.898794,.777146],[-.587785,-.406737,-.207912,.978148,.913545,.809017],[-.544639,-.374607,-.190809,.981627,.927184,.838671],[-.5,-.34202,-.173648,.984808,.939693,.866025],[-.45399,-.309017,-.156434,.987688,.951057,.891007],[-.406737,-.275637,-.139173,.990268,.961262,.913545],[-.358368,-.241922,-.121869,.992546,.970296,.93358],[-.309017,-.207912,-.104528,.994522,.978148,.951057],[-.258819,-.173648,-.087156,.996195,.984808,.965926],[-.207912,-.139173,-.069756,.997564,.990268,.978148],[-.156434,-.104528,-.052336,.99863,.994522,.987688],[-.104528,-.069756,-.034899,.999391,.997564,.994522],[-.052336,-.034899,-.017452,.999848,.999391,.99863]],[[-1,-0,1,-0,0,-1,-0,0,-0],[-.999848,.017452,.999543,-.030224,264e-6,-.999086,.042733,-59e-5,4e-6],[-.999391,.034899,.998173,-.060411,.001055,-.996348,.085356,-.002357,34e-6],[-.99863,.052336,.995891,-.090524,.002372,-.991791,.127757,-.005297,113e-6],[-.997564,.069756,.992701,-.120527,.004214,-.985429,.169828,-.0094,268e-6],[-.996195,.087156,.988606,-.150384,.006578,-.977277,.21146,-.014654,523e-6],[-.994522,.104528,.983611,-.180057,.009462,-.967356,.252544,-.021043,903e-6],[-.992546,.121869,.977722,-.209511,.012862,-.955693,.292976,-.028547,.001431],[-.990268,.139173,.970946,-.238709,.016774,-.942316,.332649,-.037143,.002131],[-.987688,.156434,.963292,-.267617,.021193,-.927262,.371463,-.046806,.003026],[-.984808,.173648,.954769,-.296198,.026114,-.910569,.409317,-.057505,.00414],[-.981627,.190809,.945388,-.324419,.03153,-.892279,.446114,-.069209,.005492],[-.978148,.207912,.935159,-.352244,.037436,-.872441,.481759,-.08188,.007105],[-.97437,.224951,.924096,-.379641,.043823,-.851105,.516162,-.095481,.008999],[-.970296,.241922,.912211,-.406574,.050685,-.828326,.549233,-.109969,.011193],[-.965926,.258819,.899519,-.433013,.058013,-.804164,.580889,-.1253,.013707],[-.961262,.275637,.886036,-.458924,.065797,-.77868,.61105,-.141427,.016556],[-.956305,.292372,.871778,-.484275,.074029,-.75194,.639639,-.158301,.019758],[-.951057,.309017,.856763,-.509037,.082698,-.724012,.666583,-.175868,.023329],[-.945519,.325568,.841008,-.533178,.091794,-.694969,.691816,-.194075,.027281],[-.939693,.34202,.824533,-.55667,.101306,-.664885,.715274,-.212865,.03163],[-.93358,.358368,.807359,-.579484,.111222,-.633837,.736898,-.23218,.036385],[-.927184,.374607,.789505,-.601592,.121529,-.601904,.756637,-.25196,.041559],[-.920505,.390731,.770994,-.622967,.132217,-.569169,.774442,-.272143,.04716],[-.913545,.406737,.751848,-.643582,.143271,-.535715,.79027,-.292666,.053196],[-.906308,.422618,.732091,-.663414,.154678,-.501627,.804083,-.313464,.059674],[-.898794,.438371,.711746,-.682437,.166423,-.466993,.81585,-.334472,.066599],[-.891007,.45399,.690839,-.700629,.178494,-.431899,.825544,-.355623,.073974],[-.882948,.469472,.669395,-.717968,.190875,-.396436,.833145,-.376851,.081803],[-.87462,.48481,.647439,-.734431,.203551,-.360692,.838638,-.398086,.090085],[-.866025,.5,.625,-.75,.216506,-.32476,.842012,-.419263,.098821],[-.857167,.515038,.602104,-.764655,.229726,-.288728,.843265,-.440311,.108009],[-.848048,.529919,.578778,-.778378,.243192,-.252688,.842399,-.461164,.117644],[-.838671,.544639,.555052,-.791154,.256891,-.21673,.839422,-.481753,.127722],[-.829038,.559193,.530955,-.802965,.270803,-.180944,.834347,-.502011,.138237],[-.819152,.573576,.506515,-.813798,.284914,-.14542,.827194,-.521871,.149181],[-.809017,.587785,.481763,-.823639,.299204,-.110246,.817987,-.541266,.160545],[-.798636,.601815,.456728,-.832477,.313658,-.075508,.806757,-.560132,.172317],[-.788011,.615661,.431441,-.840301,.328257,-.041294,.793541,-.578405,.184487],[-.777146,.62932,.405934,-.847101,.342984,-.007686,.778379,-.596021,.19704],[-.766044,.642788,.380236,-.852869,.357821,.025233,.761319,-.612921,.209963],[-.75471,.656059,.35438,-.857597,.372749,.057383,.742412,-.629044,.223238],[-.743145,.669131,.328396,-.861281,.387751,.088686,.721714,-.644334,.23685],[-.731354,.681998,.302317,-.863916,.402807,.119068,.699288,-.658734,.250778],[-.71934,.694658,.276175,-.865498,.417901,.148454,.675199,-.67219,.265005],[-.707107,.707107,.25,-.866025,.433013,.176777,.649519,-.684653,.279508],[-.694658,.71934,.223825,-.865498,.448125,.203969,.622322,-.696073,.294267],[-.681998,.731354,.197683,-.863916,.463218,.229967,.593688,-.706405,.309259],[-.669131,.743145,.171604,-.861281,.478275,.254712,.5637,-.715605,.324459],[-.656059,.75471,.14562,-.857597,.493276,.278147,.532443,-.723633,.339844],[-.642788,.766044,.119764,-.852869,.508205,.300221,.500009,-.730451,.355387],[-.62932,.777146,.094066,-.847101,.523041,.320884,.46649,-.736025,.371063],[-.615661,.788011,.068559,-.840301,.537768,.340093,.431982,-.740324,.386845],[-.601815,.798636,.043272,-.832477,.552367,.357807,.396584,-.74332,.402704],[-.587785,.809017,.018237,-.823639,.566821,.373991,.360397,-.744989,.418613],[-.573576,.819152,-.006515,-.813798,.581112,.388612,.323524,-.745308,.434544],[-.559193,.829038,-.030955,-.802965,.595222,.401645,.286069,-.744262,.450467],[-.544639,.838671,-.055052,-.791154,.609135,.413066,.24814,-.741835,.466352],[-.529919,.848048,-.078778,-.778378,.622833,.422856,.209843,-.738017,.482171],[-.515038,.857167,-.102104,-.764655,.6363,.431004,.171288,-.732801,.497894],[-.5,.866025,-.125,-.75,.649519,.4375,.132583,-.726184,.51349],[-.48481,.87462,-.147439,-.734431,.662474,.44234,.093837,-.718167,.528929],[-.469472,.882948,-.169395,-.717968,.67515,.445524,.05516,-.708753,.544183],[-.45399,.891007,-.190839,-.700629,.687531,.447059,.016662,-.69795,.55922],[-.438371,.898794,-.211746,-.682437,.699602,.446953,-.02155,-.685769,.574011],[-.422618,.906308,-.232091,-.663414,.711348,.445222,-.059368,-.672226,.588528],[-.406737,.913545,-.251848,-.643582,.722755,.441884,-.096684,-.657339,.602741],[-.390731,.920505,-.270994,-.622967,.733809,.436964,-.133395,-.64113,.616621],[-.374607,.927184,-.289505,-.601592,.744496,.430488,-.169397,-.623624,.630141],[-.358368,.93358,-.307359,-.579484,.754804,.422491,-.204589,-.604851,.643273],[-.34202,.939693,-.324533,-.55667,.76472,.413008,-.238872,-.584843,.65599],[-.325568,.945519,-.341008,-.533178,.774231,.402081,-.27215,-.563635,.668267],[-.309017,.951057,-.356763,-.509037,.783327,.389754,-.304329,-.541266,.680078],[-.292372,.956305,-.371778,-.484275,.791997,.376077,-.335319,-.517778,.691399],[-.275637,.961262,-.386036,-.458924,.800228,.361102,-.365034,-.493216,.702207],[-.258819,.965926,-.399519,-.433013,.808013,.344885,-.393389,-.467627,.712478],[-.241922,.970296,-.412211,-.406574,.81534,.327486,-.420306,-.441061,.722191],[-.224951,.97437,-.424096,-.379641,.822202,.308969,-.445709,-.413572,.731327],[-.207912,.978148,-.435159,-.352244,.828589,.289399,-.469527,-.385215,.739866],[-.190809,.981627,-.445388,-.324419,.834495,.268846,-.491693,-.356047,.74779],[-.173648,.984808,-.454769,-.296198,.839912,.247382,-.512145,-.326129,.755082],[-.156434,.987688,-.463292,-.267617,.844832,.225081,-.530827,-.295521,.761728],[-.139173,.990268,-.470946,-.238709,.849251,.20202,-.547684,-.264287,.767712],[-.121869,.992546,-.477722,-.209511,.853163,.178279,-.562672,-.232494,.773023],[-.104528,.994522,-.483611,-.180057,.856563,.153937,-.575747,-.200207,.777648],[-.087156,.996195,-.488606,-.150384,.859447,.129078,-.586872,-.167494,.781579],[-.069756,.997564,-.492701,-.120527,.861811,.103786,-.596018,-.134426,.784806],[-.052336,.99863,-.495891,-.090524,.863653,.078146,-.603158,-.101071,.787324],[-.034899,.999391,-.498173,-.060411,.864971,.052243,-.608272,-.0675,.789126],[-.017452,.999848,-.499543,-.030224,.865762,.026165,-.611347,-.033786,.790208],[0,1,-.5,0,.866025,-0,-.612372,0,.790569],[.017452,.999848,-.499543,.030224,.865762,-.026165,-.611347,.033786,.790208],[.034899,.999391,-.498173,.060411,.864971,-.052243,-.608272,.0675,.789126],[.052336,.99863,-.495891,.090524,.863653,-.078146,-.603158,.101071,.787324],[.069756,.997564,-.492701,.120527,.861811,-.103786,-.596018,.134426,.784806],[.087156,.996195,-.488606,.150384,.859447,-.129078,-.586872,.167494,.781579],[.104528,.994522,-.483611,.180057,.856563,-.153937,-.575747,.200207,.777648],[.121869,.992546,-.477722,.209511,.853163,-.178279,-.562672,.232494,.773023],[.139173,.990268,-.470946,.238709,.849251,-.20202,-.547684,.264287,.767712],[.156434,.987688,-.463292,.267617,.844832,-.225081,-.530827,.295521,.761728],[.173648,.984808,-.454769,.296198,.839912,-.247382,-.512145,.326129,.755082],[.190809,.981627,-.445388,.324419,.834495,-.268846,-.491693,.356047,.74779],[.207912,.978148,-.435159,.352244,.828589,-.289399,-.469527,.385215,.739866],[.224951,.97437,-.424096,.379641,.822202,-.308969,-.445709,.413572,.731327],[.241922,.970296,-.412211,.406574,.81534,-.327486,-.420306,.441061,.722191],[.258819,.965926,-.399519,.433013,.808013,-.344885,-.393389,.467627,.712478],[.275637,.961262,-.386036,.458924,.800228,-.361102,-.365034,.493216,.702207],[.292372,.956305,-.371778,.484275,.791997,-.376077,-.335319,.517778,.691399],[.309017,.951057,-.356763,.509037,.783327,-.389754,-.304329,.541266,.680078],[.325568,.945519,-.341008,.533178,.774231,-.402081,-.27215,.563635,.668267],[.34202,.939693,-.324533,.55667,.76472,-.413008,-.238872,.584843,.65599],[.358368,.93358,-.307359,.579484,.754804,-.422491,-.204589,.604851,.643273],[.374607,.927184,-.289505,.601592,.744496,-.430488,-.169397,.623624,.630141],[.390731,.920505,-.270994,.622967,.733809,-.436964,-.133395,.64113,.616621],[.406737,.913545,-.251848,.643582,.722755,-.441884,-.096684,.657339,.602741],[.422618,.906308,-.232091,.663414,.711348,-.445222,-.059368,.672226,.588528],[.438371,.898794,-.211746,.682437,.699602,-.446953,-.02155,.685769,.574011],[.45399,.891007,-.190839,.700629,.687531,-.447059,.016662,.69795,.55922],[.469472,.882948,-.169395,.717968,.67515,-.445524,.05516,.708753,.544183],[.48481,.87462,-.147439,.734431,.662474,-.44234,.093837,.718167,.528929],[.5,.866025,-.125,.75,.649519,-.4375,.132583,.726184,.51349],[.515038,.857167,-.102104,.764655,.6363,-.431004,.171288,.732801,.497894],[.529919,.848048,-.078778,.778378,.622833,-.422856,.209843,.738017,.482171],[.544639,.838671,-.055052,.791154,.609135,-.413066,.24814,.741835,.466352],[.559193,.829038,-.030955,.802965,.595222,-.401645,.286069,.744262,.450467],[.573576,.819152,-.006515,.813798,.581112,-.388612,.323524,.745308,.434544],[.587785,.809017,.018237,.823639,.566821,-.373991,.360397,.744989,.418613],[.601815,.798636,.043272,.832477,.552367,-.357807,.396584,.74332,.402704],[.615661,.788011,.068559,.840301,.537768,-.340093,.431982,.740324,.386845],[.62932,.777146,.094066,.847101,.523041,-.320884,.46649,.736025,.371063],[.642788,.766044,.119764,.852869,.508205,-.300221,.500009,.730451,.355387],[.656059,.75471,.14562,.857597,.493276,-.278147,.532443,.723633,.339844],[.669131,.743145,.171604,.861281,.478275,-.254712,.5637,.715605,.324459],[.681998,.731354,.197683,.863916,.463218,-.229967,.593688,.706405,.309259],[.694658,.71934,.223825,.865498,.448125,-.203969,.622322,.696073,.294267],[.707107,.707107,.25,.866025,.433013,-.176777,.649519,.684653,.279508],[.71934,.694658,.276175,.865498,.417901,-.148454,.675199,.67219,.265005],[.731354,.681998,.302317,.863916,.402807,-.119068,.699288,.658734,.250778],[.743145,.669131,.328396,.861281,.387751,-.088686,.721714,.644334,.23685],[.75471,.656059,.35438,.857597,.372749,-.057383,.742412,.629044,.223238],[.766044,.642788,.380236,.852869,.357821,-.025233,.761319,.612921,.209963],[.777146,.62932,.405934,.847101,.342984,.007686,.778379,.596021,.19704],[.788011,.615661,.431441,.840301,.328257,.041294,.793541,.578405,.184487],[.798636,.601815,.456728,.832477,.313658,.075508,.806757,.560132,.172317],[.809017,.587785,.481763,.823639,.299204,.110246,.817987,.541266,.160545],[.819152,.573576,.506515,.813798,.284914,.14542,.827194,.521871,.149181],[.829038,.559193,.530955,.802965,.270803,.180944,.834347,.502011,.138237],[.838671,.544639,.555052,.791154,.256891,.21673,.839422,.481753,.127722],[.848048,.529919,.578778,.778378,.243192,.252688,.842399,.461164,.117644],[.857167,.515038,.602104,.764655,.229726,.288728,.843265,.440311,.108009],[.866025,.5,.625,.75,.216506,.32476,.842012,.419263,.098821],[.87462,.48481,.647439,.734431,.203551,.360692,.838638,.398086,.090085],[.882948,.469472,.669395,.717968,.190875,.396436,.833145,.376851,.081803],[.891007,.45399,.690839,.700629,.178494,.431899,.825544,.355623,.073974],[.898794,.438371,.711746,.682437,.166423,.466993,.81585,.334472,.066599],[.906308,.422618,.732091,.663414,.154678,.501627,.804083,.313464,.059674],[.913545,.406737,.751848,.643582,.143271,.535715,.79027,.292666,.053196],[.920505,.390731,.770994,.622967,.132217,.569169,.774442,.272143,.04716],[.927184,.374607,.789505,.601592,.121529,.601904,.756637,.25196,.041559],[.93358,.358368,.807359,.579484,.111222,.633837,.736898,.23218,.036385],[.939693,.34202,.824533,.55667,.101306,.664885,.715274,.212865,.03163],[.945519,.325568,.841008,.533178,.091794,.694969,.691816,.194075,.027281],[.951057,.309017,.856763,.509037,.082698,.724012,.666583,.175868,.023329],[.956305,.292372,.871778,.484275,.074029,.75194,.639639,.158301,.019758],[.961262,.275637,.886036,.458924,.065797,.77868,.61105,.141427,.016556],[.965926,.258819,.899519,.433013,.058013,.804164,.580889,.1253,.013707],[.970296,.241922,.912211,.406574,.050685,.828326,.549233,.109969,.011193],[.97437,.224951,.924096,.379641,.043823,.851105,.516162,.095481,.008999],[.978148,.207912,.935159,.352244,.037436,.872441,.481759,.08188,.007105],[.981627,.190809,.945388,.324419,.03153,.892279,.446114,.069209,.005492],[.984808,.173648,.954769,.296198,.026114,.910569,.409317,.057505,.00414],[.987688,.156434,.963292,.267617,.021193,.927262,.371463,.046806,.003026],[.990268,.139173,.970946,.238709,.016774,.942316,.332649,.037143,.002131],[.992546,.121869,.977722,.209511,.012862,.955693,.292976,.028547,.001431],[.994522,.104528,.983611,.180057,.009462,.967356,.252544,.021043,903e-6],[.996195,.087156,.988606,.150384,.006578,.977277,.21146,.014654,523e-6],[.997564,.069756,.992701,.120527,.004214,.985429,.169828,.0094,268e-6],[.99863,.052336,.995891,.090524,.002372,.991791,.127757,.005297,113e-6],[.999391,.034899,.998173,.060411,.001055,.996348,.085356,.002357,34e-6],[.999848,.017452,.999543,.030224,264e-6,.999086,.042733,59e-5,4e-6],[1,-0,1,-0,0,1,-0,0,-0]]],t.SPHERICAL_HARMONICS_AZIMUTH_RESOLUTION=t.SPHERICAL_HARMONICS[0].length,t.SPHERICAL_HARMONICS_ELEVATION_RESOLUTION=t.SPHERICAL_HARMONICS[1].length,t.SPHERICAL_HARMONICS_MAX_ORDER=t.SPHERICAL_HARMONICS[0][0].length/2,t.MAX_RE_WEIGHTS=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1.003236,1.002156,.999152,.990038],[1.03237,1.021194,.990433,.898572],[1.062694,1.040231,.979161,.799806],[1.093999,1.058954,.964976,.693603],[1.126003,1.077006,.947526,.57989],[1.158345,1.093982,.926474,.45869],[1.19059,1.109437,.901512,.330158],[1.222228,1.12289,.87237,.194621],[1.252684,1.133837,.838839,.052614],[1.281987,1.142358,.801199,0],[1.312073,1.150207,.760839,0],[1.343011,1.157424,.717799,0],[1.374649,1.163859,.671999,0],[1.406809,1.169354,.623371,0],[1.439286,1.173739,.571868,0],[1.471846,1.176837,.517465,0],[1.504226,1.178465,.460174,0],[1.536133,1.178438,.400043,0],[1.567253,1.176573,.337165,0],[1.597247,1.172695,.271688,0],[1.625766,1.166645,.203815,0],[1.652455,1.158285,.133806,0],[1.676966,1.147506,.061983,0],[1.699006,1.134261,0,0],[1.720224,1.119789,0,0],[1.741631,1.10481,0,0],[1.763183,1.08933,0,0],[1.784837,1.073356,0,0],[1.806548,1.056898,0,0],[1.828269,1.039968,0,0],[1.849952,1.02258,0,0],[1.871552,1.004752,0,0],[1.893018,.986504,0,0],[1.914305,.967857,0,0],[1.935366,.948837,0,0],[1.956154,.929471,0,0],[1.976625,.90979,0,0],[1.996736,.889823,0,0],[2.016448,.869607,0,0],[2.035721,.849175,0,0],[2.054522,.828565,0,0],[2.072818,.807816,0,0],[2.090581,.786964,0,0],[2.107785,.766051,0,0],[2.124411,.745115,0,0],[2.140439,.724196,0,0],[2.155856,.703332,0,0],[2.170653,.682561,0,0],[2.184823,.661921,0,0],[2.198364,.641445,0,0],[2.211275,.621169,0,0],[2.223562,.601125,0,0],[2.23523,.581341,0,0],[2.246289,.561847,0,0],[2.256751,.542667,0,0],[2.266631,.523826,0,0],[2.275943,.505344,0,0],[2.284707,.487239,0,0],[2.292939,.469528,0,0],[2.300661,.452225,0,0],[2.307892,.435342,0,0],[2.314654,.418888,0,0],[2.320969,.40287,0,0],[2.326858,.387294,0,0],[2.332343,.372164,0,0],[2.337445,.357481,0,0],[2.342186,.343246,0,0],[2.346585,.329458,0,0],[2.350664,.316113,0,0],[2.354442,.303208,0,0],[2.357937,.290738,0,0],[2.361168,.278698,0,0],[2.364152,.26708,0,0],[2.366906,.255878,0,0],[2.369446,.245082,0,0],[2.371786,.234685,0,0],[2.37394,.224677,0,0],[2.375923,.215048,0,0],[2.377745,.20579,0,0],[2.379421,.196891,0,0],[2.380959,.188342,0,0],[2.382372,.180132,0,0],[2.383667,.172251,0,0],[2.384856,.164689,0,0],[2.385945,.157435,0,0],[2.386943,.150479,0,0],[2.387857,.143811,0,0],[2.388694,.137421,0,0],[2.38946,.131299,0,0],[2.39016,.125435,0,0],[2.390801,.11982,0,0],[2.391386,.114445,0,0],[2.391921,.1093,0,0],[2.39241,.104376,0,0],[2.392857,.099666,0,0],[2.393265,.09516,0,0],[2.393637,.090851,0,0],[2.393977,.086731,0,0],[2.394288,.082791,0,0],[2.394571,.079025,0,0],[2.394829,.075426,0,0],[2.395064,.071986,0,0],[2.395279,.068699,0,0],[2.395475,.065558,0,0],[2.395653,.062558,0,0],[2.395816,.059693,0,0],[2.395964,.056955,0,0],[2.396099,.054341,0,0],[2.396222,.051845,0,0],[2.396334,.049462,0,0],[2.396436,.047186,0,0],[2.396529,.045013,0,0],[2.396613,.042939,0,0],[2.396691,.040959,0,0],[2.396761,.039069,0,0],[2.396825,.037266,0,0],[2.396883,.035544,0,0],[2.396936,.033901,0,0],[2.396984,.032334,0,0],[2.397028,.030838,0,0],[2.397068,.02941,0,0],[2.397104,.028048,0,0],[2.397137,.026749,0,0],[2.397167,.025509,0,0],[2.397194,.024326,0,0],[2.397219,.023198,0,0],[2.397242,.022122,0,0],[2.397262,.021095,0,0],[2.397281,.020116,0,0],[2.397298,.019181,0,0],[2.397314,.01829,0,0],[2.397328,.017441,0,0],[2.397341,.01663,0,0],[2.397352,.015857,0,0],[2.397363,.015119,0,0],[2.397372,.014416,0,0],[2.397381,.013745,0,0],[2.397389,.013106,0,0],[2.397396,.012496,0,0],[2.397403,.011914,0,0],[2.397409,.01136,0,0],[2.397414,.010831,0,0],[2.397419,.010326,0,0],[2.397424,.009845,0,0],[2.397428,.009387,0,0],[2.397432,.008949,0,0],[2.397435,.008532,0,0],[2.397438,.008135,0,0],[2.397441,.007755,0,0],[2.397443,.007394,0,0],[2.397446,.007049,0,0],[2.397448,.006721,0,0],[2.39745,.006407,0,0],[2.397451,.006108,0,0],[2.397453,.005824,0,0],[2.397454,.005552,0,0],[2.397456,.005293,0,0],[2.397457,.005046,0,0],[2.397458,.004811,0,0],[2.397459,.004586,0,0],[2.39746,.004372,0,0],[2.397461,.004168,0,0],[2.397461,.003974,0,0],[2.397462,.003788,0,0],[2.397463,.003611,0,0],[2.397463,.003443,0,0],[2.397464,.003282,0,0],[2.397464,.003129,0,0],[2.397465,.002983,0,0],[2.397465,.002844,0,0],[2.397465,.002711,0,0],[2.397466,.002584,0,0],[2.397466,.002464,0,0],[2.397466,.002349,0,0],[2.397466,.002239,0,0],[2.397467,.002135,0,0],[2.397467,.002035,0,0],[2.397467,.00194,0,0],[2.397467,.001849,0,0],[2.397467,.001763,0,0],[2.397467,.001681,0,0],[2.397468,.001602,0,0],[2.397468,.001527,0,0],[2.397468,.001456,0,0],[2.397468,.001388,0,0],[2.397468,.001323,0,0],[2.397468,.001261,0,0],[2.397468,.001202,0,0],[2.397468,.001146,0,0],[2.397468,.001093,0,0],[2.397468,.001042,0,0],[2.397468,993e-6,0,0],[2.397468,947e-6,0,0],[2.397468,902e-6,0,0],[2.397468,86e-5,0,0],[2.397468,82e-5,0,0],[2.397469,782e-6,0,0],[2.397469,745e-6,0,0],[2.397469,71e-5,0,0],[2.397469,677e-6,0,0],[2.397469,646e-6,0,0],[2.397469,616e-6,0,0],[2.397469,587e-6,0,0],[2.397469,559e-6,0,0],[2.397469,533e-6,0,0],[2.397469,508e-6,0,0],[2.397469,485e-6,0,0],[2.397469,462e-6,0,0],[2.397469,44e-5,0,0],[2.397469,42e-5,0,0],[2.397469,4e-4,0,0],[2.397469,381e-6,0,0],[2.397469,364e-6,0,0],[2.397469,347e-6,0,0],[2.397469,33e-5,0,0],[2.397469,315e-6,0,0],[2.397469,3e-4,0,0],[2.397469,286e-6,0,0],[2.397469,273e-6,0,0],[2.397469,26e-5,0,0],[2.397469,248e-6,0,0],[2.397469,236e-6,0,0],[2.397469,225e-6,0,0],[2.397469,215e-6,0,0],[2.397469,205e-6,0,0],[2.397469,195e-6,0,0],[2.397469,186e-6,0,0],[2.397469,177e-6,0,0],[2.397469,169e-6,0,0],[2.397469,161e-6,0,0],[2.397469,154e-6,0,0],[2.397469,147e-6,0,0],[2.397469,14e-5,0,0],[2.397469,133e-6,0,0],[2.397469,127e-6,0,0],[2.397469,121e-6,0,0],[2.397469,115e-6,0,0],[2.397469,11e-5,0,0],[2.397469,105e-6,0,0],[2.397469,1e-4,0,0],[2.397469,95e-6,0,0],[2.397469,91e-6,0,0],[2.397469,87e-6,0,0],[2.397469,83e-6,0,0],[2.397469,79e-6,0,0],[2.397469,75e-6,0,0],[2.397469,71e-6,0,0],[2.397469,68e-6,0,0],[2.397469,65e-6,0,0],[2.397469,62e-6,0,0],[2.397469,59e-6,0,0],[2.397469,56e-6,0,0],[2.397469,54e-6,0,0],[2.397469,51e-6,0,0],[2.397469,49e-6,0,0],[2.397469,46e-6,0,0],[2.397469,44e-6,0,0],[2.397469,42e-6,0,0],[2.397469,4e-5,0,0],[2.397469,38e-6,0,0],[2.397469,37e-6,0,0],[2.397469,35e-6,0,0],[2.397469,33e-6,0,0],[2.397469,32e-6,0,0],[2.397469,3e-5,0,0],[2.397469,29e-6,0,0],[2.397469,27e-6,0,0],[2.397469,26e-6,0,0],[2.397469,25e-6,0,0],[2.397469,24e-6,0,0],[2.397469,23e-6,0,0],[2.397469,22e-6,0,0],[2.397469,21e-6,0,0],[2.397469,2e-5,0,0],[2.397469,19e-6,0,0],[2.397469,18e-6,0,0],[2.397469,17e-6,0,0],[2.397469,16e-6,0,0],[2.397469,15e-6,0,0],[2.397469,15e-6,0,0],[2.397469,14e-6,0,0],[2.397469,13e-6,0,0],[2.397469,13e-6,0,0],[2.397469,12e-6,0,0],[2.397469,12e-6,0,0],[2.397469,11e-6,0,0],[2.397469,11e-6,0,0],[2.397469,1e-5,0,0],[2.397469,1e-5,0,0],[2.397469,9e-6,0,0],[2.397469,9e-6,0,0],[2.397469,8e-6,0,0],[2.397469,8e-6,0,0],[2.397469,8e-6,0,0],[2.397469,7e-6,0,0],[2.397469,7e-6,0,0],[2.397469,7e-6,0,0],[2.397469,6e-6,0,0],[2.397469,6e-6,0,0],[2.397469,6e-6,0,0],[2.397469,5e-6,0,0],[2.397469,5e-6,0,0],[2.397469,5e-6,0,0],[2.397469,5e-6,0,0],[2.397469,4e-6,0,0],[2.397469,4e-6,0,0],[2.397469,4e-6,0,0],[2.397469,4e-6,0,0],[2.397469,4e-6,0,0],[2.397469,4e-6,0,0],[2.397469,3e-6,0,0],[2.397469,3e-6,0,0],[2.397469,3e-6,0,0],[2.397469,3e-6,0,0],[2.397469,3e-6,0,0],[2.397469,3e-6,0,0],[2.397469,3e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,2e-6,0,0],[2.397469,1e-6,0,0],[2.397469,1e-6,0,0],[2.397469,1e-6,0,0]],t.MAX_RE_WEIGHTS_RESOLUTION=t.MAX_RE_WEIGHTS.length},function(A,t,e){"use strict";function i(A,t){void 0==t&&(t={}),void 0==t.position&&(t.position=a.DEFAULT_POSITION.slice()),void 0==t.forward&&(t.forward=a.DEFAULT_FORWARD.slice()),void 0==t.up&&(t.up=a.DEFAULT_UP.slice()),void 0==t.minDistance&&(t.minDistance=a.DEFAULT_MIN_DISTANCE),void 0==t.maxDistance&&(t.maxDistance=a.DEFAULT_MAX_DISTANCE),void 0==t.rolloff&&(t.rolloff=a.DEFAULT_ROLLOFF),void 0==t.gain&&(t.gain=a.DEFAULT_SOURCE_GAIN),void 0==t.alpha&&(t.alpha=a.DEFAULT_DIRECTIVITY_ALPHA),void 0==t.sharpness&&(t.sharpness=a.DEFAULT_DIRECTIVITY_SHARPNESS),void 0==t.sourceWidth&&(t.sourceWidth=a.DEFAULT_SOURCE_WIDTH),this._scene=A,this._position=t.position,this._forward=t.forward,this._up=t.up,this._dx=new Float32Array(3),this._right=a.crossProduct(this._forward,this._up);let e=A._context;this.input=e.createGain(),this._directivity=new s(e,{alpha:t.alpha,sharpness:t.sharpness}),this._toEarly=e.createGain(),this._toLate=e.createGain(),this._attenuation=new o(e,{minDistance:t.minDistance,maxDistance:t.maxDistance,rolloff:t.rolloff}),this._encoder=new r(e,{ambisonicOrder:A._ambisonicOrder,sourceWidth:t.sourceWidth}),this.input.connect(this._toLate),this._toLate.connect(A._room.late.input),this.input.connect(this._attenuation.input),this._attenuation.output.connect(this._toEarly),this._toEarly.connect(A._room.early.input),this._attenuation.output.connect(this._directivity.input),this._directivity.output.connect(this._encoder.input),this._encoder.output.connect(A._listener.input),this.setPosition(t.position[0],t.position[1],t.position[2]),this.input.gain.value=t.gain}function n(A){let t=1;return A>a.EPSILON_FLOAT&&(t=1-A/a.SOURCE_MAX_OUTSIDE_ROOM_DISTANCE,t=Math.max(0,Math.min(1,t))),t}/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+const s=e(5),o=e(6),r=e(1),a=e(0);i.prototype.setPosition=function(A,t,e){this._position[0]=A,this._position[1]=t,this._position[2]=e;let i=n(this._scene._room.getDistanceOutsideRoom(this._position[0],this._position[1],this._position[2]));this._toLate.gain.value=i,this._toEarly.gain.value=i,this._update()},i.prototype._update=function(){for(let i=0;i<3;i++)this._dx[i]=this._position[i]-this._scene._listener.position[i];let A=Math.sqrt(this._dx[0]*this._dx[0]+this._dx[1]*this._dx[1]+this._dx[2]*this._dx[2]);A>0&&(this._dx[0]/=A,this._dx[1]/=A,this._dx[2]/=A);let t=Math.atan2(-this._dx[0],this._dx[2])*a.RADIANS_TO_DEGREES,e=Math.atan2(this._dx[1],Math.sqrt(this._dx[0]*this._dx[0]+this._dx[2]*this._dx[2]))*a.RADIANS_TO_DEGREES;this._attenuation.setDistance(A),this._directivity.computeAngle(this._forward,this._dx),this._encoder.setDirection(t,e)},i.prototype.setRolloff=function(A){this._attenuation.setRolloff(A)},i.prototype.setMinDistance=function(A){this._attenuation.minDistance=A},i.prototype.setMaxDistance=function(A){this._attenuation.maxDistance=A},i.prototype.setGain=function(A){this.input.gain.value=A},i.prototype.setOrientation=function(A,t,e,i,n,s){this._forward[0]=A,this._forward[1]=t,this._forward[2]=e,this._up[0]=i,this._up[1]=n,this._up[2]=s,this._right=a.crossProduct(this._forward,this._up)},i.prototype.setFromMatrix=function(A){this._right[0]=A.elements[0],this._right[1]=A.elements[1],this._right[2]=A.elements[2],this._up[0]=A.elements[4],this._up[1]=A.elements[5],this._up[2]=A.elements[6],this._forward[0]=A.elements[8],this._forward[1]=A.elements[9],this._forward[2]=A.elements[10],this._right=a.normalizeVector(this._right),this._up=a.normalizeVector(this._up),this._forward=a.normalizeVector(this._forward),this.setPosition(A.elements[12],A.elements[13],A.elements[14])},i.prototype.setSourceWidth=function(A){this._encoder.setSourceWidth(A),this.setPosition(this._position[0],this._position[1],this._position[2])},i.prototype.setDirectivityPattern=function(A,t){this._directivity.setPattern(A,t),this.setPosition(this._position[0],this._position[1],this._position[2])},A.exports=i},function(A,t,e){"use strict";function i(A,t){void 0==t&&(t={}),void 0==t.alpha&&(t.alpha=n.DEFAULT_DIRECTIVITY_ALPHA),void 0==t.sharpness&&(t.sharpness=n.DEFAULT_DIRECTIVITY_SHARPNESS),this._context=A,this._lowpass=A.createBiquadFilter(),this._lowpass.type="lowpass",this._lowpass.Q.value=0,this._lowpass.frequency.value=.5*A.sampleRate,this._cosTheta=0,this.setPattern(t.alpha,t.sharpness),this.input=this._lowpass,this.output=this._lowpass}/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+const n=e(0);i.prototype.computeAngle=function(A,t){let e=n.normalizeVector(A),i=n.normalizeVector(t),s=1;if(this._alpha>n.EPSILON_FLOAT){let A=e[0]*i[0]+e[1]*i[1]+e[2]*i[2];s=1-this._alpha+this._alpha*A,s=Math.pow(Math.abs(s),this._sharpness)}this._lowpass.frequency.value=.5*this._context.sampleRate*s},i.prototype.setPattern=function(A,t){this._alpha=Math.min(1,Math.max(0,A)),this._sharpness=Math.max(1,t),this.computeAngle([this._cosTheta*this._cosTheta,0,0],[1,0,0])},A.exports=i},function(A,t,e){"use strict";function i(A,t){void 0==t&&(t={}),void 0==t.minDistance&&(t.minDistance=n.DEFAULT_MIN_DISTANCE),void 0==t.maxDistance&&(t.maxDistance=n.DEFAULT_MAX_DISTANCE),void 0==t.rolloff&&(t.rolloff=n.DEFAULT_ATTENUATION_ROLLOFF),this.minDistance=t.minDistance,this.maxDistance=t.maxDistance,this.setRolloff(t.rolloff),this._gainNode=A.createGain(),this.setDistance(t.maxDistance),this.input=this._gainNode,this.output=this._gainNode}/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+const n=e(0);i.prototype.setDistance=function(A){let t=1;if("logarithmic"==this._rolloff){if(A>this.maxDistance)t=0;else if(A>this.minDistance){let e=this.maxDistance-this.minDistance;if(e>n.EPSILON_FLOAT){let i=1/(e+1);t=(1/(A-this.minDistance+1)-i)/(1-i)}}}else if("linear"==this._rolloff)if(A>this.maxDistance)t=0;else if(A>this.minDistance){let e=this.maxDistance-this.minDistance;e>n.EPSILON_FLOAT&&(t=(this.maxDistance-A)/e)}this._gainNode.gain.value=t},i.prototype.setRolloff=function(A){let t=~n.ATTENUATION_ROLLOFFS.indexOf(A);void 0!=A&&t?A=A.toString().toLowerCase():(t||n.log('Invalid rolloff model ("'+A+'"). Using default: "'+n.DEFAULT_ATTENUATION_ROLLOFF+'".'),A=n.DEFAULT_ATTENUATION_ROLLOFF),this._rolloff=A},A.exports=i},function(A,t,e){"use strict";function i(A){let t={};for(let e in _.DEFAULT_ROOM_MATERIALS)_.DEFAULT_ROOM_MATERIALS.hasOwnProperty(e)&&(t[e]=_.ROOM_MATERIAL_COEFFICIENTS[_.DEFAULT_ROOM_MATERIALS[e]]);void 0==A&&(A={},Object.assign(A,_.DEFAULT_ROOM_MATERIALS));for(let e in _.DEFAULT_ROOM_MATERIALS)_.DEFAULT_ROOM_MATERIALS.hasOwnProperty(e)&&A.hasOwnProperty(e)?A[e]in _.ROOM_MATERIAL_COEFFICIENTS?t[e]=_.ROOM_MATERIAL_COEFFICIENTS[A[e]]:_.log('Material "'+A[e]+'" on wall "'+e+'" not found. Using "'+_.DEFAULT_ROOM_MATERIALS[e]+'".'):_.log('Wall "'+e+'" is not defined. Default used.');return t}function n(A){void 0==A&&(A={});for(let t in _.DEFAULT_ROOM_MATERIALS)A.hasOwnProperty(t)||(A[t]=_.ROOM_MATERIAL_COEFFICIENTS[_.DEFAULT_ROOM_MATERIALS[t]]);return A}function s(A){void 0==A&&(A={});for(let t in _.DEFAULT_ROOM_DIMENSIONS)A.hasOwnProperty(t)||(A[t]=_.DEFAULT_ROOM_DIMENSIONS[t]);return A}function o(A,t,e){let i=new Float32Array(_.NUMBER_REVERB_FREQUENCY_BANDS);A=s(A),t=n(t),void 0==e&&(e=_.DEFAULT_SPEED_OF_SOUND);let o=_.TWENTY_FOUR_LOG10/e,r=A.width*A.height*A.depth;if(r<_.ROOM_MIN_VOLUME)return i;let a=A.width*A.height,h=A.width*A.depth,c=A.depth*A.height,f=2*(a+h+c);for(let n=0;n<_.NUMBER_REVERB_FREQUENCY_BANDS;n++){let A=((t.left[n]+t.right[n])*a+(t.down[n]+t.up[n])*h+(t.front[n]+t.back[n])*c)/f;i[n]=_.ROOM_EYRING_CORRECTION_COEFFICIENT*o*r/(-f*Math.log(1-A)+4*_.ROOM_AIR_ABSORPTION_COEFFICIENTS[n]*r)}return i}function r(A){let t=[];for(let e in _.DEFAULT_REFLECTION_COEFFICIENTS)if(_.DEFAULT_REFLECTION_COEFFICIENTS.hasOwnProperty(e)){t[e]=0;for(let i=0;i<_.NUMBER_REFLECTION_AVERAGING_BANDS;i++){let n=i+_.ROOM_STARTING_AVERAGING_BAND;t[e]+=A[e][n]}t[e]/=_.NUMBER_REFLECTION_AVERAGING_BANDS,t[e]=Math.sqrt(1-t[e])}return t}function a(A,t){void 0==t&&(t={}),void 0==t.listenerPosition&&(t.listenerPosition=_.DEFAULT_POSITION.slice()),void 0==t.dimensions&&(t.dimensions={},Object.assign(t.dimensions,_.DEFAULT_ROOM_DIMENSIONS)),void 0==t.materials&&(t.materials={},Object.assign(t.materials,_.DEFAULT_ROOM_MATERIALS)),void 0==t.speedOfSound&&(t.speedOfSound=_.DEFAULT_SPEED_OF_SOUND),t.dimensions=s(t.dimensions);let e=i(t.materials),n=r(e),a=o(t.dimensions,e,t.speedOfSound);this.early=new c(A,{dimensions:t.dimensions,coefficients:n,speedOfSound:t.speedOfSound,listenerPosition:t.listenerPosition}),this.late=new h(A,{durations:a}),this.speedOfSound=t.speedOfSound,this.output=A.createGain(),this.early.output.connect(this.output),this._merger=A.createChannelMerger(4),this.late.output.connect(this._merger,0,0),this._merger.connect(this.output)}/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+const h=e(8),c=e(9),_=e(0);a.prototype.setProperties=function(A,t){let e=i(t),n=o(A,e,this.speedOfSound);this.late.setDurations(n),this.early.speedOfSound=this.speedOfSound;let s=r(e);this.early.setRoomProperties(A,s)},a.prototype.setListenerPosition=function(A,t,e){this.early.speedOfSound=this.speedOfSound,this.early.setListenerPosition(A,t,e);let i=this.getDistanceOutsideRoom(A,t,e),n=1;i>_.EPSILON_FLOAT&&(n=1-i/_.LISTENER_MAX_OUTSIDE_ROOM_DISTANCE,n=Math.max(0,Math.min(1,n))),this.output.gain.value=n},a.prototype.getDistanceOutsideRoom=function(A,t,e){let i=Math.max(0,-this.early._halfDimensions.width-A,A-this.early._halfDimensions.width),n=Math.max(0,-this.early._halfDimensions.height-t,t-this.early._halfDimensions.height),s=Math.max(0,-this.early._halfDimensions.depth-e,e-this.early._halfDimensions.depth);return Math.sqrt(i*i+n*n+s*s)},A.exports=a},function(A,t,e){"use strict";function i(A,t){void 0==t&&(t={}),void 0==t.durations&&(t.durations=n.DEFAULT_REVERB_DURATIONS.slice()),void 0==t.predelay&&(t.predelay=n.DEFAULT_REVERB_PREDELAY),void 0==t.gain&&(t.gain=n.DEFAULT_REVERB_GAIN),void 0==t.bandwidth&&(t.bandwidth=n.DEFAULT_REVERB_BANDWIDTH),void 0==t.tailonset&&(t.tailonset=n.DEFAULT_REVERB_TAIL_ONSET);let e=t.predelay/1e3;this._bandwidthCoeff=t.bandwidth*n.LOG2_DIV2,this._tailonsetSamples=t.tailonset/1e3,this._context=A,this.input=A.createGain(),this._predelay=A.createDelay(e),this._convolver=A.createConvolver(),this.output=A.createGain(),this.output.gain.value=t.gain,this._convolver.normalize=!1,this.input.connect(this._predelay),this._predelay.connect(this._convolver),this._convolver.connect(this.output),this.setDurations(t.durations)}/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ * 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.
+ */
+const n=e(0);i.prototype.setDurations=function(A){if(A.length!==n.NUMBER_REVERB_FREQUENCY_BANDS)return void n.log("Warning: invalid number of RT60 values provided to reverb.");let t=new Float32Array(n.NUMBER_REVERB_FREQUENCY_BANDS),e=this._context.sampleRate;for(let h=0;hi&&(i=t[n]);i<1&&(i=1);let s=this._context.createBuffer(1,i,e),o=s.getChannelData(0),r=new Float32Array(i);for(let n=0;n32&&t.throw("Utils.mergeBuffer: Number of channels cannot exceed 32.(got "+s+")"),i!==e[a].length&&t.throw("Utils.mergeBuffer: AudioBuffer lengths are inconsistent. (expected "+i+" but got "+e[a].length+")"),n!==e[a].sampleRate&&t.throw("Utils.mergeBuffer: AudioBuffer sample rates are inconsistent. (expected "+n+" but got "+e[a].sampleRate+")"),s+=e[a].numberOfChannels;const o=A.createBuffer(s,i,n);let r=0;for(let t=0;te[i]=t.charCodeAt(i)),e.buffer}},function(A,t,e){"use strict";function i(A,t,e){this._context=n.isAudioContext(A)?A:n.throw("BufferList: Invalid BaseAudioContext."),this._options={dataType:s.BASE64,verbose:!1},e&&(e.dataType&&n.isDefinedENUMEntry(s,e.dataType)&&(this._options.dataType=e.dataType),e.verbose&&(this._options.verbose=Boolean(e.verbose))),this._bufferList=[],this._bufferData=this._options.dataType===s.BASE64?t:t.slice(0),this._numberOfTasks=this._bufferData.length,this._resolveHandler=null,this._rejectHandler=new Function}const n=e(0),s={BASE64:"base64",URL:"url"};i.prototype.load=function(){return new Promise(this._promiseGenerator.bind(this))},i.prototype._promiseGenerator=function(A,t){"function"!=typeof A?n.throw("BufferList: Invalid Promise resolver."):this._resolveHandler=A,"function"==typeof t&&(this._rejectHandler=t);for(let e=0;e=0?this._stereoSplitters[i].connect(this._positiveIndexSphericalHarmonics,e%2):this._stereoSplitters[i].connect(this._negativeIndexSphericalHarmonics,e%2)}this._positiveIndexSphericalHarmonics.connect(this._binauralMerger,0,0),this._positiveIndexSphericalHarmonics.connect(this._binauralMerger,0,1),this._negativeIndexSphericalHarmonics.connect(this._binauralMerger,0,0),this._negativeIndexSphericalHarmonics.connect(this._inverter),this._inverter.connect(this._binauralMerger,0,1),this._inverter.gain.value=-1,this.input=this._inputSplitter,this.output=this._outputGain},i.prototype.setHRIRBufferList=function(A){if(!this._isBufferLoaded){for(let t=0;t0){const s=i(t,1);return o(A,1,t-1,e,n)*Math.sqrt(1+s)-o(A,-1,1-t,e,n)*(1-s)}{const s=i(t,-1);return o(A,1,t+1,e,n)*(1-s)+o(A,-1,-t-1,e,n)*Math.sqrt(1+s)}}function h(A,t,e,i){return 0===t?0:t>0?o(A,1,t+1,e,i)+o(A,-1,-t-1,e,i):o(A,1,t-1,e,i)-o(A,-1,1-t,e,i)}function c(A,t,e){const n=i(A,0),s=Math.abs(t)===e?1/(2*e*(2*e-1)):1/((e+t)*(e-t));return[Math.sqrt((e+A)*(e-A)*s),.5*(1-2*n)*Math.sqrt((1+n)*(e+Math.abs(A)-1)*(e+Math.abs(A))*s),-.5*(1-n)*Math.sqrt((e-Math.abs(A)-1)*(e-Math.abs(A)))*s]}function _(A,t){for(let e=-t;e<=t;e++)for(let i=-t;i<=t;i++){const s=c(e,i,t);Math.abs(s[0])>0&&(s[0]*=r(A,e,i,t)),Math.abs(s[1])>0&&(s[1]*=a(A,e,i,t)),Math.abs(s[2])>0&&(s[2]*=h(A,e,i,t)),n(A,t,e,i,s[0]+s[1]+s[2])}}function f(A){for(let t=2;t<=A.length;t++)_(A,t)}function l(A,t){this._context=A,this._ambisonicOrder=t;const e=(t+1)*(t+1);this._splitter=this._context.createChannelSplitter(e),this._merger=this._context.createChannelMerger(e),this._gainNodeMatrix=[];let i,n,s,o,r;for(let a=1;a<=t;a++){i=a*a,n=2*a+1,this._gainNodeMatrix[a-1]=[];for(let A=0;A ["+A+"])"),this._audioElementSource=this._context.createMediaElementSource(this._videoElement),this._foaRouter=new s(this._context,this._channelMap),this._foaRotator=new o(this._context),this._foaPhaseMatchedFilter=new r(this._context),this._audioElementSource.connect(this._foaRouter.input),this._foaRouter.output.connect(this._foaRotator.input),this._foaRotator.output.connect(this._foaPhaseMatchedFilter.input),this._foaVirtualSpeakers=[],this._bypass=this._context.createGain(),this._audioElementSource.connect(this._bypass);const e=Math.pow(10,this._postGainDB/20);c.log("Gain compensation: "+e+" ("+this._postGainDB+"dB)");const i=this;return new Promise(function(A,t){new n(i._context,i._speakerData,function(t){for(let A=0;A ["+A.toString()+"])."),this._config.channelMap=A.slice(),this._foaRouter.setChannelMap(this._config.channelMap))},i.prototype.setRotationMatrix3=function(A){this._isRendererReady&&this._foaRotator.setRotationMatrix3(A)},i.prototype.setRotationMatrix4=function(A){this._isRendererReady&&this._foaRotator.setRotationMatrix4(A)},i.prototype.setRotationMatrixFromCamera=function(A){this._isRendererReady&&(h.invertMatrix4(this._tempMatrix4,A.elements),this._foaRotator.setRotationMatrix4(this._tempMatrix4))},i.prototype.setRenderingMode=function(A){if(A!==this._config.renderingMode){switch(A){case c.AMBISONIC:this._foaConvolver.enable(),this._bypass.disconnect();break;case c.BYPASS:this._foaConvolver.disable(),this._bypass.connect(this.output);break;case c.OFF:this._foaConvolver.disable(),this._bypass.disconnect();break;default:return void h.log('FOARenderer: Rendering mode "'+A+'" is not supported.')}this._config.renderingMode=A,h.log("FOARenderer: Rendering mode changed. ("+A+")")}},A.exports=i},function(A,t){A.exports=["UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wIA9v8QAPv/CwD+/wcA/v8MAP//AQD7/wEACAAEAPj/+v8YABAA7v/n//v/9P/M/8D//f34/R38EvzxAfEBtA2lDTcBJQFJ9T71FP0D/cD1tfVo/Wv9uPTO9PPmOufc/U/+agL3Aisc/RxuGKEZBv3j/iYMzQ2gAzsEQQUABiQFrASzA5cB2QmyCy0AtgR4AeYGtfgAA2j5OQHP+scArPsMBJgEggIEBtz6+QVq/pj/aPg8BPP3gQEi+jEAof0fA1v9+/7S+8IBjvwd/xD4IADL/Pf9zvs+/l3+wgB7/+L+7fzFADH9kf6A+n3+DP6+/TP9xP68/pn+w/26/i39YgA0/u790Pt9/kD+7v1s/Wb+8f4C/1P+pf/x/cT+6/3p/Xz9ff5F/0f9G/4r/6v/4P5L/sL+ff7c/pj+Ov7X/UT+9P5G/oz+6v6A/2D+9/6P/8r/bP7m/ij+C//e/tj/Gf4e/9v+FwDP/lz/sP7F/2H+rv/G/s7/Hf7y/4P+NAD9/k0AK/6w/zP/hACh/sX/gf44AOP+dgCm/iUAk/5qAOD+PwC+/jEAWP4CAAr/bQBw/vv/zf5iACD/OgCS/uD/Cv9oAAb/CgDK/kwA//5tACH/TgCg/h4AHP9aABP/JADP/hEAYv9gAAj/3f8m/ysAYv8gACX/8/8k/ysAXv8bABH//v8j/ygAa/8qAAD/9f9g/1YAWf8JACH/AgB2/z4AXP/w/z3/FgB2/ykAX//9/z//EwCV/zUAS//n/1T/GACK/x4ATv/0/4P/QQB4//v/WP/2/3X/HAB8//P/V//3/2f/AQBh/9v/Tf/x/5P/IwCI/wMAf/8hAKP/JACZ/xUAiv8nAK//HgCr/yMAm/8uAMz/OACi/yQAqf87AMT/MwCY/yUAtP9FAMH/KgCu/ycAyP85AMv/IwCz/xoA1f8qAMn/FgC8/xQA4/8nAMX/CwDJ/xQA4f8ZAMH/BgDO/xQA4f8WAMP/BwDU/xQA4P8QAMH/AQDb/xQA3P8JAMP/AgDh/xIA2v8EAMj/AgDk/w0A1f/+/8v/AwDm/wwA0v/+/9H/BgDl/wkAzv/8/9T/BwDk/wcAzv/8/9r/CQDi/wQAzf/8/9//CADf////0P/9/+L/BwDd//7/0////+T/BgDb//z/1f8AAOf/BQDZ//v/2v8CAOb/AwDY//v/3v8EAOb/AgDY//3/4f8FAOX/AQDZ//7/5P8GAOP/AADb/wAA5/8GAOH////d/wIA5/8FAOD////f/wMA6P8FAOD////h/wQA6P8EAN7////h/wUA4v8DANv/AQDd/wQA3P8CANn/AgDb/wMA2/8CANv/AgDd/wIA3v8CAOH/AQDj/wEA","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAAAA/f8CAP//AQD//wEA//8BAP3/AAACAP7/+f8AAAIA/P8FAAQA8/8AABoA+f/V/wQAHQDO/xoAQQBO/ocA0Px1/ucHW/4UCm8HLO6kAjv8/fCRDdAAYfPiBIgFXveUCM0GBvh6/nz7rf0J/QcQSRVdBgoBSgFR62r9NP8m+LoEAvriBVAAiAPmABEGMf2l+SwBjva6/G4A//8P/CYDMgXm/R0CKAE6/fcBBwAtAND+kQA0A5UDhwFs/8IB8fydAEP/A/8v/e7/mP8j/2YBIwE3Av0AYv+uAOD8lgAg/wwAIf/L/n0Ae//OAJMB3P/XAF//XwCM/08AB/8NAEf/rf4jAT3/lgAJAP4AHgDpAO8AUf9L/07/Qf8KAOD/x/+D/3sATQCDAMoA0f79/+L/EQDt/7EAqv+S/7IAuv/o/wgAc//X//H/SwCm/+3/Yf/B/yoAAADI/7X/AwBg/5EATgCX/xYA/P+q/00AVACY/6v/BADD/zwALQCN/8z/KQDu/ygAEgCZ/6f/VQDC//T/KQCs/7P/UgAfAO7/NgC8/57/awAZAPP/+P/V/8z/bQBBAL//DgD0/+T/TABBAMz/CwAxAPz/SQBqALn/BgALAPz/EAA7AIz/3/8iAAUA//8kALf/y/9VABQA+v81AOj/0P9cAB4A+f8WAOr/vv83ABgAw/8JAOj/4f8nACIAsf/y/w4A3v8gACQAxP/n/ycA7P8WAC0Ayf/U/ycA9v/7/yUA0P/P/zUABADc/xUA5P/J/zcACwDS/xUA9P/m/zAACQDX/+3/9v/2/yQACgDZ/+P/AwAKABYA///b/9j/EQALABkADgD6/+7/GwD4/w4A8P/w//j/EgAEAAUA9f/1/wQAGgD4/wAA5////wAAGQD1////7f8FAAUAFQDv/wAA6v8LAAcAFQDs/wEA9P8SAAYACwDr//7/AQASAAYABQDv/wIAAwAWAAIAAgDv/wAABgATAAEA/f/u/wQABgAQAPr/+P/z/wUACQALAPj/9//4/wgABwAKAPT/+f/5/w4ABwAIAPT/+//9/w4AAwADAPH//f///w8A//8BAPP///8BAA0A/f/+//X/AgACAA0A+//8//b/BAADAAoA+f/7//n/BgADAAcA+P/7//v/BwABAAQA+P/8//3/CQABAAIA9//9////CQD/////+P///wAACAD9//7/+f8AAAAABwD8//3/+v8CAAAABgD7//z//P8EAAAABAD6//3//P8FAP//AgD6//7//v8FAP7/AQD7//////8GAP7/AAD7/wEA//8EAP3/AAD9/wEA/v8DAP3/AAD9/wIA/v8CAP3/AQD9/wIA/v8CAP7/AQD+/wEA"]},function(A,t,e){"use strict";function i(A,t){this._context=h.isAudioContext(A)?A:h.throw("HOARenderer: Invalid BaseAudioContext."),this._config={ambisonicOrder:3,renderingMode:c.AMBISONIC},t&&t.ambisonicOrder&&(_.includes(t.ambisonicOrder)?this._config.ambisonicOrder=t.ambisonicOrder:h.log("HOARenderer: Invalid ambisonic order. (got "+t.ambisonicOrder+") Fallbacks to 3rd-order ambisonic.")),this._config.numberOfChannels=(this._config.ambisonicOrder+1)*(this._config.ambisonicOrder+1),this._config.numberOfStereoChannels=Math.ceil(this._config.numberOfChannels/2),t&&t.hrirPathList&&(Array.isArray(t.hrirPathList)&&t.hrirPathList.length===this._config.numberOfStereoChannels?this._config.pathList=t.hrirPathList:h.throw("HOARenderer: Invalid HRIR URLs. It must be an array with "+this._config.numberOfStereoChannels+" URLs to HRIR files. (got "+t.hrirPathList+")")),t&&t.renderingMode&&(Object.values(c).includes(t.renderingMode)?this._config.renderingMode=t.renderingMode:h.log("HOARenderer: Invalid rendering mode. (got "+t.renderingMode+') Fallbacks to "ambisonic".')),this._buildAudioGraph(),this._isRendererReady=!1}const n=e(1),s=e(8),o=e(9),r=e(17),a=e(18),h=e(0),c={AMBISONIC:"ambisonic",BYPASS:"bypass",OFF:"off"},_=[2,3];i.prototype._buildAudioGraph=function(){this.input=this._context.createGain(),this.output=this._context.createGain(),this._bypass=this._context.createGain(),this._hoaRotator=new o(this._context,this._config.ambisonicOrder),this._hoaConvolver=new s(this._context,this._config.ambisonicOrder),this.input.connect(this._hoaRotator.input),this.input.connect(this._bypass),this._hoaRotator.output.connect(this._hoaConvolver.input),this._hoaConvolver.output.connect(this.output),this.input.channelCount=this._config.numberOfChannels,this.input.channelCountMode="explicit",this.input.channelInterpretation="discrete"},i.prototype._initializeCallback=function(A,t){let e;(e=this._config.pathList?new n(this._context,this._config.pathList,{dataType:"url"}):2===this._config.ambisonicOrder?new n(this._context,a):new n(this._context,r)).load().then(function(t){this._hoaConvolver.setHRIRBufferList(t),this.setRenderingMode(this._config.renderingMode),this._isRendererReady=!0,h.log("HOARenderer: HRIRs loaded successfully. Ready."),A()}.bind(this),function(){const A="HOARenderer: HRIR loading/decoding failed.";h.throw(A),t(A)})},i.prototype.initialize=function(){return h.log("HOARenderer: Initializing... (mode: "+this._config.renderingMode+", ambisonic order: "+this._config.ambisonicOrder+")"),new Promise(this._initializeCallback.bind(this),function(A){h.throw("HOARenderer: Initialization failed. ("+A+")")})},i.prototype.setRotationMatrix3=function(A){this._isRendererReady&&this._hoaRotator.setRotationMatrix3(A)},i.prototype.setRotationMatrix4=function(A){this._isRendererReady&&this._hoaRotator.setRotationMatrix4(A)},i.prototype.setRenderingMode=function(A){if(A!==this._config.renderingMode){switch(A){case c.AMBISONIC:this._hoaConvolver.enable(),this._bypass.disconnect();break;case c.BYPASS:this._hoaConvolver.disable(),this._bypass.connect(this.output);break;case c.OFF:this._hoaConvolver.disable(),this._bypass.disconnect();break;default:return void h.log('HOARenderer: Rendering mode "'+A+'" is not supported.')}this._config.renderingMode=A,h.log("HOARenderer: Rendering mode changed. ("+A+")")}},A.exports=i},function(A,t){A.exports=["UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wQA8/8YAP3/CgACAAAA//8CAAYA8/8AAPH/CgDv/97/e/+y/9P+UQDwAHUBEwV7/pP8P/y09bsDwAfNBGYIFf/Y+736+fP890Hv8AGcC3T/vwYy+S70AAICA3AD4AagBw0R4w3ZEAcN8RVYAV8Q8P2z+kECHwdK/jIG0QNKAYUElf8IClj7BgjX+/f8j/l3/5f/6fkK+xz8FP0v/nj/Mf/n/FcBPfvH/1H3+gBP/Hf8cfiCAR/54QBh+UQAcvkzAWL8TP13+iD/V/73+wv9Kv+Y/hv+xPz7/UL83//a/z/9AP6R/5L+jf26/P3+rP26/tD8nP7B/Pv+WP1V/sP9gv91/3P9xP3J/nv/GP5S/sb+IP8v/9j/dv7U/pr+6v+u/Z3/sv5cAOr9Q/83/+n/zP5x/57+2//k/nwA/v01//L+SACB/sD/Ff81AJT+TgDp/ocAm/5dAFT+MgD+/pMAW/7o/yH/xQDA/kkA9P6LAL3+pAC0/iQAz/5UALD+UwAt/3UAhf4UAA//pwC+/joAz/5aAAv/fwDY/iMAIf+uAPP+ZAAc/0QAy/4xAB7/TgDs/goADP8wAEL/NwDo/ub/Uf9BAC3/+v9F/y4ARP9HAFP/EQA3/xMATP81AG3/HQAu/wgAaP9FACb/9f9B/y0AUP8rAED/CwBV/z4AW/8TAGH/BQBK/xsAfv8eAFn/AgB3/zwAff8RAGj//v+E/yAAb//0/3n/FwBz/xcAiv8PAHn/FQCJ/xgAg//x/3j/EQCa/ycAff/w/47/HwCI//X/iv/7/43/JQCM/+n/kP8AAJb/JACj//7/oP8ZAML/SwCo/w4Atv8tAMb/PACr/xcAwP9HAMP/OADF/y4A0f9IANL/NwC//zEA0f9LAMb/MAC8/y4A3f9GAMH/FQDQ/yYA2/8sAMT/AwDX/xkA3v8SAM3/9v/c/w8A4f8LAMj/8f/h/xQA2P8CAMn/8//j/xQA0v/7/9H//P/i/xEA0v/1/9L//f/j/w0A0f/x/9f//v/k/wgAz//u/9z/AwDg/wMA0P/v/9//BQDf////0v/y/+D/CADc//3/0v/2/+L/CgDa//r/1v/5/+T/CgDY//j/2f/9/+T/CADY//f/3P8AAOT/BwDY//f/4P8EAOP/BADZ//j/4v8GAOL/AwDa//r/5f8IAOH/AQDc//3/5v8JAOD//v/f////5v8IAOD//v/h/wIA5/8HAOD//f/j/wMA5/8GAOD//f/l/wYA5v8EAOD//v/m/wYA5f8CAOL////n/wYA5P8BAOH/AADl/wUA4f///+H/AQDk/wMA4f///+T/AQDm/wEA5////+r/AADt/wAA7/////P/AAD1////","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////v///wAAAAAAAAAAAQAAAAAA///9/wAABAD+//n/AgAJAAAA+v/+//f/DAAdAPv/+v+l/8L+jf/4/vgAdwVPAQACLQBo+Qj/Ev7o/N3/VgCbA08Bxf+L+yn9J/2HCU8FmgBvDe30Rv5h/LT09gi5CxkA5gOi8/30kwEM+4YJMf2nBmkJJAQQBLoFtvvv+m4A7PF6/R0Bif3qAuf8WARAAf4GyABG/BIAwvr4Acv8U//c/yIC8AEn/B8Daf2CAgMBAf3MAN38vgLK/UT/QwCyAPYClPyvAW/+pQAoASD+zP+R/IYC1f7C/nEBQP96AZb+1QAIAM//yQE7/tkAZ/7TAXL/w/8+AIsAtwB7/24A4v9a/z4A7v4iADb/dwCj/23/kgBOANUAIv8lAKEAxP9gAK7/BwCP/5kA7/9v/0wAzv9DAGT/3/9vAHv/6P+q/xUA7P8XAO//uv/g/2UAEgCV/wEATADM/+7/+//j/+D/9v/i//j/IgD+/xoAxf/6/z4A5/+8/9D/QwDq/+3/OQDT/zUAIgA/APP/PgAjAPD/BwAGACAADAC3//b/HAA3AN//RgDN/w8AIAACAN//GQBDACEAIwA+ACoAJQAeAPz/KgAYAPr/DgAEABYAIgAcAMT/7f8OAOL/5P/2//L/9P8GAPT/7v/8/+7/6v/t//z/AgAUAOL//P8VAAMA4/8IAPb/+P8MAAoA5v8NAAsA9v///wEAAAD9//n/9/8JAAYA7v/6/wMA+f8GAAEA7f/7/xgACAD4/w8A///3/w0A+f8BAAIA/P/5/xIA///9//r/7v/+/xYACQD///H/CwDz/wEADgAHAPP/FADn/+3/AQD5//f/AgD7/wEABwAMAAEADQD8//n/8f8OAPX/BAD+//X/+v8WAAQA+f8CAAEA7/8QAAEA/P8DAAUA9f8KAAwA9v8DAAUA+f8OAAoA9f/7/w0A+v8EAAgA8P/6/woA+//8/wkA+P/3/woA+//8/wcA9//1/woAAwD5/wcA/P/3/w0AAwD3/wEABAD2/wkABgD3/wEABQD3/wUABQD3//v/BwD3/wMABQD3//r/CQD7////BQD6//n/CQD9//3/BAD9//j/BwAAAPv/AwD///j/BwABAPn/AQABAPn/BQACAPn///8DAPr/AwADAPr//v8EAPv/AQADAPv//P8FAP3///8DAPz/+/8FAP7//f8CAP7/+/8EAP///P8BAP//+/8DAAEA+/8AAAEA+/8CAAIA+////wIA/f8AAAIA/P/+/wIA/f8AAAIA/f/9/wMA/////wEA///+/wIA/////wAAAAD+/wAAAAD/////AAD//wAA//8AAP//AAD//wAA","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD////////+//////8AAP////8AAP//AAAAAPz//f8IAAMA9////w4AAQD6/wwA8//+/y8Afv/0/2H/UP5gAbH+2QG1B2cAVAIh/l32FPyM/nACPQDV/+UEo/Q6AQwCu/oLD9kF8QJA/Uz+Wf2KCOcC+wUKBsL5aQBQ97rwOPiPAvn5CAl8AHEDkQPcAA8Bn/lIAdz7HQF1+xz9cAM4/94E4gDKAun+cgPYAYr9JgJr/bf+ivxz/MoBgv5UA8EBSgAQAJ7/UgEk/cQB7f63/sD/vf4XAhT/BQFCADYAnQGI/9EBtv3hALD/vP+c/3H/TgIN/1sBpf8yAP3/4f8qABr+1f8OAJ3/dwAGADEBnv9JAPz/IQBwAIH/jgAS/4wAsACTAOn/DQDCALn/ZQCSAAIAAwD1/9//jv9aADQA/v9EAB0AfgA8AAQACgB9APr/IAARAPT/5v9xACAABAAHAGUAt/89AC4ACgAjAMP/+v/9/xYA7f/1/+D/7P87AC0Auv8RAAcA9/8FAC8A2//y/xIAEwAaADQAJADp/zoAAgAfABIA2f/e/zUA+P/6/w4A9//A/zcA4//P//T/5f/R////EwDb/w4A8/8BABkANADh/xEA+f/0/wIAHADc//j/GwD1//f/GADs/+v/EAAAAPz/EgD3/+r/FgAMAAkAGAD9/+z/IQAQAPH/GQD3//z/CgAfAOX/AgD8//H/BAATAOv/+v///wIABAAdAOj/BQAPAAcAAQATAOz/8/8JAAkA6f8VAOv/+f8QABUA/v8OAO3/+P8KABUA9f8FAPv/5/8TAA0A7f8XAAkAAQAJABYA4/8WAAcACgANABEA7v8EAP7/AAD+/wMA9//7/xAAAQD8/wQA+f/7/wMABgDq/wAA+v/3/wYACQD1//3/BAD9/wgADgDw//r/AgD6/wEACADv//j/BQD///X/BwDu//j/AgACAPP/BAD2//n/BAAGAPb/BAD8//3/BQAJAPL/AwD+//3/BAAIAPP//f8DAPz/AAAGAPP/+/8CAP7//f8FAPX/+f8DAAAA/P8EAPf/+v8GAAMA+/8EAPv/+/8GAAQA+v8CAP///P8EAAUA+f8AAP///f8CAAUA+P///wEA/v8BAAUA+f/+/wIAAAD//wUA+v/9/wMAAQD9/wQA+//9/wMAAgD8/wMA/P/9/wMAAwD7/wEA/v/+/wIAAwD6/wEA///+/wAABAD6/wAAAQD//wAAAwD7////AQAAAP//AwD8//7/AgABAP3/AgD9//7/AQABAP3/AQD+//7/AAACAPz/AAD+//////8BAP3/AAD//wAA//8BAP7/AAD//wAA/v8AAP7/AAD//wAA//8AAP//","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////P/9//3//////wAAAAAAAAIAAgACAP//CAAEAEEA//+cAAUAb/8HAAH9+P9eARkAogQUAJn8BwCd/gX/+QQNAKoC9gFdAtb/b/vd/936TP/6AsD/nfqn/un1W/0dA8IEsQLvAJv2bP72+WMAkP8dAcX+nQO2AIr6bP/EABX+NgK/Bdj2IQv2AE4EUAiD/xQAnwIm/B0B/wGNAoH7sQaP/b8CiQakAqD+R/9xA477KQL//6r75v/O/pcCgQCtAiMCBQAkANAARwHf//39hgBl/kUAJgEtAUEATgA/AgoASADK/zUAJv29/vL+l/9c/0cAUwBBAE8A6QE5/87/Wv9NAOf+5v7P/5P/4/9BAKYAQwDD/zYB5v+r/zYATwAp/1v/WQAEAB0AhwA0AA0AIAA3AAEAzv/u/+//5v9m/zwAIADQ/8T/SABiANb/SwAbAFf/MQDX/7L/hP8TAPr/AgAMAAsAHwAZAI3/VgDC/9v/5//x/6P/AwBlAMv/yf82AB4A+P9WAPj/NwDi/1EA0v9JANj/JwAcAAEADABYANj/4f8MAEwAmP82AN//3P8UADYA7//6/wIACADU/ygAyv82AN7/9v/2/ygAxv/9/+3/5//n/zUA6//g/y4ADgD5/wsABwDv/xIADwAGACoAJQD3/zIA+/8FABsAFgDO/zAAHAAIABQALADp/xcACAAAAPH/GADs/wkACQAFAAgAFQDp/wIAHAD1//P/EQDw/+3/GAD9/+f/HAD8//T/DAAQAPH/HwD4//r/DwAPAOj/EQACAOn/DAAXAOX/BAAOANH/9/8MAO//9f8LANT/9f8EAO//6f8NANb/+P8KAOz/5v8MAOD/7f8UAO//7//+//7/9v8YAPj/9f/z/wsA+v8SAPD/+v/x/xYA+f8SAPb/9//3/xEABQACAPn/9//y/xQACQD///b//v/7/xIACQD9//H/AAD7/xEAAgD5//P/AwD9/w8AAgD3//D/BAD//wUA/v/0//D/BgADAAMA/P/2//f/BwAGAP7/+//2//j/CAAFAPv/+f/5//v/BwAHAPn/9//7//7/BQAFAPf/9//+/wEABAACAPf/+P8BAAIAAgAAAPj/9/8CAAMAAAD+//n/+f8EAAQA/v/8//r/+/8EAAMA/P/7//z//P8EAAIA/P/5//7//v8DAAEA+//5//////8CAAAA+//5/wEAAAABAP//+//6/wIAAQD///3//P/7/wMAAQD///3//f/9/wIAAQD9//3//v/9/wMAAQD9//z/AAD//wEAAAD9//z/AAAAAAAA///9//3/AAD//wAA/v////7/AAD//wAA////////AAD//wAA//8AAP//","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+////+f////v//v///wAA/////wUAAQAIAAIABwACAHkATAAOAaMAAf9C/9X6QvwhArAAtghABW37nv/y+0wAWQNcAE8JRwSOC6AEJe8P8S/zrPWaBI/+LQA/+0L+P/4K8AgAb/8uCh78BQtC614GaQWfAin5UfzN8Tf+GQizAZ4MCQMbGJ4BoRS7AvcHyQARA6n9ZwHZ/z4DvwAZAlAB6gbNAS4GFADFATL7E/2K+j37C/xp/SD9Uv0VAOsDs//WAd3+bv7F/f79mP2X/KH+FwC0/1n+VgFcATABHQGaAET+nf8Y/hoAovpqAXj9CQKW/lsCl/4RApj+bAHk/RcAlv4BAG/+DgDi//3/GwAOAEIAq/+y/3z/8v8+/7T/Tv8//27/mgDZ/1sA+P+cAAAA/P/i/yMAi/85AMP/KgDM/9MA9P+QABoA4QAiACwACwBdAP7/TQDb/y0Ayf+SAA0AZwDg/4wA+/8/AAMAgQDp/w0ADAAQAAoANgAgAA4AKABIAB4A4v/3/+f/+v/c/+n/EADn/wgAFAAqAOz/IwDc/9//3f8XAND/2v/a/w0A5v8BANb/9P/m/wAA8P8ZAN3/RwAGAEsABgB/AP7/NAASAEgABAA3AP3/KgD9/1sA8P8lAOr/FgD1/xAA4/8kAOv/AwD4/xEA5f8NAPT/+v/3/x8A7f8PAPj/IwD5/yAA9/8ZAAEAGgD4/xoA9f8HAAMACAD0/xgA+P8AAPr/IQDp/w4A8v8HAPX/IgD1/wYA+P8GAPX/GgD3/woABQASAAcAGQDw/+v/9P8bAP3/HADs/+f/7/8LAPr//v/0//T/AgD2/wsA6P///+P/CADY//7/5v/3/wQA/v8LAPD/GgD1/yMA/P8QAOv/LADw/yQA+P8XAO7/MQD9/yEAAQAcAPD/IgD9/xMA+/8OAO//FQABAAoA+/8PAPP/FQABAAQA9/8PAPX/CAADAAEA+P8NAPv/CAAGAAUA9/8JAP//AAAFAPz/+f8HAAQA/f8FAP3//P8FAAYA+P8DAP7/+/8AAAcA9/8BAP///f///wgA9//+/wAA/v/8/wUA9//8/wIA///7/wUA+v/7/wIAAAD6/wMA/P/6/wEAAQD6/wEA/v/7/wIAAgD6////AAD7/wEAAgD7//7/AQD8/wAAAwD8//3/AwD9/wAAAgD9//z/AwD/////AgD+//z/AwAAAP7/AQD///3/AgABAP3/AAAAAP3/AgACAPz///8BAP3/AQACAP3//v8BAP7/AAABAP3//v8CAP7///8BAP7//f8CAP////8AAAAA/v8CAAAAAAAAAAAA/v8BAAAAAAD//wAA//8AAP//AAD//wAA//8AAP//","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAP//AAD//wAA//8AAAAA/////wAAAQD+////AAAGAP3/OAABAIIAAwBv//f/E/0QAK0ADQCzA/7/8P4u/0cBDQCJA6ABbQDg/w7/z/9o+Vn/SPnL/1//Ef+2+jr9RfZgA5QFZwILDFj+PAb2/nEFKgKk/R0Dlv6b/FUDsP6YAoj9SgAT/iL/tAPwAv8A0P6zAr7/dwAnAf39uP22/skA2v///2YCoP4UAUsAZgF2AJH+4P70/rz9+f+U/Xv/8v7CAcb+TACS/kwAv/+x/tX9oP71/oL/1f8nAEUAZwGtAAgAIgC/AD4BaP8GAGH/dQDF/64Arf8nAakAhAH9/+kAQQD3AFb/q/8p/yIAR/8FAPD/ZAA/AIYA3v8tADQADQBp/3f/CwABAP3/Wf8OANj/WwDH/xoAe/8DAKz/zv96/z8A3f/J/5X/IAD5//j/q//c/+//RADq//D/vv8pADUAFQDI/y8ACAAbANb/OwD3/+3/9f/e/wcAIAAeAMH/8/8xAC0AEADW/+3/HAADAPv/8P8DAOL/OwD3/xcACQAHAM//5f8XAAcAz//T/9D/HgD9////yf/e//v/AgD//9H/6/////H/+/8hAAIA9//7/w0AFgAQAPL/2v/8/xsAGQABANz/9P8YAAQA/v/y/wMA5v8YAAkAAAAAAAMA7/8KABgADwDs//j/BwATABsA8P/1//z/BAAMAAAA9P/s/xAA/v8GAAkA/v/p/wMACwALAP7/9P/p/wcADQAFAPb/7//4/w0ACAD8//b//v/1/wMACwD1//T/8P/8/wAACQDz/+f/5P8GAAkABQD5//D/+v8FAA0AAwD///T/AgACABAA/v8CAPD/+/8FAAoA9f/3//f//v8GAP7/9v/t//z/+f8AAPj/+v/3/wEA+v8HAPr//P/5/wQA//8DAPr/+P/3/wYA///+//X/+//5/wQA/f/7//X/+//4/wMA/f/8//j//v/9/wYA///8//f/AgAAAAUA/f/6//n/AwACAAIA/f/7//z/AwACAAAA/f/6//3/AgADAP7//f/7/wAAAwAFAPz////8/wMAAgAEAPv//v/+/wMAAgADAPv//v///wMAAQABAPv//f8AAAIAAAD///v//f8BAAIA///+//z//v8CAAIA/v/9//3///8CAAEA/v/9//7/AAACAAAA/v/9////AAABAAAA/f/9/wAAAQABAP///f/+/wEAAQAAAP///v/+/wEAAQD///7//v///wEAAQD///7//v///wEAAAD+//7///8AAAAAAAD+//7///8AAAAA///+//7///8AAAAA////////AAAAAP////////////8AAP//////////","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAAAAAAABAAAAAAD//////////////v////3/////////+//8////AQD9//z/9f8BAAIA+f8dACgAWQBxAJX/qv+Y/uz9aP9k/7UDUQQBAiQA4Pgi/AkB0gKaBsD/+fxp/vz9CQSp/I/+ywDO+vMD0fzK/PABcgBeBfoBv/+uAuH9Sf5gAy39awMmBWUBuP9fA9/9fgDj/2/+EACaACcCSv9Z/2j/rv7hAA0AWf55/7L84P7E/SIAT/67AMv/tf+FAA7/1v+7/gv/IP+E/sQA+P5aAXz/tP9XAFX/tP8o/4r/j//e/yQAMv9mAJT/rgCr/9X/EwCb//H/9f7F/6D/EAAoAK3//v+e/zsAh/+B/7r/if/C/2r/4P/z/6//HwCy/0IA7/9ZALT/y/80ACgA9v/J/9//DgA5ADUALQARADIACwAfAOf/NgArACMACQBBAEcAGAAjAC4AWQBUAHcAAAAfACEAIAAcAPj/CADk/yQA7v89AEEAFwD5/xYA6f8aAOX/AADF/zQADwAUAOT/BQDr/yUA6P8XAOf/HADR/0AA8P8nAAgACQDt/ycAKAAHAPH/IQDz/xsACADn//n/DgADAA4A8P///8z/GgDN/yMA/f8QANj/MwACAC0ACwAOAO3/JgAZAAUACgAAAA4AIgAaAAkADwACAAAAHQATAAUABQACAAgACwAjAO////8AAA8ABQAPAPL//f8GAAsABgAGAPD/8v8GAPz/CAD6//H/6v8PAAgABgD4//3/9v8aAAgABwD1//7//v8QAAoACAD//wUA9v8QAAoABAAFAAgAAgAJAAoAAwD//w0AAgD//wcA/v8DAAoABQAFABUABAAKAAYABwAHAA8ACgAGAAwADwAMAAkAEAAJAAgADwAMAAgADgAJAAUACQAPAAUACwAHAAEABgAIAAEABAAGAP//AgAJAAAAAgAEAP7///8IAAIA//8GAAEAAQAJAAIA/v8EAAMA//8JAAEA/v8DAAMA/v8HAAMA/f8BAAUA/v8FAAMA/v8BAAcA//8DAAMA/v8BAAYA//8CAAMA/////wcAAAAAAAMAAAD//wYAAQD+/wMAAQD//wUAAQD+/wIAAgD//wQAAgD+/wEAAwD//wMAAwD+/wEAAwD//wIAAwD//wEABAAAAAEABAD//wAABAABAAAAAwAAAAAABAABAP//AwABAAAAAwACAP//AgACAAAAAwACAP//AgACAAAAAgACAAAAAQADAAAAAQACAAAAAQADAAAAAQACAAAAAAACAAEAAAACAAEAAAACAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEAAAAAAAAAAAAAAAAA","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAP//AAD//wAA//8AAAAA//8AAP//AAACAAAA+f8BAAYA///4/wIA//8AAA8A/v/V/wEAEwA9AAEBRwA2AF7/kfog/3gBwv99CDYBU/qtAUX/AP7OAfkAX/o9B38FSfwaAuT14/60BAr8CQAI/tfyIQTzAXP+egdUBBwBof7TBMT8bAWi/5EEWwBRAAAKyfxE/8b88vp6ACP+PAF4/qD8MQNM/ygCJ/2XAPD9kP5gAVT/iP9I/lEB4P8qAD0BFAGa/+7/DgB2AOP98gFm/u/+Vv5/AG8ASP9gAM//qv9w//oAcv+2/jIBHgA7/6D/oAAGAKH/lADT/wAAggC8AAYAkP9yAEcAkf8BAOD/RAAr/zUANwDt/xQAJQAkAMT/zwA/AOH/xv9zAGsANQBTAIcALAAvACIATACy/xMADADg/xcAWABvAJL/7f9VAPb/EgDt/wcA4f8kAPP/5P+h/wgACQDy//r/LgAQAMn/8/9CAOX/5v/S/9//3P8pABYAuP/s/w8AFgDt/+3/7v/w/9j/5/8GAOf/2P/2//P//v8kABMAuf/m/xoADADZ/+r/3P8KAAUAKwDe/wsA3P8VAAAADgAfAB0ACAAMAF4AGgAhAPL/MwDz/0kABAAKAPX/LwAbAAkA9v/s/+3/8/8CABAAAADm//n/BQALAAUAAQDj//n/JQAVAPX/9v/+/wIAEQABAPP/8P/1/wAABgD6/+3/7//o//j/DAD8/+b/8P8IAAkABgD4//D/8P8UAAoAAwD4/wAA+f8OAAcAAAAFAPX/9v8TAAkA8v8EAPb/9/8dAA0A7/8CAPn/+f8SAAQA8/8CAOf/+v8DAAgA9P////H//P8IAAUA8//0/wIAAQAGAAgA9//7/wAA+/8EAP//+P/+////AgACAAsA8v/+/wIABQD7/wgA9v/7/wMABAD5/wAA/P/3/wEAAQD7//7//P/1/wQA///3//r////3/wMAAwD1//r/AwD6////AgD4//n/AwD8//7/AgD4//n/AwD+//3/AQD4//n/BQD///n/AAD6//j/BAABAPj/AAD9//v/AwADAPj//v/+//z/AwAEAPj//v8BAP7/AQADAPj//f8CAP////8EAPr//P8DAAAA/v8CAPv//P8DAAEA/f8BAP3//f8DAAIA/P8AAP7//f8DAAIA/P///wAA/f8BAAIA+//+/wEA//8AAAEA+//+/wEA/////wEA/P/+/wEA///+/wAA/f/9/wEAAAD9/wAA/f/+/wEAAQD8/////v/+/wAAAQD8////////////AQD9////AAD/////AAD+////AAAAAP//AAD///////8AAP//AAD//wAA//8AAP//"]},function(A,t){A.exports=["UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wQA8/8ZAPr/DAD+/wMA/v8KAAQA/f8DAAMABADs//z/8v/z/8f/R/90/ob+//zAAWsDAwY3DKn9//tu93DvkwI6An4CuwJ0/BH7VPux92X0Gu7N/EX9mgfqCkkIiRMgBd4NQQGL/c0G/xBxAKELZATUA/sIHRSx+fkCyAUmBNEJIARlAdHz2AjNACcIsAW4AlECsvtJ/P/7K/tf++n8aP4W+g0FXAElAMn8nQHn/sT+Zv7N+9X2xvzM/O3+EvpqBBD7SQLd+vb/sPlw/JD72/3n+Rr+L/wS/vz6UQGg/Nf+Av5L/5X9Gv2//SP+mf3j/lf+v/2B/ZH/5P05/iL9MP9F/uf9UP4v/qv9mv7o/Xn+wP2k/8L+uP5J/tD+Dv/Y/bL+mP72/n3+pP+7/hAA+/5zAGH+Z/+u/g8Azv2y/6L+//9o/iIADP8VACz/CwCN/pb/1v4yAFP+wf+4/jsAcf5VAP3+bADa/nMA6f4sAOT+IQBd/v7/7v6aAIL+QADe/nEA0P4yAKz+CQCo/moAuf5xAN7+mAC8/jcANf9eAPX+IAA1/1kAAP9hAMz+PQD5/m0A2/4gAPr+UQDh/jQAEv9BAPH+FABN/zkASv9DADP/BABe/1IAGf8oAE3/RQAw/zIAQf8mADn/GgBE/xIAR/8hAD7/BABy/zEAKP/0/07/GwBX/z4ARf8mAFr/QQBV/zUAVP8eAFz/JABt/0EAUP8MAHz/KgBr/ycAYv8EAH3/MABl/x8Agv8bAIj/GgBv//z/ff8AAJX/IABu/+T/jv/r/4z/9/9n/77/pP8JAJD/EQCJ//r/q/8WAJ//GQCU/xYAtv8qAKr/PQCW/ysAwf8+ALb/OgC3/ygAz/8uAM7/OgDH/ygAz/8kAMz/OgC//xsA1f8qAMn/LwDN/xcA1f8oAMv/JQDR/xMAzf8bAM//HgDU/wUA2v8ZANL/EwDW/wEA1f8ZAMz/BwDX/wIA0v8SANT/BQDW/wMA0/8PANT/AADY/wIA1f8MANX/+f/a/wUA0v8IANf/+//Y/wUA0/8DANr/+f/Y/wQA1v8BANr/+f/Z/wUA1//8/9z/+v/Y/wYA2f/8/93//v/Y/wUA2v/9/93////Z/wUA3P/8/97/AgDa/wMA3v/8/97/AwDb/wIA3//9/97/BADd/wEA4f///9//BQDf/wAA4v8AAN//BQDf/wAA4/8CAN//BADh/wAA4/8DAOD/BADi////4/8DAOH/AwDk/wAA5P8FAOL/AgDl/wEA5P8FAOL/AQDl/wEA4/8EAOL/AQDj/wIA4P8DAN//AADg/wIA3v8CAOD/AADh/wEA4v8AAOP/AADm/wAA6P8AAOz/AADu/wAA","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////f/+//7///8AAP////8BAAEA/f8AAAEAAQAFAAUA9//6/x0A2f/9/xMA3P+jAE//of9HAKP//gCj/77/Z/vi/28D9/ywDJAJIvr6AsX0Xec4BhcGzf23DZP7yfZ6C1//nwBDBIHyYgob/Tf3sQ41ANoKRA/A+E7yffAa9gD5EQUBDMwMygiqAHMAqPqhAGUB2/gE+a78H/+4APT6DwIUAA0HNwMhBfL8E/90A5n7dP9cALIC+v5C/q0AOv9kAogBHv01/+3/qAQD/ub8T/4vAOUA5P6KATv+ywEYAeT+KP6i/3gCFP6h/hr/+P83ACL/VADn/8UARQJI/4MAu/8qAlj+wf4iAPb/LgFJ/8QAUABAAI4ABf+k/3X/YgFK/ij/j/9HADoAi/+WAA0BVwC/ACL/LACe//cARv9i/xgAUgA0ACj/FgBgAIj/5P9M/7z/zv8/AKz/gv8sAEQA6/+I/yYAawDL/7T/xf8qAOv/FQCu/5n/EgAyAO3/i/9LAE4A+//R//P/FgDe/8z/u/8DADIALAAZALL/TAA8ABwAo//1/xwA/P/L/z0A6P8jAN7/7v+a/zAAwf/7/3//KQAuACwA9v8RAGYAIwBNADgAKgASAF0ADgANACEAMQDH//H/LQACAB0Ay////x0APAABAAQA2v8iAAcAEgDE/+v/FQD+/+P/DAD1/97/6v/4//X/EwD4/+7/5P8cAA0ACQDH//7/CQAXAAEA/P/5//j/CwAWAAEABQD9//n/AQAWAB0A7v/k/wAACQAmAP//9/8AAPn/8/8aAO//6/8fAOv/5v8hAP//5/8PAOf/AAAGAPn/6v8JAAYABgABAOv/1//1//L/+P8DABcA6f/8/wMACgD7/xAA3v/2//z/DADu//z/5v/5/wEA/P/6//7/7v/x/wQABgD5/wAA8v/w/wkAEQD2//j/+v8EAAcAEAD3//v/+v8CAAAACQD3//v//v/9/wUADAD2//X/AgAHAAAABwD2//T/BgAKAP7/AQD4//r/BAAIAPn/AAD3//f/BQAHAPv//v/7//n/BQAJAPj/+v/9//7/AgAGAPj/+f8BAAEAAgAFAPn/+v8BAAIAAAAEAPn/+f8CAAQA/v8BAPr/+v8CAAQA/P////v//P8CAAQA+//+//3//f8CAAUA+v/9//////8AAAQA+v/8////AAD//wIA+//8/wAAAQD+/wEA+//8/wAAAgD9/////P/9/wEAAgD8//7//f/9/wAAAgD8//3//v/+////AQD8//z/////////AAD8//3///8AAP7/AAD9//7///8AAP7////+//////8AAP7////+////////////////////","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////v8AAP///////wAAAAAAAP7/AQABAAAABwD///X/BQAjAPL/CQDb/9D/GAAb/7sAYwCW/z0BcP/X/7T/2QDW+wH8yANCCCUJ5QT++UXmhPwhA78FuAxH+p78ifudBlAG9vmu/lAK2fdlB///cfjoCa0E7Akn9Yb/zvba+AkAHPywBGEBFwUNAL8AXAAGA20DFvmR/kz+F/06Ag/+GwHl/5EEKgJd/q0AP/ym/9n6EfxY/2H+/QFtAC4C6QBDAaMCo/20/+3/3f/p/fL9rv9V/6cBhQHuAX4AcwJYAaH/IP/P/gsApP0LAe7/sQBuAI0AAgGDAE4BzACe/5X//v+v/+f+Zf+gAOv/5QBhAOIApAANASYAuP+h/8b/HQBr/9//bACWAGEAFAB5AD0AWQDU/+D/Yf/p//D/s/+R/4QAMQBvABEAkQBfABQAJgDW/wwA8/8XALz/vf8zAFAAKwD1/zEAPwDJ/x0A7/8LAOX/FwDR//H/EQAdAO//6P8QAFEA2f8WABEAMgDy/xIA+f/s/xAALgDv////HQAvAPT/+f8iAAYAEgAFABoAGgD//w0A+f/0/xsAHgDx/9f/GAACAPH/8f8JAPf/GwALABEA7/8cAPT/CgD2//j/BQD8/+3/OgAgAAYA9f8PAN7/DgD9/9r/1//3/+3/9//1//b/8//5//f/AgAJAOf/+v8OAAMACwD9/+7/5f8eAAEA9//q//7/8P8WAP7/+//4/wIA+f8TAAIA9f/5/wcA+P8iAAgA9v/n/xoA//8gAAUABwDj/wAA9v8BAAUAFQDn/wMA7v8QABAAEQDm/wwA8f8aAAAABwDu/wcACgASAAEA7//w//f/BgARAAkA6P/3/wcADgAKAAYA4f/4/wYADgAAAPr/8P/9/xQACgAHAPn/7//9/xEAAgD+//L/8v/8/xUAAwDw//H/9f8CAAsA/v/q//L/+f8FAAYA/P/r//j///8GAAkA+//o//j/AQAIAP//+v/o//v/CAAIAPv/+P/w/wEACQAHAPj/+f/0/wIACwAFAPb/+f/4/wQACwACAPP/+f/+/wYACAD///L/+/8BAAYABQD9//P//P8FAAUAAgD7//T//f8HAAQA///7//f///8IAAMA/P/6//r/AQAIAAEA+v/6//3/AgAHAAAA+f/7/wAAAwAFAP7/+P/8/wIAAgACAP3/+f/9/wMAAwAAAPz/+v/+/wQAAgD+//z/+/8AAAQAAQD8//z//f8BAAQAAAD7//3///8BAAMA///7//3/AAACAAEA/v/7//7/AQABAAAA/v/9////AQAAAP///v/+////AAD/////////////////////////////","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD////////+//////8AAAAA/v/+/wAAAQD8//3/CQAJAP3/+v8PAAcApABlABkBkwCO/i//lfqa/HQAcf/3BdkCzwJcBCMC0wMN/9/9wgI7AaECYfxV/Tf83vhn/xrt8Owx/8n7cgHABYb43QcZDh4WugNrA7P74gHu/9z/zv0t/acCiQHY/iv4qQOl/ysCE/0//XT9Sf4O//j9xfupAn394gHO+rsCXAFIAxQC9wIXBgcD2AQuAnb/9gJh/6wAVfxEAI4Bvf7oAFv/bALsAMQBe/88/joAT/4dAH39/v9LAXn/gwDI//QBdABcAA0A7f4lAMn///+9/tv/iABp/13/pP/dALv/w/8MAHv//f+y/6////7U/5AAZP+Z/8r/nQDR/5r/DwDr/xAA4v+s/3z/+P9uAOv/t/82AGcAHgCb/yQAFQBGAM7/CgD3/xoAegAaAOz/CgBHAA8Adv8/AAAABQC2/xIAAAA7ABQAKgCj/z4AAQAXAJz/JAADAAcA8f/1/2AAAQAlAPD/NgDx/1wA7v/4/wMAZADv//3/HQAkAFoA8P9FAPv/FgBIAPf/WQAHAEUACQD0/xIAQwDu/wMAwP9VALn/XwCw/yEA5f8sAPj/FgDD/1YAyv8rAOX/HQDo//j/IQAQACAAHwD9/yQAHQBAABgABQAiAAUAKAD3/wkACwAKAAMABwAJAPb/+f8GAOr/JQAHABMA6P8TAA4AGgD//woA8/8ZAP//GADu/w0A9v8SAAMABwD4/wQA5P8XAAQACgDq/wUA+/8VAAcACADs/xIAAAATAPH/+v/1//T/7f///+z/+v/y/+//9/8KAAcACgAJAPT/BAAKAAAABgAIAPL/9v8KAAMABAACAPr/9v8OAAIA+P/x//v/+f8MAPb/+P/w/wQA9f8MAPn////7/woA/v8PAAEAAgD1/xAAAQAPAP//AwD//xQABwALAAAABgADABAAAgAHAAAACAABAA8ABQAFAAMABwAEAA4ABwADAAEACQAFAAoAAwD//wAACQADAAUAAQD/////CAABAAMAAAD/////BwACAAEAAAD/////BwACAP7///8BAAAABgABAP7///8CAAAABAAAAP7///8DAAAAAwAAAP3///8DAAAAAQAAAP3//v8EAAAAAAD+//////8EAP/////+/wAA/v8EAP/////+/wEA/v8EAP///v/+/wIA//8DAP///v/+/wIA//8BAP///v/+/wMA//8BAP/////+/wMA//8AAP//AAD+/wQA//8AAP7/AQD//wIA////////AQD//wIA////////AQAAAAEAAAAAAP//AQD//wEAAAAAAP//AQAAAAEAAAAAAAAA","UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wAA+v8AAPz/AAD//wAA/f8AAAEAAAD+/wAACQAAAAQAAAAZAAAAtgAAAFsBAABW/gAAH/oAAGcBAABoBwAAlAAAAO3/AAARAQAA+wIAAEoEAACe/gAAiv4AALD0AADJ8wAAkQQAAF34AABi8QAAPQAAAAH2AAD19AAADAMAAJwGAACTEAAA0AwAAJkHAACOBwAAuQEAANcDAAC6AgAAHwUAAHEFAAB0AwAAbgEAADz+AADYAQAAGAAAAJwCAADgAAAA//0AAMn+AAAT/AAAwP8AAOn9AAAJAAAAewEAAOn+AACN/wAAOv0AAO3+AADN/gAAcP8AACj/AACq/gAA+f4AAML9AACa/wAA/f4AAN7/AABo/wAA6/4AAE//AAAC/wAAEQAAAHX/AAB0AAAA5f8AAEwAAAB3AAAA5/8AAMIAAABCAAAAzgAAAE8AAAB3AAAAKAAAADMAAACqAAAALwAAAK4AAAASAAAAVgAAACgAAAAtAAAATAAAAP3/AAA7AAAA2/8AACQAAADw/wAALQAAADEAAAAlAAAAbAAAADMAAABUAAAAEAAAACgAAAD1/wAA9v8AAPr/AADu/wAALgAAABIAAABUAAAARAAAAGUAAABGAAAAOAAAAGAAAAAuAAAARQAAACEAAAAfAAAAAAAAAAkAAAAQAAAAAwAAABIAAADs/wAAEAAAAAYAAAASAAAAIgAAABEAAAADAAAABAAAAA8AAAD4/wAAHQAAAAsAAAAIAAAADgAAAP//AAAcAAAADwAAAAYAAAASAAAAFwAAAAMAAAAYAAAAEgAAAPr/AAAQAAAADQAAAAoAAAD3/wAABgAAAPb/AADf/wAA/v8AAPL/AAD6/wAAFAAAAAQAAAAEAAAAGwAAAAEAAAAMAAAAIAAAAAIAAAAdAAAAGAAAAAIAAAAcAAAAEgAAAAcAAAAeAAAADwAAAAQAAAAeAAAABAAAAAYAAAAZAAAAAQAAAA4AAAATAAAA/v8AAAoAAAAOAAAA+/8AAAsAAAAJAAAA+f8AAAsAAAABAAAA+f8AAAoAAAD9/wAA+v8AAAcAAAD5/wAA+v8AAAUAAAD3/wAA/f8AAAQAAAD2/wAAAAAAAAEAAAD3/wAAAgAAAAAAAAD4/wAAAwAAAP7/AAD6/wAABAAAAP3/AAD8/wAABAAAAPv/AAD+/wAAAwAAAPv/AAD//wAAAQAAAPv/AAAAAAAAAAAAAPv/AAACAAAA//8AAPz/AAACAAAA/v8AAP3/AAACAAAA/f8AAP7/AAABAAAA/f8AAP//AAABAAAA/f8AAAAAAAAAAAAA/v8AAAEAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"]},function(A,t,e){"use strict";t.getBrowserInfo=function(){const A=navigator.userAgent;let t,e=A.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*([\d\.]+)/i)||[];if(/trident/i.test(e[1]))return t=/\brv[ :]+(\d+)/g.exec(A)||[],{name:"IE",version:t[1]||""};if("Chrome"===e[1]&&null!=(t=A.match(/\bOPR|Edge\/(\d+)/)))return{name:"Opera",version:t[1]};e=e[2]?[e[1],e[2]]:[navigator.appName,navigator.appVersion,"-?"],null!=(t=A.match(/version\/([\d.]+)/i))&&e.splice(1,1,t[1]);let i=A.match(/android|ipad|iphone/i);return i||(i=A.match(/cros|linux|mac os x|windows/i)),{name:e[0],version:e[1],platform:i?i[0]:"unknown"}},t.patchSafari=function(){window.webkitAudioContext&&window.webkitOfflineAudioContext&&(window.AudioContext=window.webkitAudioContext,window.OfflineAudioContext=window.webkitOfflineAudioContext)}},function(A,t,e){"use strict";A.exports="1.0.6"}])})},function(A,t,e){"use strict";A.exports="0.0.4"}])});
\ No newline at end of file
diff --git a/src/renderer/lib/showdown.min.js b/src/renderer/lib/showdown.min.js
new file mode 100644
index 00000000..7ed96f26
--- /dev/null
+++ b/src/renderer/lib/showdown.min.js
@@ -0,0 +1,5531 @@
+;/*! showdown v 2.0.0-alpha1 - 14-11-2021 */
+(function(){
+ /**
+ * Created by Tivie on 13-07-2015.
+ */
+
+ function getDefaultOpts (simple) {
+ 'use strict';
+
+ var defaultOptions = {
+ omitExtraWLInCodeBlocks: {
+ defaultValue: false,
+ describe: 'Omit the default extra whiteline added to code blocks',
+ type: 'boolean'
+ },
+ noHeaderId: {
+ defaultValue: false,
+ describe: 'Turn on/off generated header id',
+ type: 'boolean'
+ },
+ prefixHeaderId: {
+ defaultValue: false,
+ describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \'section-\' prefix',
+ type: 'string'
+ },
+ rawPrefixHeaderId: {
+ defaultValue: false,
+ describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',
+ type: 'boolean'
+ },
+ ghCompatibleHeaderId: {
+ defaultValue: false,
+ describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)',
+ type: 'boolean'
+ },
+ rawHeaderId: {
+ defaultValue: false,
+ describe: 'Remove only spaces, \' and " from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids',
+ type: 'boolean'
+ },
+ headerLevelStart: {
+ defaultValue: false,
+ describe: 'The header blocks level start',
+ type: 'integer'
+ },
+ parseImgDimensions: {
+ defaultValue: false,
+ describe: 'Turn on/off image dimension parsing',
+ type: 'boolean'
+ },
+ simplifiedAutoLink: {
+ defaultValue: false,
+ describe: 'Turn on/off GFM autolink style',
+ type: 'boolean'
+ },
+ literalMidWordUnderscores: {
+ defaultValue: false,
+ describe: 'Parse midword underscores as literal underscores',
+ type: 'boolean'
+ },
+ literalMidWordAsterisks: {
+ defaultValue: false,
+ describe: 'Parse midword asterisks as literal asterisks',
+ type: 'boolean'
+ },
+ strikethrough: {
+ defaultValue: false,
+ describe: 'Turn on/off strikethrough support',
+ type: 'boolean'
+ },
+ tables: {
+ defaultValue: false,
+ describe: 'Turn on/off tables support',
+ type: 'boolean'
+ },
+ tablesHeaderId: {
+ defaultValue: false,
+ describe: 'Add an id to table headers',
+ type: 'boolean'
+ },
+ ghCodeBlocks: {
+ defaultValue: true,
+ describe: 'Turn on/off GFM fenced code blocks support',
+ type: 'boolean'
+ },
+ tasklists: {
+ defaultValue: false,
+ describe: 'Turn on/off GFM tasklist support',
+ type: 'boolean'
+ },
+ smoothLivePreview: {
+ defaultValue: false,
+ describe: 'Prevents weird effects in live previews due to incomplete input',
+ type: 'boolean'
+ },
+ smartIndentationFix: {
+ defaultValue: false,
+ description: 'Tries to smartly fix indentation in es6 strings',
+ type: 'boolean'
+ },
+ disableForced4SpacesIndentedSublists: {
+ defaultValue: false,
+ description: 'Disables the requirement of indenting nested sublists by 4 spaces',
+ type: 'boolean'
+ },
+ simpleLineBreaks: {
+ defaultValue: false,
+ description: 'Parses simple line breaks as (GFM Style)',
+ type: 'boolean'
+ },
+ requireSpaceBeforeHeadingText: {
+ defaultValue: false,
+ description: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',
+ type: 'boolean'
+ },
+ ghMentions: {
+ defaultValue: false,
+ description: 'Enables github @mentions',
+ type: 'boolean'
+ },
+ ghMentionsLink: {
+ defaultValue: 'https://github.com/{u}',
+ description: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.',
+ type: 'string'
+ },
+ encodeEmails: {
+ defaultValue: true,
+ description: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',
+ type: 'boolean'
+ },
+ openLinksInNewWindow: {
+ defaultValue: false,
+ description: 'Open all links in new windows',
+ type: 'boolean'
+ },
+ backslashEscapesHTMLTags: {
+ defaultValue: false,
+ description: 'Support for HTML Tag escaping. ex: \foo\
',
+ type: 'boolean'
+ },
+ emoji: {
+ defaultValue: false,
+ description: 'Enable emoji support. Ex: `this is a :smile: emoji`',
+ type: 'boolean'
+ },
+ underline: {
+ defaultValue: false,
+ description: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``',
+ type: 'boolean'
+ },
+ ellipsis: {
+ defaultValue: true,
+ description: 'Replaces three dots with the ellipsis unicode character',
+ type: 'boolean'
+ },
+ completeHTMLDocument: {
+ defaultValue: false,
+ description: 'Outputs a complete html document, including ``, `` and `` tags',
+ type: 'boolean'
+ },
+ metadata: {
+ defaultValue: false,
+ description: 'Enable support for document metadata (defined at the top of the document between `ÂĢÂĢÂĢ` and `ÂģÂģÂģ` or between `---` and `---`).',
+ type: 'boolean'
+ },
+ splitAdjacentBlockquotes: {
+ defaultValue: false,
+ description: 'Split adjacent blockquote blocks',
+ type: 'boolean'
+ },
+ relativePathBaseUrl: {
+ defaultValue: false,
+ describe: 'Prepends a base URL to relative paths',
+ type: 'string'
+ },
+ };
+ if (simple === false) {
+ return JSON.parse(JSON.stringify(defaultOptions));
+ }
+ var ret = {};
+ for (var opt in defaultOptions) {
+ if (defaultOptions.hasOwnProperty(opt)) {
+ ret[opt] = defaultOptions[opt].defaultValue;
+ }
+ }
+ return ret;
+ }
+
+ function allOptionsOn () {
+ 'use strict';
+ var options = getDefaultOpts(true),
+ ret = {};
+ for (var opt in options) {
+ if (options.hasOwnProperty(opt)) {
+ ret[opt] = true;
+ }
+ }
+ return ret;
+ }
+
+ /**
+ * Created by Tivie on 06-01-2015.
+ */
+// Private properties
+ var showdown = {},
+ parsers = {},
+ extensions = {},
+ globalOptions = getDefaultOpts(true),
+ setFlavor = 'vanilla',
+ flavor = {
+ github: {
+ omitExtraWLInCodeBlocks: true,
+ simplifiedAutoLink: true,
+ literalMidWordUnderscores: true,
+ strikethrough: true,
+ tables: true,
+ tablesHeaderId: true,
+ ghCodeBlocks: true,
+ tasklists: true,
+ disableForced4SpacesIndentedSublists: true,
+ simpleLineBreaks: true,
+ requireSpaceBeforeHeadingText: true,
+ ghCompatibleHeaderId: true,
+ ghMentions: true,
+ backslashEscapesHTMLTags: true,
+ emoji: true,
+ splitAdjacentBlockquotes: true
+ },
+ original: {
+ noHeaderId: true,
+ ghCodeBlocks: false
+ },
+ ghost: {
+ omitExtraWLInCodeBlocks: true,
+ parseImgDimensions: true,
+ simplifiedAutoLink: true,
+ literalMidWordUnderscores: true,
+ strikethrough: true,
+ tables: true,
+ tablesHeaderId: true,
+ ghCodeBlocks: true,
+ tasklists: true,
+ smoothLivePreview: true,
+ simpleLineBreaks: true,
+ requireSpaceBeforeHeadingText: true,
+ ghMentions: false,
+ encodeEmails: true
+ },
+ vanilla: getDefaultOpts(true),
+ allOn: allOptionsOn()
+ };
+
+ /**
+ * helper namespace
+ * @type {{}}
+ */
+ showdown.helper = {};
+
+ /**
+ * TODO LEGACY SUPPORT CODE
+ * @type {{}}
+ */
+ showdown.extensions = {};
+
+ /**
+ * Set a global option
+ * @static
+ * @param {string} key
+ * @param {*} value
+ * @returns {showdown}
+ */
+ showdown.setOption = function (key, value) {
+ 'use strict';
+ globalOptions[key] = value;
+ return this;
+ };
+
+ /**
+ * Get a global option
+ * @static
+ * @param {string} key
+ * @returns {*}
+ */
+ showdown.getOption = function (key) {
+ 'use strict';
+ return globalOptions[key];
+ };
+
+ /**
+ * Get the global options
+ * @static
+ * @returns {{}}
+ */
+ showdown.getOptions = function () {
+ 'use strict';
+ return globalOptions;
+ };
+
+ /**
+ * Reset global options to the default values
+ * @static
+ */
+ showdown.resetOptions = function () {
+ 'use strict';
+ globalOptions = getDefaultOpts(true);
+ };
+
+ /**
+ * Set the flavor showdown should use as default
+ * @param {string} name
+ */
+ showdown.setFlavor = function (name) {
+ 'use strict';
+ if (!flavor.hasOwnProperty(name)) {
+ throw Error(name + ' flavor was not found');
+ }
+ showdown.resetOptions();
+ var preset = flavor[name];
+ setFlavor = name;
+ for (var option in preset) {
+ if (preset.hasOwnProperty(option)) {
+ globalOptions[option] = preset[option];
+ }
+ }
+ };
+
+ /**
+ * Get the currently set flavor
+ * @returns {string}
+ */
+ showdown.getFlavor = function () {
+ 'use strict';
+ return setFlavor;
+ };
+
+ /**
+ * Get the options of a specified flavor. Returns undefined if the flavor was not found
+ * @param {string} name Name of the flavor
+ * @returns {{}|undefined}
+ */
+ showdown.getFlavorOptions = function (name) {
+ 'use strict';
+ if (flavor.hasOwnProperty(name)) {
+ return flavor[name];
+ }
+ };
+
+ /**
+ * Get the default options
+ * @static
+ * @param {boolean} [simple=true]
+ * @returns {{}}
+ */
+ showdown.getDefaultOptions = function (simple) {
+ 'use strict';
+ return getDefaultOpts(simple);
+ };
+
+ /**
+ * Get or set a subParser
+ *
+ * subParser(name) - Get a registered subParser
+ * subParser(name, func) - Register a subParser
+ * @static
+ * @param {string} name
+ * @param {function} [func]
+ * @returns {*}
+ */
+ showdown.subParser = function (name, func) {
+ 'use strict';
+ if (showdown.helper.isString(name)) {
+ if (typeof func !== 'undefined') {
+ parsers[name] = func;
+ } else {
+ if (parsers.hasOwnProperty(name)) {
+ return parsers[name];
+ } else {
+ throw Error('SubParser named ' + name + ' not registered!');
+ }
+ }
+ } else {
+ throw Error('showdown.subParser function first argument must be a string (the name of the subparser)');
+ }
+ };
+
+ /**
+ * Gets or registers an extension
+ * @static
+ * @param {string} name
+ * @param {object|function=} ext
+ * @returns {*}
+ */
+ showdown.extension = function (name, ext) {
+ 'use strict';
+
+ if (!showdown.helper.isString(name)) {
+ throw Error('Extension \'name\' must be a string');
+ }
+
+ name = showdown.helper.stdExtName(name);
+
+ // Getter
+ if (showdown.helper.isUndefined(ext)) {
+ if (!extensions.hasOwnProperty(name)) {
+ throw Error('Extension named ' + name + ' is not registered!');
+ }
+ return extensions[name];
+
+ // Setter
+ } else {
+ // Expand extension if it's wrapped in a function
+ if (typeof ext === 'function') {
+ ext = ext();
+ }
+
+ // Ensure extension is an array
+ if (!showdown.helper.isArray(ext)) {
+ ext = [ext];
+ }
+
+ var validExtension = validate(ext, name);
+
+ if (validExtension.valid) {
+ extensions[name] = ext;
+ } else {
+ throw Error(validExtension.error);
+ }
+ }
+ };
+
+ /**
+ * Gets all extensions registered
+ * @returns {{}}
+ */
+ showdown.getAllExtensions = function () {
+ 'use strict';
+ return extensions;
+ };
+
+ /**
+ * Remove an extension
+ * @param {string} name
+ */
+ showdown.removeExtension = function (name) {
+ 'use strict';
+ delete extensions[name];
+ };
+
+ /**
+ * Removes all extensions
+ */
+ showdown.resetExtensions = function () {
+ 'use strict';
+ extensions = {};
+ };
+
+ /**
+ * Validate extension
+ * @param {array} extension
+ * @param {string} name
+ * @returns {{valid: boolean, error: string}}
+ */
+ function validate (extension, name) {
+ 'use strict';
+
+ var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',
+ ret = {
+ valid: true,
+ error: ''
+ };
+
+ if (!showdown.helper.isArray(extension)) {
+ extension = [extension];
+ }
+
+ for (var i = 0; i < extension.length; ++i) {
+ var baseMsg = errMsg + ' sub-extension ' + i + ': ',
+ ext = extension[i];
+ if (typeof ext !== 'object') {
+ ret.valid = false;
+ ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';
+ return ret;
+ }
+
+ if (!showdown.helper.isString(ext.type)) {
+ ret.valid = false;
+ ret.error = baseMsg + 'property "type" must be a string, but ' + typeof ext.type + ' given';
+ return ret;
+ }
+
+ var type = ext.type = ext.type.toLowerCase();
+
+ // normalize extension type
+ if (type === 'language') {
+ type = ext.type = 'lang';
+ }
+
+ if (type === 'html') {
+ type = ext.type = 'output';
+ }
+
+ if (type !== 'lang' && type !== 'output' && type !== 'listener') {
+ ret.valid = false;
+ ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"';
+ return ret;
+ }
+
+ if (type === 'listener') {
+ if (showdown.helper.isUndefined(ext.listeners)) {
+ ret.valid = false;
+ ret.error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"';
+ return ret;
+ }
+ } else {
+ if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {
+ ret.valid = false;
+ ret.error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method';
+ return ret;
+ }
+ }
+
+ if (ext.listeners) {
+ if (typeof ext.listeners !== 'object') {
+ ret.valid = false;
+ ret.error = baseMsg + '"listeners" property must be an object but ' + typeof ext.listeners + ' given';
+ return ret;
+ }
+ for (var ln in ext.listeners) {
+ if (ext.listeners.hasOwnProperty(ln)) {
+ if (typeof ext.listeners[ln] !== 'function') {
+ ret.valid = false;
+ ret.error = baseMsg + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + ln +
+ ' must be a function but ' + typeof ext.listeners[ln] + ' given';
+ return ret;
+ }
+ }
+ }
+ }
+
+ if (ext.filter) {
+ if (typeof ext.filter !== 'function') {
+ ret.valid = false;
+ ret.error = baseMsg + '"filter" must be a function, but ' + typeof ext.filter + ' given';
+ return ret;
+ }
+ } else if (ext.regex) {
+ if (showdown.helper.isString(ext.regex)) {
+ ext.regex = new RegExp(ext.regex, 'g');
+ }
+ if (!(ext.regex instanceof RegExp)) {
+ ret.valid = false;
+ ret.error = baseMsg + '"regex" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';
+ return ret;
+ }
+ if (showdown.helper.isUndefined(ext.replace)) {
+ ret.valid = false;
+ ret.error = baseMsg + '"regex" extensions must implement a replace string or function';
+ return ret;
+ }
+ }
+ }
+ return ret;
+ }
+
+ /**
+ * Validate extension
+ * @param {object} ext
+ * @returns {boolean}
+ */
+ showdown.validateExtension = function (ext) {
+ 'use strict';
+
+ var validateExtension = validate(ext, null);
+ if (!validateExtension.valid) {
+ console.warn(validateExtension.error);
+ return false;
+ }
+ return true;
+ };
+
+ /**
+ * showdownjs helper functions
+ */
+
+ if (!showdown.hasOwnProperty('helper')) {
+ showdown.helper = {};
+ }
+
+ if (typeof this.document === 'undefined' && typeof this.window === 'undefined') {
+ var jsdom = require('jsdom');
+ this.window = new jsdom.JSDOM('', {}).window; // jshint ignore:line
+ }
+ showdown.helper.document = this.window.document;
+
+ /**
+ * Check if var is string
+ * @static
+ * @param {string} a
+ * @returns {boolean}
+ */
+ showdown.helper.isString = function (a) {
+ 'use strict';
+ return (typeof a === 'string' || a instanceof String);
+ };
+
+ /**
+ * Check if var is a function
+ * @static
+ * @param {*} a
+ * @returns {boolean}
+ */
+ showdown.helper.isFunction = function (a) {
+ 'use strict';
+ var getType = {};
+ return a && getType.toString.call(a) === '[object Function]';
+ };
+
+ /**
+ * isArray helper function
+ * @static
+ * @param {*} a
+ * @returns {boolean}
+ */
+ showdown.helper.isArray = function (a) {
+ 'use strict';
+ return Array.isArray(a);
+ };
+
+ /**
+ * Check if value is undefined
+ * @static
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+ */
+ showdown.helper.isUndefined = function (value) {
+ 'use strict';
+ return typeof value === 'undefined';
+ };
+
+ /**
+ * ForEach helper function
+ * Iterates over Arrays and Objects (own properties only)
+ * @static
+ * @param {*} obj
+ * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object
+ */
+ showdown.helper.forEach = function (obj, callback) {
+ 'use strict';
+ // check if obj is defined
+ if (showdown.helper.isUndefined(obj)) {
+ throw new Error('obj param is required');
+ }
+
+ if (showdown.helper.isUndefined(callback)) {
+ throw new Error('callback param is required');
+ }
+
+ if (!showdown.helper.isFunction(callback)) {
+ throw new Error('callback param must be a function/closure');
+ }
+
+ if (typeof obj.forEach === 'function') {
+ obj.forEach(callback);
+ } else if (showdown.helper.isArray(obj)) {
+ for (var i = 0; i < obj.length; i++) {
+ callback(obj[i], i, obj);
+ }
+ } else if (typeof (obj) === 'object') {
+ for (var prop in obj) {
+ if (obj.hasOwnProperty(prop)) {
+ callback(obj[prop], prop, obj);
+ }
+ }
+ } else {
+ throw new Error('obj does not seem to be an array or an iterable object');
+ }
+ };
+
+ /**
+ * Standardidize extension name
+ * @static
+ * @param {string} s extension name
+ * @returns {string}
+ */
+ showdown.helper.stdExtName = function (s) {
+ 'use strict';
+ return s.replace(/[_?*+\/\\.^-]/g, '').replace(/\s/g, '').toLowerCase();
+ };
+
+ function escapeCharactersCallback (wholeMatch, m1) {
+ 'use strict';
+ var charCodeToEscape = m1.charCodeAt(0);
+ return '¨E' + charCodeToEscape + 'E';
+ }
+
+ /**
+ * Callback used to escape characters when passing through String.replace
+ * @static
+ * @param {string} wholeMatch
+ * @param {string} m1
+ * @returns {string}
+ */
+ showdown.helper.escapeCharactersCallback = escapeCharactersCallback;
+
+ /**
+ * Escape characters in a string
+ * @static
+ * @param {string} text
+ * @param {string} charsToEscape
+ * @param {boolean} afterBackslash
+ * @returns {XML|string|void|*}
+ */
+ showdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) {
+ 'use strict';
+ // First we have to escape the escape characters so that
+ // we can build a character class out of them
+ var regexString = '([' + charsToEscape.replace(/([\[\]\\])/g, '\\$1') + '])';
+
+ if (afterBackslash) {
+ regexString = '\\\\' + regexString;
+ }
+
+ var regex = new RegExp(regexString, 'g');
+ text = text.replace(regex, escapeCharactersCallback);
+
+ return text;
+ };
+
+ var rgxFindMatchPos = function (str, left, right, flags) {
+ 'use strict';
+ var f = flags || '',
+ g = f.indexOf('g') > -1,
+ x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),
+ l = new RegExp(left, f.replace(/g/g, '')),
+ pos = [],
+ t, s, m, start, end;
+
+ do {
+ t = 0;
+ while ((m = x.exec(str))) {
+ if (l.test(m[0])) {
+ if (!(t++)) {
+ s = x.lastIndex;
+ start = s - m[0].length;
+ }
+ } else if (t) {
+ if (!--t) {
+ end = m.index + m[0].length;
+ var obj = {
+ left: {start: start, end: s},
+ match: {start: s, end: m.index},
+ right: {start: m.index, end: end},
+ wholeMatch: {start: start, end: end}
+ };
+ pos.push(obj);
+ if (!g) {
+ return pos;
+ }
+ }
+ }
+ }
+ } while (t && (x.lastIndex = s));
+
+ return pos;
+ };
+
+ /**
+ * matchRecursiveRegExp
+ *
+ * (c) 2007 Steven Levithan
+ * MIT License
+ *
+ * Accepts a string to search, a left and right format delimiter
+ * as regex patterns, and optional regex flags. Returns an array
+ * of matches, allowing nested instances of left/right delimiters.
+ * Use the "g" flag to return all matches, otherwise only the
+ * first is returned. Be careful to ensure that the left and
+ * right format delimiters produce mutually exclusive matches.
+ * Backreferences are not supported within the right delimiter
+ * due to how it is internally combined with the left delimiter.
+ * When matching strings whose format delimiters are unbalanced
+ * to the left or right, the output is intentionally as a
+ * conventional regex library with recursion support would
+ * produce, e.g. "<" and ">" both produce ["x"] when using
+ * "<" and ">" as the delimiters (both strings contain a single,
+ * balanced instance of "").
+ *
+ * examples:
+ * matchRecursiveRegExp("test", "\\(", "\\)")
+ * returns: []
+ * matchRecursiveRegExp(">>t<>", "<", ">", "g")
+ * returns: ["t<>", ""]
+ * matchRecursiveRegExp(" test
", "]*>", "
", "gi")
+ * returns: ["test"]
+ */
+ showdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {
+ 'use strict';
+
+ var matchPos = rgxFindMatchPos (str, left, right, flags),
+ results = [];
+
+ for (var i = 0; i < matchPos.length; ++i) {
+ results.push([
+ str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),
+ str.slice(matchPos[i].match.start, matchPos[i].match.end),
+ str.slice(matchPos[i].left.start, matchPos[i].left.end),
+ str.slice(matchPos[i].right.start, matchPos[i].right.end)
+ ]);
+ }
+ return results;
+ };
+
+ /**
+ *
+ * @param {string} str
+ * @param {string|function} replacement
+ * @param {string} left
+ * @param {string} right
+ * @param {string} flags
+ * @returns {string}
+ */
+ showdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {
+ 'use strict';
+
+ if (!showdown.helper.isFunction(replacement)) {
+ var repStr = replacement;
+ replacement = function () {
+ return repStr;
+ };
+ }
+
+ var matchPos = rgxFindMatchPos(str, left, right, flags),
+ finalStr = str,
+ lng = matchPos.length;
+
+ if (lng > 0) {
+ var bits = [];
+ if (matchPos[0].wholeMatch.start !== 0) {
+ bits.push(str.slice(0, matchPos[0].wholeMatch.start));
+ }
+ for (var i = 0; i < lng; ++i) {
+ bits.push(
+ replacement(
+ str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),
+ str.slice(matchPos[i].match.start, matchPos[i].match.end),
+ str.slice(matchPos[i].left.start, matchPos[i].left.end),
+ str.slice(matchPos[i].right.start, matchPos[i].right.end)
+ )
+ );
+ if (i < lng - 1) {
+ bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));
+ }
+ }
+ if (matchPos[lng - 1].wholeMatch.end < str.length) {
+ bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));
+ }
+ finalStr = bits.join('');
+ }
+ return finalStr;
+ };
+
+ /**
+ * Returns the index within the passed String object of the first occurrence of the specified regex,
+ * starting the search at fromIndex. Returns -1 if the value is not found.
+ *
+ * @param {string} str string to search
+ * @param {RegExp} regex Regular expression to search
+ * @param {int} [fromIndex = 0] Index to start the search
+ * @returns {Number}
+ * @throws InvalidArgumentError
+ */
+ showdown.helper.regexIndexOf = function (str, regex, fromIndex) {
+ 'use strict';
+ if (!showdown.helper.isString(str)) {
+ throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';
+ }
+ if (regex instanceof RegExp === false) {
+ throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp';
+ }
+ var indexOf = str.substring(fromIndex || 0).search(regex);
+ return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf;
+ };
+
+ /**
+ * Splits the passed string object at the defined index, and returns an array composed of the two substrings
+ * @param {string} str string to split
+ * @param {int} index index to split string at
+ * @returns {[string,string]}
+ * @throws InvalidArgumentError
+ */
+ showdown.helper.splitAtIndex = function (str, index) {
+ 'use strict';
+ if (!showdown.helper.isString(str)) {
+ throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';
+ }
+ return [str.substring(0, index), str.substring(index)];
+ };
+
+ /**
+ * Obfuscate an e-mail address through the use of Character Entities,
+ * transforming ASCII characters into their equivalent decimal or hex entities.
+ *
+ * Since it has a random component, subsequent calls to this function produce different results
+ *
+ * @param {string} mail
+ * @returns {string}
+ */
+ showdown.helper.encodeEmailAddress = function (mail) {
+ 'use strict';
+ var encode = [
+ function (ch) {
+ return '' + ch.charCodeAt(0) + ';';
+ },
+ function (ch) {
+ return '' + ch.charCodeAt(0).toString(16) + ';';
+ },
+ function (ch) {
+ return ch;
+ }
+ ];
+
+ mail = mail.replace(/./g, function (ch) {
+ if (ch === '@') {
+ // this *must* be encoded. I insist.
+ ch = encode[Math.floor(Math.random() * 2)](ch);
+ } else {
+ var r = Math.random();
+ // roughly 10% raw, 45% hex, 45% dec
+ ch = (
+ r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)
+ );
+ }
+ return ch;
+ });
+
+ return mail;
+ };
+
+ /**
+ *
+ * @param str
+ * @param targetLength
+ * @param padString
+ * @returns {string}
+ */
+ showdown.helper.padEnd = function padEnd (str, targetLength, padString) {
+ 'use strict';
+ /*jshint bitwise: false*/
+ // eslint-disable-next-line space-infix-ops
+ targetLength = targetLength>>0; //floor if number or convert non-number to 0;
+ /*jshint bitwise: true*/
+ padString = String(padString || ' ');
+ if (str.length > targetLength) {
+ return String(str);
+ } else {
+ targetLength = targetLength - str.length;
+ if (targetLength > padString.length) {
+ padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed
+ }
+ return String(str) + padString.slice(0,targetLength);
+ }
+ };
+
+ /**
+ * Unescape HTML entities
+ * @param txt
+ * @returns {string}
+ */
+ showdown.helper.unescapeHTMLEntities = function (txt) {
+ 'use strict';
+
+ return txt
+ .replace(/"/g, '"')
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, '&');
+ };
+
+ showdown.helper._hashHTMLSpan = function (html, globals) {
+ return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C';
+ };
+
+ /**
+ * Prepends a base URL to relative paths.
+ *
+ * @param {string} baseUrl the base URL to prepend to a relative path
+ * @param {string} url the path to modify, which may be relative
+ * @returns {string} the full URL
+ */
+ showdown.helper.applyBaseUrl = function (baseUrl, url) {
+ // Only prepend if given a base URL and the path is not absolute.
+ if (baseUrl && !this.isAbsolutePath(url)) {
+ var urlResolve = require('url').resolve;
+ url = urlResolve(baseUrl, url);
+ }
+
+ return url;
+ };
+
+ /**
+ * Checks if the given path is absolute.
+ *
+ * @param {string} path the path to test for absolution
+ * @returns {boolean} `true` if the given path is absolute, else `false`
+ */
+ showdown.helper.isAbsolutePath = function (path) {
+ // Absolute paths begin with '[protocol:]//' or '#' (anchors)
+ return /(^([a-z]+:)?\/\/)|(^#)/i.test(path);
+ };
+
+ /**
+ * Showdown's Event Object
+ * @param {string} name Name of the event
+ * @param {string} text Text
+ * @param {{}} params optional. params of the event
+ * @constructor
+ */
+ showdown.helper.Event = function (name, text, params) {
+ 'use strict';
+
+ var regexp = params.regexp || null;
+ var matches = params.matches || {};
+ var options = params.options || {};
+ var converter = params.converter || null;
+ var globals = params.globals || {};
+
+ /**
+ * Get the name of the event
+ * @returns {string}
+ */
+ this.getName = function () {
+ return name;
+ };
+
+ this.getEventName = function () {
+ return name;
+ };
+
+ this._stopExecution = false;
+
+ this.parsedText = params.parsedText || null;
+
+ this.getRegexp = function () {
+ return regexp;
+ };
+
+ this.getOptions = function () {
+ return options;
+ };
+
+ this.getConverter = function () {
+ return converter;
+ };
+
+ this.getGlobals = function () {
+ return globals;
+ };
+
+ this.getCapturedText = function () {
+ return text;
+ };
+
+ this.getText = function () {
+ return text;
+ };
+
+ this.setText = function (newText) {
+ text = newText;
+ };
+
+ this.getMatches = function () {
+ return matches;
+ };
+
+ this.setMatches = function (newMatches) {
+ matches = newMatches;
+ };
+
+ this.preventDefault = function (bool) {
+ this._stopExecution = !bool;
+ };
+ };
+
+ /**
+ * POLYFILLS
+ */
+// use this instead of builtin is undefined for IE8 compatibility
+ if (typeof (console) === 'undefined') {
+ console = {
+ warn: function (msg) {
+ 'use strict';
+ alert(msg);
+ },
+ log: function (msg) {
+ 'use strict';
+ alert(msg);
+ },
+ error: function (msg) {
+ 'use strict';
+ throw msg;
+ }
+ };
+ }
+
+ /**
+ * Common regexes.
+ * We declare some common regexes to improve performance
+ */
+ showdown.helper.regexes = {
+ asteriskDashTildeAndColon: /([*_:~])/g,
+ asteriskDashAndTilde: /([*_~])/g
+ };
+
+ /**
+ * EMOJIS LIST
+ */
+ showdown.helper.emojis = {
+ '+1':'\ud83d\udc4d',
+ '-1':'\ud83d\udc4e',
+ '100':'\ud83d\udcaf',
+ '1234':'\ud83d\udd22',
+ '1st_place_medal':'\ud83e\udd47',
+ '2nd_place_medal':'\ud83e\udd48',
+ '3rd_place_medal':'\ud83e\udd49',
+ '8ball':'\ud83c\udfb1',
+ 'a':'\ud83c\udd70\ufe0f',
+ 'ab':'\ud83c\udd8e',
+ 'abc':'\ud83d\udd24',
+ 'abcd':'\ud83d\udd21',
+ 'accept':'\ud83c\ude51',
+ 'aerial_tramway':'\ud83d\udea1',
+ 'airplane':'\u2708\ufe0f',
+ 'alarm_clock':'\u23f0',
+ 'alembic':'\u2697\ufe0f',
+ 'alien':'\ud83d\udc7d',
+ 'ambulance':'\ud83d\ude91',
+ 'amphora':'\ud83c\udffa',
+ 'anchor':'\u2693\ufe0f',
+ 'angel':'\ud83d\udc7c',
+ 'anger':'\ud83d\udca2',
+ 'angry':'\ud83d\ude20',
+ 'anguished':'\ud83d\ude27',
+ 'ant':'\ud83d\udc1c',
+ 'apple':'\ud83c\udf4e',
+ 'aquarius':'\u2652\ufe0f',
+ 'aries':'\u2648\ufe0f',
+ 'arrow_backward':'\u25c0\ufe0f',
+ 'arrow_double_down':'\u23ec',
+ 'arrow_double_up':'\u23eb',
+ 'arrow_down':'\u2b07\ufe0f',
+ 'arrow_down_small':'\ud83d\udd3d',
+ 'arrow_forward':'\u25b6\ufe0f',
+ 'arrow_heading_down':'\u2935\ufe0f',
+ 'arrow_heading_up':'\u2934\ufe0f',
+ 'arrow_left':'\u2b05\ufe0f',
+ 'arrow_lower_left':'\u2199\ufe0f',
+ 'arrow_lower_right':'\u2198\ufe0f',
+ 'arrow_right':'\u27a1\ufe0f',
+ 'arrow_right_hook':'\u21aa\ufe0f',
+ 'arrow_up':'\u2b06\ufe0f',
+ 'arrow_up_down':'\u2195\ufe0f',
+ 'arrow_up_small':'\ud83d\udd3c',
+ 'arrow_upper_left':'\u2196\ufe0f',
+ 'arrow_upper_right':'\u2197\ufe0f',
+ 'arrows_clockwise':'\ud83d\udd03',
+ 'arrows_counterclockwise':'\ud83d\udd04',
+ 'art':'\ud83c\udfa8',
+ 'articulated_lorry':'\ud83d\ude9b',
+ 'artificial_satellite':'\ud83d\udef0',
+ 'astonished':'\ud83d\ude32',
+ 'athletic_shoe':'\ud83d\udc5f',
+ 'atm':'\ud83c\udfe7',
+ 'atom_symbol':'\u269b\ufe0f',
+ 'avocado':'\ud83e\udd51',
+ 'b':'\ud83c\udd71\ufe0f',
+ 'baby':'\ud83d\udc76',
+ 'baby_bottle':'\ud83c\udf7c',
+ 'baby_chick':'\ud83d\udc24',
+ 'baby_symbol':'\ud83d\udebc',
+ 'back':'\ud83d\udd19',
+ 'bacon':'\ud83e\udd53',
+ 'badminton':'\ud83c\udff8',
+ 'baggage_claim':'\ud83d\udec4',
+ 'baguette_bread':'\ud83e\udd56',
+ 'balance_scale':'\u2696\ufe0f',
+ 'balloon':'\ud83c\udf88',
+ 'ballot_box':'\ud83d\uddf3',
+ 'ballot_box_with_check':'\u2611\ufe0f',
+ 'bamboo':'\ud83c\udf8d',
+ 'banana':'\ud83c\udf4c',
+ 'bangbang':'\u203c\ufe0f',
+ 'bank':'\ud83c\udfe6',
+ 'bar_chart':'\ud83d\udcca',
+ 'barber':'\ud83d\udc88',
+ 'baseball':'\u26be\ufe0f',
+ 'basketball':'\ud83c\udfc0',
+ 'basketball_man':'\u26f9\ufe0f',
+ 'basketball_woman':'\u26f9\ufe0f\u2640\ufe0f',
+ 'bat':'\ud83e\udd87',
+ 'bath':'\ud83d\udec0',
+ 'bathtub':'\ud83d\udec1',
+ 'battery':'\ud83d\udd0b',
+ 'beach_umbrella':'\ud83c\udfd6',
+ 'bear':'\ud83d\udc3b',
+ 'bed':'\ud83d\udecf',
+ 'bee':'\ud83d\udc1d',
+ 'beer':'\ud83c\udf7a',
+ 'beers':'\ud83c\udf7b',
+ 'beetle':'\ud83d\udc1e',
+ 'beginner':'\ud83d\udd30',
+ 'bell':'\ud83d\udd14',
+ 'bellhop_bell':'\ud83d\udece',
+ 'bento':'\ud83c\udf71',
+ 'biking_man':'\ud83d\udeb4',
+ 'bike':'\ud83d\udeb2',
+ 'biking_woman':'\ud83d\udeb4\u2640\ufe0f',
+ 'bikini':'\ud83d\udc59',
+ 'biohazard':'\u2623\ufe0f',
+ 'bird':'\ud83d\udc26',
+ 'birthday':'\ud83c\udf82',
+ 'black_circle':'\u26ab\ufe0f',
+ 'black_flag':'\ud83c\udff4',
+ 'black_heart':'\ud83d\udda4',
+ 'black_joker':'\ud83c\udccf',
+ 'black_large_square':'\u2b1b\ufe0f',
+ 'black_medium_small_square':'\u25fe\ufe0f',
+ 'black_medium_square':'\u25fc\ufe0f',
+ 'black_nib':'\u2712\ufe0f',
+ 'black_small_square':'\u25aa\ufe0f',
+ 'black_square_button':'\ud83d\udd32',
+ 'blonde_man':'\ud83d\udc71',
+ 'blonde_woman':'\ud83d\udc71\u2640\ufe0f',
+ 'blossom':'\ud83c\udf3c',
+ 'blowfish':'\ud83d\udc21',
+ 'blue_book':'\ud83d\udcd8',
+ 'blue_car':'\ud83d\ude99',
+ 'blue_heart':'\ud83d\udc99',
+ 'blush':'\ud83d\ude0a',
+ 'boar':'\ud83d\udc17',
+ 'boat':'\u26f5\ufe0f',
+ 'bomb':'\ud83d\udca3',
+ 'book':'\ud83d\udcd6',
+ 'bookmark':'\ud83d\udd16',
+ 'bookmark_tabs':'\ud83d\udcd1',
+ 'books':'\ud83d\udcda',
+ 'boom':'\ud83d\udca5',
+ 'boot':'\ud83d\udc62',
+ 'bouquet':'\ud83d\udc90',
+ 'bowing_man':'\ud83d\ude47',
+ 'bow_and_arrow':'\ud83c\udff9',
+ 'bowing_woman':'\ud83d\ude47\u2640\ufe0f',
+ 'bowling':'\ud83c\udfb3',
+ 'boxing_glove':'\ud83e\udd4a',
+ 'boy':'\ud83d\udc66',
+ 'bread':'\ud83c\udf5e',
+ 'bride_with_veil':'\ud83d\udc70',
+ 'bridge_at_night':'\ud83c\udf09',
+ 'briefcase':'\ud83d\udcbc',
+ 'broken_heart':'\ud83d\udc94',
+ 'bug':'\ud83d\udc1b',
+ 'building_construction':'\ud83c\udfd7',
+ 'bulb':'\ud83d\udca1',
+ 'bullettrain_front':'\ud83d\ude85',
+ 'bullettrain_side':'\ud83d\ude84',
+ 'burrito':'\ud83c\udf2f',
+ 'bus':'\ud83d\ude8c',
+ 'business_suit_levitating':'\ud83d\udd74',
+ 'busstop':'\ud83d\ude8f',
+ 'bust_in_silhouette':'\ud83d\udc64',
+ 'busts_in_silhouette':'\ud83d\udc65',
+ 'butterfly':'\ud83e\udd8b',
+ 'cactus':'\ud83c\udf35',
+ 'cake':'\ud83c\udf70',
+ 'calendar':'\ud83d\udcc6',
+ 'call_me_hand':'\ud83e\udd19',
+ 'calling':'\ud83d\udcf2',
+ 'camel':'\ud83d\udc2b',
+ 'camera':'\ud83d\udcf7',
+ 'camera_flash':'\ud83d\udcf8',
+ 'camping':'\ud83c\udfd5',
+ 'cancer':'\u264b\ufe0f',
+ 'candle':'\ud83d\udd6f',
+ 'candy':'\ud83c\udf6c',
+ 'canoe':'\ud83d\udef6',
+ 'capital_abcd':'\ud83d\udd20',
+ 'capricorn':'\u2651\ufe0f',
+ 'car':'\ud83d\ude97',
+ 'card_file_box':'\ud83d\uddc3',
+ 'card_index':'\ud83d\udcc7',
+ 'card_index_dividers':'\ud83d\uddc2',
+ 'carousel_horse':'\ud83c\udfa0',
+ 'carrot':'\ud83e\udd55',
+ 'cat':'\ud83d\udc31',
+ 'cat2':'\ud83d\udc08',
+ 'cd':'\ud83d\udcbf',
+ 'chains':'\u26d3',
+ 'champagne':'\ud83c\udf7e',
+ 'chart':'\ud83d\udcb9',
+ 'chart_with_downwards_trend':'\ud83d\udcc9',
+ 'chart_with_upwards_trend':'\ud83d\udcc8',
+ 'checkered_flag':'\ud83c\udfc1',
+ 'cheese':'\ud83e\uddc0',
+ 'cherries':'\ud83c\udf52',
+ 'cherry_blossom':'\ud83c\udf38',
+ 'chestnut':'\ud83c\udf30',
+ 'chicken':'\ud83d\udc14',
+ 'children_crossing':'\ud83d\udeb8',
+ 'chipmunk':'\ud83d\udc3f',
+ 'chocolate_bar':'\ud83c\udf6b',
+ 'christmas_tree':'\ud83c\udf84',
+ 'church':'\u26ea\ufe0f',
+ 'cinema':'\ud83c\udfa6',
+ 'circus_tent':'\ud83c\udfaa',
+ 'city_sunrise':'\ud83c\udf07',
+ 'city_sunset':'\ud83c\udf06',
+ 'cityscape':'\ud83c\udfd9',
+ 'cl':'\ud83c\udd91',
+ 'clamp':'\ud83d\udddc',
+ 'clap':'\ud83d\udc4f',
+ 'clapper':'\ud83c\udfac',
+ 'classical_building':'\ud83c\udfdb',
+ 'clinking_glasses':'\ud83e\udd42',
+ 'clipboard':'\ud83d\udccb',
+ 'clock1':'\ud83d\udd50',
+ 'clock10':'\ud83d\udd59',
+ 'clock1030':'\ud83d\udd65',
+ 'clock11':'\ud83d\udd5a',
+ 'clock1130':'\ud83d\udd66',
+ 'clock12':'\ud83d\udd5b',
+ 'clock1230':'\ud83d\udd67',
+ 'clock130':'\ud83d\udd5c',
+ 'clock2':'\ud83d\udd51',
+ 'clock230':'\ud83d\udd5d',
+ 'clock3':'\ud83d\udd52',
+ 'clock330':'\ud83d\udd5e',
+ 'clock4':'\ud83d\udd53',
+ 'clock430':'\ud83d\udd5f',
+ 'clock5':'\ud83d\udd54',
+ 'clock530':'\ud83d\udd60',
+ 'clock6':'\ud83d\udd55',
+ 'clock630':'\ud83d\udd61',
+ 'clock7':'\ud83d\udd56',
+ 'clock730':'\ud83d\udd62',
+ 'clock8':'\ud83d\udd57',
+ 'clock830':'\ud83d\udd63',
+ 'clock9':'\ud83d\udd58',
+ 'clock930':'\ud83d\udd64',
+ 'closed_book':'\ud83d\udcd5',
+ 'closed_lock_with_key':'\ud83d\udd10',
+ 'closed_umbrella':'\ud83c\udf02',
+ 'cloud':'\u2601\ufe0f',
+ 'cloud_with_lightning':'\ud83c\udf29',
+ 'cloud_with_lightning_and_rain':'\u26c8',
+ 'cloud_with_rain':'\ud83c\udf27',
+ 'cloud_with_snow':'\ud83c\udf28',
+ 'clown_face':'\ud83e\udd21',
+ 'clubs':'\u2663\ufe0f',
+ 'cocktail':'\ud83c\udf78',
+ 'coffee':'\u2615\ufe0f',
+ 'coffin':'\u26b0\ufe0f',
+ 'cold_sweat':'\ud83d\ude30',
+ 'comet':'\u2604\ufe0f',
+ 'computer':'\ud83d\udcbb',
+ 'computer_mouse':'\ud83d\uddb1',
+ 'confetti_ball':'\ud83c\udf8a',
+ 'confounded':'\ud83d\ude16',
+ 'confused':'\ud83d\ude15',
+ 'congratulations':'\u3297\ufe0f',
+ 'construction':'\ud83d\udea7',
+ 'construction_worker_man':'\ud83d\udc77',
+ 'construction_worker_woman':'\ud83d\udc77\u2640\ufe0f',
+ 'control_knobs':'\ud83c\udf9b',
+ 'convenience_store':'\ud83c\udfea',
+ 'cookie':'\ud83c\udf6a',
+ 'cool':'\ud83c\udd92',
+ 'policeman':'\ud83d\udc6e',
+ 'copyright':'\u00a9\ufe0f',
+ 'corn':'\ud83c\udf3d',
+ 'couch_and_lamp':'\ud83d\udecb',
+ 'couple':'\ud83d\udc6b',
+ 'couple_with_heart_woman_man':'\ud83d\udc91',
+ 'couple_with_heart_man_man':'\ud83d\udc68\u2764\ufe0f\ud83d\udc68',
+ 'couple_with_heart_woman_woman':'\ud83d\udc69\u2764\ufe0f\ud83d\udc69',
+ 'couplekiss_man_man':'\ud83d\udc68\u2764\ufe0f\ud83d\udc8b\ud83d\udc68',
+ 'couplekiss_man_woman':'\ud83d\udc8f',
+ 'couplekiss_woman_woman':'\ud83d\udc69\u2764\ufe0f\ud83d\udc8b\ud83d\udc69',
+ 'cow':'\ud83d\udc2e',
+ 'cow2':'\ud83d\udc04',
+ 'cowboy_hat_face':'\ud83e\udd20',
+ 'crab':'\ud83e\udd80',
+ 'crayon':'\ud83d\udd8d',
+ 'credit_card':'\ud83d\udcb3',
+ 'crescent_moon':'\ud83c\udf19',
+ 'cricket':'\ud83c\udfcf',
+ 'crocodile':'\ud83d\udc0a',
+ 'croissant':'\ud83e\udd50',
+ 'crossed_fingers':'\ud83e\udd1e',
+ 'crossed_flags':'\ud83c\udf8c',
+ 'crossed_swords':'\u2694\ufe0f',
+ 'crown':'\ud83d\udc51',
+ 'cry':'\ud83d\ude22',
+ 'crying_cat_face':'\ud83d\ude3f',
+ 'crystal_ball':'\ud83d\udd2e',
+ 'cucumber':'\ud83e\udd52',
+ 'cupid':'\ud83d\udc98',
+ 'curly_loop':'\u27b0',
+ 'currency_exchange':'\ud83d\udcb1',
+ 'curry':'\ud83c\udf5b',
+ 'custard':'\ud83c\udf6e',
+ 'customs':'\ud83d\udec3',
+ 'cyclone':'\ud83c\udf00',
+ 'dagger':'\ud83d\udde1',
+ 'dancer':'\ud83d\udc83',
+ 'dancing_women':'\ud83d\udc6f',
+ 'dancing_men':'\ud83d\udc6f\u2642\ufe0f',
+ 'dango':'\ud83c\udf61',
+ 'dark_sunglasses':'\ud83d\udd76',
+ 'dart':'\ud83c\udfaf',
+ 'dash':'\ud83d\udca8',
+ 'date':'\ud83d\udcc5',
+ 'deciduous_tree':'\ud83c\udf33',
+ 'deer':'\ud83e\udd8c',
+ 'department_store':'\ud83c\udfec',
+ 'derelict_house':'\ud83c\udfda',
+ 'desert':'\ud83c\udfdc',
+ 'desert_island':'\ud83c\udfdd',
+ 'desktop_computer':'\ud83d\udda5',
+ 'male_detective':'\ud83d\udd75\ufe0f',
+ 'diamond_shape_with_a_dot_inside':'\ud83d\udca0',
+ 'diamonds':'\u2666\ufe0f',
+ 'disappointed':'\ud83d\ude1e',
+ 'disappointed_relieved':'\ud83d\ude25',
+ 'dizzy':'\ud83d\udcab',
+ 'dizzy_face':'\ud83d\ude35',
+ 'do_not_litter':'\ud83d\udeaf',
+ 'dog':'\ud83d\udc36',
+ 'dog2':'\ud83d\udc15',
+ 'dollar':'\ud83d\udcb5',
+ 'dolls':'\ud83c\udf8e',
+ 'dolphin':'\ud83d\udc2c',
+ 'door':'\ud83d\udeaa',
+ 'doughnut':'\ud83c\udf69',
+ 'dove':'\ud83d\udd4a',
+ 'dragon':'\ud83d\udc09',
+ 'dragon_face':'\ud83d\udc32',
+ 'dress':'\ud83d\udc57',
+ 'dromedary_camel':'\ud83d\udc2a',
+ 'drooling_face':'\ud83e\udd24',
+ 'droplet':'\ud83d\udca7',
+ 'drum':'\ud83e\udd41',
+ 'duck':'\ud83e\udd86',
+ 'dvd':'\ud83d\udcc0',
+ 'e-mail':'\ud83d\udce7',
+ 'eagle':'\ud83e\udd85',
+ 'ear':'\ud83d\udc42',
+ 'ear_of_rice':'\ud83c\udf3e',
+ 'earth_africa':'\ud83c\udf0d',
+ 'earth_americas':'\ud83c\udf0e',
+ 'earth_asia':'\ud83c\udf0f',
+ 'egg':'\ud83e\udd5a',
+ 'eggplant':'\ud83c\udf46',
+ 'eight_pointed_black_star':'\u2734\ufe0f',
+ 'eight_spoked_asterisk':'\u2733\ufe0f',
+ 'electric_plug':'\ud83d\udd0c',
+ 'elephant':'\ud83d\udc18',
+ 'email':'\u2709\ufe0f',
+ 'end':'\ud83d\udd1a',
+ 'envelope_with_arrow':'\ud83d\udce9',
+ 'euro':'\ud83d\udcb6',
+ 'european_castle':'\ud83c\udff0',
+ 'european_post_office':'\ud83c\udfe4',
+ 'evergreen_tree':'\ud83c\udf32',
+ 'exclamation':'\u2757\ufe0f',
+ 'expressionless':'\ud83d\ude11',
+ 'eye':'\ud83d\udc41',
+ 'eye_speech_bubble':'\ud83d\udc41\ud83d\udde8',
+ 'eyeglasses':'\ud83d\udc53',
+ 'eyes':'\ud83d\udc40',
+ 'face_with_head_bandage':'\ud83e\udd15',
+ 'face_with_thermometer':'\ud83e\udd12',
+ 'fist_oncoming':'\ud83d\udc4a',
+ 'factory':'\ud83c\udfed',
+ 'fallen_leaf':'\ud83c\udf42',
+ 'family_man_woman_boy':'\ud83d\udc6a',
+ 'family_man_boy':'\ud83d\udc68\ud83d\udc66',
+ 'family_man_boy_boy':'\ud83d\udc68\ud83d\udc66\ud83d\udc66',
+ 'family_man_girl':'\ud83d\udc68\ud83d\udc67',
+ 'family_man_girl_boy':'\ud83d\udc68\ud83d\udc67\ud83d\udc66',
+ 'family_man_girl_girl':'\ud83d\udc68\ud83d\udc67\ud83d\udc67',
+ 'family_man_man_boy':'\ud83d\udc68\ud83d\udc68\ud83d\udc66',
+ 'family_man_man_boy_boy':'\ud83d\udc68\ud83d\udc68\ud83d\udc66\ud83d\udc66',
+ 'family_man_man_girl':'\ud83d\udc68\ud83d\udc68\ud83d\udc67',
+ 'family_man_man_girl_boy':'\ud83d\udc68\ud83d\udc68\ud83d\udc67\ud83d\udc66',
+ 'family_man_man_girl_girl':'\ud83d\udc68\ud83d\udc68\ud83d\udc67\ud83d\udc67',
+ 'family_man_woman_boy_boy':'\ud83d\udc68\ud83d\udc69\ud83d\udc66\ud83d\udc66',
+ 'family_man_woman_girl':'\ud83d\udc68\ud83d\udc69\ud83d\udc67',
+ 'family_man_woman_girl_boy':'\ud83d\udc68\ud83d\udc69\ud83d\udc67\ud83d\udc66',
+ 'family_man_woman_girl_girl':'\ud83d\udc68\ud83d\udc69\ud83d\udc67\ud83d\udc67',
+ 'family_woman_boy':'\ud83d\udc69\ud83d\udc66',
+ 'family_woman_boy_boy':'\ud83d\udc69\ud83d\udc66\ud83d\udc66',
+ 'family_woman_girl':'\ud83d\udc69\ud83d\udc67',
+ 'family_woman_girl_boy':'\ud83d\udc69\ud83d\udc67\ud83d\udc66',
+ 'family_woman_girl_girl':'\ud83d\udc69\ud83d\udc67\ud83d\udc67',
+ 'family_woman_woman_boy':'\ud83d\udc69\ud83d\udc69\ud83d\udc66',
+ 'family_woman_woman_boy_boy':'\ud83d\udc69\ud83d\udc69\ud83d\udc66\ud83d\udc66',
+ 'family_woman_woman_girl':'\ud83d\udc69\ud83d\udc69\ud83d\udc67',
+ 'family_woman_woman_girl_boy':'\ud83d\udc69\ud83d\udc69\ud83d\udc67\ud83d\udc66',
+ 'family_woman_woman_girl_girl':'\ud83d\udc69\ud83d\udc69\ud83d\udc67\ud83d\udc67',
+ 'fast_forward':'\u23e9',
+ 'fax':'\ud83d\udce0',
+ 'fearful':'\ud83d\ude28',
+ 'feet':'\ud83d\udc3e',
+ 'female_detective':'\ud83d\udd75\ufe0f\u2640\ufe0f',
+ 'ferris_wheel':'\ud83c\udfa1',
+ 'ferry':'\u26f4',
+ 'field_hockey':'\ud83c\udfd1',
+ 'file_cabinet':'\ud83d\uddc4',
+ 'file_folder':'\ud83d\udcc1',
+ 'film_projector':'\ud83d\udcfd',
+ 'film_strip':'\ud83c\udf9e',
+ 'fire':'\ud83d\udd25',
+ 'fire_engine':'\ud83d\ude92',
+ 'fireworks':'\ud83c\udf86',
+ 'first_quarter_moon':'\ud83c\udf13',
+ 'first_quarter_moon_with_face':'\ud83c\udf1b',
+ 'fish':'\ud83d\udc1f',
+ 'fish_cake':'\ud83c\udf65',
+ 'fishing_pole_and_fish':'\ud83c\udfa3',
+ 'fist_raised':'\u270a',
+ 'fist_left':'\ud83e\udd1b',
+ 'fist_right':'\ud83e\udd1c',
+ 'flags':'\ud83c\udf8f',
+ 'flashlight':'\ud83d\udd26',
+ 'fleur_de_lis':'\u269c\ufe0f',
+ 'flight_arrival':'\ud83d\udeec',
+ 'flight_departure':'\ud83d\udeeb',
+ 'floppy_disk':'\ud83d\udcbe',
+ 'flower_playing_cards':'\ud83c\udfb4',
+ 'flushed':'\ud83d\ude33',
+ 'fog':'\ud83c\udf2b',
+ 'foggy':'\ud83c\udf01',
+ 'football':'\ud83c\udfc8',
+ 'footprints':'\ud83d\udc63',
+ 'fork_and_knife':'\ud83c\udf74',
+ 'fountain':'\u26f2\ufe0f',
+ 'fountain_pen':'\ud83d\udd8b',
+ 'four_leaf_clover':'\ud83c\udf40',
+ 'fox_face':'\ud83e\udd8a',
+ 'framed_picture':'\ud83d\uddbc',
+ 'free':'\ud83c\udd93',
+ 'fried_egg':'\ud83c\udf73',
+ 'fried_shrimp':'\ud83c\udf64',
+ 'fries':'\ud83c\udf5f',
+ 'frog':'\ud83d\udc38',
+ 'frowning':'\ud83d\ude26',
+ 'frowning_face':'\u2639\ufe0f',
+ 'frowning_man':'\ud83d\ude4d\u2642\ufe0f',
+ 'frowning_woman':'\ud83d\ude4d',
+ 'middle_finger':'\ud83d\udd95',
+ 'fuelpump':'\u26fd\ufe0f',
+ 'full_moon':'\ud83c\udf15',
+ 'full_moon_with_face':'\ud83c\udf1d',
+ 'funeral_urn':'\u26b1\ufe0f',
+ 'game_die':'\ud83c\udfb2',
+ 'gear':'\u2699\ufe0f',
+ 'gem':'\ud83d\udc8e',
+ 'gemini':'\u264a\ufe0f',
+ 'ghost':'\ud83d\udc7b',
+ 'gift':'\ud83c\udf81',
+ 'gift_heart':'\ud83d\udc9d',
+ 'girl':'\ud83d\udc67',
+ 'globe_with_meridians':'\ud83c\udf10',
+ 'goal_net':'\ud83e\udd45',
+ 'goat':'\ud83d\udc10',
+ 'golf':'\u26f3\ufe0f',
+ 'golfing_man':'\ud83c\udfcc\ufe0f',
+ 'golfing_woman':'\ud83c\udfcc\ufe0f\u2640\ufe0f',
+ 'gorilla':'\ud83e\udd8d',
+ 'grapes':'\ud83c\udf47',
+ 'green_apple':'\ud83c\udf4f',
+ 'green_book':'\ud83d\udcd7',
+ 'green_heart':'\ud83d\udc9a',
+ 'green_salad':'\ud83e\udd57',
+ 'grey_exclamation':'\u2755',
+ 'grey_question':'\u2754',
+ 'grimacing':'\ud83d\ude2c',
+ 'grin':'\ud83d\ude01',
+ 'grinning':'\ud83d\ude00',
+ 'guardsman':'\ud83d\udc82',
+ 'guardswoman':'\ud83d\udc82\u2640\ufe0f',
+ 'guitar':'\ud83c\udfb8',
+ 'gun':'\ud83d\udd2b',
+ 'haircut_woman':'\ud83d\udc87',
+ 'haircut_man':'\ud83d\udc87\u2642\ufe0f',
+ 'hamburger':'\ud83c\udf54',
+ 'hammer':'\ud83d\udd28',
+ 'hammer_and_pick':'\u2692',
+ 'hammer_and_wrench':'\ud83d\udee0',
+ 'hamster':'\ud83d\udc39',
+ 'hand':'\u270b',
+ 'handbag':'\ud83d\udc5c',
+ 'handshake':'\ud83e\udd1d',
+ 'hankey':'\ud83d\udca9',
+ 'hatched_chick':'\ud83d\udc25',
+ 'hatching_chick':'\ud83d\udc23',
+ 'headphones':'\ud83c\udfa7',
+ 'hear_no_evil':'\ud83d\ude49',
+ 'heart':'\u2764\ufe0f',
+ 'heart_decoration':'\ud83d\udc9f',
+ 'heart_eyes':'\ud83d\ude0d',
+ 'heart_eyes_cat':'\ud83d\ude3b',
+ 'heartbeat':'\ud83d\udc93',
+ 'heartpulse':'\ud83d\udc97',
+ 'hearts':'\u2665\ufe0f',
+ 'heavy_check_mark':'\u2714\ufe0f',
+ 'heavy_division_sign':'\u2797',
+ 'heavy_dollar_sign':'\ud83d\udcb2',
+ 'heavy_heart_exclamation':'\u2763\ufe0f',
+ 'heavy_minus_sign':'\u2796',
+ 'heavy_multiplication_x':'\u2716\ufe0f',
+ 'heavy_plus_sign':'\u2795',
+ 'helicopter':'\ud83d\ude81',
+ 'herb':'\ud83c\udf3f',
+ 'hibiscus':'\ud83c\udf3a',
+ 'high_brightness':'\ud83d\udd06',
+ 'high_heel':'\ud83d\udc60',
+ 'hocho':'\ud83d\udd2a',
+ 'hole':'\ud83d\udd73',
+ 'honey_pot':'\ud83c\udf6f',
+ 'horse':'\ud83d\udc34',
+ 'horse_racing':'\ud83c\udfc7',
+ 'hospital':'\ud83c\udfe5',
+ 'hot_pepper':'\ud83c\udf36',
+ 'hotdog':'\ud83c\udf2d',
+ 'hotel':'\ud83c\udfe8',
+ 'hotsprings':'\u2668\ufe0f',
+ 'hourglass':'\u231b\ufe0f',
+ 'hourglass_flowing_sand':'\u23f3',
+ 'house':'\ud83c\udfe0',
+ 'house_with_garden':'\ud83c\udfe1',
+ 'houses':'\ud83c\udfd8',
+ 'hugs':'\ud83e\udd17',
+ 'hushed':'\ud83d\ude2f',
+ 'ice_cream':'\ud83c\udf68',
+ 'ice_hockey':'\ud83c\udfd2',
+ 'ice_skate':'\u26f8',
+ 'icecream':'\ud83c\udf66',
+ 'id':'\ud83c\udd94',
+ 'ideograph_advantage':'\ud83c\ude50',
+ 'imp':'\ud83d\udc7f',
+ 'inbox_tray':'\ud83d\udce5',
+ 'incoming_envelope':'\ud83d\udce8',
+ 'tipping_hand_woman':'\ud83d\udc81',
+ 'information_source':'\u2139\ufe0f',
+ 'innocent':'\ud83d\ude07',
+ 'interrobang':'\u2049\ufe0f',
+ 'iphone':'\ud83d\udcf1',
+ 'izakaya_lantern':'\ud83c\udfee',
+ 'jack_o_lantern':'\ud83c\udf83',
+ 'japan':'\ud83d\uddfe',
+ 'japanese_castle':'\ud83c\udfef',
+ 'japanese_goblin':'\ud83d\udc7a',
+ 'japanese_ogre':'\ud83d\udc79',
+ 'jeans':'\ud83d\udc56',
+ 'joy':'\ud83d\ude02',
+ 'joy_cat':'\ud83d\ude39',
+ 'joystick':'\ud83d\udd79',
+ 'kaaba':'\ud83d\udd4b',
+ 'key':'\ud83d\udd11',
+ 'keyboard':'\u2328\ufe0f',
+ 'keycap_ten':'\ud83d\udd1f',
+ 'kick_scooter':'\ud83d\udef4',
+ 'kimono':'\ud83d\udc58',
+ 'kiss':'\ud83d\udc8b',
+ 'kissing':'\ud83d\ude17',
+ 'kissing_cat':'\ud83d\ude3d',
+ 'kissing_closed_eyes':'\ud83d\ude1a',
+ 'kissing_heart':'\ud83d\ude18',
+ 'kissing_smiling_eyes':'\ud83d\ude19',
+ 'kiwi_fruit':'\ud83e\udd5d',
+ 'koala':'\ud83d\udc28',
+ 'koko':'\ud83c\ude01',
+ 'label':'\ud83c\udff7',
+ 'large_blue_circle':'\ud83d\udd35',
+ 'large_blue_diamond':'\ud83d\udd37',
+ 'large_orange_diamond':'\ud83d\udd36',
+ 'last_quarter_moon':'\ud83c\udf17',
+ 'last_quarter_moon_with_face':'\ud83c\udf1c',
+ 'latin_cross':'\u271d\ufe0f',
+ 'laughing':'\ud83d\ude06',
+ 'leaves':'\ud83c\udf43',
+ 'ledger':'\ud83d\udcd2',
+ 'left_luggage':'\ud83d\udec5',
+ 'left_right_arrow':'\u2194\ufe0f',
+ 'leftwards_arrow_with_hook':'\u21a9\ufe0f',
+ 'lemon':'\ud83c\udf4b',
+ 'leo':'\u264c\ufe0f',
+ 'leopard':'\ud83d\udc06',
+ 'level_slider':'\ud83c\udf9a',
+ 'libra':'\u264e\ufe0f',
+ 'light_rail':'\ud83d\ude88',
+ 'link':'\ud83d\udd17',
+ 'lion':'\ud83e\udd81',
+ 'lips':'\ud83d\udc44',
+ 'lipstick':'\ud83d\udc84',
+ 'lizard':'\ud83e\udd8e',
+ 'lock':'\ud83d\udd12',
+ 'lock_with_ink_pen':'\ud83d\udd0f',
+ 'lollipop':'\ud83c\udf6d',
+ 'loop':'\u27bf',
+ 'loud_sound':'\ud83d\udd0a',
+ 'loudspeaker':'\ud83d\udce2',
+ 'love_hotel':'\ud83c\udfe9',
+ 'love_letter':'\ud83d\udc8c',
+ 'low_brightness':'\ud83d\udd05',
+ 'lying_face':'\ud83e\udd25',
+ 'm':'\u24c2\ufe0f',
+ 'mag':'\ud83d\udd0d',
+ 'mag_right':'\ud83d\udd0e',
+ 'mahjong':'\ud83c\udc04\ufe0f',
+ 'mailbox':'\ud83d\udceb',
+ 'mailbox_closed':'\ud83d\udcea',
+ 'mailbox_with_mail':'\ud83d\udcec',
+ 'mailbox_with_no_mail':'\ud83d\udced',
+ 'man':'\ud83d\udc68',
+ 'man_artist':'\ud83d\udc68\ud83c\udfa8',
+ 'man_astronaut':'\ud83d\udc68\ud83d\ude80',
+ 'man_cartwheeling':'\ud83e\udd38\u2642\ufe0f',
+ 'man_cook':'\ud83d\udc68\ud83c\udf73',
+ 'man_dancing':'\ud83d\udd7a',
+ 'man_facepalming':'\ud83e\udd26\u2642\ufe0f',
+ 'man_factory_worker':'\ud83d\udc68\ud83c\udfed',
+ 'man_farmer':'\ud83d\udc68\ud83c\udf3e',
+ 'man_firefighter':'\ud83d\udc68\ud83d\ude92',
+ 'man_health_worker':'\ud83d\udc68\u2695\ufe0f',
+ 'man_in_tuxedo':'\ud83e\udd35',
+ 'man_judge':'\ud83d\udc68\u2696\ufe0f',
+ 'man_juggling':'\ud83e\udd39\u2642\ufe0f',
+ 'man_mechanic':'\ud83d\udc68\ud83d\udd27',
+ 'man_office_worker':'\ud83d\udc68\ud83d\udcbc',
+ 'man_pilot':'\ud83d\udc68\u2708\ufe0f',
+ 'man_playing_handball':'\ud83e\udd3e\u2642\ufe0f',
+ 'man_playing_water_polo':'\ud83e\udd3d\u2642\ufe0f',
+ 'man_scientist':'\ud83d\udc68\ud83d\udd2c',
+ 'man_shrugging':'\ud83e\udd37\u2642\ufe0f',
+ 'man_singer':'\ud83d\udc68\ud83c\udfa4',
+ 'man_student':'\ud83d\udc68\ud83c\udf93',
+ 'man_teacher':'\ud83d\udc68\ud83c\udfeb',
+ 'man_technologist':'\ud83d\udc68\ud83d\udcbb',
+ 'man_with_gua_pi_mao':'\ud83d\udc72',
+ 'man_with_turban':'\ud83d\udc73',
+ 'tangerine':'\ud83c\udf4a',
+ 'mans_shoe':'\ud83d\udc5e',
+ 'mantelpiece_clock':'\ud83d\udd70',
+ 'maple_leaf':'\ud83c\udf41',
+ 'martial_arts_uniform':'\ud83e\udd4b',
+ 'mask':'\ud83d\ude37',
+ 'massage_woman':'\ud83d\udc86',
+ 'massage_man':'\ud83d\udc86\u2642\ufe0f',
+ 'meat_on_bone':'\ud83c\udf56',
+ 'medal_military':'\ud83c\udf96',
+ 'medal_sports':'\ud83c\udfc5',
+ 'mega':'\ud83d\udce3',
+ 'melon':'\ud83c\udf48',
+ 'memo':'\ud83d\udcdd',
+ 'men_wrestling':'\ud83e\udd3c\u2642\ufe0f',
+ 'menorah':'\ud83d\udd4e',
+ 'mens':'\ud83d\udeb9',
+ 'metal':'\ud83e\udd18',
+ 'metro':'\ud83d\ude87',
+ 'microphone':'\ud83c\udfa4',
+ 'microscope':'\ud83d\udd2c',
+ 'milk_glass':'\ud83e\udd5b',
+ 'milky_way':'\ud83c\udf0c',
+ 'minibus':'\ud83d\ude90',
+ 'minidisc':'\ud83d\udcbd',
+ 'mobile_phone_off':'\ud83d\udcf4',
+ 'money_mouth_face':'\ud83e\udd11',
+ 'money_with_wings':'\ud83d\udcb8',
+ 'moneybag':'\ud83d\udcb0',
+ 'monkey':'\ud83d\udc12',
+ 'monkey_face':'\ud83d\udc35',
+ 'monorail':'\ud83d\ude9d',
+ 'moon':'\ud83c\udf14',
+ 'mortar_board':'\ud83c\udf93',
+ 'mosque':'\ud83d\udd4c',
+ 'motor_boat':'\ud83d\udee5',
+ 'motor_scooter':'\ud83d\udef5',
+ 'motorcycle':'\ud83c\udfcd',
+ 'motorway':'\ud83d\udee3',
+ 'mount_fuji':'\ud83d\uddfb',
+ 'mountain':'\u26f0',
+ 'mountain_biking_man':'\ud83d\udeb5',
+ 'mountain_biking_woman':'\ud83d\udeb5\u2640\ufe0f',
+ 'mountain_cableway':'\ud83d\udea0',
+ 'mountain_railway':'\ud83d\ude9e',
+ 'mountain_snow':'\ud83c\udfd4',
+ 'mouse':'\ud83d\udc2d',
+ 'mouse2':'\ud83d\udc01',
+ 'movie_camera':'\ud83c\udfa5',
+ 'moyai':'\ud83d\uddff',
+ 'mrs_claus':'\ud83e\udd36',
+ 'muscle':'\ud83d\udcaa',
+ 'mushroom':'\ud83c\udf44',
+ 'musical_keyboard':'\ud83c\udfb9',
+ 'musical_note':'\ud83c\udfb5',
+ 'musical_score':'\ud83c\udfbc',
+ 'mute':'\ud83d\udd07',
+ 'nail_care':'\ud83d\udc85',
+ 'name_badge':'\ud83d\udcdb',
+ 'national_park':'\ud83c\udfde',
+ 'nauseated_face':'\ud83e\udd22',
+ 'necktie':'\ud83d\udc54',
+ 'negative_squared_cross_mark':'\u274e',
+ 'nerd_face':'\ud83e\udd13',
+ 'neutral_face':'\ud83d\ude10',
+ 'new':'\ud83c\udd95',
+ 'new_moon':'\ud83c\udf11',
+ 'new_moon_with_face':'\ud83c\udf1a',
+ 'newspaper':'\ud83d\udcf0',
+ 'newspaper_roll':'\ud83d\uddde',
+ 'next_track_button':'\u23ed',
+ 'ng':'\ud83c\udd96',
+ 'no_good_man':'\ud83d\ude45\u2642\ufe0f',
+ 'no_good_woman':'\ud83d\ude45',
+ 'night_with_stars':'\ud83c\udf03',
+ 'no_bell':'\ud83d\udd15',
+ 'no_bicycles':'\ud83d\udeb3',
+ 'no_entry':'\u26d4\ufe0f',
+ 'no_entry_sign':'\ud83d\udeab',
+ 'no_mobile_phones':'\ud83d\udcf5',
+ 'no_mouth':'\ud83d\ude36',
+ 'no_pedestrians':'\ud83d\udeb7',
+ 'no_smoking':'\ud83d\udead',
+ 'non-potable_water':'\ud83d\udeb1',
+ 'nose':'\ud83d\udc43',
+ 'notebook':'\ud83d\udcd3',
+ 'notebook_with_decorative_cover':'\ud83d\udcd4',
+ 'notes':'\ud83c\udfb6',
+ 'nut_and_bolt':'\ud83d\udd29',
+ 'o':'\u2b55\ufe0f',
+ 'o2':'\ud83c\udd7e\ufe0f',
+ 'ocean':'\ud83c\udf0a',
+ 'octopus':'\ud83d\udc19',
+ 'oden':'\ud83c\udf62',
+ 'office':'\ud83c\udfe2',
+ 'oil_drum':'\ud83d\udee2',
+ 'ok':'\ud83c\udd97',
+ 'ok_hand':'\ud83d\udc4c',
+ 'ok_man':'\ud83d\ude46\u2642\ufe0f',
+ 'ok_woman':'\ud83d\ude46',
+ 'old_key':'\ud83d\udddd',
+ 'older_man':'\ud83d\udc74',
+ 'older_woman':'\ud83d\udc75',
+ 'om':'\ud83d\udd49',
+ 'on':'\ud83d\udd1b',
+ 'oncoming_automobile':'\ud83d\ude98',
+ 'oncoming_bus':'\ud83d\ude8d',
+ 'oncoming_police_car':'\ud83d\ude94',
+ 'oncoming_taxi':'\ud83d\ude96',
+ 'open_file_folder':'\ud83d\udcc2',
+ 'open_hands':'\ud83d\udc50',
+ 'open_mouth':'\ud83d\ude2e',
+ 'open_umbrella':'\u2602\ufe0f',
+ 'ophiuchus':'\u26ce',
+ 'orange_book':'\ud83d\udcd9',
+ 'orthodox_cross':'\u2626\ufe0f',
+ 'outbox_tray':'\ud83d\udce4',
+ 'owl':'\ud83e\udd89',
+ 'ox':'\ud83d\udc02',
+ 'package':'\ud83d\udce6',
+ 'page_facing_up':'\ud83d\udcc4',
+ 'page_with_curl':'\ud83d\udcc3',
+ 'pager':'\ud83d\udcdf',
+ 'paintbrush':'\ud83d\udd8c',
+ 'palm_tree':'\ud83c\udf34',
+ 'pancakes':'\ud83e\udd5e',
+ 'panda_face':'\ud83d\udc3c',
+ 'paperclip':'\ud83d\udcce',
+ 'paperclips':'\ud83d\udd87',
+ 'parasol_on_ground':'\u26f1',
+ 'parking':'\ud83c\udd7f\ufe0f',
+ 'part_alternation_mark':'\u303d\ufe0f',
+ 'partly_sunny':'\u26c5\ufe0f',
+ 'passenger_ship':'\ud83d\udef3',
+ 'passport_control':'\ud83d\udec2',
+ 'pause_button':'\u23f8',
+ 'peace_symbol':'\u262e\ufe0f',
+ 'peach':'\ud83c\udf51',
+ 'peanuts':'\ud83e\udd5c',
+ 'pear':'\ud83c\udf50',
+ 'pen':'\ud83d\udd8a',
+ 'pencil2':'\u270f\ufe0f',
+ 'penguin':'\ud83d\udc27',
+ 'pensive':'\ud83d\ude14',
+ 'performing_arts':'\ud83c\udfad',
+ 'persevere':'\ud83d\ude23',
+ 'person_fencing':'\ud83e\udd3a',
+ 'pouting_woman':'\ud83d\ude4e',
+ 'phone':'\u260e\ufe0f',
+ 'pick':'\u26cf',
+ 'pig':'\ud83d\udc37',
+ 'pig2':'\ud83d\udc16',
+ 'pig_nose':'\ud83d\udc3d',
+ 'pill':'\ud83d\udc8a',
+ 'pineapple':'\ud83c\udf4d',
+ 'ping_pong':'\ud83c\udfd3',
+ 'pisces':'\u2653\ufe0f',
+ 'pizza':'\ud83c\udf55',
+ 'place_of_worship':'\ud83d\uded0',
+ 'plate_with_cutlery':'\ud83c\udf7d',
+ 'play_or_pause_button':'\u23ef',
+ 'point_down':'\ud83d\udc47',
+ 'point_left':'\ud83d\udc48',
+ 'point_right':'\ud83d\udc49',
+ 'point_up':'\u261d\ufe0f',
+ 'point_up_2':'\ud83d\udc46',
+ 'police_car':'\ud83d\ude93',
+ 'policewoman':'\ud83d\udc6e\u2640\ufe0f',
+ 'poodle':'\ud83d\udc29',
+ 'popcorn':'\ud83c\udf7f',
+ 'post_office':'\ud83c\udfe3',
+ 'postal_horn':'\ud83d\udcef',
+ 'postbox':'\ud83d\udcee',
+ 'potable_water':'\ud83d\udeb0',
+ 'potato':'\ud83e\udd54',
+ 'pouch':'\ud83d\udc5d',
+ 'poultry_leg':'\ud83c\udf57',
+ 'pound':'\ud83d\udcb7',
+ 'rage':'\ud83d\ude21',
+ 'pouting_cat':'\ud83d\ude3e',
+ 'pouting_man':'\ud83d\ude4e\u2642\ufe0f',
+ 'pray':'\ud83d\ude4f',
+ 'prayer_beads':'\ud83d\udcff',
+ 'pregnant_woman':'\ud83e\udd30',
+ 'previous_track_button':'\u23ee',
+ 'prince':'\ud83e\udd34',
+ 'princess':'\ud83d\udc78',
+ 'printer':'\ud83d\udda8',
+ 'purple_heart':'\ud83d\udc9c',
+ 'purse':'\ud83d\udc5b',
+ 'pushpin':'\ud83d\udccc',
+ 'put_litter_in_its_place':'\ud83d\udeae',
+ 'question':'\u2753',
+ 'rabbit':'\ud83d\udc30',
+ 'rabbit2':'\ud83d\udc07',
+ 'racehorse':'\ud83d\udc0e',
+ 'racing_car':'\ud83c\udfce',
+ 'radio':'\ud83d\udcfb',
+ 'radio_button':'\ud83d\udd18',
+ 'radioactive':'\u2622\ufe0f',
+ 'railway_car':'\ud83d\ude83',
+ 'railway_track':'\ud83d\udee4',
+ 'rainbow':'\ud83c\udf08',
+ 'rainbow_flag':'\ud83c\udff3\ufe0f\ud83c\udf08',
+ 'raised_back_of_hand':'\ud83e\udd1a',
+ 'raised_hand_with_fingers_splayed':'\ud83d\udd90',
+ 'raised_hands':'\ud83d\ude4c',
+ 'raising_hand_woman':'\ud83d\ude4b',
+ 'raising_hand_man':'\ud83d\ude4b\u2642\ufe0f',
+ 'ram':'\ud83d\udc0f',
+ 'ramen':'\ud83c\udf5c',
+ 'rat':'\ud83d\udc00',
+ 'record_button':'\u23fa',
+ 'recycle':'\u267b\ufe0f',
+ 'red_circle':'\ud83d\udd34',
+ 'registered':'\u00ae\ufe0f',
+ 'relaxed':'\u263a\ufe0f',
+ 'relieved':'\ud83d\ude0c',
+ 'reminder_ribbon':'\ud83c\udf97',
+ 'repeat':'\ud83d\udd01',
+ 'repeat_one':'\ud83d\udd02',
+ 'rescue_worker_helmet':'\u26d1',
+ 'restroom':'\ud83d\udebb',
+ 'revolving_hearts':'\ud83d\udc9e',
+ 'rewind':'\u23ea',
+ 'rhinoceros':'\ud83e\udd8f',
+ 'ribbon':'\ud83c\udf80',
+ 'rice':'\ud83c\udf5a',
+ 'rice_ball':'\ud83c\udf59',
+ 'rice_cracker':'\ud83c\udf58',
+ 'rice_scene':'\ud83c\udf91',
+ 'right_anger_bubble':'\ud83d\uddef',
+ 'ring':'\ud83d\udc8d',
+ 'robot':'\ud83e\udd16',
+ 'rocket':'\ud83d\ude80',
+ 'rofl':'\ud83e\udd23',
+ 'roll_eyes':'\ud83d\ude44',
+ 'roller_coaster':'\ud83c\udfa2',
+ 'rooster':'\ud83d\udc13',
+ 'rose':'\ud83c\udf39',
+ 'rosette':'\ud83c\udff5',
+ 'rotating_light':'\ud83d\udea8',
+ 'round_pushpin':'\ud83d\udccd',
+ 'rowing_man':'\ud83d\udea3',
+ 'rowing_woman':'\ud83d\udea3\u2640\ufe0f',
+ 'rugby_football':'\ud83c\udfc9',
+ 'running_man':'\ud83c\udfc3',
+ 'running_shirt_with_sash':'\ud83c\udfbd',
+ 'running_woman':'\ud83c\udfc3\u2640\ufe0f',
+ 'sa':'\ud83c\ude02\ufe0f',
+ 'sagittarius':'\u2650\ufe0f',
+ 'sake':'\ud83c\udf76',
+ 'sandal':'\ud83d\udc61',
+ 'santa':'\ud83c\udf85',
+ 'satellite':'\ud83d\udce1',
+ 'saxophone':'\ud83c\udfb7',
+ 'school':'\ud83c\udfeb',
+ 'school_satchel':'\ud83c\udf92',
+ 'scissors':'\u2702\ufe0f',
+ 'scorpion':'\ud83e\udd82',
+ 'scorpius':'\u264f\ufe0f',
+ 'scream':'\ud83d\ude31',
+ 'scream_cat':'\ud83d\ude40',
+ 'scroll':'\ud83d\udcdc',
+ 'seat':'\ud83d\udcba',
+ 'secret':'\u3299\ufe0f',
+ 'see_no_evil':'\ud83d\ude48',
+ 'seedling':'\ud83c\udf31',
+ 'selfie':'\ud83e\udd33',
+ 'shallow_pan_of_food':'\ud83e\udd58',
+ 'shamrock':'\u2618\ufe0f',
+ 'shark':'\ud83e\udd88',
+ 'shaved_ice':'\ud83c\udf67',
+ 'sheep':'\ud83d\udc11',
+ 'shell':'\ud83d\udc1a',
+ 'shield':'\ud83d\udee1',
+ 'shinto_shrine':'\u26e9',
+ 'ship':'\ud83d\udea2',
+ 'shirt':'\ud83d\udc55',
+ 'shopping':'\ud83d\udecd',
+ 'shopping_cart':'\ud83d\uded2',
+ 'shower':'\ud83d\udebf',
+ 'shrimp':'\ud83e\udd90',
+ 'signal_strength':'\ud83d\udcf6',
+ 'six_pointed_star':'\ud83d\udd2f',
+ 'ski':'\ud83c\udfbf',
+ 'skier':'\u26f7',
+ 'skull':'\ud83d\udc80',
+ 'skull_and_crossbones':'\u2620\ufe0f',
+ 'sleeping':'\ud83d\ude34',
+ 'sleeping_bed':'\ud83d\udecc',
+ 'sleepy':'\ud83d\ude2a',
+ 'slightly_frowning_face':'\ud83d\ude41',
+ 'slightly_smiling_face':'\ud83d\ude42',
+ 'slot_machine':'\ud83c\udfb0',
+ 'small_airplane':'\ud83d\udee9',
+ 'small_blue_diamond':'\ud83d\udd39',
+ 'small_orange_diamond':'\ud83d\udd38',
+ 'small_red_triangle':'\ud83d\udd3a',
+ 'small_red_triangle_down':'\ud83d\udd3b',
+ 'smile':'\ud83d\ude04',
+ 'smile_cat':'\ud83d\ude38',
+ 'smiley':'\ud83d\ude03',
+ 'smiley_cat':'\ud83d\ude3a',
+ 'smiling_imp':'\ud83d\ude08',
+ 'smirk':'\ud83d\ude0f',
+ 'smirk_cat':'\ud83d\ude3c',
+ 'smoking':'\ud83d\udeac',
+ 'snail':'\ud83d\udc0c',
+ 'snake':'\ud83d\udc0d',
+ 'sneezing_face':'\ud83e\udd27',
+ 'snowboarder':'\ud83c\udfc2',
+ 'snowflake':'\u2744\ufe0f',
+ 'snowman':'\u26c4\ufe0f',
+ 'snowman_with_snow':'\u2603\ufe0f',
+ 'sob':'\ud83d\ude2d',
+ 'soccer':'\u26bd\ufe0f',
+ 'soon':'\ud83d\udd1c',
+ 'sos':'\ud83c\udd98',
+ 'sound':'\ud83d\udd09',
+ 'space_invader':'\ud83d\udc7e',
+ 'spades':'\u2660\ufe0f',
+ 'spaghetti':'\ud83c\udf5d',
+ 'sparkle':'\u2747\ufe0f',
+ 'sparkler':'\ud83c\udf87',
+ 'sparkles':'\u2728',
+ 'sparkling_heart':'\ud83d\udc96',
+ 'speak_no_evil':'\ud83d\ude4a',
+ 'speaker':'\ud83d\udd08',
+ 'speaking_head':'\ud83d\udde3',
+ 'speech_balloon':'\ud83d\udcac',
+ 'speedboat':'\ud83d\udea4',
+ 'spider':'\ud83d\udd77',
+ 'spider_web':'\ud83d\udd78',
+ 'spiral_calendar':'\ud83d\uddd3',
+ 'spiral_notepad':'\ud83d\uddd2',
+ 'spoon':'\ud83e\udd44',
+ 'squid':'\ud83e\udd91',
+ 'stadium':'\ud83c\udfdf',
+ 'star':'\u2b50\ufe0f',
+ 'star2':'\ud83c\udf1f',
+ 'star_and_crescent':'\u262a\ufe0f',
+ 'star_of_david':'\u2721\ufe0f',
+ 'stars':'\ud83c\udf20',
+ 'station':'\ud83d\ude89',
+ 'statue_of_liberty':'\ud83d\uddfd',
+ 'steam_locomotive':'\ud83d\ude82',
+ 'stew':'\ud83c\udf72',
+ 'stop_button':'\u23f9',
+ 'stop_sign':'\ud83d\uded1',
+ 'stopwatch':'\u23f1',
+ 'straight_ruler':'\ud83d\udccf',
+ 'strawberry':'\ud83c\udf53',
+ 'stuck_out_tongue':'\ud83d\ude1b',
+ 'stuck_out_tongue_closed_eyes':'\ud83d\ude1d',
+ 'stuck_out_tongue_winking_eye':'\ud83d\ude1c',
+ 'studio_microphone':'\ud83c\udf99',
+ 'stuffed_flatbread':'\ud83e\udd59',
+ 'sun_behind_large_cloud':'\ud83c\udf25',
+ 'sun_behind_rain_cloud':'\ud83c\udf26',
+ 'sun_behind_small_cloud':'\ud83c\udf24',
+ 'sun_with_face':'\ud83c\udf1e',
+ 'sunflower':'\ud83c\udf3b',
+ 'sunglasses':'\ud83d\ude0e',
+ 'sunny':'\u2600\ufe0f',
+ 'sunrise':'\ud83c\udf05',
+ 'sunrise_over_mountains':'\ud83c\udf04',
+ 'surfing_man':'\ud83c\udfc4',
+ 'surfing_woman':'\ud83c\udfc4\u2640\ufe0f',
+ 'sushi':'\ud83c\udf63',
+ 'suspension_railway':'\ud83d\ude9f',
+ 'sweat':'\ud83d\ude13',
+ 'sweat_drops':'\ud83d\udca6',
+ 'sweat_smile':'\ud83d\ude05',
+ 'sweet_potato':'\ud83c\udf60',
+ 'swimming_man':'\ud83c\udfca',
+ 'swimming_woman':'\ud83c\udfca\u2640\ufe0f',
+ 'symbols':'\ud83d\udd23',
+ 'synagogue':'\ud83d\udd4d',
+ 'syringe':'\ud83d\udc89',
+ 'taco':'\ud83c\udf2e',
+ 'tada':'\ud83c\udf89',
+ 'tanabata_tree':'\ud83c\udf8b',
+ 'taurus':'\u2649\ufe0f',
+ 'taxi':'\ud83d\ude95',
+ 'tea':'\ud83c\udf75',
+ 'telephone_receiver':'\ud83d\udcde',
+ 'telescope':'\ud83d\udd2d',
+ 'tennis':'\ud83c\udfbe',
+ 'tent':'\u26fa\ufe0f',
+ 'thermometer':'\ud83c\udf21',
+ 'thinking':'\ud83e\udd14',
+ 'thought_balloon':'\ud83d\udcad',
+ 'ticket':'\ud83c\udfab',
+ 'tickets':'\ud83c\udf9f',
+ 'tiger':'\ud83d\udc2f',
+ 'tiger2':'\ud83d\udc05',
+ 'timer_clock':'\u23f2',
+ 'tipping_hand_man':'\ud83d\udc81\u2642\ufe0f',
+ 'tired_face':'\ud83d\ude2b',
+ 'tm':'\u2122\ufe0f',
+ 'toilet':'\ud83d\udebd',
+ 'tokyo_tower':'\ud83d\uddfc',
+ 'tomato':'\ud83c\udf45',
+ 'tongue':'\ud83d\udc45',
+ 'top':'\ud83d\udd1d',
+ 'tophat':'\ud83c\udfa9',
+ 'tornado':'\ud83c\udf2a',
+ 'trackball':'\ud83d\uddb2',
+ 'tractor':'\ud83d\ude9c',
+ 'traffic_light':'\ud83d\udea5',
+ 'train':'\ud83d\ude8b',
+ 'train2':'\ud83d\ude86',
+ 'tram':'\ud83d\ude8a',
+ 'triangular_flag_on_post':'\ud83d\udea9',
+ 'triangular_ruler':'\ud83d\udcd0',
+ 'trident':'\ud83d\udd31',
+ 'triumph':'\ud83d\ude24',
+ 'trolleybus':'\ud83d\ude8e',
+ 'trophy':'\ud83c\udfc6',
+ 'tropical_drink':'\ud83c\udf79',
+ 'tropical_fish':'\ud83d\udc20',
+ 'truck':'\ud83d\ude9a',
+ 'trumpet':'\ud83c\udfba',
+ 'tulip':'\ud83c\udf37',
+ 'tumbler_glass':'\ud83e\udd43',
+ 'turkey':'\ud83e\udd83',
+ 'turtle':'\ud83d\udc22',
+ 'tv':'\ud83d\udcfa',
+ 'twisted_rightwards_arrows':'\ud83d\udd00',
+ 'two_hearts':'\ud83d\udc95',
+ 'two_men_holding_hands':'\ud83d\udc6c',
+ 'two_women_holding_hands':'\ud83d\udc6d',
+ 'u5272':'\ud83c\ude39',
+ 'u5408':'\ud83c\ude34',
+ 'u55b6':'\ud83c\ude3a',
+ 'u6307':'\ud83c\ude2f\ufe0f',
+ 'u6708':'\ud83c\ude37\ufe0f',
+ 'u6709':'\ud83c\ude36',
+ 'u6e80':'\ud83c\ude35',
+ 'u7121':'\ud83c\ude1a\ufe0f',
+ 'u7533':'\ud83c\ude38',
+ 'u7981':'\ud83c\ude32',
+ 'u7a7a':'\ud83c\ude33',
+ 'umbrella':'\u2614\ufe0f',
+ 'unamused':'\ud83d\ude12',
+ 'underage':'\ud83d\udd1e',
+ 'unicorn':'\ud83e\udd84',
+ 'unlock':'\ud83d\udd13',
+ 'up':'\ud83c\udd99',
+ 'upside_down_face':'\ud83d\ude43',
+ 'v':'\u270c\ufe0f',
+ 'vertical_traffic_light':'\ud83d\udea6',
+ 'vhs':'\ud83d\udcfc',
+ 'vibration_mode':'\ud83d\udcf3',
+ 'video_camera':'\ud83d\udcf9',
+ 'video_game':'\ud83c\udfae',
+ 'violin':'\ud83c\udfbb',
+ 'virgo':'\u264d\ufe0f',
+ 'volcano':'\ud83c\udf0b',
+ 'volleyball':'\ud83c\udfd0',
+ 'vs':'\ud83c\udd9a',
+ 'vulcan_salute':'\ud83d\udd96',
+ 'walking_man':'\ud83d\udeb6',
+ 'walking_woman':'\ud83d\udeb6\u2640\ufe0f',
+ 'waning_crescent_moon':'\ud83c\udf18',
+ 'waning_gibbous_moon':'\ud83c\udf16',
+ 'warning':'\u26a0\ufe0f',
+ 'wastebasket':'\ud83d\uddd1',
+ 'watch':'\u231a\ufe0f',
+ 'water_buffalo':'\ud83d\udc03',
+ 'watermelon':'\ud83c\udf49',
+ 'wave':'\ud83d\udc4b',
+ 'wavy_dash':'\u3030\ufe0f',
+ 'waxing_crescent_moon':'\ud83c\udf12',
+ 'wc':'\ud83d\udebe',
+ 'weary':'\ud83d\ude29',
+ 'wedding':'\ud83d\udc92',
+ 'weight_lifting_man':'\ud83c\udfcb\ufe0f',
+ 'weight_lifting_woman':'\ud83c\udfcb\ufe0f\u2640\ufe0f',
+ 'whale':'\ud83d\udc33',
+ 'whale2':'\ud83d\udc0b',
+ 'wheel_of_dharma':'\u2638\ufe0f',
+ 'wheelchair':'\u267f\ufe0f',
+ 'white_check_mark':'\u2705',
+ 'white_circle':'\u26aa\ufe0f',
+ 'white_flag':'\ud83c\udff3\ufe0f',
+ 'white_flower':'\ud83d\udcae',
+ 'white_large_square':'\u2b1c\ufe0f',
+ 'white_medium_small_square':'\u25fd\ufe0f',
+ 'white_medium_square':'\u25fb\ufe0f',
+ 'white_small_square':'\u25ab\ufe0f',
+ 'white_square_button':'\ud83d\udd33',
+ 'wilted_flower':'\ud83e\udd40',
+ 'wind_chime':'\ud83c\udf90',
+ 'wind_face':'\ud83c\udf2c',
+ 'wine_glass':'\ud83c\udf77',
+ 'wink':'\ud83d\ude09',
+ 'wolf':'\ud83d\udc3a',
+ 'woman':'\ud83d\udc69',
+ 'woman_artist':'\ud83d\udc69\ud83c\udfa8',
+ 'woman_astronaut':'\ud83d\udc69\ud83d\ude80',
+ 'woman_cartwheeling':'\ud83e\udd38\u2640\ufe0f',
+ 'woman_cook':'\ud83d\udc69\ud83c\udf73',
+ 'woman_facepalming':'\ud83e\udd26\u2640\ufe0f',
+ 'woman_factory_worker':'\ud83d\udc69\ud83c\udfed',
+ 'woman_farmer':'\ud83d\udc69\ud83c\udf3e',
+ 'woman_firefighter':'\ud83d\udc69\ud83d\ude92',
+ 'woman_health_worker':'\ud83d\udc69\u2695\ufe0f',
+ 'woman_judge':'\ud83d\udc69\u2696\ufe0f',
+ 'woman_juggling':'\ud83e\udd39\u2640\ufe0f',
+ 'woman_mechanic':'\ud83d\udc69\ud83d\udd27',
+ 'woman_office_worker':'\ud83d\udc69\ud83d\udcbc',
+ 'woman_pilot':'\ud83d\udc69\u2708\ufe0f',
+ 'woman_playing_handball':'\ud83e\udd3e\u2640\ufe0f',
+ 'woman_playing_water_polo':'\ud83e\udd3d\u2640\ufe0f',
+ 'woman_scientist':'\ud83d\udc69\ud83d\udd2c',
+ 'woman_shrugging':'\ud83e\udd37\u2640\ufe0f',
+ 'woman_singer':'\ud83d\udc69\ud83c\udfa4',
+ 'woman_student':'\ud83d\udc69\ud83c\udf93',
+ 'woman_teacher':'\ud83d\udc69\ud83c\udfeb',
+ 'woman_technologist':'\ud83d\udc69\ud83d\udcbb',
+ 'woman_with_turban':'\ud83d\udc73\u2640\ufe0f',
+ 'womans_clothes':'\ud83d\udc5a',
+ 'womans_hat':'\ud83d\udc52',
+ 'women_wrestling':'\ud83e\udd3c\u2640\ufe0f',
+ 'womens':'\ud83d\udeba',
+ 'world_map':'\ud83d\uddfa',
+ 'worried':'\ud83d\ude1f',
+ 'wrench':'\ud83d\udd27',
+ 'writing_hand':'\u270d\ufe0f',
+ 'x':'\u274c',
+ 'yellow_heart':'\ud83d\udc9b',
+ 'yen':'\ud83d\udcb4',
+ 'yin_yang':'\u262f\ufe0f',
+ 'yum':'\ud83d\ude0b',
+ 'zap':'\u26a1\ufe0f',
+ 'zipper_mouth_face':'\ud83e\udd10',
+ 'zzz':'\ud83d\udca4',
+
+ /* special emojis :P */
+ 'octocat': ' ',
+ 'showdown': ' '
+ };
+
+ /**
+ * These are all the transformations that form block-level
+ * tags like paragraphs, headers, and list items.
+ */
+ showdown.subParser('makehtml.blockGamut', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.blockGamut.before', text, options, globals).getText();
+
+ // we parse blockquotes first so that we can have headings and hrs
+ // inside blockquotes
+ text = showdown.subParser('makehtml.blockQuotes')(text, options, globals);
+ text = showdown.subParser('makehtml.headers')(text, options, globals);
+
+ // Do Horizontal Rules:
+ text = showdown.subParser('makehtml.horizontalRule')(text, options, globals);
+
+ text = showdown.subParser('makehtml.lists')(text, options, globals);
+ text = showdown.subParser('makehtml.codeBlocks')(text, options, globals);
+ text = showdown.subParser('makehtml.tables')(text, options, globals);
+
+ // We already ran _HashHTMLBlocks() before, in Markdown(), but that
+ // was to escape raw HTML in the original Markdown source. This time,
+ // we're escaping the markup we've just created, so that we don't wrap
+ // tags around block-level tags.
+ text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals);
+ text = showdown.subParser('makehtml.paragraphs')(text, options, globals);
+
+ text = globals.converter._dispatch('makehtml.blockGamut.after', text, options, globals).getText();
+
+ return text;
+ });
+
+ showdown.subParser('makehtml.blockQuotes', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.blockQuotes.before', text, options, globals).getText();
+
+ // add a couple extra lines after the text and endtext mark
+ text = text + '\n\n';
+
+ var rgx = /(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;
+
+ if (options.splitAdjacentBlockquotes) {
+ rgx = /^ {0,3}>[\s\S]*?(?:\n\n)/gm;
+ }
+
+ text = text.replace(rgx, function (bq) {
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ // "----------bug".replace(/^-/g,"") == "bug"
+ bq = bq.replace(/^[ \t]*>[ \t]?/gm, ''); // trim one level of quoting
+
+ // attacklab: clean up hack
+ bq = bq.replace(/¨0/g, '');
+
+ bq = bq.replace(/^[ \t]+$/gm, ''); // trim whitespace-only lines
+ bq = showdown.subParser('makehtml.githubCodeBlocks')(bq, options, globals);
+ bq = showdown.subParser('makehtml.blockGamut')(bq, options, globals); // recurse
+
+ bq = bq.replace(/(^|\n)/g, '$1 ');
+ // These leading spaces screw with
content, so we need to fix that:
+ bq = bq.replace(/(\s*[^\r]+?<\/pre>)/gm, function (wholeMatch, m1) {
+ var pre = m1;
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ pre = pre.replace(/^ /mg, '¨0');
+ pre = pre.replace(/¨0/g, '');
+ return pre;
+ });
+
+ return showdown.subParser('makehtml.hashBlock')('\n' + bq + '\n ', options, globals);
+ });
+
+ text = globals.converter._dispatch('makehtml.blockQuotes.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Process Markdown `` blocks.
+ */
+ showdown.subParser('makehtml.codeBlocks', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.codeBlocks.before', text, options, globals).getText();
+
+ // sentinel workarounds for lack of \A and \Z, safari\khtml bug
+ text += '¨0';
+
+ var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g;
+ text = text.replace(pattern, function (wholeMatch, m1, m2) {
+ var codeblock = m1,
+ nextChar = m2,
+ end = '\n';
+
+ codeblock = showdown.subParser('makehtml.outdent')(codeblock, options, globals);
+ codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals);
+ codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals);
+ codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
+ codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing newlines
+
+ if (options.omitExtraWLInCodeBlocks) {
+ end = '';
+ }
+
+ codeblock = '' + codeblock + end + '
';
+
+ return showdown.subParser('makehtml.hashBlock')(codeblock, options, globals) + nextChar;
+ });
+
+ // strip sentinel
+ text = text.replace(/¨0/, '');
+
+ text = globals.converter._dispatch('makehtml.codeBlocks.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ *
+ * * Backtick quotes are used for
spans.
+ *
+ * * You can use multiple backticks as the delimiters if you want to
+ * include literal backticks in the code span. So, this input:
+ *
+ * Just type ``foo `bar` baz`` at the prompt.
+ *
+ * Will translate to:
+ *
+ * Just type foo `bar` baz
at the prompt.
+ *
+ * There's no arbitrary limit to the number of backticks you
+ * can use as delimters. If you need three consecutive backticks
+ * in your code, use four for delimiters, etc.
+ *
+ * * You can use spaces to get literal backticks at the edges:
+ *
+ * ... type `` `bar` `` ...
+ *
+ * Turns to:
+ *
+ * ... type `bar`
...
+ */
+ showdown.subParser('makehtml.codeSpans', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.codeSpans.before', text, options, globals).getText();
+
+ if (typeof (text) === 'undefined') {
+ text = '';
+ }
+ text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
+ function (wholeMatch, m1, m2, m3) {
+ var c = m3;
+ c = c.replace(/^([ \t]*)/g, ''); // leading whitespace
+ c = c.replace(/[ \t]*$/g, ''); // trailing whitespace
+ c = showdown.subParser('makehtml.encodeCode')(c, options, globals);
+ c = m1 + '' + c + '
';
+ c = showdown.subParser('makehtml.hashHTMLSpans')(c, options, globals);
+ return c;
+ }
+ );
+
+ text = globals.converter._dispatch('makehtml.codeSpans.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Create a full HTML document from the processed markdown
+ */
+ showdown.subParser('makehtml.completeHTMLDocument', function (text, options, globals) {
+ 'use strict';
+
+ if (!options.completeHTMLDocument) {
+ return text;
+ }
+
+ text = globals.converter._dispatch('makehtml.completeHTMLDocument.before', text, options, globals).getText();
+
+ var doctype = 'html',
+ doctypeParsed = '\n',
+ title = '',
+ charset = ' \n',
+ lang = '',
+ metadata = '';
+
+ if (typeof globals.metadata.parsed.doctype !== 'undefined') {
+ doctypeParsed = '\n';
+ doctype = globals.metadata.parsed.doctype.toString().toLowerCase();
+ if (doctype === 'html' || doctype === 'html5') {
+ charset = ' ';
+ }
+ }
+
+ for (var meta in globals.metadata.parsed) {
+ if (globals.metadata.parsed.hasOwnProperty(meta)) {
+ switch (meta.toLowerCase()) {
+ case 'doctype':
+ break;
+
+ case 'title':
+ title = '' + globals.metadata.parsed.title + ' \n';
+ break;
+
+ case 'charset':
+ if (doctype === 'html' || doctype === 'html5') {
+ charset = ' \n';
+ } else {
+ charset = ' \n';
+ }
+ break;
+
+ case 'language':
+ case 'lang':
+ lang = ' lang="' + globals.metadata.parsed[meta] + '"';
+ metadata += ' \n';
+ break;
+
+ default:
+ metadata += ' \n';
+ }
+ }
+ }
+
+ text = doctypeParsed + '\n\n' + title + charset + metadata + '\n\n' + text.trim() + '\n\n';
+
+ text = globals.converter._dispatch('makehtml.completeHTMLDocument.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Convert all tabs to spaces
+ */
+ showdown.subParser('makehtml.detab', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.detab.before', text, options, globals).getText();
+
+ // expand first n-1 tabs
+ text = text.replace(/\t(?=\t)/g, ' '); // g_tab_width
+
+ // replace the nth with two sentinels
+ text = text.replace(/\t/g, '¨A¨B');
+
+ // use the sentinel to anchor our regex so it doesn't explode
+ text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) {
+ var leadingText = m1,
+ numSpaces = 4 - leadingText.length % 4; // g_tab_width
+
+ // there *must* be a better way to do this:
+ for (var i = 0; i < numSpaces; i++) {
+ leadingText += ' ';
+ }
+
+ return leadingText;
+ });
+
+ // clean up sentinels
+ text = text.replace(/¨A/g, ' '); // g_tab_width
+ text = text.replace(/¨B/g, '');
+
+ text = globals.converter._dispatch('makehtml.detab.after', text, options, globals).getText();
+ return text;
+ });
+
+ showdown.subParser('makehtml.ellipsis', function (text, options, globals) {
+ 'use strict';
+
+ if (!options.ellipsis) {
+ return text;
+ }
+
+ text = globals.converter._dispatch('makehtml.ellipsis.before', text, options, globals).getText();
+
+ text = text.replace(/\.\.\./g, 'âĻ');
+
+ text = globals.converter._dispatch('makehtml.ellipsis.after', text, options, globals).getText();
+
+ return text;
+ });
+
+ /**
+ * Turn emoji codes into emojis
+ *
+ * List of supported emojis: https://github.com/showdownjs/showdown/wiki/Emojis
+ */
+ showdown.subParser('makehtml.emoji', function (text, options, globals) {
+ 'use strict';
+
+ if (!options.emoji) {
+ return text;
+ }
+
+ text = globals.converter._dispatch('makehtml.emoji.before', text, options, globals).getText();
+
+ var emojiRgx = /:([\S]+?):/g;
+
+ text = text.replace(emojiRgx, function (wm, emojiCode) {
+ if (showdown.helper.emojis.hasOwnProperty(emojiCode)) {
+ return showdown.helper.emojis[emojiCode];
+ }
+ return wm;
+ });
+
+ text = globals.converter._dispatch('makehtml.emoji.after', text, options, globals).getText();
+
+ return text;
+ });
+
+ /**
+ * Smart processing for ampersands and angle brackets that need to be encoded.
+ */
+ showdown.subParser('makehtml.encodeAmpsAndAngles', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.before', text, options, globals).getText();
+
+ // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
+ // http://bumppo.net/projects/amputator/
+ text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&');
+
+ // Encode naked <'s
+ text = text.replace(/<(?![a-z\/?$!])/gi, '<');
+
+ // Encode <
+ text = text.replace(/
+ text = text.replace(/>/g, '>');
+
+ text = globals.converter._dispatch('makehtml.encodeAmpsAndAngles.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Returns the string, with after processing the following backslash escape sequences.
+ *
+ * attacklab: The polite way to do this is with the new escapeCharacters() function:
+ *
+ * text = escapeCharacters(text,"\\",true);
+ * text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
+ *
+ * ...but we're sidestepping its use of the (slow) RegExp constructor
+ * as an optimization for Firefox. This function gets called a LOT.
+ */
+ showdown.subParser('makehtml.encodeBackslashEscapes', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.before', text, options, globals).getText();
+
+ text = text.replace(/\\(\\)/g, showdown.helper.escapeCharactersCallback);
+ text = text.replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g, showdown.helper.escapeCharactersCallback);
+
+ text = globals.converter._dispatch('makehtml.encodeBackslashEscapes.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Encode/escape certain characters inside Markdown code runs.
+ * The point is that in code, these characters are literals,
+ * and lose their special Markdown meanings.
+ */
+ showdown.subParser('makehtml.encodeCode', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.encodeCode.before', text, options, globals).getText();
+
+ // Encode all ampersands; HTML entities are not
+ // entities within a Markdown code span.
+ text = text
+ .replace(/&/g, '&')
+ // Do the angle bracket song and dance:
+ .replace(//g, '>')
+ // Now, escape characters that are magic in Markdown:
+ .replace(/([*_{}\[\]\\=~-])/g, showdown.helper.escapeCharactersCallback);
+
+ text = globals.converter._dispatch('makehtml.encodeCode.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Within tags -- meaning between < and > -- encode [\ ` * _ ~ =] so they
+ * don't conflict with their use in Markdown for code, italics and strong.
+ */
+ showdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.before', text, options, globals).getText();
+
+ // Build a regex to find HTML tags.
+ var tags = /<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,
+ comments = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi;
+
+ text = text.replace(tags, function (wholeMatch) {
+ return wholeMatch
+ .replace(/(.)<\/?code>(?=.)/g, '$1`')
+ .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);
+ });
+
+ text = text.replace(comments, function (wholeMatch) {
+ return wholeMatch
+ .replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);
+ });
+
+ text = globals.converter._dispatch('makehtml.escapeSpecialCharsWithinTagAttributes.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Handle github codeblocks prior to running HashHTML so that
+ * HTML contained within the codeblock gets escaped properly
+ * Example:
+ * ```ruby
+ * def hello_world(x)
+ * puts "Hello, #{x}"
+ * end
+ * ```
+ */
+ showdown.subParser('makehtml.githubCodeBlocks', function (text, options, globals) {
+ 'use strict';
+
+ // early exit if option is not enabled
+ if (!options.ghCodeBlocks) {
+ return text;
+ }
+
+ text = globals.converter._dispatch('makehtml.githubCodeBlocks.before', text, options, globals).getText();
+
+ text += '¨0';
+
+ text = text.replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g, function (wholeMatch, delim, language, codeblock) {
+ var end = (options.omitExtraWLInCodeBlocks) ? '' : '\n';
+
+ // First parse the github code block
+ codeblock = showdown.subParser('makehtml.encodeCode')(codeblock, options, globals);
+ codeblock = showdown.subParser('makehtml.detab')(codeblock, options, globals);
+ codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines
+ codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing whitespace
+
+ codeblock = '' + codeblock + end + '
';
+
+ codeblock = showdown.subParser('makehtml.hashBlock')(codeblock, options, globals);
+
+ // Since GHCodeblocks can be false positives, we need to
+ // store the primitive text and the parsed text in a global var,
+ // and then return a token
+ return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n';
+ });
+
+ // attacklab: strip sentinel
+ text = text.replace(/¨0/, '');
+
+ return globals.converter._dispatch('makehtml.githubCodeBlocks.after', text, options, globals).getText();
+ });
+
+ showdown.subParser('makehtml.hashBlock', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.hashBlock.before', text, options, globals).getText();
+ text = text.replace(/(^\n+|\n+$)/g, '');
+ text = '\n\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\n\n';
+ text = globals.converter._dispatch('makehtml.hashBlock.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Hash and escape elements that should not be parsed as markdown
+ */
+ showdown.subParser('makehtml.hashCodeTags', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.hashCodeTags.before', text, options, globals).getText();
+
+ var repFunc = function (wholeMatch, match, left, right) {
+ var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right;
+ return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C';
+ };
+
+ // Hash naked
+ text = showdown.helper.replaceRecursiveRegExp(text, repFunc, ']*>', '
', 'gim');
+
+ text = globals.converter._dispatch('makehtml.hashCodeTags.after', text, options, globals).getText();
+ return text;
+ });
+
+ showdown.subParser('makehtml.hashElement', function (text, options, globals) {
+ 'use strict';
+
+ return function (wholeMatch, m1) {
+ var blockText = m1;
+
+ // Undo double lines
+ blockText = blockText.replace(/\n\n/g, '\n');
+ blockText = blockText.replace(/^\n/, '');
+
+ // strip trailing blank lines
+ blockText = blockText.replace(/\n+$/g, '');
+
+ // Replace the element text with a marker ("¨KxK" where x is its key)
+ blockText = '\n\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\n\n';
+
+ return blockText;
+ };
+ });
+
+ showdown.subParser('makehtml.hashHTMLBlocks', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.hashHTMLBlocks.before', text, options, globals).getText();
+
+ var blockTags = [
+ 'pre',
+ 'div',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'blockquote',
+ 'table',
+ 'dl',
+ 'ol',
+ 'ul',
+ 'script',
+ 'noscript',
+ 'form',
+ 'fieldset',
+ 'iframe',
+ 'math',
+ 'style',
+ 'section',
+ 'header',
+ 'footer',
+ 'nav',
+ 'article',
+ 'aside',
+ 'address',
+ 'audio',
+ 'canvas',
+ 'figure',
+ 'hgroup',
+ 'output',
+ 'video',
+ 'details',
+ 'p'
+ ],
+ repFunc = function (wholeMatch, match, left, right) {
+ var txt = wholeMatch;
+ // check if this html element is marked as markdown
+ // if so, it's contents should be parsed as markdown
+ if (left.search(/\bmarkdown\b/) !== -1) {
+ txt = left + globals.converter.makeHtml(match) + right;
+ }
+ return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
+ };
+
+ if (options.backslashEscapesHTMLTags) {
+ // encode backslash escaped HTML tags
+ text = text.replace(/\\<(\/?[^>]+?)>/g, function (wm, inside) {
+ return '<' + inside + '>';
+ });
+ }
+
+ // hash HTML Blocks
+ for (var i = 0; i < blockTags.length; ++i) {
+
+ var opTagPos,
+ rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\b[^>]*>)', 'im'),
+ patLeft = '<' + blockTags[i] + '\\b[^>]*>',
+ patRight = '' + blockTags[i] + '>';
+ // 1. Look for the first position of the first opening HTML tag in the text
+ while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {
+
+ // if the HTML tag is \ escaped, we need to escape it and break
+
+
+ //2. Split the text in that position
+ var subTexts = showdown.helper.splitAtIndex(text, opTagPos),
+ //3. Match recursively
+ newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im');
+
+ // prevent an infinite loop
+ if (newSubText1 === subTexts[1]) {
+ break;
+ }
+ text = subTexts[0].concat(newSubText1);
+ }
+ }
+ // HR SPECIAL CASE
+ text = text.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,
+ showdown.subParser('makehtml.hashElement')(text, options, globals));
+
+ // Special case for standalone HTML comments
+ text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {
+ return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
+ }, '^ {0,3}', 'gm');
+
+ // PHP and ASP-style processor instructions (...?> and <%...%>)
+ text = text.replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,
+ showdown.subParser('makehtml.hashElement')(text, options, globals));
+
+ text = globals.converter._dispatch('makehtml.hashHTMLBlocks.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Hash span elements that should not be parsed as markdown
+ */
+ showdown.subParser('makehtml.hashHTMLSpans', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.hashHTMLSpans.before', text, options, globals).getText();
+
+ // Hash Self Closing tags
+ text = text.replace(/<[^>]+?\/>/gi, function (wm) {
+ return showdown.helper._hashHTMLSpan(wm, globals);
+ });
+
+ // Hash tags without properties
+ text = text.replace(/<([^>]+?)>[\s\S]*?<\/\1>/g, function (wm) {
+ return showdown.helper._hashHTMLSpan(wm, globals);
+ });
+
+ // Hash tags with properties
+ text = text.replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g, function (wm) {
+ return showdown.helper._hashHTMLSpan(wm, globals);
+ });
+
+ // Hash self closing tags without />
+ text = text.replace(/<[^>]+?>/gi, function (wm) {
+ return showdown.helper._hashHTMLSpan(wm, globals);
+ });
+
+ text = globals.converter._dispatch('makehtml.hashHTMLSpans.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Unhash HTML spans
+ */
+ showdown.subParser('makehtml.unhashHTMLSpans', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.unhashHTMLSpans.before', text, options, globals).getText();
+
+ for (var i = 0; i < globals.gHtmlSpans.length; ++i) {
+ var repText = globals.gHtmlSpans[i],
+ // limiter to prevent infinite loop (assume 10 as limit for recurse)
+ limit = 0;
+
+ while (/¨C(\d+)C/.test(repText)) {
+ var num = RegExp.$1;
+ repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);
+ if (limit === 10) {
+ console.error('maximum nesting of 10 spans reached!!!');
+ break;
+ }
+ ++limit;
+ }
+ text = text.replace('¨C' + i + 'C', repText);
+ }
+
+ text = globals.converter._dispatch('makehtml.unhashHTMLSpans.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Hash and escape elements that should not be parsed as markdown
+ */
+ showdown.subParser('makehtml.hashPreCodeTags', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.hashPreCodeTags.before', text, options, globals).getText();
+
+ var repFunc = function (wholeMatch, match, left, right) {
+ // encode html entities
+ var codeblock = left + showdown.subParser('makehtml.encodeCode')(match, options, globals) + right;
+ return '\n\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\n\n';
+ };
+
+ // Hash
+ text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}]*>\\s*]*>', '^ {0,3}
\\s* ', 'gim');
+
+ text = globals.converter._dispatch('makehtml.hashPreCodeTags.after', text, options, globals).getText();
+ return text;
+ });
+
+ showdown.subParser('makehtml.headers', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.headers.before', text, options, globals).getText();
+
+ var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),
+
+ // Set text-style headers:
+ // Header 1
+ // ========
+ //
+ // Header 2
+ // --------
+ //
+ setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm,
+ setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm;
+
+ text = text.replace(setextRegexH1, function (wholeMatch, m1) {
+
+ var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals),
+ hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+ hLevel = headerLevelStart,
+ hashBlock = '' + spanGamut + ' ';
+ return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals);
+ });
+
+ text = text.replace(setextRegexH2, function (matchFound, m1) {
+ var spanGamut = showdown.subParser('makehtml.spanGamut')(m1, options, globals),
+ hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
+ hLevel = headerLevelStart + 1,
+ hashBlock = '' + spanGamut + ' ';
+ return showdown.subParser('makehtml.hashBlock')(hashBlock, options, globals);
+ });
+
+ // atx-style headers:
+ // # Header 1
+ // ## Header 2
+ // ## Header 2 with closing hashes ##
+ // ...
+ // ###### Header 6
+ //
+ var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm : /^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;
+
+ text = text.replace(atxStyle, function (wholeMatch, m1, m2) {
+ var hText = m2;
+ if (options.customizedHeaderId) {
+ hText = m2.replace(/\s?\{([^{]+?)}\s*$/, '');
+ }
+
+ var span = showdown.subParser('makehtml.spanGamut')(hText, options, globals),
+ hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"',
+ hLevel = headerLevelStart - 1 + m1.length,
+ header = '' + span + ' ';
+
+ return showdown.subParser('makehtml.hashBlock')(header, options, globals);
+ });
+
+ function headerId (m) {
+ var title,
+ prefix;
+
+ // It is separate from other options to allow combining prefix and customized
+ if (options.customizedHeaderId) {
+ var match = m.match(/\{([^{]+?)}\s*$/);
+ if (match && match[1]) {
+ m = match[1];
+ }
+ }
+
+ title = m;
+
+ // Prefix id to prevent causing inadvertent pre-existing style matches.
+ if (showdown.helper.isString(options.prefixHeaderId)) {
+ prefix = options.prefixHeaderId;
+ } else if (options.prefixHeaderId === true) {
+ prefix = 'section-';
+ } else {
+ prefix = '';
+ }
+
+ if (!options.rawPrefixHeaderId) {
+ title = prefix + title;
+ }
+
+ if (options.ghCompatibleHeaderId) {
+ title = title
+ .replace(/ /g, '-')
+ // replace previously escaped chars (&, ¨ and $)
+ .replace(/&/g, '')
+ .replace(/¨T/g, '')
+ .replace(/¨D/g, '')
+ // replace rest of the chars (&~$ are repeated as they might have been escaped)
+ // borrowed from github's redcarpet (some they should produce similar results)
+ .replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g, '')
+ .toLowerCase();
+ } else if (options.rawHeaderId) {
+ title = title
+ .replace(/ /g, '-')
+ // replace previously escaped chars (&, ¨ and $)
+ .replace(/&/g, '&')
+ .replace(/¨T/g, '¨')
+ .replace(/¨D/g, '$')
+ // replace " and '
+ .replace(/["']/g, '-')
+ .toLowerCase();
+ } else {
+ title = title
+ .replace(/[^\w]/g, '')
+ .toLowerCase();
+ }
+
+ if (options.rawPrefixHeaderId) {
+ title = prefix + title;
+ }
+
+ if (globals.hashLinkCounts[title]) {
+ title = title + '-' + (globals.hashLinkCounts[title]++);
+ } else {
+ globals.hashLinkCounts[title] = 1;
+ }
+ return title;
+ }
+
+ text = globals.converter._dispatch('makehtml.headers.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Turn Markdown horizontal rule shortcuts into tags.
+ *
+ * Any 3 or more unindented consecutive hyphens, asterisks or underscores with or without a space beetween them
+ * in a single line is considered a horizontal rule
+ */
+ showdown.subParser('makehtml.horizontalRule', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.horizontalRule.before', text, options, globals).getText();
+
+ var key = showdown.subParser('makehtml.hashBlock')(' ', options, globals);
+ text = text.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm, key);
+ text = text.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm, key);
+ text = text.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm, key);
+
+ text = globals.converter._dispatch('makehtml.horizontalRule.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Turn Markdown image shortcuts into tags.
+ */
+ showdown.subParser('makehtml.images', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.images.before', text, options, globals).getText();
+
+ var inlineRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?([\S]+?(?:\([\S]*?\)[\S]*?)?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,
+ crazyRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,
+ base64RegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?(data:.+?\/.+?;base64,[A-Za-z0-9+/=\n]+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,
+ referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,
+ refShortcutRegExp = /!\[([^\[\]]+)]()()()()()/g;
+
+ function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) {
+ url = url.replace(/\s/g, '');
+ return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);
+ }
+
+ function writeImageTagBaseUrl (wholeMatch, altText, linkId, url, width, height, m5, title) {
+ url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);
+
+ return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);
+ }
+
+ function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {
+
+ var gUrls = globals.gUrls,
+ gTitles = globals.gTitles,
+ gDims = globals.gDimensions;
+
+ linkId = linkId.toLowerCase();
+
+ if (!title) {
+ title = '';
+ }
+ // Special case for explicit empty url
+ if (wholeMatch.search(/\(\s*>? ?(['"].*['"])?\)$/m) > -1) {
+ url = '';
+
+ } else if (url === '' || url === null) {
+ if (linkId === '' || linkId === null) {
+ // lower-case and turn embedded newlines into spaces
+ linkId = altText.toLowerCase().replace(/ ?\n/g, ' ');
+ }
+ url = '#' + linkId;
+
+ if (!showdown.helper.isUndefined(gUrls[linkId])) {
+ url = gUrls[linkId];
+ if (!showdown.helper.isUndefined(gTitles[linkId])) {
+ title = gTitles[linkId];
+ }
+ if (!showdown.helper.isUndefined(gDims[linkId])) {
+ width = gDims[linkId].width;
+ height = gDims[linkId].height;
+ }
+ } else {
+ return wholeMatch;
+ }
+ }
+
+ altText = altText
+ .replace(/"/g, '"')
+ //altText = showdown.helper.escapeCharacters(altText, '*_', false);
+ .replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);
+ //url = showdown.helper.escapeCharacters(url, '*_', false);
+ url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);
+ var result = ' ';
+
+ return result;
+ }
+
+ // First, handle reference-style labeled images: ![alt text][id]
+ text = text.replace(referenceRegExp, writeImageTag);
+
+ // Next, handle inline images: 
+
+ // base64 encoded images
+ text = text.replace(base64RegExp, writeImageTagBase64);
+
+ // cases with crazy urls like ./image/cat1).png
+ text = text.replace(crazyRegExp, writeImageTagBaseUrl);
+
+ // normal cases
+ text = text.replace(inlineRegExp, writeImageTagBaseUrl);
+
+ // handle reference-style shortcuts: ![img text]
+ text = text.replace(refShortcutRegExp, writeImageTag);
+
+ text = globals.converter._dispatch('makehtml.images.after', text, options, globals).getText();
+ return text;
+ });
+
+ showdown.subParser('makehtml.italicsAndBold', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.italicsAndBold.before', text, options, globals).getText();
+
+ // it's faster to have 3 separate regexes for each case than have just one
+ // because of backtracing, in some cases, it could lead to an exponential effect
+ // called "catastrophic backtrace". Ominous!
+
+ function parseInside (txt, left, right) {
+ return left + txt + right;
+ }
+
+ // Parse underscores
+ if (options.literalMidWordUnderscores) {
+ text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) {
+ return parseInside (txt, '', ' ');
+ });
+ text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) {
+ return parseInside (txt, '', ' ');
+ });
+ text = text.replace(/\b_(\S[\s\S]*?)_\b/g, function (wm, txt) {
+ return parseInside (txt, '', ' ');
+ });
+ } else {
+ text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) {
+ return (/\S$/.test(m)) ? parseInside (m, '', ' ') : wm;
+ });
+ text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) {
+ return (/\S$/.test(m)) ? parseInside (m, '', ' ') : wm;
+ });
+ text = text.replace(/_([^\s_][\s\S]*?)_/g, function (wm, m) {
+ // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)
+ return (/\S$/.test(m)) ? parseInside (m, '', ' ') : wm;
+ });
+ }
+
+ // Now parse asterisks
+ /*
+ if (options.literalMidWordAsterisks) {
+ text = text.replace(/([^*]|^)\B\*\*\*(\S[\s\S]+?)\*\*\*\B(?!\*)/g, function (wm, lead, txt) {
+ return parseInside (txt, lead + '', ' ');
+ });
+ text = text.replace(/([^*]|^)\B\*\*(\S[\s\S]+?)\*\*\B(?!\*)/g, function (wm, lead, txt) {
+ return parseInside (txt, lead + '', ' ');
+ });
+ text = text.replace(/([^*]|^)\B\*(\S[\s\S]+?)\*\B(?!\*)/g, function (wm, lead, txt) {
+ return parseInside (txt, lead + '', ' ');
+ });
+ } else {
+ */
+ text = text.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function (wm, m) {
+ return (/\S$/.test(m)) ? parseInside (m, '', ' ') : wm;
+ });
+ text = text.replace(/\*\*(\S[\s\S]*?)\*\*/g, function (wm, m) {
+ return (/\S$/.test(m)) ? parseInside (m, '', ' ') : wm;
+ });
+ text = text.replace(/\*([^\s*][\s\S]*?)\*/g, function (wm, m) {
+ // !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)
+ return (/\S$/.test(m)) ? parseInside (m, '', ' ') : wm;
+ });
+ //}
+
+ text = globals.converter._dispatch('makehtml.italicsAndBold.after', text, options, globals).getText();
+ return text;
+ });
+
+////
+// makehtml/links.js
+// Copyright (c) 2018 ShowdownJS
+//
+// Transforms MD links into `` html anchors
+//
+// A link contains link text (the visible text), a link destination (the URI that is the link destination), and
+// optionally a link title. There are two basic kinds of links in Markdown.
+// In inline links the destination and title are given immediately after the link text.
+// In reference links the destination and title are defined elsewhere in the document.
+//
+// ***Author:***
+// - EstevÃŖo Soares dos Santos (Tivie)
+////
+
+ (function () {
+ /**
+ * Helper function: Wrapper function to pass as second replace parameter
+ *
+ * @param {RegExp} rgx
+ * @param {string} evtRootName
+ * @param {{}} options
+ * @param {{}} globals
+ * @returns {Function}
+ */
+ function replaceAnchorTagReference (rgx, evtRootName, options, globals, emptyCase) {
+ emptyCase = !!emptyCase;
+ return function (wholeMatch, text, id, url, m5, m6, title) {
+ // bail we we find 2 newlines somewhere
+ if (/\n\n/.test(wholeMatch)) {
+ return wholeMatch;
+ }
+
+ var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, text, id, url, title, options, globals);
+ return writeAnchorTag(evt, options, globals, emptyCase);
+ };
+ }
+
+ function replaceAnchorTagBaseUrl (rgx, evtRootName, options, globals, emptyCase) {
+ return function (wholeMatch, text, id, url, m5, m6, title) {
+ url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);
+
+ var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, text, id, url, title, options, globals);
+ return writeAnchorTag(evt, options, globals, emptyCase);
+ };
+ }
+
+ /**
+ * TODO Normalize this
+ * Helper function: Create a capture event
+ * @param {RegExp} rgx
+ * @param {String} evtName Event name
+ * @param {String} wholeMatch
+ * @param {String} text
+ * @param {String} id
+ * @param {String} url
+ * @param {String} title
+ * @param {{}} options
+ * @param {{}} globals
+ * @returns {showdown.helper.Event|*}
+ */
+ function createEvent (rgx, evtName, wholeMatch, text, id, url, title, options, globals) {
+ return globals.converter._dispatch(evtName, wholeMatch, options, globals, {
+ regexp: rgx,
+ matches: {
+ wholeMatch: wholeMatch,
+ text: text,
+ id: id,
+ url: url,
+ title: title
+ }
+ });
+ }
+
+ /**
+ * Helper Function: Normalize and write an anchor tag based on passed parameters
+ * @param evt
+ * @param options
+ * @param globals
+ * @param {boolean} emptyCase
+ * @returns {string}
+ */
+ function writeAnchorTag (evt, options, globals, emptyCase) {
+
+ var wholeMatch = evt.getMatches().wholeMatch;
+ var text = evt.getMatches().text;
+ var id = evt.getMatches().id;
+ var url = evt.getMatches().url;
+ var title = evt.getMatches().title;
+ var target = '';
+
+ if (!title) {
+ title = '';
+ }
+ id = (id) ? id.toLowerCase() : '';
+
+ if (emptyCase) {
+ url = '';
+ } else if (!url) {
+ if (!id) {
+ // lower-case and turn embedded newlines into spaces
+ id = text.toLowerCase().replace(/ ?\n/g, ' ');
+ }
+ url = '#' + id;
+
+ if (!showdown.helper.isUndefined(globals.gUrls[id])) {
+ url = globals.gUrls[id];
+ if (!showdown.helper.isUndefined(globals.gTitles[id])) {
+ title = globals.gTitles[id];
+ }
+ } else {
+ return wholeMatch;
+ }
+ }
+ //url = showdown.helper.escapeCharacters(url, '*_:~', false); // replaced line to improve performance
+ url = url.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);
+
+ if (title !== '' && title !== null) {
+ title = title.replace(/"/g, '"');
+ //title = showdown.helper.escapeCharacters(title, '*_', false); // replaced line to improve performance
+ title = title.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);
+ title = ' title="' + title + '"';
+ }
+
+ // optionLinksInNewWindow only applies
+ // to external links. Hash links (#) open in same page
+ if (options.openLinksInNewWindow && !/^#/.test(url)) {
+ // escaped _
+ target = ' rel="noopener noreferrer" target="¨E95Eblank"';
+ }
+
+ // Text can be a markdown element, so we run through the appropriate parsers
+ text = showdown.subParser('makehtml.codeSpans')(text, options, globals);
+ text = showdown.subParser('makehtml.emoji')(text, options, globals);
+ text = showdown.subParser('makehtml.underline')(text, options, globals);
+ text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals);
+ text = showdown.subParser('makehtml.strikethrough')(text, options, globals);
+ text = showdown.subParser('makehtml.ellipsis')(text, options, globals);
+ text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals);
+
+ //evt = createEvent(rgx, evtRootName + '.captureEnd', wholeMatch, text, id, url, title, options, globals);
+
+ var result = '' + text + ' ';
+
+ //evt = createEvent(rgx, evtRootName + '.beforeHash', wholeMatch, text, id, url, title, options, globals);
+
+ result = showdown.subParser('makehtml.hashHTMLSpans')(result, options, globals);
+
+ return result;
+ }
+
+ var evtRootName = 'makehtml.links';
+
+ /**
+ * Turn Markdown link shortcuts into XHTML tags.
+ */
+ showdown.subParser('makehtml.links', function (text, options, globals) {
+
+ text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();
+
+ // 1. Handle reference-style links: [link text] [id]
+ text = showdown.subParser('makehtml.links.reference')(text, options, globals);
+
+ // 2. Handle inline-style links: [link text](url "optional title")
+ text = showdown.subParser('makehtml.links.inline')(text, options, globals);
+
+ // 3. Handle reference-style shortcuts: [link text]
+ // These must come last in case there's a [link text][1] or [link text](/foo)
+ text = showdown.subParser('makehtml.links.referenceShortcut')(text, options, globals);
+
+ // 4. Handle angle brackets links -> ` `
+ // Must come after links, because you can use < and > delimiters in inline links like [this]().
+ text = showdown.subParser('makehtml.links.angleBrackets')(text, options, globals);
+
+ // 5. Handle GithubMentions (if option is enabled)
+ text = showdown.subParser('makehtml.links.ghMentions')(text, options, globals);
+
+ // 6. Handle tags and img tags
+ text = text.replace(/ ]*>[\s\S]*<\/a>/g, function (wholeMatch) {
+ return showdown.helper._hashHTMLSpan(wholeMatch, globals);
+ });
+
+ text = text.replace(/ ]*\/?>/g, function (wholeMatch) {
+ return showdown.helper._hashHTMLSpan(wholeMatch, globals);
+ });
+
+ // 7. Handle naked links (if option is enabled)
+ text = showdown.subParser('makehtml.links.naked')(text, options, globals);
+
+ text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * TODO WRITE THIS DOCUMENTATION
+ */
+ showdown.subParser('makehtml.links.inline', function (text, options, globals) {
+ var evtRootName = evtRootName + '.inline';
+
+ text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();
+
+ // 1. Look for empty cases: []() and [empty]() and []("title")
+ var rgxEmpty = /\[(.*?)]()()()()\( ?>? ?(?:["'](.*)["'])?\)/g;
+ text = text.replace(rgxEmpty, replaceAnchorTagBaseUrl(rgxEmpty, evtRootName, options, globals, true));
+
+ // 2. Look for cases with crazy urls like ./image/cat1).png
+ var rgxCrazy = /\[((?:\[[^\]]*]|[^\[\]])*)]()\s?\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g;
+ text = text.replace(rgxCrazy, replaceAnchorTagBaseUrl(rgxCrazy, evtRootName, options, globals));
+
+ // 3. inline links with no title or titles wrapped in ' or ":
+ // [text](url.com) || [text]() || [text](url.com "title") || [text]( "title")
+ //var rgx2 = /\[[ ]*[\s]?[ ]*([^\n\[\]]*?)[ ]*[\s]?[ ]*] ?()\([ ]*[\s]?[ ]*([^\s'"]*)>?(?:[ ]*[\n]?[ ]*()(['"])(.*?)\5)?[ ]*[\s]?[ ]*\)/; // this regex is too slow!!!
+ var rgx2 = /\[([\S ]*?)]\s?()\( *([^\s'"]*?(?:\([\S]*?\)[\S]*?)?)>?\s*(?:()(['"])(.*?)\5)? *\)/g;
+ text = text.replace(rgx2, replaceAnchorTagBaseUrl(rgx2, evtRootName, options, globals));
+
+ // 4. inline links with titles wrapped in (): [foo](bar.com (title))
+ var rgx3 = /\[([\S ]*?)]\s?()\( *([^\s'"]*?(?:\([\S]*?\)[\S]*?)?)>?\s+()()\((.*?)\) *\)/g;
+ text = text.replace(rgx3, replaceAnchorTagBaseUrl(rgx3, evtRootName, options, globals));
+
+ text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();
+
+ return text;
+ });
+
+ /**
+ * TODO WRITE THIS DOCUMENTATION
+ */
+ showdown.subParser('makehtml.links.reference', function (text, options, globals) {
+ var evtRootName = evtRootName + '.reference';
+
+ text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();
+
+ var rgx = /\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g;
+ text = text.replace(rgx, replaceAnchorTagReference(rgx, evtRootName, options, globals));
+
+ text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();
+
+ return text;
+ });
+
+ /**
+ * TODO WRITE THIS DOCUMENTATION
+ */
+ showdown.subParser('makehtml.links.referenceShortcut', function (text, options, globals) {
+ var evtRootName = evtRootName + '.referenceShortcut';
+
+ text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();
+
+ var rgx = /\[([^\[\]]+)]()()()()()/g;
+ text = text.replace(rgx, replaceAnchorTagReference(rgx, evtRootName, options, globals));
+
+ text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();
+
+ return text;
+ });
+
+ /**
+ * TODO WRITE THIS DOCUMENTATION
+ */
+ showdown.subParser('makehtml.links.ghMentions', function (text, options, globals) {
+ var evtRootName = evtRootName + 'ghMentions';
+
+ if (!options.ghMentions) {
+ return text;
+ }
+
+ text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();
+
+ var rgx = /(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d._-]+?[a-z\d]+)*))/gi;
+
+ text = text.replace(rgx, function (wholeMatch, st, escape, mentions, username) {
+ // bail if the mentions was escaped
+ if (escape === '\\') {
+ return st + mentions;
+ }
+
+ // check if options.ghMentionsLink is a string
+ // TODO Validation should be done at initialization not at runtime
+ if (!showdown.helper.isString(options.ghMentionsLink)) {
+ throw new Error('ghMentionsLink option must be a string');
+ }
+ var url = options.ghMentionsLink.replace(/{u}/g, username);
+ var evt = createEvent(rgx, evtRootName + '.captureStart', wholeMatch, mentions, null, url, null, options, globals);
+ // captureEnd Event is triggered inside writeAnchorTag function
+ return st + writeAnchorTag(evt, options, globals);
+ });
+
+ text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();
+
+ return text;
+ });
+
+ /**
+ * TODO WRITE THIS DOCUMENTATION
+ */
+ showdown.subParser('makehtml.links.angleBrackets', function (text, options, globals) {
+ var evtRootName = 'makehtml.links.angleBrackets';
+
+ text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();
+
+ // 1. Parse links first
+ var urlRgx = /<(((?:https?|ftp):\/\/|www\.)[^'">\s]+)>/gi;
+ text = text.replace(urlRgx, function (wholeMatch, url, urlStart) {
+ var text = url;
+ url = (urlStart === 'www.') ? 'http://' + url : url;
+ var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals);
+ return writeAnchorTag(evt, options, globals);
+ });
+
+ // 2. Then Mail Addresses
+ var mailRgx = /<(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi;
+ text = text.replace(mailRgx, function (wholeMatch, mail) {
+ var url = 'mailto:';
+ mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals);
+ if (options.encodeEmails) {
+ url = showdown.helper.encodeEmailAddress(url + mail);
+ mail = showdown.helper.encodeEmailAddress(mail);
+ } else {
+ url = url + mail;
+ }
+ var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals);
+ return writeAnchorTag(evt, options, globals);
+ });
+
+ text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * TODO MAKE THIS WORK (IT'S NOT ACTIVATED)
+ * TODO WRITE THIS DOCUMENTATION
+ */
+ showdown.subParser('makehtml.links.naked', function (text, options, globals) {
+ if (!options.simplifiedAutoLink) {
+ return text;
+ }
+
+ var evtRootName = 'makehtml.links.naked';
+
+ text = globals.converter._dispatch(evtRootName + '.start', text, options, globals).getText();
+
+ // 2. Now we check for
+ // we also include leading markdown magic chars [_*~] for cases like __https://www.google.com/foobar__
+ var urlRgx = /([_*~]*?)(((?:https?|ftp):\/\/|www\.)[^\s<>"'`´.-][^\s<>"'`´]*?\.[a-z\d.]+[^\s<>"']*)\1/gi;
+ text = text.replace(urlRgx, function (wholeMatch, leadingMDChars, url, urlPrefix) {
+
+ // we now will start traversing the url from the front to back, looking for punctuation chars [_*~,;:.!?\)\]]
+ var len = url.length;
+ var suffix = '';
+ for (var i = len - 1; i >= 0; --i) {
+ var char = url.charAt(i);
+
+ if (/[_*~,;:.!?]/.test(char)) {
+ // it's a punctuation char
+ // we remove it from the url
+ url = url.slice(0, -1);
+ // and prepend it to the suffix
+ suffix = char + suffix;
+ } else if (/\)/.test(char)) {
+ var opPar = url.match(/\(/g) || [];
+ var clPar = url.match(/\)/g);
+
+ // it's a curved parenthesis so we need to check for "balance" (kinda)
+ if (opPar.length < clPar.length) {
+ // there are more closing Parenthesis than opening so chop it!!!!!
+ url = url.slice(0, -1);
+ // and prepend it to the suffix
+ suffix = char + suffix;
+ } else {
+ // it's (kinda) balanced so our work is done
+ break;
+ }
+ } else if (/]/.test(char)) {
+ var opPar2 = url.match(/\[/g) || [];
+ var clPar2 = url.match(/\]/g);
+ // it's a squared parenthesis so we need to check for "balance" (kinda)
+ if (opPar2.length < clPar2.length) {
+ // there are more closing Parenthesis than opening so chop it!!!!!
+ url = url.slice(0, -1);
+ // and prepend it to the suffix
+ suffix = char + suffix;
+ } else {
+ // it's (kinda) balanced so our work is done
+ break;
+ }
+ } else {
+ // it's not a punctuation or a parenthesis so our work is done
+ break;
+ }
+ }
+
+ // we copy the treated url to the text variable
+ var text = url;
+ // finally, if it's a www shortcut, we prepend http
+ url = (urlPrefix === 'www.') ? 'http://' + url : url;
+
+ // url part is done so let's take care of text now
+ // we need to escape the text (because of links such as www.example.com/foo__bar__baz)
+ text = text.replace(showdown.helper.regexes.asteriskDashTildeAndColon, showdown.helper.escapeCharactersCallback);
+
+ // finally we dispatch the event
+ var evt = createEvent(urlRgx, evtRootName + '.captureStart', wholeMatch, text, null, url, null, options, globals);
+
+ // and return the link tag, with the leadingMDChars and suffix. The leadingMDChars are added at the end too because
+ // we consumed those characters in the regexp
+ return leadingMDChars + writeAnchorTag(evt, options, globals) + suffix + leadingMDChars;
+ });
+
+ // 2. Then mails
+ var mailRgx = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi;
+ text = text.replace(mailRgx, function (wholeMatch, leadingChar, mail) {
+ var url = 'mailto:';
+ mail = showdown.subParser('makehtml.unescapeSpecialChars')(mail, options, globals);
+ if (options.encodeEmails) {
+ url = showdown.helper.encodeEmailAddress(url + mail);
+ mail = showdown.helper.encodeEmailAddress(mail);
+ } else {
+ url = url + mail;
+ }
+ var evt = createEvent(mailRgx, evtRootName + '.captureStart', wholeMatch, mail, null, url, null, options, globals);
+ return leadingChar + writeAnchorTag(evt, options, globals);
+ });
+
+
+ text = globals.converter._dispatch(evtRootName + '.end', text, options, globals).getText();
+ return text;
+ });
+ })();
+
+ /**
+ * Form HTML ordered (numbered) and unordered (bulleted) lists.
+ */
+ showdown.subParser('makehtml.lists', function (text, options, globals) {
+ 'use strict';
+
+ /**
+ * Process the contents of a single ordered or unordered list, splitting it
+ * into individual list items.
+ * @param {string} listStr
+ * @param {boolean} trimTrailing
+ * @returns {string}
+ */
+ function processListItems (listStr, trimTrailing) {
+ // The $g_list_level global keeps track of when we're inside a list.
+ // Each time we enter a list, we increment it; when we leave a list,
+ // we decrement. If it's zero, we're not in a list anymore.
+ //
+ // We do this because when we're not inside a list, we want to treat
+ // something like this:
+ //
+ // I recommend upgrading to version
+ // 8. Oops, now this line is treated
+ // as a sub-list.
+ //
+ // As a single paragraph, despite the fact that the second line starts
+ // with a digit-period-space sequence.
+ //
+ // Whereas when we're inside a list (or sub-list), that line will be
+ // treated as the start of a sub-list. What a kludge, huh? This is
+ // an aspect of Markdown's syntax that's hard to parse perfectly
+ // without resorting to mind-reading. Perhaps the solution is to
+ // change the syntax rules such that sub-lists must start with a
+ // starting cardinal number; e.g. "1." or "a.".
+ globals.gListLevel++;
+
+ // trim trailing blank lines:
+ listStr = listStr.replace(/\n{2,}$/, '\n');
+
+ // attacklab: add sentinel to emulate \z
+ listStr += '¨0';
+
+ var rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,
+ isParagraphed = (/\n[ \t]*\n(?!¨0)/.test(listStr));
+
+ // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,
+ // which is a syntax breaking change
+ // activating this option reverts to old behavior
+ // This will be removed in version 2.0
+ if (options.disableForced4SpacesIndentedSublists) {
+ rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm;
+ }
+
+ listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {
+ checked = (checked && checked.trim() !== '');
+
+ var item = showdown.subParser('makehtml.outdent')(m4, options, globals),
+ bulletStyle = '';
+
+ // Support for github tasklists
+ if (taskbtn && options.tasklists) {
+ bulletStyle = ' class="task-list-item" style="list-style-type: none;"';
+ item = item.replace(/^[ \t]*\[(x|X| )?]/m, function () {
+ var otp = ' ';
+ return otp;
+ });
+ }
+
+ // ISSUE #312
+ // This input: - - - a
+ // causes trouble to the parser, since it interprets it as:
+ //
+ // instead of:
+ //
+ // So, to prevent it, we will put a marker (¨A)in the beginning of the line
+ // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser
+ item = item.replace(/^([-*+]|\d\.)[ \t]+[\S\n ]*/g, function (wm2) {
+ return '¨A' + wm2;
+ });
+
+ // SPECIAL CASE: an heading followed by a paragraph of text that is not separated by a double newline
+ // or/nor indented. ex:
+ //
+ // - # foo
+ // bar is great
+ //
+ // While this does now follow the spec per se, not allowing for this might cause confusion since
+ // header blocks don't need double newlines after
+ if (/^#+.+\n.+/.test(item)) {
+ item = item.replace(/^(#+.+)$/m, '$1\n');
+ }
+
+ // m1 - Leading line or
+ // Has a double return (multi paragraph)
+ if (m1 || (item.search(/\n{2,}/) > -1)) {
+ item = showdown.subParser('makehtml.githubCodeBlocks')(item, options, globals);
+ item = showdown.subParser('makehtml.blockGamut')(item, options, globals);
+ } else {
+
+ // Recursion for sub-lists:
+ item = showdown.subParser('makehtml.lists')(item, options, globals);
+ item = item.replace(/\n$/, ''); // chomp(item)
+ item = showdown.subParser('makehtml.hashHTMLBlocks')(item, options, globals);
+
+ // Colapse double linebreaks
+ item = item.replace(/\n\n+/g, '\n\n');
+
+ if (isParagraphed) {
+ item = showdown.subParser('makehtml.paragraphs')(item, options, globals);
+ } else {
+ item = showdown.subParser('makehtml.spanGamut')(item, options, globals);
+ }
+ }
+
+ // now we need to remove the marker (¨A)
+ item = item.replace('¨A', '');
+ // we can finally wrap the line in list item tags
+ item = '' + item + ' \n';
+
+ return item;
+ });
+
+ // attacklab: strip sentinel
+ listStr = listStr.replace(/¨0/g, '');
+
+ globals.gListLevel--;
+
+ if (trimTrailing) {
+ listStr = listStr.replace(/\s+$/, '');
+ }
+
+ return listStr;
+ }
+
+ function styleStartNumber (list, listType) {
+ // check if ol and starts by a number different than 1
+ if (listType === 'ol') {
+ var res = list.match(/^ *(\d+)\./);
+ if (res && res[1] !== '1') {
+ return ' start="' + res[1] + '"';
+ }
+ }
+ return '';
+ }
+
+ /**
+ * Check and parse consecutive lists (better fix for issue #142)
+ * @param {string} list
+ * @param {string} listType
+ * @param {boolean} trimTrailing
+ * @returns {string}
+ */
+ function parseConsecutiveLists (list, listType, trimTrailing) {
+ // check if we caught 2 or more consecutive lists by mistake
+ // we use the counterRgx, meaning if listType is UL we look for OL and vice versa
+ var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\d+\.[ \t]/gm : /^ {0,3}\d+\.[ \t]/gm,
+ ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \t]/gm : /^ {0,3}[*+-][ \t]/gm,
+ counterRxg = (listType === 'ul') ? olRgx : ulRgx,
+ result = '';
+
+ if (list.search(counterRxg) !== -1) {
+ (function parseCL (txt) {
+ var pos = txt.search(counterRxg),
+ style = styleStartNumber(list, listType);
+ if (pos !== -1) {
+ // slice
+ result += '\n\n<' + listType + style + '>\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '' + listType + '>\n';
+
+ // invert counterType and listType
+ listType = (listType === 'ul') ? 'ol' : 'ul';
+ counterRxg = (listType === 'ul') ? olRgx : ulRgx;
+
+ //recurse
+ parseCL(txt.slice(pos));
+ } else {
+ result += '\n\n<' + listType + style + '>\n' + processListItems(txt, !!trimTrailing) + '' + listType + '>\n';
+ }
+ })(list);
+ } else {
+ var style = styleStartNumber(list, listType);
+ result = '\n\n<' + listType + style + '>\n' + processListItems(list, !!trimTrailing) + '' + listType + '>\n';
+ }
+
+ return result;
+ }
+
+ // Start of list parsing
+ var subListRgx = /^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
+ var mainListRgx = /(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
+
+ text = globals.converter._dispatch('lists.before', text, options, globals).getText();
+ // add sentinel to hack around khtml/safari bug:
+ // http://bugs.webkit.org/show_bug.cgi?id=11231
+ text += '¨0';
+
+ if (globals.gListLevel) {
+ text = text.replace(subListRgx, function (wholeMatch, list, m2) {
+ var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
+ return parseConsecutiveLists(list, listType, true);
+ });
+ } else {
+ text = text.replace(mainListRgx, function (wholeMatch, m1, list, m3) {
+ var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
+ return parseConsecutiveLists(list, listType, false);
+ });
+ }
+
+ // strip sentinel
+ text = text.replace(/¨0/, '');
+ text = globals.converter._dispatch('makehtml.lists.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Parse metadata at the top of the document
+ */
+ showdown.subParser('makehtml.metadata', function (text, options, globals) {
+ 'use strict';
+
+ if (!options.metadata) {
+ return text;
+ }
+
+ text = globals.converter._dispatch('makehtml.metadata.before', text, options, globals).getText();
+
+ function parseMetadataContents (content) {
+ // raw is raw so it's not changed in any way
+ globals.metadata.raw = content;
+
+ // escape chars forbidden in html attributes
+ // double quotes
+ content = content
+ // ampersand first
+ .replace(/&/g, '&')
+ // double quotes
+ .replace(/"/g, '"');
+
+ content = content.replace(/\n {4}/g, ' ');
+ content.replace(/^([\S ]+): +([\s\S]+?)$/gm, function (wm, key, value) {
+ globals.metadata.parsed[key] = value;
+ return '';
+ });
+ }
+
+ text = text.replace(/^\s*ÂĢÂĢÂĢ+(\S*?)\n([\s\S]+?)\nÂģÂģÂģ+\n/, function (wholematch, format, content) {
+ parseMetadataContents(content);
+ return '¨M';
+ });
+
+ text = text.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/, function (wholematch, format, content) {
+ if (format) {
+ globals.metadata.format = format;
+ }
+ parseMetadataContents(content);
+ return '¨M';
+ });
+
+ text = text.replace(/¨M/g, '');
+
+ text = globals.converter._dispatch('makehtml.metadata.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ * Remove one level of line-leading tabs or spaces
+ */
+ showdown.subParser('makehtml.outdent', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.outdent.before', text, options, globals).getText();
+
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ // "----------bug".replace(/^-/g,"") == "bug"
+ text = text.replace(/^(\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width
+
+ // attacklab: clean up hack
+ text = text.replace(/¨0/g, '');
+
+ text = globals.converter._dispatch('makehtml.outdent.after', text, options, globals).getText();
+ return text;
+ });
+
+ /**
+ *
+ */
+ showdown.subParser('makehtml.paragraphs', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.paragraphs.before', text, options, globals).getText();
+ // Strip leading and trailing lines:
+ text = text.replace(/^\n+/g, '');
+ text = text.replace(/\n+$/g, '');
+
+ var grafs = text.split(/\n{2,}/g),
+ grafsOut = [],
+ end = grafs.length; // Wrap tags
+
+ for (var i = 0; i < end; i++) {
+ var str = grafs[i];
+ // if this is an HTML marker, copy it
+ if (str.search(/¨(K|G)(\d+)\1/g) >= 0) {
+ grafsOut.push(str);
+
+ // test for presence of characters to prevent empty lines being parsed
+ // as paragraphs (resulting in undesired extra empty paragraphs)
+ } else if (str.search(/\S/) >= 0) {
+ str = showdown.subParser('makehtml.spanGamut')(str, options, globals);
+ str = str.replace(/^([ \t]*)/g, '
');
+ str += '
';
+ grafsOut.push(str);
+ }
+ }
+
+ /** Unhashify HTML blocks */
+ end = grafsOut.length;
+ for (i = 0; i < end; i++) {
+ var blockText = '',
+ grafsOutIt = grafsOut[i],
+ codeFlag = false;
+ // if this is a marker for an html block...
+ // use RegExp.test instead of string.search because of QML bug
+ while (/¨(K|G)(\d+)\1/.test(grafsOutIt)) {
+ var delim = RegExp.$1,
+ num = RegExp.$2;
+
+ if (delim === 'K') {
+ blockText = globals.gHtmlBlocks[num];
+ } else {
+ // we need to check if ghBlock is a false positive
+ if (codeFlag) {
+ // use encoded version of all text
+ blockText = showdown.subParser('makehtml.encodeCode')(globals.ghCodeBlocks[num].text, options, globals);
+ } else {
+ blockText = globals.ghCodeBlocks[num].codeblock;
+ }
+ }
+ blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs
+
+ grafsOutIt = grafsOutIt.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/, blockText);
+ // Check if grafsOutIt is a pre->code
+ if (/^]*>\s*]*>/.test(grafsOutIt)) {
+ codeFlag = true;
+ }
+ }
+ grafsOut[i] = grafsOutIt;
+ }
+ text = grafsOut.join('\n');
+ // Strip leading and trailing lines:
+ text = text.replace(/^\n+/g, '');
+ text = text.replace(/\n+$/g, '');
+ return globals.converter._dispatch('makehtml.paragraphs.after', text, options, globals).getText();
+ });
+
+ /**
+ * Run extension
+ */
+ showdown.subParser('makehtml.runExtension', function (ext, text, options, globals) {
+ 'use strict';
+
+ if (ext.filter) {
+ text = ext.filter(text, globals.converter, options);
+
+ } else if (ext.regex) {
+ // TODO remove this when old extension loading mechanism is deprecated
+ var re = ext.regex;
+ if (!(re instanceof RegExp)) {
+ re = new RegExp(re, 'g');
+ }
+ text = text.replace(re, ext.replace);
+ }
+
+ return text;
+ });
+
+ /**
+ * These are all the transformations that occur *within* block-level
+ * tags like paragraphs, headers, and list items.
+ */
+ showdown.subParser('makehtml.spanGamut', function (text, options, globals) {
+ 'use strict';
+
+ text = globals.converter._dispatch('makehtml.span.before', text, options, globals).getText();
+
+ text = showdown.subParser('makehtml.codeSpans')(text, options, globals);
+ text = showdown.subParser('makehtml.escapeSpecialCharsWithinTagAttributes')(text, options, globals);
+ text = showdown.subParser('makehtml.encodeBackslashEscapes')(text, options, globals);
+
+ // Process link and image tags. Images must come first,
+ // because ![foo][f] looks like a link.
+ text = showdown.subParser('makehtml.images')(text, options, globals);
+
+ text = globals.converter._dispatch('smakehtml.links.before', text, options, globals).getText();
+ text = showdown.subParser('makehtml.links')(text, options, globals);
+ text = globals.converter._dispatch('smakehtml.links.after', text, options, globals).getText();
+
+ //text = showdown.subParser('makehtml.autoLinks')(text, options, globals);
+ //text = showdown.subParser('makehtml.simplifiedAutoLinks')(text, options, globals);
+ text = showdown.subParser('makehtml.emoji')(text, options, globals);
+ text = showdown.subParser('makehtml.underline')(text, options, globals);
+ text = showdown.subParser('makehtml.italicsAndBold')(text, options, globals);
+ text = showdown.subParser('makehtml.strikethrough')(text, options, globals);
+ text = showdown.subParser('makehtml.ellipsis')(text, options, globals);
+
+ // we need to hash HTML tags inside spans
+ text = showdown.subParser('makehtml.hashHTMLSpans')(text, options, globals);
+
+ // now we encode amps and angles
+ text = showdown.subParser('makehtml.encodeAmpsAndAngles')(text, options, globals);
+
+ // Do hard breaks
+ if (options.simpleLineBreaks) {
+ // GFM style hard breaks
+ // only add line breaks if the text does not contain a block (special case for lists)
+ if (!/\n\n¨K/.test(text)) {
+ text = text.replace(/\n+/g, ' \n');
+ }
+ } else {
+ // Vanilla hard breaks
+ text = text.replace(/ +\n/g, ' \n');
+ }
+
+ text = globals.converter._dispatch('makehtml.spanGamut.after', text, options, globals).getText();
+ return text;
+ });
+
+ showdown.subParser('makehtml.strikethrough', function (text, options, globals) {
+ 'use strict';
+
+ if (options.strikethrough) {
+ text = globals.converter._dispatch('makehtml.strikethrough.before', text, options, globals).getText();
+ text = text.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, function (wm, txt) { return '' + txt + ''; });
+ text = globals.converter._dispatch('makehtml.strikethrough.after', text, options, globals).getText();
+ }
+
+ return text;
+ });
+
+ /**
+ * Strips link definitions from text, stores the URLs and titles in
+ * hash references.
+ * Link defs are in the form: ^[id]: url "optional title"
+ */
+ showdown.subParser('makehtml.stripLinkDefinitions', function (text, options, globals) {
+ 'use strict';
+
+ var regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*([^>\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,
+ base64Regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*(data:.+?\/.+?;base64,[A-Za-z0-9+/=\n]+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm;
+
+ // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
+ text += '¨0';
+
+ var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {
+ linkId = linkId.toLowerCase();
+ if (url.match(/^data:.+?\/.+?;base64,/)) {
+ // remove newlines
+ globals.gUrls[linkId] = url.replace(/\s/g, '');
+ } else {
+ url = showdown.helper.applyBaseUrl(options.relativePathBaseUrl, url);
+
+ globals.gUrls[linkId] = showdown.subParser('makehtml.encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive
+ }
+
+ if (blankLines) {
+ // Oops, found blank lines, so it's not a title.
+ // Put back the parenthetical statement we stole.
+ return blankLines + title;
+
+ } else {
+ if (title) {
+ globals.gTitles[linkId] = title.replace(/"|'/g, '"');
+ }
+ if (options.parseImgDimensions && width && height) {
+ globals.gDimensions[linkId] = {
+ width: width,
+ height: height
+ };
+ }
+ }
+ // Completely remove the definition from the text
+ return '';
+ };
+
+ // first we try to find base64 link references
+ text = text.replace(base64Regex, replaceFunc);
+
+ text = text.replace(regex, replaceFunc);
+
+ // attacklab: strip sentinel
+ text = text.replace(/¨0/, '');
+
+ return text;
+ });
+
+ showdown.subParser('makehtml.tables', function (text, options, globals) {
+ 'use strict';
+
+ if (!options.tables) {
+ return text;
+ }
+
+ var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,
+ //singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm;
+ singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm;
+
+ function parseStyles (sLine) {
+ if (/^:[ \t]*--*$/.test(sLine)) {
+ return ' style="text-align:left;"';
+ } else if (/^--*[ \t]*:[ \t]*$/.test(sLine)) {
+ return ' style="text-align:right;"';
+ } else if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) {
+ return ' style="text-align:center;"';
+ } else {
+ return '';
+ }
+ }
+
+ function parseHeaders (header, style) {
+ var id = '';
+ header = header.trim();
+ // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility
+ if (options.tablesHeaderId || options.tableHeaderId) {
+ id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"';
+ }
+ header = showdown.subParser('makehtml.spanGamut')(header, options, globals);
+
+ return '' + header + ' \n';
+ }
+
+ function parseCells (cell, style) {
+ var subText = showdown.subParser('makehtml.spanGamut')(cell, options, globals);
+ return '' + subText + ' \n';
+ }
+
+ function buildTable (headers, cells) {
+ var tb = '\n\n\n',
+ tblLgn = headers.length;
+
+ for (var i = 0; i < tblLgn; ++i) {
+ tb += headers[i];
+ }
+ tb += ' \n \n\n';
+
+ for (i = 0; i < cells.length; ++i) {
+ tb += '\n';
+ for (var ii = 0; ii < tblLgn; ++ii) {
+ tb += cells[i][ii];
+ }
+ tb += ' \n';
+ }
+ tb += ' \n
\n';
+ return tb;
+ }
+
+ function parseTable (rawTable) {
+ var i, tableLines = rawTable.split('\n');
+
+ for (i = 0; i < tableLines.length; ++i) {
+ // strip wrong first and last column if wrapped tables are used
+ if (/^ {0,3}\|/.test(tableLines[i])) {
+ tableLines[i] = tableLines[i].replace(/^ {0,3}\|/, '');
+ }
+ if (/\|[ \t]*$/.test(tableLines[i])) {
+ tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, '');
+ }
+ // parse code spans first, but we only support one line code spans
+
+ tableLines[i] = showdown.subParser('makehtml.codeSpans')(tableLines[i], options, globals);
+ }
+
+ var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),
+ rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),
+ rawCells = [],
+ headers = [],
+ styles = [],
+ cells = [];
+
+ tableLines.shift();
+ tableLines.shift();
+
+ for (i = 0; i < tableLines.length; ++i) {
+ if (tableLines[i].trim() === '') {
+ continue;
+ }
+ rawCells.push(
+ tableLines[i]
+ .split('|')
+ .map(function (s) {
+ return s.trim();
+ })
+ );
+ }
+
+ if (rawHeaders.length < rawStyles.length) {
+ return rawTable;
+ }
+
+ for (i = 0; i < rawStyles.length; ++i) {
+ styles.push(parseStyles(rawStyles[i]));
+ }
+
+ for (i = 0; i < rawHeaders.length; ++i) {
+ if (showdown.helper.isUndefined(styles[i])) {
+ styles[i] = '';
+ }
+ headers.push(parseHeaders(rawHeaders[i], styles[i]));
+ }
+
+ for (i = 0; i < rawCells.length; ++i) {
+ var row = [];
+ for (var ii = 0; ii < headers.length; ++ii) {
+ if (showdown.helper.isUndefined(rawCells[i][ii])) {
+
+ }
+ row.push(parseCells(rawCells[i][ii], styles[ii]));
+ }
+ cells.push(row);
+ }
+
+ return buildTable(headers, cells);
+ }
+
+ text = globals.converter._dispatch('makehtml.tables.before', text, options, globals).getText();
+
+ // find escaped pipe characters
+ text = text.replace(/\\(\|)/g, showdown.helper.escapeCharactersCallback);
+
+ // parse multi column tables
+ text = text.replace(tableRgx, parseTable);
+
+ // parse one column tables
+ text = text.replace(singeColTblRgx, parseTable);
+
+ text = globals.converter._dispatch('makehtml.tables.after', text, options, globals).getText();
+
+ return text;
+ });
+
+ showdown.subParser('makehtml.underline', function (text, options, globals) {
+ 'use strict';
+
+ if (!options.underline) {
+ return text;
+ }
+
+ text = globals.converter._dispatch('makehtml.underline.before', text, options, globals).getText();
+
+ if (options.literalMidWordUnderscores) {
+ text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) {
+ return '' + txt + ' ';
+ });
+ text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) {
+ return '' + txt + ' ';
+ });
+ } else {
+ text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) {
+ return (/\S$/.test(m)) ? '' + m + ' ' : wm;
+ });
+ text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) {
+ return (/\S$/.test(m)) ? '' + m + ' ' : wm;
+ });
+ }
+
+ // escape remaining underscores to prevent them being parsed by italic and bold
+ text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);
+
+ text = globals.converter._dispatch('makehtml.underline.after', text, options, globals).getText();
+
+ return text;
+ });
+
+ /**
+ * Swap back in all the special characters we've hidden.
+ */
+ showdown.subParser('makehtml.unescapeSpecialChars', function (text, options, globals) {
+ 'use strict';
+ text = globals.converter._dispatch('makehtml.unescapeSpecialChars.before', text, options, globals).getText();
+
+ text = text.replace(/¨E(\d+)E/g, function (wholeMatch, m1) {
+ var charCodeToReplace = parseInt(m1);
+ return String.fromCharCode(charCodeToReplace);
+ });
+
+ text = globals.converter._dispatch('makehtml.unescapeSpecialChars.after', text, options, globals).getText();
+ return text;
+ });
+
+ showdown.subParser('makeMarkdown.blockquote', function (node, globals) {
+ 'use strict';
+
+ var txt = '';
+ if (node.hasChildNodes()) {
+ var children = node.childNodes,
+ childrenLength = children.length;
+
+ for (var i = 0; i < childrenLength; ++i) {
+ var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals);
+
+ if (innerTxt === '') {
+ continue;
+ }
+ txt += innerTxt;
+ }
+ }
+ // cleanup
+ txt = txt.trim();
+ txt = '> ' + txt.split('\n').join('\n> ');
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.break', function () {
+ 'use strict';
+
+ return ' \n';
+ });
+
+ showdown.subParser('makeMarkdown.codeBlock', function (node, globals) {
+ 'use strict';
+
+ var lang = node.getAttribute('language'),
+ num = node.getAttribute('precodenum');
+ return '```' + lang + '\n' + globals.preList[num] + '\n```';
+ });
+
+ showdown.subParser('makeMarkdown.codeSpan', function (node) {
+ 'use strict';
+
+ return '`' + node.innerHTML + '`';
+ });
+
+ showdown.subParser('makeMarkdown.emphasis', function (node, globals) {
+ 'use strict';
+
+ var txt = '';
+ if (node.hasChildNodes()) {
+ txt += '*';
+ var children = node.childNodes,
+ childrenLength = children.length;
+ for (var i = 0; i < childrenLength; ++i) {
+ txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
+ }
+ txt += '*';
+ }
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) {
+ 'use strict';
+
+ var headerMark = new Array(headerLevel + 1).join('#'),
+ txt = '';
+
+ if (node.hasChildNodes()) {
+ txt = headerMark + ' ';
+ var children = node.childNodes,
+ childrenLength = children.length;
+
+ for (var i = 0; i < childrenLength; ++i) {
+ txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
+ }
+ }
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.hr', function () {
+ 'use strict';
+
+ return '---';
+ });
+
+ showdown.subParser('makeMarkdown.image', function (node) {
+ 'use strict';
+
+ var txt = '';
+ if (node.hasAttribute('src')) {
+ txt += ' + '>';
+ if (node.hasAttribute('width') && node.hasAttribute('height')) {
+ txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height');
+ }
+
+ if (node.hasAttribute('title')) {
+ txt += ' "' + node.getAttribute('title') + '"';
+ }
+ txt += ')';
+ }
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.links', function (node, globals) {
+ 'use strict';
+
+ var txt = '';
+ if (node.hasChildNodes() && node.hasAttribute('href')) {
+ var children = node.childNodes,
+ childrenLength = children.length;
+ txt = '[';
+ for (var i = 0; i < childrenLength; ++i) {
+ txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
+ }
+ txt += '](';
+ txt += '<' + node.getAttribute('href') + '>';
+ if (node.hasAttribute('title')) {
+ txt += ' "' + node.getAttribute('title') + '"';
+ }
+ txt += ')';
+ }
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.list', function (node, globals, type) {
+ 'use strict';
+
+ var txt = '';
+ if (!node.hasChildNodes()) {
+ return '';
+ }
+ var listItems = node.childNodes,
+ listItemsLenght = listItems.length,
+ listNum = node.getAttribute('start') || 1;
+
+ for (var i = 0; i < listItemsLenght; ++i) {
+ if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') {
+ continue;
+ }
+
+ // define the bullet to use in list
+ var bullet = '';
+ if (type === 'ol') {
+ bullet = listNum.toString() + '. ';
+ } else {
+ bullet = '- ';
+ }
+
+ // parse list item
+ txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals);
+ ++listNum;
+ }
+
+ return txt.trim();
+ });
+
+ showdown.subParser('makeMarkdown.listItem', function (node, globals) {
+ 'use strict';
+
+ var listItemTxt = '';
+
+ var children = node.childNodes,
+ childrenLenght = children.length;
+
+ for (var i = 0; i < childrenLenght; ++i) {
+ listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals);
+ }
+ // if it's only one liner, we need to add a newline at the end
+ if (!/\n$/.test(listItemTxt)) {
+ listItemTxt += '\n';
+ } else {
+ // it's multiparagraph, so we need to indent
+ listItemTxt = listItemTxt
+ .split('\n')
+ .join('\n ')
+ .replace(/^ {4}$/gm, '')
+ .replace(/\n\n+/g, '\n\n');
+ }
+
+ return listItemTxt;
+ });
+
+
+
+ showdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) {
+ 'use strict';
+
+ spansOnly = spansOnly || false;
+
+ var txt = '';
+
+ // edge case of text without wrapper paragraph
+ if (node.nodeType === 3) {
+ return showdown.subParser('makeMarkdown.txt')(node, globals);
+ }
+
+ // HTML comment
+ if (node.nodeType === 8) {
+ return '\n\n';
+ }
+
+ // process only node elements
+ if (node.nodeType !== 1) {
+ return '';
+ }
+
+ var tagName = node.tagName.toLowerCase();
+
+ switch (tagName) {
+
+ //
+ // BLOCKS
+ //
+ case 'h1':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\n\n'; }
+ break;
+ case 'h2':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\n\n'; }
+ break;
+ case 'h3':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\n\n'; }
+ break;
+ case 'h4':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\n\n'; }
+ break;
+ case 'h5':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\n\n'; }
+ break;
+ case 'h6':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\n\n'; }
+ break;
+
+ case 'p':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\n\n'; }
+ break;
+
+ case 'blockquote':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\n\n'; }
+ break;
+
+ case 'hr':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\n\n'; }
+ break;
+
+ case 'ol':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\n\n'; }
+ break;
+
+ case 'ul':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\n\n'; }
+ break;
+
+ case 'precode':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\n\n'; }
+ break;
+
+ case 'pre':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\n\n'; }
+ break;
+
+ case 'table':
+ if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\n\n'; }
+ break;
+
+ //
+ // SPANS
+ //
+ case 'code':
+ txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals);
+ break;
+
+ case 'em':
+ case 'i':
+ txt = showdown.subParser('makeMarkdown.emphasis')(node, globals);
+ break;
+
+ case 'strong':
+ case 'b':
+ txt = showdown.subParser('makeMarkdown.strong')(node, globals);
+ break;
+
+ case 'del':
+ txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals);
+ break;
+
+ case 'a':
+ txt = showdown.subParser('makeMarkdown.links')(node, globals);
+ break;
+
+ case 'img':
+ txt = showdown.subParser('makeMarkdown.image')(node, globals);
+ break;
+
+ case 'br':
+ txt = showdown.subParser('makeMarkdown.break')(node, globals);
+ break;
+
+ default:
+ txt = node.outerHTML + '\n\n';
+ }
+
+ // common normalization
+ // TODO eventually
+
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.paragraph', function (node, globals) {
+ 'use strict';
+
+ var txt = '';
+ if (node.hasChildNodes()) {
+ var children = node.childNodes,
+ childrenLength = children.length;
+ for (var i = 0; i < childrenLength; ++i) {
+ txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
+ }
+ }
+
+ // some text normalization
+ txt = txt.trim();
+
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.pre', function (node, globals) {
+ 'use strict';
+
+ var num = node.getAttribute('prenum');
+ return '' + globals.preList[num] + ' ';
+ });
+
+ showdown.subParser('makeMarkdown.strikethrough', function (node, globals) {
+ 'use strict';
+
+ var txt = '';
+ if (node.hasChildNodes()) {
+ txt += '~~';
+ var children = node.childNodes,
+ childrenLength = children.length;
+ for (var i = 0; i < childrenLength; ++i) {
+ txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
+ }
+ txt += '~~';
+ }
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.strong', function (node, globals) {
+ 'use strict';
+
+ var txt = '';
+ if (node.hasChildNodes()) {
+ txt += '**';
+ var children = node.childNodes,
+ childrenLength = children.length;
+ for (var i = 0; i < childrenLength; ++i) {
+ txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
+ }
+ txt += '**';
+ }
+ return txt;
+ });
+
+ showdown.subParser('makeMarkdown.table', function (node, globals) {
+ 'use strict';
+
+ var txt = '',
+ tableArray = [[], []],
+ headings = node.querySelectorAll('thead>tr>th'),
+ rows = node.querySelectorAll('tbody>tr'),
+ i, ii;
+ for (i = 0; i < headings.length; ++i) {
+ var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals),
+ allign = '---';
+
+ if (headings[i].hasAttribute('style')) {
+ var style = headings[i].getAttribute('style').toLowerCase().replace(/\s/g, '');
+ switch (style) {
+ case 'text-align:left;':
+ allign = ':---';
+ break;
+ case 'text-align:right;':
+ allign = '---:';
+ break;
+ case 'text-align:center;':
+ allign = ':---:';
+ break;
+ }
+ }
+ tableArray[0][i] = headContent.trim();
+ tableArray[1][i] = allign;
+ }
+
+ for (i = 0; i < rows.length; ++i) {
+ var r = tableArray.push([]) - 1,
+ cols = rows[i].getElementsByTagName('td');
+
+ for (ii = 0; ii < headings.length; ++ii) {
+ var cellContent = ' ';
+ if (typeof cols[ii] !== 'undefined') {
+ cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals);
+ }
+ tableArray[r].push(cellContent);
+ }
+ }
+
+ var cellSpacesCount = 3;
+ for (i = 0; i < tableArray.length; ++i) {
+ for (ii = 0; ii < tableArray[i].length; ++ii) {
+ var strLen = tableArray[i][ii].length;
+ if (strLen > cellSpacesCount) {
+ cellSpacesCount = strLen;
+ }
+ }
+ }
+
+ for (i = 0; i < tableArray.length; ++i) {
+ for (ii = 0; ii < tableArray[i].length; ++ii) {
+ if (i === 1) {
+ if (tableArray[i][ii].slice(-1) === ':') {
+ tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(-1), cellSpacesCount - 1, '-') + ':';
+ } else {
+ tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-');
+ }
+ } else {
+ tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount);
+ }
+ }
+ txt += '| ' + tableArray[i].join(' | ') + ' |\n';
+ }
+
+ return txt.trim();
+ });
+
+ showdown.subParser('makeMarkdown.tableCell', function (node, globals) {
+ 'use strict';
+
+ var txt = '';
+ if (!node.hasChildNodes()) {
+ return '';
+ }
+ var children = node.childNodes,
+ childrenLength = children.length;
+
+ for (var i = 0; i < childrenLength; ++i) {
+ txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true);
+ }
+ return txt.trim();
+ });
+
+ showdown.subParser('makeMarkdown.txt', function (node) {
+ 'use strict';
+
+ var txt = node.nodeValue;
+
+ // multiple spaces are collapsed
+ txt = txt.replace(/ +/g, ' ');
+
+ // replace the custom ¨NBSP; with a space
+ txt = txt.replace(/¨NBSP;/g, ' ');
+
+ // ", <, > and & should replace escaped html entities
+ txt = showdown.helper.unescapeHTMLEntities(txt);
+
+ // escape markdown magic characters
+ // emphasis, strong and strikethrough - can appear everywhere
+ // we also escape pipe (|) because of tables
+ // and escape ` because of code blocks and spans
+ txt = txt.replace(/([*_~|`])/g, '\\$1');
+
+ // escape > because of blockquotes
+ txt = txt.replace(/^(\s*)>/g, '\\$1>');
+
+ // hash character, only troublesome at the beginning of a line because of headers
+ txt = txt.replace(/^#/gm, '\\#');
+
+ // horizontal rules
+ txt = txt.replace(/^(\s*)([-=]{3,})(\s*)$/, '$1\\$2$3');
+
+ // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer
+ txt = txt.replace(/^( {0,3}\d+)\./gm, '$1\\.');
+
+ // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)
+ txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\$2');
+
+ // images and links, ] followed by ( is problematic, so we escape it
+ txt = txt.replace(/]([\s]*)\(/g, '\\]$1\\(');
+
+ // reference URIs must also be escaped
+ txt = txt.replace(/^ {0,3}\[([\S \t]*?)]:/gm, '\\[$1]:');
+
+ return txt;
+ });
+
+ /**
+ * Created by Estevao on 31-05-2015.
+ */
+
+ /**
+ * Showdown Converter class
+ * @class
+ * @param {object} [converterOptions]
+ * @returns {Converter}
+ */
+ showdown.Converter = function (converterOptions) {
+ 'use strict';
+
+ var
+ /**
+ * Options used by this converter
+ * @private
+ * @type {{}}
+ */
+ options = {},
+
+ /**
+ * Language extensions used by this converter
+ * @private
+ * @type {Array}
+ */
+ langExtensions = [],
+
+ /**
+ * Output modifiers extensions used by this converter
+ * @private
+ * @type {Array}
+ */
+ outputModifiers = [],
+
+ /**
+ * Event listeners
+ * @private
+ * @type {{}}
+ */
+ listeners = {},
+
+ /**
+ * The flavor set in this converter
+ */
+ setConvFlavor = setFlavor,
+
+ /**
+ * Metadata of the document
+ * @type {{parsed: {}, raw: string, format: string}}
+ */
+ metadata = {
+ parsed: {},
+ raw: '',
+ format: ''
+ };
+
+ _constructor();
+
+ /**
+ * Converter constructor
+ * @private
+ */
+ function _constructor () {
+ converterOptions = converterOptions || {};
+
+ for (var gOpt in globalOptions) {
+ if (globalOptions.hasOwnProperty(gOpt)) {
+ options[gOpt] = globalOptions[gOpt];
+ }
+ }
+
+ // Merge options
+ if (typeof converterOptions === 'object') {
+ for (var opt in converterOptions) {
+ if (converterOptions.hasOwnProperty(opt)) {
+ options[opt] = converterOptions[opt];
+ }
+ }
+ } else {
+ throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +
+ ' was passed instead.');
+ }
+
+ if (options.extensions) {
+ showdown.helper.forEach(options.extensions, _parseExtension);
+ }
+ }
+
+ /**
+ * Parse extension
+ * @param {*} ext
+ * @param {string} [name='']
+ * @private
+ */
+ function _parseExtension (ext, name) {
+
+ name = name || null;
+ // If it's a string, the extension was previously loaded
+ if (showdown.helper.isString(ext)) {
+ ext = showdown.helper.stdExtName(ext);
+ name = ext;
+
+ // LEGACY_SUPPORT CODE
+ if (showdown.extensions[ext]) {
+ console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +
+ 'Please inform the developer that the extension should be updated!');
+ legacyExtensionLoading(showdown.extensions[ext], ext);
+ return;
+ // END LEGACY SUPPORT CODE
+
+ } else if (!showdown.helper.isUndefined(extensions[ext])) {
+ ext = extensions[ext];
+
+ } else {
+ throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.');
+ }
+ }
+
+ if (typeof ext === 'function') {
+ ext = ext();
+ }
+
+ if (!showdown.helper.isArray(ext)) {
+ ext = [ext];
+ }
+
+ var validExt = validate(ext, name);
+ if (!validExt.valid) {
+ throw Error(validExt.error);
+ }
+
+ for (var i = 0; i < ext.length; ++i) {
+ switch (ext[i].type) {
+
+ case 'lang':
+ langExtensions.push(ext[i]);
+ break;
+
+ case 'output':
+ outputModifiers.push(ext[i]);
+ break;
+ }
+ if (ext[i].hasOwnProperty('listeners')) {
+ for (var ln in ext[i].listeners) {
+ if (ext[i].listeners.hasOwnProperty(ln)) {
+ listen(ln, ext[i].listeners[ln]);
+ }
+ }
+ }
+ }
+
+ }
+
+ /**
+ * LEGACY_SUPPORT
+ * @param {*} ext
+ * @param {string} name
+ */
+ function legacyExtensionLoading (ext, name) {
+ if (typeof ext === 'function') {
+ ext = ext(new showdown.Converter());
+ }
+ if (!showdown.helper.isArray(ext)) {
+ ext = [ext];
+ }
+ var valid = validate(ext, name);
+
+ if (!valid.valid) {
+ throw Error(valid.error);
+ }
+
+ for (var i = 0; i < ext.length; ++i) {
+ switch (ext[i].type) {
+ case 'lang':
+ langExtensions.push(ext[i]);
+ break;
+ case 'output':
+ outputModifiers.push(ext[i]);
+ break;
+ default:// should never reach here
+ throw Error('Extension loader error: Type unrecognized!!!');
+ }
+ }
+ }
+
+ /**
+ * Listen to an event
+ * @param {string} name
+ * @param {function} callback
+ */
+ function listen (name, callback) {
+ if (!showdown.helper.isString(name)) {
+ throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');
+ }
+
+ if (typeof callback !== 'function') {
+ throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');
+ }
+ name = name.toLowerCase();
+ if (!listeners.hasOwnProperty(name)) {
+ listeners[name] = [];
+ }
+ listeners[name].push(callback);
+ }
+
+ function rTrimInputText (text) {
+ var rsp = text.match(/^\s*/)[0].length,
+ rgx = new RegExp('^\\s{0,' + rsp + '}', 'gm');
+ return text.replace(rgx, '');
+ }
+
+ /**
+ *
+ * @param {string} evtName Event name
+ * @param {string} text Text
+ * @param {{}} options Converter Options
+ * @param {{}} globals Converter globals
+ * @param {{}} pParams extra params for event
+ * @returns showdown.helper.Event
+ * @private
+ */
+ this._dispatch = function dispatch (evtName, text, options, globals, pParams) {
+ evtName = evtName.toLowerCase();
+ var params = pParams || {};
+ params.converter = this;
+ params.text = text;
+ params.options = options;
+ params.globals = globals;
+ var event = new showdown.helper.Event(evtName, text, params);
+
+ if (listeners.hasOwnProperty(evtName)) {
+ for (var ei = 0; ei < listeners[evtName].length; ++ei) {
+ var nText = listeners[evtName][ei](event);
+ if (nText && typeof nText !== 'undefined') {
+ event.setText(nText);
+ }
+ }
+ }
+ return event;
+ };
+
+ /**
+ * Listen to an event
+ * @param {string} name
+ * @param {function} callback
+ * @returns {showdown.Converter}
+ */
+ this.listen = function (name, callback) {
+ listen(name, callback);
+ return this;
+ };
+
+ /**
+ * Converts a markdown string into HTML string
+ * @param {string} text
+ * @returns {*}
+ */
+ this.makeHtml = function (text) {
+ //check if text is not falsy
+ if (!text) {
+ return text;
+ }
+
+ var globals = {
+ gHtmlBlocks: [],
+ gHtmlMdBlocks: [],
+ gHtmlSpans: [],
+ gUrls: {},
+ gTitles: {},
+ gDimensions: {},
+ gListLevel: 0,
+ hashLinkCounts: {},
+ langExtensions: langExtensions,
+ outputModifiers: outputModifiers,
+ converter: this,
+ ghCodeBlocks: [],
+ metadata: {
+ parsed: {},
+ raw: '',
+ format: ''
+ }
+ };
+
+ // This lets us use ¨ trema as an escape char to avoid md5 hashes
+ // The choice of character is arbitrary; anything that isn't
+ // magic in Markdown will work.
+ text = text.replace(/¨/g, '¨T');
+
+ // Replace $ with ¨D
+ // RegExp interprets $ as a special character
+ // when it's in a replacement string
+ text = text.replace(/\$/g, '¨D');
+
+ // Standardize line endings
+ text = text.replace(/\r\n/g, '\n'); // DOS to Unix
+ text = text.replace(/\r/g, '\n'); // Mac to Unix
+
+ // Stardardize line spaces
+ text = text.replace(/\u00A0/g, ' ');
+
+ if (options.smartIndentationFix) {
+ text = rTrimInputText(text);
+ }
+
+ // Make sure text begins and ends with a couple of newlines:
+ text = '\n\n' + text + '\n\n';
+
+ // detab
+ text = showdown.subParser('makehtml.detab')(text, options, globals);
+
+ /**
+ * Strip any lines consisting only of spaces and tabs.
+ * This makes subsequent regexs easier to write, because we can
+ * match consecutive blank lines with /\n+/ instead of something
+ * contorted like /[ \t]*\n+/
+ */
+ text = text.replace(/^[ \t]+$/mg, '');
+
+ //run languageExtensions
+ showdown.helper.forEach(langExtensions, function (ext) {
+ text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals);
+ });
+
+ // run the sub parsers
+ text = showdown.subParser('makehtml.metadata')(text, options, globals);
+ text = showdown.subParser('makehtml.hashPreCodeTags')(text, options, globals);
+ text = showdown.subParser('makehtml.githubCodeBlocks')(text, options, globals);
+ text = showdown.subParser('makehtml.hashHTMLBlocks')(text, options, globals);
+ text = showdown.subParser('makehtml.hashCodeTags')(text, options, globals);
+ text = showdown.subParser('makehtml.stripLinkDefinitions')(text, options, globals);
+ text = showdown.subParser('makehtml.blockGamut')(text, options, globals);
+ text = showdown.subParser('makehtml.unhashHTMLSpans')(text, options, globals);
+ text = showdown.subParser('makehtml.unescapeSpecialChars')(text, options, globals);
+
+ // attacklab: Restore dollar signs
+ text = text.replace(/¨D/g, '$$');
+
+ // attacklab: Restore tremas
+ text = text.replace(/¨T/g, '¨');
+
+ // render a complete html document instead of a partial if the option is enabled
+ text = showdown.subParser('makehtml.completeHTMLDocument')(text, options, globals);
+
+ // Run output modifiers
+ showdown.helper.forEach(outputModifiers, function (ext) {
+ text = showdown.subParser('makehtml.runExtension')(ext, text, options, globals);
+ });
+
+ // update metadata
+ metadata = globals.metadata;
+ return text;
+ };
+
+ /**
+ * Converts an HTML string into a markdown string
+ * @param src
+ * @returns {string}
+ */
+ this.makeMarkdown = function (src) {
+
+ // replace \r\n with \n
+ src = src.replace(/\r\n/g, '\n');
+ src = src.replace(/\r/g, '\n'); // old macs
+
+ // due to an edge case, we need to find this: > <
+ // to prevent removing of non silent white spaces
+ // ex: this is sparta
+ src = src.replace(/>[ \t]+, '>¨NBSP;<');
+
+ var doc = showdown.helper.document.createElement('div');
+ doc.innerHTML = src;
+
+ var globals = {
+ preList: substitutePreCodeTags(doc)
+ };
+
+ // remove all newlines and collapse spaces
+ clean(doc);
+
+ // some stuff, like accidental reference links must now be escaped
+ // TODO
+ // doc.innerHTML = doc.innerHTML.replace(/\[[\S\t ]]/);
+
+ var nodes = doc.childNodes,
+ mdDoc = '';
+
+ for (var i = 0; i < nodes.length; i++) {
+ mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], globals);
+ }
+
+ function clean (node) {
+ for (var n = 0; n < node.childNodes.length; ++n) {
+ var child = node.childNodes[n];
+ if (child.nodeType === 3) {
+ if (!/\S/.test(child.nodeValue) && !/^[ ]+$/.test(child.nodeValue)) {
+ node.removeChild(child);
+ --n;
+ } else {
+ child.nodeValue = child.nodeValue.split('\n').join(' ');
+ child.nodeValue = child.nodeValue.replace(/(\s)+/g, '$1');
+ }
+ } else if (child.nodeType === 1) {
+ clean(child);
+ }
+ }
+ }
+
+ // find all pre tags and replace contents with placeholder
+ // we need this so that we can remove all indentation from html
+ // to ease up parsing
+ function substitutePreCodeTags (doc) {
+
+ var pres = doc.querySelectorAll('pre'),
+ presPH = [];
+
+ for (var i = 0; i < pres.length; ++i) {
+
+ if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') {
+ var content = pres[i].firstChild.innerHTML.trim(),
+ language = pres[i].firstChild.getAttribute('data-language') || '';
+
+ // if data-language attribute is not defined, then we look for class language-*
+ if (language === '') {
+ var classes = pres[i].firstChild.className.split(' ');
+ for (var c = 0; c < classes.length; ++c) {
+ var matches = classes[c].match(/^language-(.+)$/);
+ if (matches !== null) {
+ language = matches[1];
+ break;
+ }
+ }
+ }
+
+ // unescape html entities in content
+ content = showdown.helper.unescapeHTMLEntities(content);
+
+ presPH.push(content);
+ pres[i].outerHTML = ' ';
+ } else {
+ presPH.push(pres[i].innerHTML);
+ pres[i].innerHTML = '';
+ pres[i].setAttribute('prenum', i.toString());
+ }
+ }
+ return presPH;
+ }
+
+ return mdDoc;
+ };
+
+ /**
+ * Set an option of this Converter instance
+ * @param {string} key
+ * @param {*} value
+ */
+ this.setOption = function (key, value) {
+ options[key] = value;
+ };
+
+ /**
+ * Get the option of this Converter instance
+ * @param {string} key
+ * @returns {*}
+ */
+ this.getOption = function (key) {
+ return options[key];
+ };
+
+ /**
+ * Get the options of this Converter instance
+ * @returns {{}}
+ */
+ this.getOptions = function () {
+ return options;
+ };
+
+ /**
+ * Add extension to THIS converter
+ * @param {{}} extension
+ * @param {string} [name=null]
+ */
+ this.addExtension = function (extension, name) {
+ name = name || null;
+ _parseExtension(extension, name);
+ };
+
+ /**
+ * Use a global registered extension with THIS converter
+ * @param {string} extensionName Name of the previously registered extension
+ */
+ this.useExtension = function (extensionName) {
+ _parseExtension(extensionName);
+ };
+
+ /**
+ * Set the flavor THIS converter should use
+ * @param {string} name
+ */
+ this.setFlavor = function (name) {
+ if (!flavor.hasOwnProperty(name)) {
+ throw Error(name + ' flavor was not found');
+ }
+ var preset = flavor[name];
+ setConvFlavor = name;
+ for (var option in preset) {
+ if (preset.hasOwnProperty(option)) {
+ options[option] = preset[option];
+ }
+ }
+ };
+
+ /**
+ * Get the currently set flavor of this converter
+ * @returns {string}
+ */
+ this.getFlavor = function () {
+ return setConvFlavor;
+ };
+
+ /**
+ * Remove an extension from THIS converter.
+ * Note: This is a costly operation. It's better to initialize a new converter
+ * and specify the extensions you wish to use
+ * @param {Array} extension
+ */
+ this.removeExtension = function (extension) {
+ if (!showdown.helper.isArray(extension)) {
+ extension = [extension];
+ }
+ for (var a = 0; a < extension.length; ++a) {
+ var ext = extension[a];
+ for (var i = 0; i < langExtensions.length; ++i) {
+ if (langExtensions[i] === ext) {
+ langExtensions[i].splice(i, 1);
+ }
+ }
+ for (var ii = 0; ii < outputModifiers.length; ++i) {
+ if (outputModifiers[ii] === ext) {
+ outputModifiers[ii].splice(i, 1);
+ }
+ }
+ }
+ };
+
+ /**
+ * Get all extension of THIS converter
+ * @returns {{language: Array, output: Array}}
+ */
+ this.getAllExtensions = function () {
+ return {
+ language: langExtensions,
+ output: outputModifiers
+ };
+ };
+
+ /**
+ * Get the metadata of the previously parsed document
+ * @param raw
+ * @returns {string|{}}
+ */
+ this.getMetadata = function (raw) {
+ if (raw) {
+ return metadata.raw;
+ } else {
+ return metadata.parsed;
+ }
+ };
+
+ /**
+ * Get the metadata format of the previously parsed document
+ * @returns {string}
+ */
+ this.getMetadataFormat = function () {
+ return metadata.format;
+ };
+
+ /**
+ * Private: set a single key, value metadata pair
+ * @param {string} key
+ * @param {string} value
+ */
+ this._setMetadataPair = function (key, value) {
+ metadata.parsed[key] = value;
+ };
+
+ /**
+ * Private: set metadata format
+ * @param {string} format
+ */
+ this._setMetadataFormat = function (format) {
+ metadata.format = format;
+ };
+
+ /**
+ * Private: set metadata raw text
+ * @param {string} raw
+ */
+ this._setMetadataRaw = function (raw) {
+ metadata.raw = raw;
+ };
+ };
+
+ var root = this;
+
+// AMD Loader
+ if (typeof define === 'function' && define.amd) {
+ define(function () {
+ 'use strict';
+ return showdown;
+ });
+
+// CommonJS/nodeJS Loader
+ } else if (typeof module !== 'undefined' && module.exports) {
+ module.exports = showdown;
+
+// Regular Browser loader
+ } else {
+ root.showdown = showdown;
+ }
+}).call(this);
+
+//# sourceMappingURL=showdown.js.map
diff --git a/src/renderer/lib/smoothscroll.js b/src/renderer/lib/smoothscroll.js
new file mode 100644
index 00000000..8c694ad6
--- /dev/null
+++ b/src/renderer/lib/smoothscroll.js
@@ -0,0 +1,434 @@
+/* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */
+(function () {
+ 'use strict';
+
+ // polyfill
+ function polyfill() {
+ // aliases
+ var w = window;
+ var d = document;
+
+ // return if scroll behavior is supported and polyfill is not forced
+ if (
+ 'scrollBehavior' in d.documentElement.style &&
+ w.__forceSmoothScrollPolyfill__ !== true
+ ) {
+ return;
+ }
+
+ // globals
+ var Element = w.HTMLElement || w.Element;
+ var SCROLL_TIME = 468;
+
+ // object gathering original scroll methods
+ var original = {
+ scroll: w.scroll || w.scrollTo,
+ scrollBy: w.scrollBy,
+ elementScroll: Element.prototype.scroll || scrollElement,
+ scrollIntoView: Element.prototype.scrollIntoView
+ };
+
+ // define timing method
+ var now =
+ w.performance && w.performance.now
+ ? w.performance.now.bind(w.performance)
+ : Date.now;
+
+ /**
+ * indicates if a the current browser is made by Microsoft
+ * @method isMicrosoftBrowser
+ * @param {String} userAgent
+ * @returns {Boolean}
+ */
+ function isMicrosoftBrowser(userAgent) {
+ var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];
+
+ return new RegExp(userAgentPatterns.join('|')).test(userAgent);
+ }
+
+ /*
+ * IE has rounding bug rounding down clientHeight and clientWidth and
+ * rounding up scrollHeight and scrollWidth causing false positives
+ * on hasScrollableSpace
+ */
+ var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;
+
+ /**
+ * changes scroll position inside an element
+ * @method scrollElement
+ * @param {Number} x
+ * @param {Number} y
+ * @returns {undefined}
+ */
+ function scrollElement(x, y) {
+ this.scrollLeft = x;
+ this.scrollTop = y;
+ }
+
+ /**
+ * returns result of applying ease math function to a number
+ * @method ease
+ * @param {Number} k
+ * @returns {Number}
+ */
+ function ease(k) {
+ return 0.5 * (1 - Math.cos(Math.PI * k));
+ }
+
+ /**
+ * indicates if a smooth behavior should be applied
+ * @method shouldBailOut
+ * @param {Number|Object} firstArg
+ * @returns {Boolean}
+ */
+ function shouldBailOut(firstArg) {
+ if (
+ firstArg === null ||
+ typeof firstArg !== 'object' ||
+ firstArg.behavior === undefined ||
+ firstArg.behavior === 'auto' ||
+ firstArg.behavior === 'instant'
+ ) {
+ // first argument is not an object/null
+ // or behavior is auto, instant or undefined
+ return true;
+ }
+
+ if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {
+ // first argument is an object and behavior is smooth
+ return false;
+ }
+
+ // throw error when behavior is not supported
+ throw new TypeError(
+ 'behavior member of ScrollOptions ' +
+ firstArg.behavior +
+ ' is not a valid value for enumeration ScrollBehavior.'
+ );
+ }
+
+ /**
+ * indicates if an element has scrollable space in the provided axis
+ * @method hasScrollableSpace
+ * @param {Node} el
+ * @param {String} axis
+ * @returns {Boolean}
+ */
+ function hasScrollableSpace(el, axis) {
+ if (axis === 'Y') {
+ return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;
+ }
+
+ if (axis === 'X') {
+ return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;
+ }
+ }
+
+ /**
+ * indicates if an element has a scrollable overflow property in the axis
+ * @method canOverflow
+ * @param {Node} el
+ * @param {String} axis
+ * @returns {Boolean}
+ */
+ function canOverflow(el, axis) {
+ var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];
+
+ return overflowValue === 'auto' || overflowValue === 'scroll';
+ }
+
+ /**
+ * indicates if an element can be scrolled in either axis
+ * @method isScrollable
+ * @param {Node} el
+ * @param {String} axis
+ * @returns {Boolean}
+ */
+ function isScrollable(el) {
+ var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');
+ var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');
+
+ return isScrollableY || isScrollableX;
+ }
+
+ /**
+ * finds scrollable parent of an element
+ * @method findScrollableParent
+ * @param {Node} el
+ * @returns {Node} el
+ */
+ function findScrollableParent(el) {
+ while (el !== d.body && isScrollable(el) === false) {
+ el = el.parentNode || el.host;
+ }
+
+ return el;
+ }
+
+ /**
+ * self invoked function that, given a context, steps through scrolling
+ * @method step
+ * @param {Object} context
+ * @returns {undefined}
+ */
+ function step(context) {
+ var time = now();
+ var value;
+ var currentX;
+ var currentY;
+ var elapsed = (time - context.startTime) / SCROLL_TIME;
+
+ // avoid elapsed times higher than one
+ elapsed = elapsed > 1 ? 1 : elapsed;
+
+ // apply easing to elapsed time
+ value = ease(elapsed);
+
+ currentX = context.startX + (context.x - context.startX) * value;
+ currentY = context.startY + (context.y - context.startY) * value;
+
+ context.method.call(context.scrollable, currentX, currentY);
+
+ // scroll more if we have not reached our destination
+ if (currentX !== context.x || currentY !== context.y) {
+ w.requestAnimationFrame(step.bind(w, context));
+ }
+ }
+
+ /**
+ * scrolls window or element with a smooth behavior
+ * @method smoothScroll
+ * @param {Object|Node} el
+ * @param {Number} x
+ * @param {Number} y
+ * @returns {undefined}
+ */
+ function smoothScroll(el, x, y) {
+ var scrollable;
+ var startX;
+ var startY;
+ var method;
+ var startTime = now();
+
+ // define scroll context
+ if (el === d.body) {
+ scrollable = w;
+ startX = w.scrollX || w.pageXOffset;
+ startY = w.scrollY || w.pageYOffset;
+ method = original.scroll;
+ } else {
+ scrollable = el;
+ startX = el.scrollLeft;
+ startY = el.scrollTop;
+ method = scrollElement;
+ }
+
+ // scroll looping over a frame
+ step({
+ scrollable: scrollable,
+ method: method,
+ startTime: startTime,
+ startX: startX,
+ startY: startY,
+ x: x,
+ y: y
+ });
+ }
+
+ // ORIGINAL METHODS OVERRIDES
+ // w.scroll and w.scrollTo
+ w.scroll = w.scrollTo = function() {
+ // avoid action when no arguments are passed
+ if (arguments[0] === undefined) {
+ return;
+ }
+
+ // avoid smooth behavior if not required
+ if (shouldBailOut(arguments[0]) === true) {
+ original.scroll.call(
+ w,
+ arguments[0].left !== undefined
+ ? arguments[0].left
+ : typeof arguments[0] !== 'object'
+ ? arguments[0]
+ : w.scrollX || w.pageXOffset,
+ // use top prop, second argument if present or fallback to scrollY
+ arguments[0].top !== undefined
+ ? arguments[0].top
+ : arguments[1] !== undefined
+ ? arguments[1]
+ : w.scrollY || w.pageYOffset
+ );
+
+ return;
+ }
+
+ // LET THE SMOOTHNESS BEGIN!
+ smoothScroll.call(
+ w,
+ d.body,
+ arguments[0].left !== undefined
+ ? ~~arguments[0].left
+ : w.scrollX || w.pageXOffset,
+ arguments[0].top !== undefined
+ ? ~~arguments[0].top
+ : w.scrollY || w.pageYOffset
+ );
+ };
+
+ // w.scrollBy
+ w.scrollBy = function() {
+ // avoid action when no arguments are passed
+ if (arguments[0] === undefined) {
+ return;
+ }
+
+ // avoid smooth behavior if not required
+ if (shouldBailOut(arguments[0])) {
+ original.scrollBy.call(
+ w,
+ arguments[0].left !== undefined
+ ? arguments[0].left
+ : typeof arguments[0] !== 'object' ? arguments[0] : 0,
+ arguments[0].top !== undefined
+ ? arguments[0].top
+ : arguments[1] !== undefined ? arguments[1] : 0
+ );
+
+ return;
+ }
+
+ // LET THE SMOOTHNESS BEGIN!
+ smoothScroll.call(
+ w,
+ d.body,
+ ~~arguments[0].left + (w.scrollX || w.pageXOffset),
+ ~~arguments[0].top + (w.scrollY || w.pageYOffset)
+ );
+ };
+
+ // Element.prototype.scroll and Element.prototype.scrollTo
+ Element.prototype.scroll = Element.prototype.scrollTo = function() {
+ // avoid action when no arguments are passed
+ if (arguments[0] === undefined) {
+ return;
+ }
+
+ // avoid smooth behavior if not required
+ if (shouldBailOut(arguments[0]) === true) {
+ // if one number is passed, throw error to match Firefox implementation
+ if (typeof arguments[0] === 'number' && arguments[1] === undefined) {
+ throw new SyntaxError('Value could not be converted');
+ }
+
+ original.elementScroll.call(
+ this,
+ // use left prop, first number argument or fallback to scrollLeft
+ arguments[0].left !== undefined
+ ? ~~arguments[0].left
+ : typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,
+ // use top prop, second argument or fallback to scrollTop
+ arguments[0].top !== undefined
+ ? ~~arguments[0].top
+ : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop
+ );
+
+ return;
+ }
+
+ var left = arguments[0].left;
+ var top = arguments[0].top;
+
+ // LET THE SMOOTHNESS BEGIN!
+ smoothScroll.call(
+ this,
+ this,
+ typeof left === 'undefined' ? this.scrollLeft : ~~left,
+ typeof top === 'undefined' ? this.scrollTop : ~~top
+ );
+ };
+
+ // Element.prototype.scrollBy
+ Element.prototype.scrollBy = function() {
+ // avoid action when no arguments are passed
+ if (arguments[0] === undefined) {
+ return;
+ }
+
+ // avoid smooth behavior if not required
+ if (shouldBailOut(arguments[0]) === true) {
+ original.elementScroll.call(
+ this,
+ arguments[0].left !== undefined
+ ? ~~arguments[0].left + this.scrollLeft
+ : ~~arguments[0] + this.scrollLeft,
+ arguments[0].top !== undefined
+ ? ~~arguments[0].top + this.scrollTop
+ : ~~arguments[1] + this.scrollTop
+ );
+
+ return;
+ }
+
+ this.scroll({
+ left: ~~arguments[0].left + this.scrollLeft,
+ top: ~~arguments[0].top + this.scrollTop,
+ behavior: arguments[0].behavior
+ });
+ };
+
+ // Element.prototype.scrollIntoView
+ Element.prototype.scrollIntoView = function() {
+ // avoid smooth behavior if not required
+ if (shouldBailOut(arguments[0]) === true) {
+ original.scrollIntoView.call(
+ this,
+ arguments[0] === undefined ? true : arguments[0]
+ );
+
+ return;
+ }
+
+ // LET THE SMOOTHNESS BEGIN!
+ var scrollableParent = findScrollableParent(this);
+ var parentRects = scrollableParent.getBoundingClientRect();
+ var clientRects = this.getBoundingClientRect();
+
+ if (scrollableParent !== d.body) {
+ // reveal element inside parent
+ smoothScroll.call(
+ this,
+ scrollableParent,
+ scrollableParent.scrollLeft + clientRects.left - parentRects.left,
+ scrollableParent.scrollTop + clientRects.top - parentRects.top
+ );
+
+ // reveal parent in viewport unless is fixed
+ if (w.getComputedStyle(scrollableParent).position !== 'fixed') {
+ w.scrollBy({
+ left: parentRects.left,
+ top: parentRects.top,
+ behavior: 'smooth'
+ });
+ }
+ } else {
+ // reveal element in viewport
+ w.scrollBy({
+ left: clientRects.left,
+ top: clientRects.top,
+ behavior: 'smooth'
+ });
+ }
+ };
+ }
+
+ if (typeof exports === 'object' && typeof module !== 'undefined') {
+ // commonjs
+ module.exports = { polyfill: polyfill };
+ } else {
+ // global
+ polyfill();
+ }
+
+ }());
+
\ No newline at end of file
diff --git a/src/renderer/js/sortable.min.js b/src/renderer/lib/sortable.min.js
similarity index 100%
rename from src/renderer/js/sortable.min.js
rename to src/renderer/lib/sortable.min.js
diff --git a/src/renderer/lib/velocity.min.js b/src/renderer/lib/velocity.min.js
new file mode 100644
index 00000000..ab1fce1c
--- /dev/null
+++ b/src/renderer/lib/velocity.min.js
@@ -0,0 +1,6 @@
+/**
+ * velocity-animate (C) 2014-2017 Julian Shapiro.
+ *
+ * Licensed under the MIT license. See LICENSE file in the project root for details.
+ */
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Velocity=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n=t?function(t,n){for(var r=0;r0?i=a:t=a}while(Math.abs(o)>n&&++l=0)return n;null==e||t||console.error("VelocityJS: Trying to set 'duration' to an invalid value:",e)}function W(e,t,n){if(u(e))return S[e];if(o(e))return e;if(Array.isArray(e)){if(1===e.length)return r=e[0],C[r]||(C[r]=function(e,t,n){return 0===e?t:1===e?n:t+Math.round(e*r)*(1/r)*(n-t)});if(2===e.length)return function e(t,n,r){var i={x:-1,v:0,tension:parseFloat(t)||500,friction:parseFloat(n)||20},o=[0],a=null!=r,l=0,s=void 0,u=void 0;for(s=a?(l=e(i.tension,i.friction))/r*.016:.016;u=j(u||i,s),o.push(1+u.x),l+=16,Math.abs(u.x)>1e-4&&Math.abs(u.v)>1e-4;);return a?function(e,t,n){return 0===e?t:1===e?n:t+o[Math.floor(e*(o.length-1))]*(n-t)}:l}(e[0],e[1],t);if(4===e.length)return q.apply(null,e)||!1}var r;null==e||n||console.error("VelocityJS: Trying to set 'easing' to an invalid value:",e)}function $(e){if(!1===e)return 0;var t=parseInt(e,10);if(!isNaN(t)&&t>=0)return Math.min(t,60);null!=e&&console.warn("VelocityJS: Trying to set 'fpsLimit' to an invalid value:",e)}function G(e){switch(e){case!1:return 0;case!0:return!0;default:var t=parseInt(e,10);if(!isNaN(t)&&t>=0)return t}null!=e&&console.warn("VelocityJS: Trying to set 'loop' to an invalid value:",e)}function Q(e,t){if(!1===e||u(e))return e;null==e||t||console.warn("VelocityJS: Trying to set 'queue' to an invalid value:",e)}function D(e){switch(e){case!1:return 0;case!0:return!0;default:var t=parseInt(e,10);if(!isNaN(t)&&t>=0)return t}null!=e&&console.warn("VelocityJS: Trying to set 'repeat' to an invalid value:",e)}function U(e){if(l(e))return e;null!=e&&console.error("VelocityJS: Trying to set 'speed' to an invalid value:",e)}function Z(e){if(i(e))return e;null!=e&&console.error("VelocityJS: Trying to set 'sync' to an invalid value:",e)}var Y=void 0,X=void 0,K=void 0,ee=void 0,te=void 0,ne=void 0,re=void 0,ie=void 0,oe=void 0,ae=void 0,le=void 0,se=void 0,ue=void 0,ce=void 0,fe=void 0,de=void 0,ve=function(){function e(){t(this,e)}return n(e,null,[{key:"reset",value:function(){Y=!0,X=void 0,K=void 0,ee=0,te=w,ne=W("swing",w),re=60,ie=0,ae=980/60,le=!0,se=!0,ue="",ce=0,fe=1,de=!0}},{key:"cache",get:function(){return Y},set:function(e){void 0!==(e=z(e))&&(Y=e)}},{key:"begin",get:function(){return X},set:function(e){void 0!==(e=F(e))&&(X=e)}},{key:"complete",get:function(){return K},set:function(e){void 0!==(e=H(e))&&(K=e)}},{key:"delay",get:function(){return ee},set:function(e){void 0!==(e=R(e))&&(ee=e)}},{key:"duration",get:function(){return te},set:function(e){void 0!==(e=B(e))&&(te=e)}},{key:"easing",get:function(){return ne},set:function(e){void 0!==(e=W(e,te))&&(ne=e)}},{key:"fpsLimit",get:function(){return re},set:function(e){void 0!==(e=$(e))&&(re=e,ae=980/e)}},{key:"loop",get:function(){return ie},set:function(e){void 0!==(e=G(e))&&(ie=e)}},{key:"mobileHA",get:function(){return oe},set:function(e){i(e)&&(oe=e)}},{key:"minFrameTime",get:function(){return ae}},{key:"promise",get:function(){return le},set:function(e){void 0!==(e=function(e){if(i(e))return e;null!=e&&console.warn("VelocityJS: Trying to set 'promise' to an invalid value:",e)}(e))&&(le=e)}},{key:"promiseRejectEmpty",get:function(){return se},set:function(e){void 0!==(e=function(e){if(i(e))return e;null!=e&&console.warn("VelocityJS: Trying to set 'promiseRejectEmpty' to an invalid value:",e)}(e))&&(se=e)}},{key:"queue",get:function(){return ue},set:function(e){void 0!==(e=Q(e))&&(ue=e)}},{key:"repeat",get:function(){return ce},set:function(e){void 0!==(e=D(e))&&(ce=e)}},{key:"repeatAgain",get:function(){return ce}},{key:"speed",get:function(){return fe},set:function(e){void 0!==(e=U(e))&&(fe=e)}},{key:"sync",get:function(){return de},set:function(e){void 0!==(e=Z(e))&&(de=e)}}]),e}();Object.freeze(ve),ve.reset();var pe=[],ye={},ge=new Set,he=[],me=new Map,we="velocityData";function be(e){var t=e[we];if(t)return t;for(var n=e.ownerDocument.defaultView,r=0,i=0;i=0&&pe[r].hasOwnProperty(n)}function Ne(e,t){for(var n=be(e),r=void 0,i=he.length-1,o=n.types;!r&&i>=0;i--)o&1<=2&&console.info('Set "'+t+'": "'+n+'"',e))}function Le(e){if(e.indexOf("calc(")>=0){for(var t=e.split(/([\(\)])/),n=0,r=0;r=2&&console.info('Get "'+t+'": "'+o+'"',e),o}var De=/^#([A-f\d]{3}){1,2}$/i,Ue={function:function(e,t,n,r,i,o){return e.call(t,r,n.length,i)},number:function(e,t,n,r,i,o){return String(e)+function(e){for(var t in ye)if(ye[t].includes(e))return t;return""}(o.fn)},string:function(e,t,n,r,i,o){return Be(e)},undefined:function(e,t,n,r,i,o){return Be(Qe(t,i,o.fn)||"")}};function Ze(t,n){var r=t.tweens=Object.create(null),i=t.elements,a=t.element,s=i.indexOf(a),c=be(a),f=p(t.queue,t.options.queue),d=p(t.options.duration,ve.duration);for(var v in n)if(n.hasOwnProperty(v)){var y=Ie(v),g=Ne(a,y),h=n[v];if(!g&&"tween"!==y){Ut.debug&&console.log('Skipping "'+v+'" due to a lack of browser support.');continue}if(null==h){Ut.debug&&console.log('Skipping "'+v+'" due to no value supplied.');continue}var m=r[y]={},w=void 0,b=void 0;if(m.fn=g,o(h)&&(h=h.call(a,s,i.length,i)),Array.isArray(h)){var x=h[1],k=h[2];w=h[0],u(x)&&(/^[\d-]/.test(x)||De.test(x))||o(x)||l(x)?b=x:u(x)&&S[x]||Array.isArray(x)?(m.easing=W(x,d),b=k):b=x||k}else w=h;m.end=Ue[void 0===w?"undefined":e(w)](w,a,i,s,y,m),null==b&&!1!==f&&void 0!==c.queueList[f]||(m.start=Ue[void 0===b?"undefined":e(b)](b,a,i,s,y,m),et(y,m,d))}}var Ye=/((?:[+\-*/]=)?(?:[+-]?\d*\.\d+|[+-]?\d+)[a-z%]*|(?:.(?!$|[+-]?\d|[+\-*/]=[+-]?\d))+.|.)/g,Xe=/^([+\-*/]=)?([+-]?\d*\.\d+|[+-]?\d+)(.*)$/;function Ke(e,t){for(var n=e.length,r=[],i=[],o=void 0,a=0;a1}for(var l=[],s=l.pattern=[],c=function(e){if(u(s[s.length-1]))s[s.length-1]+=e;else if(e){s.push(e);for(var t=0;t1)){for(var r="display"===t,i="visibility"===t,a=0;a=0?H++:R.indexOf("rgb")>=0&&(H=1):H&&(H<4?s[F]=!0:H=0)}return l}function et(e,t,n,r){var i=t.start,o=t.end;if(u(o)&&u(i)){var a=Ke([i,o],e);if(!a&&r){var l=i.match(/\d\.?\d*/g)||["0"],s=l.length,c=0;a=Ke([o.replace(/\d+\.?\d*/g,function(){return l[c++%s]}),o],e)}if(a)switch(Ut.debug&&console.log("Velocity: Sequence found:",a),a[0].percent=0,a[1].percent=1,t.sequence=a,t.easing){case S["at-start"]:case S.during:case S["at-end"]:a[0].easing=a[1].easing=t.easing}}}function tt(e){if(ke.firstNew===e&&(ke.firstNew=e._next),!(1&e._flags)){var t=e.element,n=e.tweens;p(e.options.duration,ve.duration);for(var r in n){var i=n[r];if(null==i.start){var o=Qe(e.element,r);u(o)?(i.start=Be(o),et(r,i,0,!0)):Array.isArray(o)||console.warn("bad type",i,r,o)}Ut.debug&&console.log('tweensContainer "'+r+'": '+JSON.stringify(i),t)}e._flags|=1}}function nt(e){var t=e.begin||e.options.begin;if(t)try{var n=e.elements;t.call(n,n,e)}catch(e){setTimeout(function(){throw e},1)}}function rt(e){var t=e.progress||e.options.progress;if(t)try{var n=e.elements,r=e.percentComplete,i=e.options,o=e.tween;t.call(n,n,r,Math.max(0,e.timeStart+(null!=e.duration?e.duration:null!=i.duration?i.duration:ve.duration)-vt),void 0!==o?o:String(100*r),e)}catch(e){setTimeout(function(){throw e},1)}}function it(){var e=!0,t=!1,n=void 0;try{for(var r,i=lt[Symbol.iterator]();!(e=(r=i.next()).done);e=!0){rt(r.value)}}catch(e){t=!0,n=e}finally{try{!e&&i.return&&i.return()}finally{if(t)throw n}}lt.clear();var o=!0,a=!1,l=void 0;try{for(var s,u=at[Symbol.iterator]();!(o=(s=u.next()).done);o=!0){Me(s.value)}}catch(e){a=!0,l=e}finally{try{!o&&u.return&&u.return()}finally{if(a)throw l}}at.clear()}var ot=1e3/60,at=new Set,lt=new Set,st=function(){var e=window.performance||{};if("function"!=typeof e.now){var t=e.timing&&e.timing.navigationStart?e.timing.navigationStart:y();e.now=function(){return y()-t}}return e}(),ut=function(e){return setTimeout(e,Math.max(0,ot-(st.now()-vt)))},ct=window.requestAnimationFrame||ut,ft=void 0,dt=void 0,vt=0;try{(dt=new Worker(URL.createObjectURL(new Blob(["("+function(){var e=this,t=void 0;this.onmessage=function(n){switch(n.data){case!0:t||(t=setInterval(function(){e.postMessage(!0)},1e3/30));break;case!1:t&&(clearInterval(t),t=0);break;default:e.postMessage(n.data)}}}+")()"])))).onmessage=function(e){!0===e.data?pt():it()},ke.isMobile||void 0===document.hidden||document.addEventListener("visibilitychange",function(){dt.postMessage(ke.isTicking&&document.hidden)})}catch(e){}function pt(e){if(!ft){if(ft=!0,!1!==e){var t=st.now(),n=vt?t-vt:ot,r=ve.speed,i=ve.easing,o=ve.duration,a=void 0,l=void 0;if(n>=ve.minFrameTime||!vt){for(vt=t;ke.firstNew;)tt(ke.firstNew);for(a=ke.first;a&&a!==ke.firstNew;a=a._next){var s=a.element,u=be(s);if(s.parentNode&&u){var c=a.options,f=a._flags,d=a.timeStart;if(!d){var v=null!=a.queue?a.queue:c.queue;d=t-n,!1!==v&&(d=Math.max(d,u.lastFinishList[v]||0)),a.timeStart=d}16&f?a.timeStart+=n:2&f||(a._flags|=2,c._ready++)}else _e(a)}for(a=ke.first;a&&a!==ke.firstNew;a=l){var p=a._flags;if(l=a._next,2&p&&!(16&p)){var y=a.options;if(32&p&&y._readyt)continue;a.timeStart=h+=m/(m>0?g:1)}a._flags|=4,0==y._started++&&(y._first=a,y.begin&&(nt(a),y.begin=void 0))}1!==g&&(a.timeStart=h+=Math.min(n,t-h)*(1-g));var w=null!=a.easing?a.easing:null!=y.easing?y.easing:i,b=a.ellapsedTime=t-h,S=null!=a.duration?a.duration:null!=y.duration?y.duration:o,x=a.percentComplete=Ut.mock?1:Math.min(b/S,1),O=a.tweens,E=64&p;for(var _ in(a.progress||y._first===a&&y.progress)&<.add(a),1===x&&at.add(a),O){var T=O[_],M=T.sequence,V=M.pattern,q="",N=0;if(V){for(var A=(T.easing||w)(x,0,1,_),L=0,J=0;J=0?r.replace(/^.*\./,""):void 0)&&Q(e[0]),a=ve.queue;if(c(t)&&t.velocity.animations){var l=!0,s=!1,u=void 0;try{for(var f,d=t.velocity.animations[Symbol.iterator]();!(l=(f=d.next()).done);l=!0){ht(f.value,o,a,i)}}catch(e){s=!0,u=e}finally{try{!l&&d.return&&d.return()}finally{if(s)throw u}}}else for(var v=ke.first;v;)t&&!t.includes(v.element)||ht(v,o,a,i),v=v._next;n&&(c(t)&&t.velocity.animations&&t.then?t.then(n._resolver):n._resolver(t))}function wt(t,n,r,i){var o=t[0],a=t[1];if(!o)return console.warn("VelocityJS: Cannot access a non-existant property!"),null;if(void 0===a&&!s(o)){if(Array.isArray(o)){if(1===n.length){var f={},d=!0,v=!1,p=void 0;try{for(var y,g=o[Symbol.iterator]();!(d=(y=g.next()).done);d=!0){var h=y.value;f[h]=Be(Qe(n[0],h))}}catch(e){v=!0,p=e}finally{try{!d&&g.return&&g.return()}finally{if(v)throw p}}return f}var m=[],w=!0,b=!1,S=void 0;try{for(var x,k=n[Symbol.iterator]();!(w=(x=k.next()).done);w=!0){var O=x.value,E={},_=!0,T=!1,M=void 0;try{for(var V,q=o[Symbol.iterator]();!(_=(V=q.next()).done);_=!0){var N=V.value;E[N]=Be(Qe(O,N))}}catch(e){T=!0,M=e}finally{try{!_&&q.return&&q.return()}finally{if(T)throw M}}m.push(E)}}catch(e){b=!0,S=e}finally{try{!w&&k.return&&k.return()}finally{if(b)throw S}}return m}if(1===n.length)return Be(Qe(n[0],o));var A=[],L=!0,J=!1,I=void 0;try{for(var j,C=n[Symbol.iterator]();!(L=(j=C.next()).done);L=!0){var P=j.value;A.push(Be(Qe(P,o)))}}catch(e){J=!0,I=e}finally{try{!L&&C.return&&C.return()}finally{if(J)throw I}}return A}var z=[];if(s(o)){for(var F in o)if(o.hasOwnProperty(F)){var H=!0,R=!1,B=void 0;try{for(var W,$=n[Symbol.iterator]();!(H=(W=$.next()).done);H=!0){var G=W.value,Q=o[F];u(Q)||l(Q)?Ae(G,F,o[F]):(z.push('Cannot set a property "'+F+'" to an unknown type: '+(void 0===Q?"undefined":e(Q))),console.warn('VelocityJS: Cannot set a property "'+F+'" to an unknown type:',Q))}}catch(e){R=!0,B=e}finally{try{!H&&$.return&&$.return()}finally{if(R)throw B}}}}else if(u(a)||l(a)){var D=!0,U=!1,Z=void 0;try{for(var Y,X=n[Symbol.iterator]();!(D=(Y=X.next()).done);D=!0){Ae(Y.value,o,String(a))}}catch(e){U=!0,Z=e}finally{try{!D&&X.return&&X.return()}finally{if(U)throw Z}}}else z.push('Cannot set a property "'+o+'" to an unknown type: '+(void 0===a?"undefined":e(a))),console.warn('VelocityJS: Cannot set a property "'+o+'" to an unknown type:',a);r&&(z.length?r._rejecter(z.join(", ")):c(n)&&n.velocity.animations&&n.then?n.then(r._resolver):r._resolver(n))}function bt(e,t,n){tt(e),void 0!==t&&t!==p(e.queue,e.options.queue,n)||(e._flags|=8,Me(e))}m(["option",function(e,t,n,r){var i=e[0],o=r.indexOf(".")>=0?r.replace(/^.*\./,""):void 0,a="false"!==o&&Q(o,!0),l=void 0,s=e[1];if(!i)return console.warn("VelocityJS: Cannot access a non-existant key!"),null;if(c(t)&&t.velocity.animations)l=t.velocity.animations;else{l=[];for(var u=ke.first;u;u=u._next)t.indexOf(u.element)>=0&&p(u.queue,u.options.queue)===a&&l.push(u);if(t.length>1&&l.length>1){for(var f=1,d=l[0].options;f, "tween", percentComplete, property, end | [end, , ], ) => value\nVelocity(, "tween", percentComplete, {property: end | [end, , ], ...}, ) => {property: value, ...}'),null;t=[document.body],o=!0}var a=e[0],c={elements:t,element:t[0],queue:!1,options:{duration:1e3},tweens:null},f={},d=e[1],v=void 0,y=void 0,g=e[2],h=0;if(u(e[1])?Te&&Te[e[1]]?(y=Te[e[1]],d={},g=e[2]):(v=!0,d=r({},e[1],e[2]),g=e[3]):Array.isArray(e[1])&&(v=!0,d={tween:e[1]},g=e[2]),!l(a)||a<0||a>1)throw new Error("VelocityJS: Must tween a percentage from 0 to 1!");if(!s(d))throw new Error("VelocityJS: Cannot tween an invalid property!");if(o)for(var m in d)if(d.hasOwnProperty(m)&&(!Array.isArray(d[m])||d[m].length<2))throw new Error("VelocityJS: When not supplying an element you must force-feed values: "+m);var b=W(p(g,ve.easing),w);for(var S in y?tn(c,y):Ze(c,d),c.tweens){var x=c.tweens[S],O=x.sequence,E=O.pattern,_="",T=0;if(h++,E){for(var M=(x.easing||b)(a,0,1,S),V=0,q=0;q4;e--){var t=document.createElement("div");if(t.innerHTML="\x3c!--[if IE "+e+"]> 100)console.warn("VelocityJS: Trying to use an invalid value as a percentage (0 <= n <= 100):",r,x);else if(isNaN(x))console.warn("VelocityJS: Trying to use an invalid number as a percentage:",r,v,S);else for(var k in o[String(x)]||(o[String(x)]=[]),o[String(x)].push(v),i[v])c.includes(k)||c.push(k)}}catch(e){g=!0,h=e}finally{try{!y&&b.return&&b.return()}finally{if(g)throw h}}}}var O=Object.keys(o).sort(function(e,t){var n=parseFloat(e),r=parseFloat(t);return n>r?1:n1&&(u(ae[1])||Array.isArray(ae[1]))&&(Q[D].easing=W(ae[1],f.duration||w)),Q[D++].percent=parseFloat(ee)/100)}}catch(e){ne=!0,re=e}finally{try{!te&&oe.return&&oe.return()}finally{if(ne)throw re}}}}catch(e){Z=!0,Y=e}finally{try{!U&&K.return&&K.return()}finally{if(Z)throw Y}}f.tweens[A]=Q}}}}catch(e){_=!0,T=e}finally{try{!E&&V.return&&V.return()}finally{if(_)throw T}}}else console.warn("VelocityJS: Trying to set 'registerSequence' sequence to an invalid value:",r,i);else console.warn("VelocityJS: Trying to set 'registerSequence' name to an invalid value:",r)}}],!0);var nn=void 0;try{nn=Promise}catch(e){}var rn=", if that is deliberate then pass `promiseRejectEmpty:false` as an option";function on(e,t){v(t,"promise",e),v(t,"then",e.then.bind(e)),v(t,"catch",e.catch.bind(e)),e.finally&&v(t,"finally",e.finally.bind(e))}function an(){var e,t=ve,n=arguments.length<=0?void 0:arguments[0],r=s(n)&&(n.p||s(n.properties)&&!n.properties.names||u(n.properties)),y=0,g=void 0,m=void 0,w=void 0,b=void 0,S=void 0,x=void 0,k=void 0;(a(this)?g=[this]:f(this)?(g=d(this),c(this)&&(b=this.velocity.animations)):r?(g=d(n.elements||n.e),y++):a(n)?(g=d([n]),y++):f(n)&&(g=d(n),y++),g&&(v(g,"velocity",an.bind(g)),b&&v(g.velocity,"animations",b)),r)?m=p(n.properties,n.p):(e=y++,m=arguments.length<=e?void 0:arguments[e]);var O="reverse"===m,E=!O&&u(m),_=E&&Te[m],T=r?p(n.options,n.o):arguments.length<=y?void 0:arguments[y];if(s(T)&&(w=T),nn&&p(w&&w.promise,t.promise)&&(S=new nn(function(e,t){k=t,x=function(t){c(t)&&t.promise?(delete t.then,delete t.catch,delete t.finally,e(t),on(t.promise,t)):e(t)}}),g&&on(S,g)),S){var M=w&&w.promiseRejectEmpty,V=p(M,t.promiseRejectEmpty);g||E?m||(V?k("Velocity: No properties supplied"+(i(M)?"":rn)+". Aborting."):x()):V?k("Velocity: No elements supplied"+(i(M)?"":rn)+". Aborting."):x()}if(!g&&!E||!m)return S;if(E){for(var q=[],N=S&&{_promise:S,_resolver:x,_rejecter:k};y4;e--){var t=document.createElement("div");if(t.innerHTML="\x3c!--[if IE "+e+"]> 2.5)return void this.scrollToLeft(t.scrollLeft+o)}var l=t.clientWidth*this.displacement;this.scrollToLeft(t.scrollLeft+l)},scrollToIndex:function(t){var e=this.children();if(e[t]){var n=this.$refs.container,i=e[t].getBoundingClientRect().left-n.getBoundingClientRect().left;this.scrollToLeft(n.scrollLeft+i)}},scrollToLeft:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"smooth",n=this.$refs.container;n.scrollTo({left:t,behavior:e})},onScroll:function(){var t=this.$refs.container;t&&(this.$emit("scroll",{left:t.scrollLeft}),clearTimeout(this.debounceId),this.debounceId=setTimeout(this.onScrollDebounce,100))},onScrollDebounce:function(){var t=this;this.refresh((function(e){t.$emit("scroll-debounce",e)}))},refresh:function(t){var e=this;this.$nextTick((function(){var n=e.calculate();e.left=n.left,e.width=n.width,e.scrollWidth=n.scrollWidth,e.hasNext=n.hasNext,e.hasPrev=n.hasPrev,null==t||t(n)}))},calculate:function(){var t=this.$refs.container,e=this.children()[0];return{left:t.scrollLeft,width:t.clientWidth,scrollWidth:t.scrollWidth,hasNext:t.scrollWidth>t.scrollLeft+t.clientWidth+2.5,hasPrev:function(){var n,i;if(0===t.scrollLeft)return!1;var o=t.getBoundingClientRect().left,l=null!==(n=null==e||null===(i=e.getBoundingClientRect())||void 0===i?void 0:i.left)&&void 0!==n?n:0;return Math.abs(o-l)>=2.5}()}}}});function o(t,e,n,i,o,l,r,a,s,c){"boolean"!=typeof r&&(s=a,a=r,r=!1);const d="function"==typeof n?n.options:n;let h;if(t&&t.render&&(d.render=t.render,d.staticRenderFns=t.staticRenderFns,d._compiled=!0,o&&(d.functional=!0)),i&&(d._scopeId=i),l?(h=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),e&&e.call(this,s(t)),t&&t._registeredComponents&&t._registeredComponents.add(l)},d._ssrRegister=h):e&&(h=r?function(t){e.call(this,c(t,this.$root.$options.shadowRoot))}:function(t){e.call(this,a(t))}),h)if(d.functional){const t=d.render;d.render=function(e,n){return h.call(n),t(e,n)}}else{const t=d.beforeCreate;d.beforeCreate=t?[].concat(t,h):[h]}return n}const l="undefined"!=typeof navigator&&/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());function r(t){return(t,e)=>function(t,e){const n=l?e.media||"default":t,i=s[n]||(s[n]={ids:new Set,styles:[]});if(!i.ids.has(t)){i.ids.add(t);let n=e.source;if(e.map&&(n+="\n/*# sourceURL="+e.map.sources[0]+" */",n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e.map))))+" */"),i.element||(i.element=document.createElement("style"),i.element.type="text/css",e.media&&i.element.setAttribute("media",e.media),void 0===a&&(a=document.head||document.getElementsByTagName("head")[0]),a.appendChild(i.element)),"styleSheet"in i.element)i.styles.push(n),i.element.styleSheet.cssText=i.styles.filter(Boolean).join("\n");else{const t=i.ids.size-1,e=document.createTextNode(n),o=i.element.childNodes;o[t]&&i.element.removeChild(o[t]),o.length?i.element.insertBefore(e,o[t]):i.element.appendChild(e)}}}(t,e)}let a;const s={};var c=o({render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"vue-horizontal",staticStyle:{position:"relative",display:"flex"}},[t.button&&t.hasPrev?n("div",{staticClass:"v-hl-btn v-hl-btn-prev",class:{"v-hl-btn-between":t.buttonBetween},attrs:{role:"button"},on:{click:function(e){return e.stopPropagation(),t.prev(e)}}},[t._t("btn-prev",[n("svg",{staticClass:"v-hl-svg",attrs:{viewBox:"0 0 24 24","aria-label":"horizontal scroll area navigate to previous button"}},[n("path",{attrs:{d:"m9.8 12 5 5a1 1 0 1 1-1.4 1.4l-5.7-5.7a1 1 0 0 1 0-1.4l5.7-5.7a1 1 0 0 1 1.4 1.4l-5 5z"}})])])],2):t._e(),t._v(" "),t.button&&t.hasNext?n("div",{staticClass:"v-hl-btn v-hl-btn-next",class:{"v-hl-btn-between":t.buttonBetween},attrs:{role:"button"},on:{click:function(e){return e.stopPropagation(),t.next(e)}}},[t._t("btn-next",[n("svg",{staticClass:"v-hl-svg",attrs:{viewBox:"0 0 24 24","aria-label":"horizontal scroll area navigate to next button"}},[n("path",{attrs:{d:"m14.3 12.1-5-5a1 1 0 0 1 1.4-1.4l5.7 5.7a1 1 0 0 1 0 1.4l-5.7 5.7a1 1 0 0 1-1.4-1.4l5-5z"}})])])],2):t._e(),t._v(" "),n("div",{ref:"container",staticClass:"v-hl-container",class:{"v-hl-responsive":t.responsive,"v-hl-scroll":t.scroll,"v-hl-snap-start":"start"===t.snap,"v-hl-snap-center":"center"===t.snap,"v-hl-snap-end":"end"===t.snap},on:{"&scroll":function(e){return t.onScroll(e)}}},[t._t("default")],2)])},staticRenderFns:[]},(function(t){t&&t("data-v-45080727_0",{source:".v-hl-btn[data-v-45080727]{position:absolute;align-self:center;z-index:1;top:0;bottom:0;display:flex;align-items:center;cursor:pointer}.v-hl-btn-prev[data-v-45080727]{left:0}.v-hl-btn-prev.v-hl-btn-between[data-v-45080727]{transform:translateX(-50%)}.v-hl-btn-next[data-v-45080727]{right:0}.v-hl-btn-next.v-hl-btn-between[data-v-45080727]{transform:translateX(50%)}.v-hl-svg[data-v-45080727]{width:40px;height:40px;margin:6px;padding:6px;border-radius:20px;box-sizing:border-box;background:#fff;color:#000;fill:currentColor;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}.v-hl-container[data-v-45080727]{display:flex;width:100%;margin:0;padding:0;border:none;box-sizing:content-box;overflow-x:scroll;overflow-y:hidden;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch}.v-hl-container>*[data-v-45080727]{flex-shrink:0;box-sizing:border-box;min-height:1px}.v-hl-snap-start>*[data-v-45080727]{scroll-snap-align:start}.v-hl-snap-center>*[data-v-45080727]{scroll-snap-align:center}.v-hl-snap-end>*[data-v-45080727]{scroll-snap-align:end}.v-hl-container[data-v-45080727]:not(.v-hl-scroll){scrollbar-width:none;-ms-overflow-style:none;padding-bottom:30px;margin-bottom:-30px;clip-path:inset(0 0 30px 0)}.v-hl-container[data-v-45080727]:not(.v-hl-scroll)::-webkit-scrollbar{width:0!important;height:0!important}.v-hl-responsive>*[data-v-45080727]{width:100%;margin-right:24px}.v-hl-responsive[data-v-45080727]>:last-child{margin-right:0}@media (min-width:640px){.v-hl-responsive>*[data-v-45080727]{width:calc((100% - 24px)/ 2)}}@media (min-width:768px){.v-hl-responsive>*[data-v-45080727]{width:calc((100% - 48px)/ 3)}}@media (min-width:1024px){.v-hl-responsive>*[data-v-45080727]{width:calc((100% - 72px)/ 4)}}@media (min-width:1280px){.v-hl-responsive>*[data-v-45080727]{width:calc((100% - 96px)/ 5)}}",map:void 0,media:void 0})}),i,"data-v-45080727",!1,void 0,!1,r,void 0,void 0),d=function(t){d.installed||(d.installed=!0,t.component("VueHorizontal",c))},h={install:d},u=null;return"undefined"!=typeof window?u=window.Vue:"undefined"!=typeof global&&(u=global.Vue),u&&u.use(h),c.install=d,t.default=c,Object.defineProperty(t,"__esModule",{value:!0}),t}({},Vue);
\ No newline at end of file
diff --git a/src/renderer/js/vue-observe-visibility.min.js b/src/renderer/lib/vue-observe-visibility.min.js
similarity index 100%
rename from src/renderer/js/vue-observe-visibility.min.js
rename to src/renderer/lib/vue-observe-visibility.min.js
diff --git a/src/renderer/js/vue.dev.js b/src/renderer/lib/vue.dev.js
similarity index 100%
rename from src/renderer/js/vue.dev.js
rename to src/renderer/lib/vue.dev.js
diff --git a/src/renderer/js/vue.js b/src/renderer/lib/vue.js
similarity index 100%
rename from src/renderer/js/vue.js
rename to src/renderer/lib/vue.js
diff --git a/src/renderer/js/vuedraggable.umd.min.js b/src/renderer/lib/vuedraggable.umd.min.js
similarity index 100%
rename from src/renderer/js/vuedraggable.umd.min.js
rename to src/renderer/lib/vuedraggable.umd.min.js
diff --git a/src/renderer/js/vuex.min.js b/src/renderer/lib/vuex.min.js
similarity index 100%
rename from src/renderer/js/vuex.min.js
rename to src/renderer/lib/vuex.min.js
diff --git a/src/renderer/main/app.js b/src/renderer/main/app.js
new file mode 100644
index 00000000..c3c2b59b
--- /dev/null
+++ b/src/renderer/main/app.js
@@ -0,0 +1,30 @@
+import { app } from "./vueapp.js"
+import {CiderCache} from './cidercache.js'
+import {CiderFrontAPI} from './ciderfrontapi.js'
+import {simulateGamepad} from './gamepad.js'
+import {CiderAudio} from '../audio/audio.js'
+import {Events} from './events.js'
+import { wsapi } from "./wsapi_interop.js"
+import { MusicKitTools } from "./musickittools.js"
+
+
+// Define window objects
+window.app = app
+window.MusicKitTools = MusicKitTools
+window.CiderAudio = CiderAudio
+window.CiderCache = CiderCache
+window.CiderFrontAPI = CiderFrontAPI
+window.wsapi = wsapi
+
+// Mount Vue to #app
+app.$mount("#app")
+
+// Init CiderAudio
+if (app.cfg.advanced.AudioContext){
+ CiderAudio.init()
+}
+
+// Import gamepad support
+app.simulateGamepad = simulateGamepad
+
+Events.InitEvents()
\ No newline at end of file
diff --git a/src/renderer/main/cidercache.js b/src/renderer/main/cidercache.js
new file mode 100644
index 00000000..c28550c1
--- /dev/null
+++ b/src/renderer/main/cidercache.js
@@ -0,0 +1,24 @@
+const CiderCache = {
+ async getCache(file) {
+ let cache = await ipcRenderer.sendSync("get-cache", file)
+ if (isJson(cache)) {
+ cache = JSON.parse(cache)
+ if (Object.keys(cache).length === 0) {
+ cache = false
+ }
+ } else {
+ cache = false
+ }
+ return cache
+ },
+ async putCache(file, data) {
+ console.log(`Caching ${file}`)
+ ipcRenderer.invoke("put-cache", {
+ file: file,
+ data: JSON.stringify(data)
+ })
+ return true
+ }
+}
+
+export {CiderCache}
\ No newline at end of file
diff --git a/src/renderer/main/ciderfrontapi.js b/src/renderer/main/ciderfrontapi.js
new file mode 100644
index 00000000..145bd770
--- /dev/null
+++ b/src/renderer/main/ciderfrontapi.js
@@ -0,0 +1,32 @@
+const CiderFrontAPI = {
+ Objects: {
+ MenuEntry: function () {
+ this.id = ""
+ this.name = ""
+ this.onClick = () => {
+ }
+ }
+ },
+ AddMenuEntry(entry) {
+ app.pluginMenuEntries.push(entry)
+ app.pluginInstalled = true
+ },
+ StyleSheets: {
+ Add(href) {
+ console.log("Adding stylesheet: " + href)
+ let id = uuidv4()
+ let link = document.createElement("link")
+ link.rel = "stylesheet/less"
+ link.type = "text/css"
+ link.href = href
+ link.setAttribute("css-id", id)
+ // insert the link before document.querySelector("#userTheme") in head
+ document.querySelector("head").insertBefore(link, document.querySelector("#userTheme"))
+ less.registerStylesheetsImmediately()
+ less.refresh(true, true, true)
+ return link
+ }
+ }
+}
+
+export {CiderFrontAPI}
\ No newline at end of file
diff --git a/src/renderer/main/events.js b/src/renderer/main/events.js
new file mode 100644
index 00000000..23236e41
--- /dev/null
+++ b/src/renderer/main/events.js
@@ -0,0 +1,74 @@
+const Events = {
+ InitEvents() {
+ const app = window.app
+ // Key binds
+ document.addEventListener('keydown', function (e) {
+ if (e.keyCode === 70 && e.ctrlKey) {
+ app.$refs.searchInput.focus()
+ app.$refs.searchInput.select()
+ }
+ });
+
+// add event listener for when window.location.hash changes
+ window.addEventListener("hashchange", function () {
+ app.appRoute(window.location.hash)
+ });
+
+ // Key bind to unjam MusicKit in case it fails: CTRL+F10
+
+ document.addEventListener('keydown', function (event) {
+ if (event.ctrlKey && event.keyCode == 121) {
+ try {
+ app.mk._services.mediaItemPlayback._currentPlayer.stop()
+ } catch (e) {
+ }
+ try {
+ app.mk._services.mediaItemPlayback._currentPlayer.destroy()
+ } catch (e) {
+ }
+ }
+ });
+
+ window.addEventListener("mouseup", (e) => {
+ if (e.button === 3) {
+ e.preventDefault()
+ app.navigateBack()
+ } else if (e.button === 4) {
+ e.preventDefault()
+ app.navigateForward()
+ }
+ });
+
+ document.addEventListener('keydown', function (event) {
+ if (event.ctrlKey && event.keyCode == 122) {
+ try {
+ ipcRenderer.send('detachDT', '')
+ } catch (e) {
+ }
+ }
+ });
+
+ // Hang Timer
+ app.hangtimer = setTimeout(() => {
+ if (confirm("Cider is not responding. Reload the app?")) {
+ window.location.reload()
+ }
+ }, 10000)
+
+// Refresh Focus
+ function refreshFocus() {
+ if (document.hasFocus() == false) {
+ app.windowFocus(false)
+ } else {
+ app.windowFocus(true)
+ }
+ setTimeout(refreshFocus, 200);
+ }
+
+ app.getHTMLStyle()
+
+ refreshFocus();
+ }
+}
+
+export {Events}
\ No newline at end of file
diff --git a/src/renderer/main/gamepad.js b/src/renderer/main/gamepad.js
new file mode 100644
index 00000000..a902cd5f
--- /dev/null
+++ b/src/renderer/main/gamepad.js
@@ -0,0 +1,327 @@
+function simulateGamepad () {
+ const app = window.app
+ app.chrome.showCursor = true
+ let cursorPos = [0, 0];
+ let intTabIndex = 0
+ const cursorSpeedPvt = 8
+ const cursorSize = 16
+ let scrollSpeed = 8
+ let buttonPressDelay = 500
+ let stickDeadZone = 0.2
+ let scrollGroup = null
+ let scrollGroupY = null
+ let elementFocusEnabled = true
+ let start;
+
+ let cursorSpeed = cursorSpeedPvt
+
+ let lastButtonPress = {
+
+ }
+
+ var sounds = {
+ Confirm: new Audio("./sounds/confirm.ogg"),
+ Menu: new Audio("./sounds/btn1.ogg"),
+ Hover: new Audio("./sounds/hover.ogg")
+ }
+
+ let element = document.elementFromPoint(0, 0)
+ let elementType = 0
+
+ function appLoop() {
+ var gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);
+ if (!gamepads) {
+ return;
+ }
+
+ var gp = gamepads[0];
+
+ // LEFT STICK
+ if (gp.axes[0] > stickDeadZone) {
+ cursorPos[0] += (gp.axes[0] * cursorSpeed)
+ } else if (gp.axes[0] < -stickDeadZone) {
+ cursorPos[0] += (gp.axes[0] * cursorSpeed)
+ }
+
+ if (gp.axes[1] > stickDeadZone) {
+ cursorPos[1] += (gp.axes[1] * cursorSpeed)
+ } else if (gp.axes[1] < -stickDeadZone) {
+ cursorPos[1] += (gp.axes[1] * cursorSpeed)
+ }
+
+ if (cursorPos[0] < cursorSize) {
+ cursorPos[0] = cursorSize
+ }
+ if (cursorPos[1] < cursorSize) {
+ cursorPos[1] = cursorSize
+ }
+ if (cursorPos[0] > window.innerWidth - cursorSize) {
+ cursorPos[0] = window.innerWidth - cursorSize
+ }
+ if (cursorPos[1] > window.innerHeight - cursorSize) {
+ cursorPos[1] = window.innerHeight - cursorSize
+ }
+
+
+ // RIGHT STICK.
+ if (scrollGroupY) {
+ if (gp.axes[3] > stickDeadZone) {
+ $(scrollGroupY).scrollTop($(scrollGroupY).scrollTop() + (gp.axes[3] * scrollSpeed))
+ elementFocusEnabled = false
+ } else if (gp.axes[3] < -stickDeadZone) {
+ $(scrollGroupY).scrollTop($(scrollGroupY).scrollTop() + (gp.axes[3] * scrollSpeed))
+ elementFocusEnabled = false
+ } else {
+ elementFocusEnabled = true
+ }
+ }
+
+
+
+ if (scrollGroup) {
+ if (gp.axes[2] > stickDeadZone) {
+ $(scrollGroup).scrollLeft($(scrollGroup).scrollLeft() + (gp.axes[2] * scrollSpeed))
+ elementFocusEnabled = false
+ } else if (gp.axes[2] < -stickDeadZone) {
+ $(scrollGroup).scrollLeft($(scrollGroup).scrollLeft() + (gp.axes[2] * scrollSpeed))
+ elementFocusEnabled = false
+ } else {
+ elementFocusEnabled = true
+ }
+ }
+
+
+ $(".cursor").css({
+ top: cursorPos[1] + "px",
+ left: cursorPos[0] + "px",
+ display: "block"
+ })
+
+ // A BUTTON
+ if (gp.buttons[0].pressed) {
+ if (!lastButtonPress["A"]) {
+ lastButtonPress["A"] = 0
+ }
+ if (Date.now() - lastButtonPress["A"] > buttonPressDelay) {
+ lastButtonPress["A"] = Date.now()
+ sounds.Confirm.play()
+ if (elementType == 0) {
+ document.activeElement.dispatchEvent(new Event("click"))
+ document.activeElement.dispatchEvent(new Event("controller-click"))
+ } else {
+ element.dispatchEvent(new Event("click"))
+ element.dispatchEvent(new Event("controller-click"))
+ }
+ }
+ }
+
+ // B BUTTON
+ if (gp.buttons[1].pressed) {
+
+ if (!lastButtonPress["B"]) {
+ lastButtonPress["B"] = 0
+ }
+ if (Date.now() - lastButtonPress["B"] > buttonPressDelay) {
+ lastButtonPress["B"] = Date.now()
+ if (elementType == 0) {
+ document.activeElement.dispatchEvent(new Event("contextmenu"))
+ setTimeout(() => {
+ if ($(".menu-option").length > 0) {
+ let bounds = $(".menu-option")[0].getBoundingClientRect()
+ cursorPos[0] = bounds.left + (bounds.width / 2)
+ cursorPos[1] = bounds.top + (bounds.height / 2)
+ }
+ }, 100)
+ } else {
+ element.dispatchEvent(new Event("contextmenu"))
+ }
+ }
+
+ }
+
+ // right bumper
+ if (gp.buttons[5].pressed) {
+ if (!lastButtonPress["RB"]) {
+ lastButtonPress["RB"] = 0
+ }
+ if (Date.now() - lastButtonPress["RB"] > buttonPressDelay) {
+ lastButtonPress["RB"] = Date.now()
+ app.navigateForward()
+
+ }
+ }
+
+ // left bumper
+ if (gp.buttons[4].pressed) {
+ if (!lastButtonPress["LB"]) {
+ lastButtonPress["LB"] = 0
+ }
+ if (Date.now() - lastButtonPress["LB"] > buttonPressDelay) {
+ lastButtonPress["LB"] = Date.now()
+ app.navigateBack()
+
+ }
+ }
+
+
+
+ // cursor hover
+ if (elementFocusEnabled) {
+ element = document.elementFromPoint(cursorPos[0], cursorPos[1])
+ }
+
+ if (element) {
+
+ let closest = element.closest("[tabindex], input, button, a")
+
+ // VERT SCROLL
+ let scrollGroupCloY = element.closest(`[scrollaxis="y"]`)
+ if (scrollGroupCloY) {
+ scrollGroupY = scrollGroupCloY
+ }
+
+
+ // HOZ SCROLL
+ let scrollGroupClo = element.closest(".v-hl-container")
+
+ if (scrollGroupClo) {
+ if (scrollGroupClo.classList.contains("v-hl-container")) {
+ scrollGroup = scrollGroupClo
+ scrollGroup.style["scroll-snap-type"] = "unset"
+ } else {
+ scrollGroup.style["scroll-snap-type"] = ""
+ scrollGroup = null
+ }
+ }
+
+ if (closest) {
+ elementType = 0
+ closest.focus()
+ } else {
+ if (closest) {
+ closest.blur()
+ }
+ elementType = 1
+ element.focus()
+ }
+ cursorSpeed = cursorSpeedPvt
+ if (!element.classList.contains("app-chrome")
+ && !element.classList.contains("app-content")) {
+ cursorSpeed = cursorSpeedPvt
+ }
+ // console.log($._data($(element), "events"))
+ } else {
+ cursorSpeed = 12
+ }
+ // console.log(gp.axes[0], gp.axes[1])
+ start = requestAnimationFrame(appLoop);
+ }
+
+// controller pairing
+ notyf.error("Press the button on your controller to pair it to Cider.")
+ window.addEventListener("gamepadconnected", function (e) {
+ console.log("Gamepad connected at index %d: %s. %d buttons, %d axes.",
+ e.gamepad.index, e.gamepad.id,
+ e.gamepad.buttons.length, e.gamepad.axes.length);
+ notyf.success("Pairing successful!")
+ appLoop()
+ }, { once: true });
+
+ document.addEventListener("keydown", (e) => {
+ sounds.Confirm.currentTime = 0
+ sounds.Menu.currentTime = 0
+ sounds.Hover.currentTime = 0
+ let tabbable = $("[tabindex]")
+ console.log(e.key)
+ switch (e.key) {
+ default:
+ break;
+ case "ArrowLeft":
+ e.preventDefault()
+
+ cursorPos[0] -= cursorSpeed
+ break;
+ case "ArrowRight":
+ e.preventDefault()
+
+ cursorPos[0] += cursorSpeed
+ break;
+ case "ArrowUp":
+ e.preventDefault()
+
+ cursorPos[1] -= cursorSpeed
+ // sounds.Hover.play()
+ // if(intTabIndex <= 0) {
+ // intTabIndex = 0
+ // }else{
+ // intTabIndex--
+ // }
+ // $(tabbable[intTabIndex]).focus()
+ // $("#app-content").scrollTop($(document.activeElement).offset().top)
+ break;
+ case "ArrowDown":
+ e.preventDefault()
+
+ cursorPos[1] += cursorSpeed
+ // if(intTabIndex < tabbable.length) {
+ // intTabIndex++
+ // }else{
+ // intTabIndex = tabbable.length
+ // }
+ // $(tabbable[intTabIndex]).focus()
+ // $("#app-content").scrollTop($(document.activeElement).offset().top)
+ break;
+ case "c":
+ app.resetState()
+ break;
+ case "x":
+ // set cursorPos to the top right of the screen
+ // sounds.Menu.play()
+ if (elementType == 0) {
+ document.activeElement.dispatchEvent(new Event("contextmenu"))
+ } else {
+ element.dispatchEvent(new Event("contextmenu"))
+ }
+
+ e.preventDefault()
+ break;
+ case "z":
+ sounds.Confirm.play()
+ if (elementType == 0) {
+ document.activeElement.dispatchEvent(new Event("click"))
+ document.activeElement.dispatchEvent(new Event("controller-click"))
+ } else {
+ element.dispatchEvent(new Event("click"))
+ element.dispatchEvent(new Event("controller-click"))
+ }
+
+ e.preventDefault()
+ break;
+ }
+
+ $(".cursor").css({
+ top: cursorPos[1] + "px",
+ left: cursorPos[0] + "px"
+ })
+ function lerp(a, b, n) {
+ return (1 - n) * a + n * b
+ }
+
+
+ element = document.elementFromPoint(cursorPos[0], cursorPos[1])
+
+ if (element) {
+ let closest = element.closest("[tabindex], input, button, a")
+ if (closest) {
+ elementType = 0
+ closest.focus()
+ } else {
+ elementType = 1
+ element.focus()
+ }
+ }
+ console.log(element)
+ });
+}
+
+export {simulateGamepad}
\ No newline at end of file
diff --git a/src/renderer/main/musickittools.js b/src/renderer/main/musickittools.js
new file mode 100644
index 00000000..8967f4a9
--- /dev/null
+++ b/src/renderer/main/musickittools.js
@@ -0,0 +1,42 @@
+const MusicKitTools = {
+ async v3Continuous ({
+ href,
+ options = {},
+ reqOptions = {},
+ onProgress = () => {},
+ onError = () => {},
+ onSuccess = () => {}
+ } = {}) {
+ let returnData = []
+ async function sendReq(href, options) {
+ const response = await app.mk.api.v3.music(href, options).catch(error => onError)
+
+ returnData = returnData.concat(response.data.data)
+ if(response.data.next) {
+ onProgress({
+ response: response,
+ total: returnData.length
+ })
+ try {
+ await sendReq(response.data.next, options)
+ }catch(e){
+ await sendReq(response.data.next, options)
+ }
+ }
+ }
+
+ await sendReq(href, options)
+ onSuccess(returnData)
+ return returnData
+ },
+ getHeader() {
+ return new Headers({
+ Authorization: 'Bearer ' + MusicKit.getInstance().developerToken,
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ 'Music-User-Token': '' + MusicKit.getInstance().musicUserToken
+ });
+ }
+}
+
+export { MusicKitTools }
\ No newline at end of file
diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js
new file mode 100644
index 00000000..617b87ba
--- /dev/null
+++ b/src/renderer/main/vueapp.js
@@ -0,0 +1,4006 @@
+import { store } from './vuex-store.js';
+
+Vue.use(VueHorizontal);
+Vue.use(VueObserveVisibility);
+Vue.use(BootstrapVue)
+/* @namespace */
+const app = new Vue({
+ store: store,
+ data: {
+ version: ipcRenderer.sendSync("get-version"),
+ appMode: "player",
+ ipcRenderer: ipcRenderer,
+ cfg: ipcRenderer.sendSync("getStore"),
+ isDev: ipcRenderer.sendSync("is-dev"),
+ drawertest: false,
+ platform: "",
+ mk: {},
+ quickPlayQuery: "",
+ pluginInstalled: false,
+ pluginMenuEntries: [],
+ lz: ipcRenderer.sendSync("get-i18n", "en_US"),
+ lzListing: ipcRenderer.sendSync("get-i18n-listing"),
+ search: {
+ term: "",
+ hints: [],
+ showHints: false,
+ results: {},
+ resultsSocial: {},
+ limit: 10
+ },
+ fullscreenLyrics: false,
+ playerLCD: {
+ playbackDuration: 0,
+ desiredDuration: 0,
+ userInteraction: false
+ },
+ drawer: {
+ open: false,
+ panel: ""
+ },
+ browsepage: [],
+ listennow: [],
+ madeforyou: [],
+ radio: {
+ personal: []
+ },
+ mklang: 'en',
+ webview: {
+ url: "",
+ title: "",
+ loading: false
+ },
+ showingPlaylist: [],
+ appleCurator: [],
+ artistPage: {
+ data: {},
+ },
+ library: {
+ backgroundNotification: {
+ show: false,
+ message: "",
+ total: 0,
+ progress: 0
+ },
+ songs: {
+ sortingOptions: {
+ "albumName": "0",
+ "artistName": "0",
+ "name": "0",
+ "genre": "0",
+ "releaseDate": "0",
+ "durationInMillis": "0",
+ "dateAdded": "0"
+ },
+ sorting: "name",
+ sortOrder: "asc",
+ listing: [],
+ meta: { total: 0, progress: 0 },
+ search: "",
+ displayListing: [],
+ downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library
+ },
+ albums: {
+ sortingOptions: {
+ "albumName": "0",
+ "artistName": "0",
+ "name": "0",
+ "genre": "0"
+ },
+ viewAs: 'covers',
+ sorting: ["dateAdded", "name"], // [0] = recentlyadded page, [1] = albums page
+ sortOrder: ["desc", "asc"], // [0] = recentlyadded page, [1] = albums page
+ listing: [],
+ meta: { total: 0, progress: 0 },
+ search: "",
+ displayListing: [],
+ downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library
+ },
+ artists: {
+ sortingOptions: {
+ "artistName": "0",
+ "name": "0",
+ "genre": "0",
+ "releaseDate": "0"
+ },
+ viewAs: 'covers',
+ sorting: ["dateAdded", "name"], // [0] = recentlyadded page, [1] = albums page
+ sortOrder: ["desc", "asc"], // [0] = recentlyadded page, [1] = albums page
+ listing: [],
+ meta: { total: 0, progress: 0 },
+ search: "",
+ displayListing: [],
+ downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library
+ },
+ },
+ playlists: {
+ listing: [],
+ details: {},
+ loadingState: 0, // 0 loading, 1 loaded, 2 error
+ id: "",
+ trackMapping: {}
+ },
+ webremoteurl: "",
+ webremoteqr: "",
+ mxmtoken: "",
+ mkIsReady: false,
+ playerReady: false,
+ animateBackground: false,
+ currentArtUrl: '',
+ currentArtUrlRaw: '',
+ lyricon: false,
+ currentTrackID: '',
+ currentTrackIDBG: '',
+ lyrics: [],
+ currentLyricsLine: 0,
+ lyriccurrenttime: 0,
+ richlyrics: [],
+ lyricsMediaItem: {},
+ lyricsDebug: {
+ current: 0,
+ start: 0,
+ end: 0
+ },
+ v3: {
+ requestBody: {
+ platform: "web"
+ }
+ },
+ tmpHeight: '',
+ tmpWidth: '',
+ tmpVar: [],
+ notification: false,
+ chrome: {
+ appliedTheme: {
+ location: "",
+ info: {}
+ },
+ desiredPageTransition: "wpfade_transform",
+ hideUserInfo: ipcRenderer.sendSync("is-dev") || false,
+ artworkReady: false,
+ userinfo: {
+ "id": "",
+ "attributes": {
+ "name": "Cider User",
+ "handle": "CiderUser",
+ "artwork": { "url": "./assets/logocut.png" }
+ }
+ },
+ menuOpened: false,
+ maximized: false,
+ drawerOpened: false,
+ drawerState: "queue",
+ topChromeVisible: true,
+ progresshover: false,
+ windowControlPosition: "right",
+ contentAreaScrolling: true,
+ showCursor: false
+ },
+ collectionList: {
+ response: {},
+ title: "",
+ type: ""
+ },
+ prevButtonBackIndicator: false,
+ currentSongInfo: {},
+ page: "",
+ pageHistory: [],
+ songstest: false,
+ hangtimer: null,
+ selectedMediaItems: [],
+ routes: ["browse", "listen_now", "radio"],
+ musicBaseUrl: "https://api.music.apple.com/",
+ modals: {
+ addToPlaylist: false,
+ spatialProperties: false,
+ qrcode: false,
+ equalizer: false,
+ audioSettings: false,
+ pluginMenu: false,
+ audioControls: false,
+ showPlaylist: false,
+ castMenu: false
+ },
+ socialBadges: {
+ badgeMap: {},
+ version: "",
+ mediaItems: [],
+ mediaItemDLState: 0 // 0 = not started, 1 = in progress, 2 = complete
+ },
+ menuPanel: {
+ visible: false,
+ event: null,
+ content: {
+ name: "",
+ items: {},
+ headerItems: {}
+ }
+ },
+ pauseButtonTimer: null,
+ activeCasts: [],
+ pluginPages: {
+ page: "hello-world",
+ pages: [],
+ }
+ },
+ watch: {
+ cfg: {
+ handler: function (val, oldVal) {
+ console.log(`cfg changed from ${oldVal} to ${val}`);
+ ipcRenderer.send("setStore", val);
+ },
+ deep: true
+ },
+ page: () => {
+ document.getElementById("app-content").scrollTo(0, 0);
+ app.resetState()
+ },
+ showingPlaylist: () => {
+ if (!app.modals.showPlaylist) {
+ document.getElementById("app-content").scrollTo(0, 0);
+ app.resetState()
+ }
+ },
+ artistPage: () => {
+ document.getElementById("app-content").scrollTo(0, 0);
+ app.resetState()
+ }
+ },
+ methods: {
+ songLinkShare(amUrl) {
+ notyf.open({ type: "info", className: "notyf-info", message: app.getLz('term.song.link.generate') })
+ let self = this
+ let httpRequest = new XMLHttpRequest();
+ httpRequest.open('GET', `https://api.song.link/v1-alpha.1/links?url=${amUrl}&userCountry=US`, true);
+ httpRequest.send();
+ httpRequest.onreadystatechange = function () {
+ if (httpRequest.readyState === 4) {
+ if (httpRequest.status === 200) {
+ let response = JSON.parse(httpRequest.responseText);
+ console.log(response);
+ self.copyToClipboard(response.pageUrl)
+ } else {
+ console.log('There was a problem with the request.');
+ notyf.error(app.getLz('term.requestError'))
+ }
+ }
+ }
+ },
+ mainMenuVisibility(val) {
+ if (val) {
+ (this.mk.isAuthorized) ? this.chrome.menuOpened = !this.chrome.menuOpened : false;
+ if (!this.mk.isAuthorized) {
+ this.mk.authorize()
+ }
+ } else {
+ setTimeout(() => {
+ this.chrome.menuOpened = false
+ }, 100)
+ }
+ },
+ stringTemplateParser(expression, valueObj) {
+ const templateMatcher = /{{\s?([^{}\s]*)\s?}}/g;
+ let text = expression.replace(templateMatcher, (substring, value, index) => {
+ value = valueObj[value];
+ return value;
+ });
+ return text
+ // stringTemplateParser('my name is {{name}} and age is {{age}}', {name: 'Tom', age:100})
+ },
+ async setLz(lang) {
+ if (lang == "") {
+ lang = this.cfg.general.language
+ }
+ this.lz = ipcRenderer.sendSync("get-i18n", lang)
+ this.mklang = await this.MKJSLang()
+ },
+ /**
+ * Grabs translation for localization.
+ * @param {string} message - The key to grab the translated term
+ * @param {object} options - Optional options
+ * @author booploops#7139
+ * @memberOf app
+ */
+ getLz(message, options = {}) {
+ if (this.lz[message]) {
+ if (options["count"]) {
+ if (typeof this.lz[message] === "object") {
+ let type = window.fastPluralRules.getPluralFormNameForCardinalByLocale(this.cfg.general.language.replace("_", "-"), options["count"]);
+ return this.lz[message][type] ?? ((this.lz[message])[Object.keys(this.lz[message])[0]] ?? this.lz[message])
+ } else {
+ // fallback English plural forms ( old i18n )
+ if (options["count"] > 1) {
+ return this.lz[message + "s"] ?? this.lz[message]
+ } else {
+ return this.lz[message] ?? this.lz[message + "s"]
+ }
+ }
+ } else if (typeof this.lz[message] === "object") {
+ return (this.lz[message])[Object.keys(this.lz[message])[0]]
+ }
+ return this.lz[message]
+ } else {
+ return message
+ }
+ },
+ setLzManual() {
+ app.$data.library.songs.sortingOptions = {
+ "albumName": app.getLz('term.sortBy.album'),
+ "artistName": app.getLz('term.sortBy.artist'),
+ "name": app.getLz('term.sortBy.name'),
+ "genre": app.getLz('term.sortBy.genre'),
+ "releaseDate": app.getLz('term.sortBy.releaseDate'),
+ "durationInMillis": app.getLz('term.sortBy.duration'),
+ "dateAdded": app.getLz('term.sortBy.dateAdded')
+ }
+
+ app.$data.library.albums.sortingOptions = {
+ "albumName": app.getLz('term.sortBy.album'),
+ "artistName": app.getLz('term.sortBy.artist'),
+ "name": app.getLz('term.sortBy.name'),
+ "genre": app.getLz('term.sortBy.genre')
+ }
+
+ app.$data.library.artists.sortingOptions = {
+ "artistName": app.getLz('term.sortBy.artist'),
+ "name": app.getLz('term.sortBy.name'),
+ "genre": app.getLz('term.sortBy.genre'),
+ "releaseDate": app.getLz('term.sortBy.releaseDate')
+ }
+ },
+ async showSocialListeningTo() {
+ let contentIds = Object.keys(app.socialBadges.badgeMap)
+ app.showCollection({ data: this.socialBadges.mediaItems }, "Friends Listening To", "albums")
+ if (this.socialBadges.mediaItemDLState == 1 || this.socialBadges.mediaItemDLState == 2) {
+ return
+ }
+ this.socialBadges.mediaItemDLState = 2
+ await asyncForEach(contentIds, async (item) => {
+ try {
+ let type = "albums"
+ if (item.includes("pl.")) {
+ type = "playlists"
+ }
+ if (item.includes("ra.")) {
+ type = "stations"
+ }
+ let found = await app.mk.api.v3.music(`/v1/catalog/us/${type}/${item}`)
+ this.socialBadges.mediaItems.push(found.data.data[0])
+ } catch (e) {
+
+ }
+ })
+ },
+ async openAppleMusicURL(url) {
+ let properties = MusicKit.formattedMediaURL(url)
+ let item = {
+ id: properties.contentId,
+ attributes: {
+ playParams: {
+ id: properties.contentId,
+ kind: properties.kind,
+ }
+ },
+ type: properties.kind,
+ kind: properties.kind
+ }
+ app.routeView(item)
+ },
+ saveFile(fileName, urlFile) {
+ let a = document.createElement("a");
+ a.style = "display: none";
+ document.body.appendChild(a);
+ a.href = urlFile;
+ a.download = fileName;
+ a.click();
+ window.URL.revokeObjectURL(url);
+ a.remove();
+ },
+ async showMenuPanel(data, event) {
+ app.menuPanel.visible = true;
+ app.menuPanel.content.name = data.name ?? "";
+ app.menuPanel.content.items = data.items ?? {};
+ app.menuPanel.content.headerItems = data.headerItems ?? {};
+ if (event) {
+ app.menuPanel.event = event;
+ }
+ },
+ async getSvgIcon(url) {
+ let response = await fetch(url);
+ let data = await response.text();
+ return data;
+ },
+ getSocialBadges(cb = () => {
+ }) {
+ let self = this
+ try {
+ app.mk.api.v3.music("/v1/social/badging-map").then(data => {
+ self.socialBadges.badgeMap = data.data.results.badgingMap
+ cb(data.data.results.badgingMap)
+ })
+ } catch (ex) {
+ this.socialBadges.badgeMap = {}
+ }
+ },
+ addFavorite(id, type) {
+ this.cfg.home.favoriteItems.push({
+ id: id,
+ type: type
+ });
+ },
+ modularUITest(val = false) {
+ this.fullscreenLyrics = val;
+ if (val) {
+ document.querySelector("#app-main").classList.add("modular-fs")
+ } else {
+ document.querySelector("#app-main").classList.remove("modular-fs")
+ }
+ },
+ navigateBack() {
+ this.chrome.desiredPageTransition = "wpfade_transform_backwards"
+ return new Promise((resolve, reject) => {
+ history.back()
+ setTimeout(() => {
+
+
+ resolve(this.chrome.desiredPageTransition = "wpfade_transform")
+ }, 100)
+ })
+ },
+ navigateForward() {
+ history.forward()
+ },
+ getHTMLStyle() {
+ // document.querySelector("html").style.background = "#222";
+ document.querySelector("body").classList.add("notransparency")
+ },
+ resetState() {
+ this.menuPanel.visible = false;
+ app.selectedMediaItems = [];
+ this.chrome.contentAreaScrolling = true
+ for (let key in app.modals) {
+ app.modals[key] = false;
+ }
+ },
+ promptAddToPlaylist() {
+ app.modals.addToPlaylist = true;
+ },
+ async addSelectedToNewPlaylist() {
+ let self = this
+ let pl_items = []
+ for (let i = 0; i < self.selectedMediaItems.length; i++) {
+ if (self.selectedMediaItems[i].kind == "song" || self.selectedMediaItems[i].kind == "songs") {
+ self.selectedMediaItems[i].kind = "songs"
+ pl_items.push({
+ id: self.selectedMediaItems[i].id,
+ type: self.selectedMediaItems[i].kind
+ })
+ } else if ((self.selectedMediaItems[i].kind == "album" || self.selectedMediaItems[i].kind == "albums") && self.selectedMediaItems[i].isLibrary != true) {
+ self.selectedMediaItems[i].kind = "albums"
+ let res = await self.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/albums/${self.selectedMediaItems[i].id}/tracks`);
+ let ids = res.data.data.map(function (i) {
+ return { id: i.id, type: i.type }
+ })
+ pl_items = pl_items.concat(ids)
+ } else if (self.selectedMediaItems[i].kind == "library-song" || self.selectedMediaItems[i].kind == "library-songs") {
+ self.selectedMediaItems[i].kind = "library-songs"
+ pl_items.push({
+ id: self.selectedMediaItems[i].id,
+ type: self.selectedMediaItems[i].kind
+ })
+ } else if ((self.selectedMediaItems[i].kind == "library-album" || self.selectedMediaItems[i].kind == "library-albums") || (self.selectedMediaItems[i].kind == "album" && self.selectedMediaItems[i].isLibrary == true)) {
+ self.selectedMediaItems[i].kind = "library-albums"
+ let res = await self.mk.api.v3.music(`/v1/me/library/albums/${self.selectedMediaItems[i].id}/tracks`);
+ let ids = res.data.data.map(function (i) {
+ return { id: i.id, type: i.type }
+ })
+ pl_items = pl_items.concat(ids)
+ } else {
+ pl_items.push({
+ id: self.selectedMediaItems[i].id,
+ type: self.selectedMediaItems[i].kind
+ })
+ }
+ }
+ this.modals.addToPlaylist = false
+ app.newPlaylist(app.getLz('term.newPlaylist'), pl_items)
+ },
+ async addSelectedToPlaylist(playlist_id) {
+ let self = this
+ let pl_items = []
+ for (let i = 0; i < self.selectedMediaItems.length; i++) {
+ if (self.selectedMediaItems[i].kind == "song" || self.selectedMediaItems[i].kind == "songs") {
+ self.selectedMediaItems[i].kind = "songs"
+ pl_items.push({
+ id: self.selectedMediaItems[i].id,
+ type: self.selectedMediaItems[i].kind
+ })
+ } else if ((self.selectedMediaItems[i].kind == "album" || self.selectedMediaItems[i].kind == "albums") && self.selectedMediaItems[i].isLibrary != true) {
+ self.selectedMediaItems[i].kind = "albums"
+ let res = await self.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/albums/${self.selectedMediaItems[i].id}/tracks`);
+ let ids = res.data.data.map(function (i) {
+ return { id: i.id, type: i.type }
+ })
+ pl_items = pl_items.concat(ids)
+ } else if (self.selectedMediaItems[i].kind == "library-song" || self.selectedMediaItems[i].kind == "library-songs") {
+ self.selectedMediaItems[i].kind = "library-songs"
+ pl_items.push({
+ id: self.selectedMediaItems[i].id,
+ type: self.selectedMediaItems[i].kind
+ })
+ } else if ((self.selectedMediaItems[i].kind == "library-album" || self.selectedMediaItems[i].kind == "library-albums") || (self.selectedMediaItems[i].kind == "album" && self.selectedMediaItems[i].isLibrary == true)) {
+ self.selectedMediaItems[i].kind = "library-albums"
+ let res = await self.mk.api.v3.music(`/v1/me/library/albums/${self.selectedMediaItems[i].id}/tracks`);
+ let ids = res.data.data.map(function (i) {
+ return { id: i.id, type: i.type }
+ })
+ pl_items = pl_items.concat(ids)
+ } else {
+ pl_items.push({
+ id: self.selectedMediaItems[i].id,
+ type: self.selectedMediaItems[i].kind
+ })
+ }
+
+ }
+ this.modals.addToPlaylist = false
+ await app.mk.api.v3.music(
+ `/v1/me/library/playlists/${playlist_id}/tracks`, {}, {
+ fetchOptions: {
+ method: "POST",
+ body: JSON.stringify({
+ data: pl_items
+ })
+ }
+ }
+ ).then(() => {
+ if (this.page == 'playlist_' + this.showingPlaylist.id) {
+ this.getPlaylistFromID(this.showingPlaylist.id, true)
+ }
+ })
+ },
+ async init() {
+ let self = this
+ if (this.cfg.visual.theme != "default.less" && this.cfg.visual.theme != "") {
+ this.setTheme(this.cfg.visual.theme)
+ }
+
+ this.setLz(this.cfg.general.language)
+ this.setLzManual()
+ clearTimeout(this.hangtimer)
+ this.mk = MusicKit.getInstance()
+ let needsReload = (typeof localStorage["music.ampwebplay.media-user-token"] == "undefined")
+ this.mk.authorize().then(() => {
+ self.mkIsReady = true
+ if (needsReload) {
+ document.location.reload()
+ }
+ })
+ this.$forceUpdate()
+ if (this.isDev) {
+ this.mk.privateEnabled = true
+ // Hide UserInfo if Dev mode
+ } else {
+ // Get Hide User from Settings
+ this.chrome.hideUserInfo = !this.cfg.visual.showuserinfo
+ this.mk.privateEnabled = this.cfg.general.privateEnabled
+ }
+ if (this.cfg.visual.hw_acceleration == "disabled") {
+ document.body.classList.add("no-gpu")
+ }
+ this.mk._services.timing.mode = 0
+ this.platform = ipcRenderer.sendSync('cider-platform');
+
+ this.mklang = await this.MKJSLang()
+
+ try {
+ // Set profile name
+ this.chrome.userinfo = (await app.mk.api.v3.music(`/v1/me/social-profile`)).data.data[0]
+ } catch (err) {
+ }
+
+ this.mk._bag.features['seamless-audio-transitions'] = this.cfg.audio.seamless_audio
+
+ // API Fallback
+ if (!this.chrome.userinfo) {
+ this.chrome.userinfo = {
+ "id": "",
+ "attributes": {
+ "name": "Cider User",
+ "handle": "CiderUser",
+ "artwork": { "url": "./assets/logocut.png" }
+ }
+ }
+ }
+ MusicKitInterop.init()
+ // Set the volume
+
+ // Check the value of this.cfg.audio.muted
+ if (!this.cfg.audio.muted) {
+ // Set the mk.volume to the last stored volume data
+ this.mk.volume = this.cfg.audio.volume
+ } else if (this.cfg.audio.muted) {
+ // Set mk.volume to -1 (setting to 0 wont work, so temp solution setting to -1)
+ this.mk.volume = -1;
+ }
+ // ipcRenderer.invoke('getStoreValue', 'audio.volume').then((value) => {
+ // self.mk.volume = value
+ // })
+
+ // load cached library
+ let librarySongs = await CiderCache.getCache("library-songs")
+ let libraryAlbums = await CiderCache.getCache("library-albums")
+ if (librarySongs) {
+ this.library.songs.listing = librarySongs
+ this.library.songs.displayListing = this.library.songs.listing
+ }
+ if (libraryAlbums) {
+ this.library.albums.listing = libraryAlbums
+ this.library.albums.displayListing = this.library.albums.listing
+ }
+
+ window.onbeforeunload = function (e) {
+ window.localStorage.setItem("currentTrack", JSON.stringify(app.mk.nowPlayingItem))
+ window.localStorage.setItem("currentTime", JSON.stringify(app.mk.currentPlaybackTime))
+ window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items))
+ };
+
+ if (typeof MusicKit.PlaybackBitrate[app.cfg.audio.quality] !== "string") {
+ app.mk.bitrate = MusicKit.PlaybackBitrate[app.cfg.audio.quality]
+ } else {
+ app.mk.bitrate = 256
+ app.cfg.audio.quality = "HIGH"
+ }
+
+ switch (this.cfg.general.resumeOnStartupBehavior) {
+ default:
+ case "local":
+ // load last played track
+ try {
+ let lastItem = window.localStorage.getItem("currentTrack")
+ let time = window.localStorage.getItem("currentTime")
+ let queue = window.localStorage.getItem("currentQueue")
+ if (lastItem != null) {
+ lastItem = JSON.parse(lastItem)
+ let kind = lastItem.attributes.playParams.kind;
+ let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
+ app.mk.setQueue({
+ [truekind]: [lastItem.attributes.playParams.id],
+ parameters: { l: app.mklang }
+ })
+ app.mk.mute()
+ setTimeout(() => {
+ app.mk.play().then(() => {
+ app.mk.pause().then(() => {
+ if (time != null) {
+ app.mk.seekToTime(time)
+ }
+ app.mk.unmute()
+ if (queue != null) {
+ queue = JSON.parse(queue)
+ if (queue && queue.length > 0) {
+ let ids = queue.map(e => (e.playParams ? e.playParams.id : (e.attributes.playParams ? e.attributes.playParams.id : '')))
+ let i = 0;
+ if (ids.length > 0) {
+ for (let id of ids) {
+ if (!(i == 0 && ids[0] == lastItem.attributes.playParams.id)) {
+ try {
+ app.mk.playLater({ songs: [id] })
+ } catch (err) {
+ }
+ }
+ i++;
+ }
+ }
+ }
+ }
+
+ })
+
+ })
+ }, 1500)
+
+ }
+
+ } catch (e) {
+ console.log(e)
+ }
+ break;
+ case "history":
+ let history = await app.mk.api.v3.music(`/v1/me/recent/played/tracks`, { l: app.mklang })
+ if (history.data.data.length > 0) {
+ let lastItem = history.data.data[0]
+ let kind = lastItem.attributes.playParams.kind;
+ let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
+ app.mk.setQueue({
+ [truekind]: [lastItem.attributes.playParams.id],
+ parameters: { l: app.mklang }
+ })
+ app.mk.mute()
+ setTimeout(() => {
+ app.mk.play().then(() => {
+ app.mk.pause().then(() => {
+ app.mk.unmute()
+ })
+ })
+ }, 1500)
+ }
+
+ break;
+ case "disabled":
+
+ break;
+ }
+
+ MusicKit.getInstance().videoContainerElement = document.getElementById("apple-music-video-player")
+
+ ipcRenderer.on('theme-update', (event, arg) => {
+ less.refresh(true, true, true)
+ self.setTheme(self.cfg.visual.theme, true)
+ })
+
+ ipcRenderer.on('SoundCheckTag', (event, tag) => {
+ // let replaygain = self.parseSCTagToRG(tag)
+ let soundcheck = tag.split(" ")
+ let numbers = []
+ for (let item of soundcheck) {
+ numbers.push(parseInt(item, 16))
+
+ }
+ numbers.shift()
+ let peak = Math.max(numbers[6], numbers[7]) / 32768.0
+ let gain = Math.pow(10, ((-7.63 - (Math.log10(peak) * 20)) / 20))// EBU R 128 Compliant
+ console.debug(`[Cider][MaikiwiSoundCheck] Peak Gain: '${Math.log10(peak) * 20}' dB | Adjusting '${Math.log10(gain) * 20}' dB`)
+ try {
+ //CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak)))
+ CiderAudio.audioNodes.gainNode.gain.value = gain
+ } catch (e) {
+ }
+ })
+
+ ipcRenderer.on('play', function (_event, mode, id) {
+ if (mode !== 'url') {
+ self.mk.setQueue({ [mode]: id, parameters: { l: self.mklang } }).then(() => {
+ app.mk.play()
+ })
+
+ } else {
+ app.openAppleMusicURL(id)
+ }
+ });
+
+ this.mk.addEventListener(MusicKit.Events.playbackStateDidChange, () => {
+ ipcRenderer.send('wsapi-updatePlaybackState', wsapi.getAttributes());
+ })
+
+ this.mk.addEventListener(MusicKit.Events.playbackTimeDidChange, (a) => {
+ self.lyriccurrenttime = self.mk.currentPlaybackTime
+ this.currentSongInfo = a
+ self.playerLCD.playbackDuration = (self.mk.currentPlaybackTime)
+ // wsapi
+ ipcRenderer.send('wsapi-updatePlaybackState', wsapi.getAttributes());
+ })
+
+ this.mk.addEventListener(MusicKit.Events.nowPlayingItemDidChange, (a) => {
+ if (self.$refs.queue) {
+ self.$refs.queue.updateQueue();
+ }
+ this.currentSongInfo = a
+
+
+ if (app.cfg.audio.normalization) {
+ // get unencrypted audio previews to get SoundCheck's normalization tag
+ try {
+ let previewURL = null
+ try {
+ previewURL = app.mk.nowPlayingItem.previewURL
+ } catch (e) {
+ }
+ if (previewURL == null && ((app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)) != -1)) {
+ app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)}`).then((response) => {
+ previewURL = response.data.data[0].attributes.previews[0].url
+ if (previewURL)
+ ipcRenderer.send('getPreviewURL', previewURL)
+ })
+ } else {
+ if (previewURL)
+ ipcRenderer.send('getPreviewURL', previewURL)
+ }
+
+ } catch (e) {
+ }
+ }
+
+
+ try {
+ a = a.item.attributes;
+ } catch (_) {
+ }
+ let type = (self.mk.nowPlayingItem != null) ? self.mk.nowPlayingItem["type"] ?? '' : '';
+
+ if (type.includes("musicVideo") || type.includes("uploadedVideo") || type.includes("music-movie")) {
+ document.getElementById("apple-music-video-container").style.display = "block";
+ // app.chrome.topChromeVisible = false
+ } else {
+ document.getElementById("apple-music-video-container").style.display = "none";
+ // app.chrome.topChromeVisible = true
+ }
+ self.chrome.artworkReady = false
+ self.lyrics = []
+ self.richlyrics = []
+ app.getCurrentArtURL();
+ // app.getNowPlayingArtwork(42);
+ app.getNowPlayingArtworkBG(32);
+ app.loadLyrics();
+
+ // Playback Notifications
+ if (this.cfg.general.playbackNotifications && !document.hasFocus() && a.artistName && a.artwork && a.name) {
+ if (this.notification) {
+ this.notification.close()
+ }
+ this.notification = new Notification(a.name, {
+ body: a.artistName,
+ icon: a.artwork.url.replace('/{w}x{h}bb', '/512x512bb').replace('/2000x2000bb', '/35x35bb'),
+ silent: true,
+ });
+ }
+
+ })
+
+
+ this.mk.addEventListener(MusicKit.Events.playbackVolumeDidChange, (_a) => {
+ this.cfg.audio.volume = this.mk.volume
+ })
+
+ this.refreshPlaylists(this.isDev)
+ document.body.removeAttribute("loading")
+ if (window.location.hash != "") {
+ this.appRoute(window.location.hash)
+ } else {
+ this.page = "home"
+ }
+
+ this.mediaKeyFixes()
+
+ setTimeout(() => {
+ this.getSocialBadges()
+ this.getBrowsePage();
+ this.$forceUpdate()
+ }, 500)
+ ipcRenderer.invoke("renderer-ready", true)
+ document.querySelector("#LOADER").remove()
+ if (this.cfg.general.themeUpdateNotification) {
+ this.checkForThemeUpdates()
+ }
+ },
+ async checkForThemeUpdates() {
+ let self = this
+ const themes = ipcRenderer.sendSync("get-themes")
+ await asyncForEach(themes, async (theme) => {
+ if (theme.commit != "") {
+ await fetch(`https://api.github.com/repos/${theme.github_repo}/commits`)
+ .then(res => res.json())
+ .then(res => {
+ if (res[0].sha != theme.commit) {
+ const notify = notyf.open({ className: "notyf-info", type: "info", message: `[Themes] ${theme.name} has an update available.` })
+ notify.on("click", () => {
+ app.appRoute("themes-github")
+ notyf.dismiss(notify)
+ })
+ }
+ })
+ }
+ })
+ },
+ async setTheme(theme = "", onlyPrefs = false) {
+ console.log(theme)
+ if (this.cfg.visual.theme == "") {
+ this.cfg.visual.theme = "default.less"
+ }
+ if (theme == "") {
+ theme = this.cfg.visual.theme
+ } else {
+ this.cfg.visual.theme = ""
+ this.cfg.visual.theme = theme
+ }
+ const info = {}
+ try {
+ const infoResponse = await fetch("themes/" + app.cfg.visual.theme.replace("index.less", "theme.json"))
+ this.chrome.appliedTheme.info = await infoResponse.json()
+ } catch (e) {
+ e = null
+ console.warn("failed to get theme.json")
+ this.chrome.appliedTheme.info = {}
+ }
+
+
+ if (!onlyPrefs) {
+ document.querySelector("#userTheme").href = `themes/${this.cfg.visual.theme}`
+ document.querySelectorAll(`[id*='less']`).forEach(el => {
+ el.remove()
+ });
+ less.refresh()
+ }
+ },
+ getThemeDirective(directive = "") {
+ let directives = {}
+ if (typeof this.chrome.appliedTheme.info.directives == "object") {
+ directives = this.chrome.appliedTheme.info.directives
+ }
+ if (directives[directive]) {
+ return this.chrome.appliedTheme.info.directives[directive].value
+ } else if (this.cfg.visual.directives[directive]) {
+ return this.cfg.visual.directives.windowLayout
+ } else {
+ return ""
+ }
+ },
+ unauthorize() {
+ bootbox.confirm(app.getLz('term.confirmLogout'), function (result) {
+ if (result) {
+ app.mk.unauthorize()
+ document.location.reload()
+ }
+ });
+ },
+ getAppClasses() {
+ let classes = {}
+ if (this.cfg.advanced.experiments.includes('compactui')) {
+ classes.compact = true
+ }
+ if (this.cfg.visual.window_background_style == "none") {
+ classes.simplebg = true
+ }
+
+ if (this.getThemeDirective('windowLayout') == 'twopanel') {
+ classes.twopanel = true
+ }
+ return classes
+ },
+ invokeDrawer(panel) {
+ if (this.drawer.panel == panel && this.drawer.open) {
+ if (panel == "lyrics") {
+ this.lyricon = false
+ }
+ this.drawer.panel = ""
+ this.drawer.open = false
+ } else {
+ if (panel == "lyrics") {
+ this.lyricon = true
+ } else {
+ this.lyricon = false
+ }
+ this.drawer.open = true
+ this.drawer.panel = panel
+ }
+ },
+ select_removeMediaItem(id) {
+ this.selectedMediaItems.filter(item => item.guid == id).forEach(item => {
+ this.selectedMediaItems.splice(this.selectedMediaItems.indexOf(item), 1)
+ })
+ },
+ select_hasMediaItem(id) {
+ let found = this.selectedMediaItems.find(item => item.guid == id)
+ if (found) {
+ return true
+ } else {
+ return false
+ }
+ },
+ select_selectMediaItem(id, kind, index, guid, library) {
+ if (!this.select_hasMediaItem(guid)) {
+ this.selectedMediaItems.push({
+ id: id,
+ kind: kind,
+ index: index,
+ guid: guid,
+ isLibrary: library
+ })
+ }
+ },
+ getPlaylistFolderChildren(id) {
+ return this.playlists.listing.filter(playlist => {
+ if (playlist.parent == id) {
+ return playlist
+ }
+ })
+ },
+ async refreshPlaylists(localOnly = false) {
+ let self = this
+ let trackMap = this.cfg.advanced.playlistTrackMapping
+ let newListing = []
+ let trackMapping = {}
+ const cachedPlaylist = await CiderCache.getCache("library-playlists")
+ const cachedTrackMapping = await CiderCache.getCache("library-playlists-tracks")
+
+ if (cachedPlaylist) {
+ console.log("using cached playlists")
+ this.playlists.listing = cachedPlaylist
+ self.sortPlaylists()
+ } else {
+ console.log("playlist has no cache")
+ }
+
+ if (cachedTrackMapping) {
+ console.log("using cached track mapping")
+ this.playlists.trackMapping = cachedTrackMapping
+ }
+ if (localOnly) {
+ return
+ }
+
+ this.library.backgroundNotification.message = "Building playlist cache..."
+ this.library.backgroundNotification.show = true
+
+ async function deepScan(parent = "p.playlistsroot") {
+ console.log(`scanning ${parent}`)
+ const playlistData = await app.mk.api.v3.music(`/v1/me/library/playlist-folders/${parent}/children/`)
+ await asyncForEach(playlistData.data.data, async (playlist) => {
+ playlist.parent = parent
+ if (
+ playlist.type != "library-playlist-folders" &&
+ typeof playlist.attributes.playParams["versionHash"] != "undefined"
+ ) {
+ playlist.parent = "p.applemusic"
+ }
+ playlist.children = []
+ playlist.tracks = []
+ try {
+ if (trackMap) {
+ let tracks = await app.mk.api.v3.music(playlist.href + "/tracks").catch(e => {
+ // no tracks
+ e = null
+ })
+ tracks.data.data.forEach(track => {
+ if (!trackMapping[track.id]) {
+ trackMapping[track.id] = []
+ }
+ trackMapping[track.id].push(playlist.id)
+
+ if (typeof track.attributes.playParams.catalogId == "string") {
+ if (!trackMapping[track.attributes.playParams.catalogId]) {
+ trackMapping[track.attributes.playParams.catalogId] = []
+ }
+ trackMapping[track.attributes.playParams.catalogId].push(playlist.id)
+ }
+ })
+ }
+ } catch (e) { }
+ if (playlist.type == "library-playlist-folders") {
+ try {
+ await deepScan(playlist.id).catch(e => { })
+ } catch (e) {
+
+ }
+ }
+ newListing.push(playlist)
+ })
+ }
+
+ await deepScan()
+
+ this.library.backgroundNotification.show = false
+ this.playlists.listing = newListing
+ self.sortPlaylists()
+ if (trackMap) {
+ CiderCache.putCache("library-playlists-tracks", trackMapping)
+ this.playlists.trackMapping = trackMapping
+ }
+ CiderCache.putCache("library-playlists", newListing)
+ },
+ sortPlaylists() {
+ this.playlists.listing.sort((a, b) => {
+ if (a.type === "library-playlist-folders" && b.type !== "library-playlist-folders") {
+ return -1
+ } else if (a.type !== "library-playlist-folders" && b.type === "library-playlist-folders") {
+ return 1
+ } else {
+ return 0
+ }
+ })
+ },
+ playlistHeaderContextMenu(event) {
+ let menu = {
+ items: [{
+ name: app.getLz('term.createNewPlaylist'),
+ action: () => {
+ this.newPlaylist()
+ }
+ },
+ {
+ name: app.getLz('term.createNewPlaylistFolder'),
+ action: () => {
+ this.newPlaylistFolder()
+ }
+ }
+ ]
+ }
+ this.showMenuPanel(menu, event)
+ },
+ async editPlaylistFolder(id, name = app.getLz('term.newPlaylist')) {
+ let self = this
+ this.mk.api.v3.music(
+ `/v1/me/library/playlist-folders/${id}`, {}, {
+ fetchOptions: {
+ method: "PATCH",
+ body: JSON.stringify({
+ attributes: { name: name }
+ })
+ }
+ }
+ ).then(res => {
+ self.refreshPlaylists()
+ })
+ },
+ async editPlaylist(id, name = app.getLz('term.newPlaylist')) {
+ let self = this
+ this.mk.api.v3.music(
+ `/v1/me/library/playlists/${id}`, {}, {
+ fetchOptions: {
+ method: "PATCH",
+ body: JSON.stringify({
+ attributes: { name: name }
+ })
+ }
+ }
+ ).then(res => {
+ self.refreshPlaylists()
+ })
+ },
+ copyToClipboard(str) {
+ if (navigator.userAgent.includes('Darwin') || navigator.appVersion.indexOf("Mac") != -1) {
+ this.darwinShare(str)
+ } else {
+ notyf.success(app.getLz('term.share.success'))
+ navigator.clipboard.writeText(str).then(r => console.log("Copied to clipboard."))
+ }
+ },
+ newPlaylist(name = app.getLz('term.newPlaylist'), tracks = []) {
+ let self = this
+ let request = {
+ name: name
+ }
+ if (tracks.length > 0) {
+ request.tracks = tracks
+ }
+ app.mk.api.v3.music(`/v1/me/library/playlists`, {}, {
+ fetchOptions: {
+ method: "POST",
+ body: JSON.stringify({
+ "attributes": { "name": name },
+ "relationships": {
+ "tracks": { "data": tracks },
+ }
+ })
+ }
+ }).then(res => {
+ res = res.data.data[0]
+ console.log(res)
+ self.appRoute(`playlist_` + res.id);
+ self.showingPlaylist = [];
+ self.getPlaylistFromID(app.page.substring(9), true)
+ self.playlists.listing.push({
+ id: res.id,
+ attributes: {
+ name: name
+ },
+ parent: "p.playlistsroot"
+ })
+ self.sortPlaylists()
+ setTimeout(() => {
+ app.refreshPlaylists()
+ }, 8000)
+ })
+ },
+ deletePlaylist(id) {
+ let self = this
+ if (confirm(app.getLz('term.deletePlaylist'))) {
+ app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, {}, {
+ fetchOptions: {
+ method: "DELETE"
+ }
+ }).then(res => {
+ // remove this playlist from playlists.listing if it exists
+ let found = self.playlists.listing.find(item => item.id == id)
+ if (found) {
+ self.playlists.listing.splice(self.playlists.listing.indexOf(found), 1)
+ }
+ })
+ }
+ },
+ async showCollection(response, title, type, requestBody = {}) {
+ let self = this
+ console.log(response)
+ this.collectionList.requestBody = {}
+ this.collectionList.response = response
+ this.collectionList.title = title
+ this.collectionList.type = type
+ this.collectionList.requestBody = requestBody
+ app.appRoute("collection-list")
+ },
+ async showArtistView(artist, title, view) {
+ let response = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists/${artist}/view/${view}?l=${this.mklang}`, {}, { includeResponseMeta: !0 })).data
+ console.log(response)
+ await this.showCollection(response, title, "artists")
+ },
+ async showRecordLabelView(label, title, view) {
+ let response = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/record-labels/${label}/view/${view}?l=${this.mklang}`)).data
+ await this.showCollection(response, title, "record-labels")
+ },
+ async showSearchView(term, group, title) {
+
+ let requestBody = {
+ platform: "web",
+ groups: group,
+ types: "activities,albums,apple-curators,artists,curators,editorial-items,music-movies,music-videos,playlists,songs,stations,tv-episodes,uploaded-videos,record-labels",
+ limit: 25,
+ relate: {
+ editorialItems: ["contents"]
+ },
+ include: {
+ albums: ["artists"],
+ songs: ["artists"],
+ "music-videos": ["artists"]
+ },
+ extend: "artistUrl",
+ fields: {
+ artists: "url,name,artwork,hero",
+ albums: "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url"
+ },
+ with: "serverBubbles,lyricHighlights",
+ art: {
+ "url": "cf"
+ },
+ omit: {
+ resource: ["autos"]
+ },
+ l: this.mklang
+ }
+ let response = await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${term}`, requestBody, {
+ includeResponseMeta: !0
+ })
+
+ console.log('searchres', response)
+ let responseFormat = {
+ data: response.data.results[group].data,
+ next: response.data.results[group].next,
+ groups: group
+ }
+ await this.showCollection(responseFormat, title, "search", requestBody)
+ },
+ async getPlaylistContinuous(response, transient = false) {
+ response = response.data.data[0]
+ let self = this
+ let playlistId = response.id
+ this.playlists.loadingState = (!transient) ? 0 : 1
+ this.showingPlaylist = response
+ if (!response.relationships?.tracks?.next) {
+ this.playlists.loadingState = 1
+ return
+ }
+
+ function getPlaylistTracks(next) {
+ app.apiCall(app.musicBaseUrl + next, res => {
+ if (self.showingPlaylist.id != playlistId) {
+ return
+ }
+ self.showingPlaylist.relationships.tracks.data = self.showingPlaylist.relationships.tracks.data.concat(res.data)
+ if (res.next) {
+ getPlaylistTracks(res.next)
+ } else {
+ self.playlists.loadingState = 1
+ }
+ })
+ }
+
+ getPlaylistTracks(response.relationships.tracks.next)
+
+ },
+ async getPlaylistFromID(id, transient = false) {
+ let self = this
+ const params = {
+ include: "tracks",
+ platform: "web",
+ "include[library-playlists]": "catalog,tracks",
+ "fields[playlists]": "curatorName,playlistType,name,artwork,url,playParams",
+ "include[library-songs]": "catalog,artists,albums,playParams,name,artwork,url",
+ "fields[catalog]": "artistUrl,albumUrl,url",
+ "fields[songs]": "artistUrl,albumUrl,playParams,name,artwork,url,artistName,albumName,durationInMillis",
+ l: this.mklang
+ }
+ if (!transient) {
+ this.playlists.loadingState = 0;
+ }
+ app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, params).then(res => {
+ self.getPlaylistContinuous(res, transient)
+ }).catch((e) => {
+ console.log(e);
+ try {
+ app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`, params).then(res => {
+ self.getPlaylistContinuous(res, transient)
+ })
+ } catch (err) {
+ console.log(err)
+ }
+ })
+
+ },
+ async getArtistFromID(id) {
+ this.page = ""
+ const artistData = await this.mkapi("artists", false, id, {
+ "views": "featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see",
+ "extend": "artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero",
+ "extend[playlists]": "trackCount",
+ "include[songs]": "albums",
+ "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount",
+ "limit[artists:top-songs]": 20,
+ "art[url]": "f",
+ l: this.mklang
+ }, { includeResponseMeta: !0 })
+ console.log(artistData.data.data[0])
+ this.artistPage.data = artistData.data.data[0]
+ this.page = "artist-page"
+ },
+ progressBarStyle() {
+ let val = this.playerLCD.playbackDuration
+ if (this.playerLCD.desiredDuration > 0) {
+ val = this.playerLCD.desiredDuration
+ }
+ let min = 0
+ let max = this.mk.currentPlaybackDuration
+ let value = (val - min) / (max - min) * 100
+ return {
+ 'background': ('linear-gradient(to right, var(--songProgressColor) 0%, var(--songProgressColor) ' + value + '%, var(--songProgressBackground) ' + value + '%, var(--songProgressBackground) 100%)')
+ }
+ },
+ async getRecursive(response) {
+ // if response has a .next() property run it and keep running until .next is null or undefined
+ // and then return the response concatenated with the results of the next() call
+ function executeRequest() {
+ if (response.next) {
+ return response.next().then(executeRequest)
+ } else {
+ return response
+ }
+ }
+
+ return executeRequest()
+ },
+ async getRecursive2(response, sendTo) {
+ let returnData = {
+ "data": [],
+ "meta": {}
+ }
+ if (response.next) {
+ console.log("has next")
+ returnData.data.concat(response.data)
+ returnData.meta = response.meta
+ return await this.getRecursive(await response.next())
+ } else {
+ console.log("no next")
+ returnData.data.concat(response.data)
+ return returnData
+ }
+ },
+ async getSearchHints() {
+ if (this.search.term == "") {
+ this.search.hints = []
+ return
+ }
+ let hints = await (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search/hints?term=${this.search.term}`)).data.results
+ this.search.hints = hints ? hints.terms : []
+ },
+ getSongProgress() {
+ if (this.playerLCD.userInteraction) {
+ return this.playerLCD.desiredDuration
+ } else {
+ return this.playerLCD.playbackDuration
+ }
+ },
+ /**
+ * Converts seconds to dd:hh:mm:ss
+ * @param time (in seconds)
+ * @param format (short, long)
+ * @returns {string}
+ */
+ convertTime(time = 0, format = 'short') {
+
+ if (isNaN(time)) {
+ time = 0
+ }
+ if (typeof time !== "number") {
+ time = parseInt(time)
+ }
+
+ const timeGates = {
+ 600: 15, // 10 Minutes
+ 3600: 14, // Hour
+ 36000: 12, // 10 Hours
+ }
+
+ const datetime = new Date(time * 1000)
+
+ let returnTime = datetime.toISOString().substring(11, 19);
+ for (let key in timeGates) {
+ if (time < key) {
+ returnTime = datetime.toISOString().substring(timeGates[key], 19)
+ break
+ }
+ }
+
+ // Add the days on the front
+ let day;
+ if (time >= 86400) {
+ day = datetime.toISOString().substring(8, 10)
+ day = parseInt(day) - 1
+ returnTime = day + ":" + returnTime
+ }
+
+ if (format === 'long') {
+ const longFormat = []
+
+ // Seconds
+ if (datetime.getSeconds() !== 0) {
+ longFormat.push(`${datetime.getSeconds()} ${app.getLz('term.time.seconds')}`)
+ }
+
+ // Minutes
+ if (time >= 60) {
+ longFormat.push(`${datetime.getMinutes()} ${app.getLz('term.time.minute', options = { count: datetime.getMinutes() })}`)
+ }
+
+ // Hours
+ if (time >= 3600) {
+ longFormat.push(`${datetime.getHours()} ${app.getLz('term.time.hour', options = { count: datetime.getHours() })}`)
+ }
+
+ // Days
+ if (time >= 86400) {
+ longFormat.push(`${day} ${app.getLz('term.time.day', options = { count: day })}`)
+ }
+ returnTime = longFormat.reverse().join(', ')
+ }
+
+ return returnTime
+ },
+ hashCode(str) {
+ let hash = 0,
+ i, chr;
+ if (str.length === 0) return hash;
+ for (i = 0; i < str.length; i++) {
+ chr = str.charCodeAt(i);
+ hash = ((hash << 5) - hash) + chr;
+ hash |= 0; // Convert to 32bit integer
+ }
+ return hash;
+ },
+ appRoute(route) {
+ if (route == "" || route == "#" || route == "/") {
+ return;
+ }
+ route = route.replace(/#/g, "")
+ // if the route contains does not include a / then route to the page directly
+ if (route.indexOf("/") == -1) {
+ this.page = route
+ window.location.hash = this.page
+ // if (this.page == "settings") {
+ // this.version
+ // }
+ return
+ }
+ let hash = route.split("/")
+ let page = hash[0]
+ let id = hash[1]
+ let isLibrary = hash[2] ?? false
+ if(page == "plugin") {
+ this.pluginPages.page = "plugin." + id
+ this.page = "plugin-renderer"
+ return
+ }
+ this.routeView({
+ kind: page,
+ id: id,
+ attributes: {
+ playParams: { kind: page, id: id, isLibrary: isLibrary }
+ }
+ })
+ },
+ routeView(item) {
+ let kind = (item.attributes.playParams ? (item.attributes.playParams.kind ?? (item.type ?? '')) : (item.type ?? ''));
+ let id = (item.attributes.playParams ? (item.attributes.playParams.id ?? (item.id ?? '')) : (item.id ?? ''));
+ ;
+ let isLibrary = item.attributes.playParams ? (item.attributes.playParams.isLibrary ?? false) : false;
+ if (kind.includes("playlist") || kind.includes("album")) {
+ app.showingPlaylist = [];
+ }
+ if (kind.toString().includes("apple-curator")) {
+ kind = "appleCurator"
+ app.getTypeFromID("appleCurator", (id), false, {
+ platform: "web",
+ include: "grouping,playlists",
+ extend: "editorialArtwork",
+ "art[url]": "f"
+ });
+ window.location.hash = `${kind}/${id}`
+ document.querySelector("#app-content").scrollTop = 0
+ } else if (kind == "editorial-elements") {
+ console.log(item)
+ if (item.relationships?.contents?.data != null && item.relationships?.contents?.data.length > 0) {
+ this.routeView(item.relationships.contents.data[0])
+ } else if (item.attributes?.link?.url != null) {
+ window.open(item.attributes.link.url)
+ }
+
+ } else if (kind.toString().includes("artist")) {
+ app.getArtistInfo(id, isLibrary)
+ window.location.hash = `${kind}/${id}${isLibrary ? "/" + isLibrary : ''}`
+ document.querySelector("#app-content").scrollTop = 0
+
+ } else if (kind.toString().includes("record-label") || kind.toString().includes("curator")) {
+ if (kind.toString().includes("record-label")) {
+ kind = "recordLabel"
+ } else {
+ kind = "curator"
+ }
+ app.page = (kind) + "_" + (id);
+ app.getTypeFromID((kind), (id), (isLibrary), {
+ extend: "editorialVideo",
+ include: 'grouping,playlists',
+ views: 'top-releases,latest-releases,top-artists'
+ });
+ window.location.hash = `${kind}/${id}`
+ document.querySelector("#app-content").scrollTop = 0
+ } else if (!kind.toString().includes("radioStation") && !kind.toString().includes("song") && !kind.toString().includes("musicVideo") && !kind.toString().includes("uploadedVideo") && !kind.toString().includes("music-movie")) {
+ let params = {
+ extend: "offers,editorialVideo",
+ "views": "appears-on,more-by-artist,related-videos,other-versions,you-might-also-like,video-extras,audio-extras",
+ }
+ if (kind.includes("playlist")) {
+ params["include"] = "tracks";
+ }
+ if (kind.includes("album")) {
+ params["include[albums]"] = "artists"
+ params["fields[artists]"] = "name,url"
+ params["fields[albums]"] = "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,copyright"
+ }
+
+ if (this.cfg.advanced.experiments.includes('inline-playlists')) {
+ let showModal = kind.toString().includes("album") || kind.toString().includes("playlist")
+ if (app.page.includes("playlist") || app.page.includes("album")) {
+ showModal = false
+ }
+ if (showModal) {
+ app.modals.showPlaylist = true
+ app.chrome.contentAreaScrolling = false
+ } else {
+ app.page = (kind) + "_" + (id);
+ window.location.hash = `${kind}/${id}${isLibrary ? "/" + isLibrary : ''}`
+ }
+ } else {
+ app.page = (kind) + "_" + (id);
+ window.location.hash = `${kind}/${id}${isLibrary ? "/" + isLibrary : ''}`
+ }
+
+
+ app.getTypeFromID((kind), (id), (isLibrary), params);
+ // document.querySelector("#app-content").scrollTop = 0
+ } else {
+ app.playMediaItemById((id), (kind), (isLibrary), item.attributes.url ?? '')
+ }
+ },
+ prevButton() {
+ if (!app.prevButtonBackIndicator && app.mk.nowPlayingItem && app.mk.currentPlaybackTime > 2) {
+ app.prevButtonBackIndicator = true;
+ try {
+ clearTimeout(app.pauseButtonTimer)
+ } catch (e) {
+ }
+ app.mk.seekToTime(0);
+ app.pauseButtonTimer = setTimeout(() => {
+ app.prevButtonBackIndicator = false
+ }, 3000);
+ } else {
+ try {
+ clearTimeout(app.pauseButtonTimer)
+ } catch (e) {
+ }
+ app.prevButtonBackIndicator = false;
+ app.skipToPreviousItem()
+ }
+ },
+ async getNowPlayingItemDetailed(target) {
+ try {
+ let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind,
+ (app.mk.nowPlayingItem.songId == -1),
+ (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"],
+ { "include[songs]": "albums,artists", l: app.mklang });
+ app.searchAndNavigate(u.data.data[0], target)
+ } catch (e) {
+ app.searchAndNavigate(app.mk.nowPlayingItem, target)
+ }
+ },
+ async searchAndNavigate(item, target) {
+ let self = this
+ app.tmpVar = item;
+ switch (target) {
+ case "artist":
+ let artistId = '';
+ try {
+ if (item.relationships.artists && item.relationships.artists.data.length > 0 && !item.relationships.artists.data[0].type.includes("library")) {
+ if (item.relationships.artists.data[0].type === "artist" || item.relationships.artists.data[0].type === "artists") {
+ artistId = item.relationships.artists.data[0].id
+ }
+ }
+ if (artistId == '') {
+ const url = (item.relationships.catalog.data[0].attributes.artistUrl);
+ artistId = (url).substring(url.lastIndexOf('/') + 1)
+ if (artistId.includes('viewCollaboration')) {
+ artistId = artistId.substring(artistId.lastIndexOf('ids=') + 4, artistId.lastIndexOf('-'))
+ }
+ }
+ } catch (_) {
+ }
+
+ if (artistId == "") {
+ let artistQuery = (await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.artistName}`, {
+ limit: 1,
+ types: 'artists'
+ })).data.results;
+ try {
+ if (artistQuery.artists.data.length > 0) {
+ artistId = artistQuery.artists.data[0].id;
+ console.log(artistId)
+ }
+ } catch (e) {
+ }
+ }
+ console.log(artistId);
+ if (artistId != "")
+ self.appRoute(`artist/${artistId}`)
+ break;
+ case "album":
+ let albumId = '';
+ try {
+ if ((item.type ?? item.playParams?.kind ?? "") == "albums") {
+ albumId = item.id ?? ""
+ } else if (item.relationships.albums && item.relationships.albums.data.length > 0 && !item.relationships.albums.data[0].type.includes("library")) {
+ if (item.relationships.albums.data[0].type === "album" || item.relationships.albums.data[0].type === "albums") {
+ albumId = item.relationships.albums.data[0].id
+ }
+ }
+ if (albumId == '') {
+ const url = (item.relationships.catalog.data[0].attributes.url);
+ albumId = (url).substring(url.lastIndexOf('/') + 1)
+ if (albumId.includes("?i=")) {
+ albumId = albumId.substring(0, albumId.indexOf("?i="))
+ }
+ }
+ } catch (_) {
+ }
+
+ if (albumId == "") {
+ try {
+ let albumQuery = (await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${(item.attributes.albumName ?? item.attributes.name ?? "") + " " + (item.attributes.artistName ?? "")}`, {
+ limit: 1,
+ types: 'albums'
+ })).data.results;
+ if (albumQuery.albums.data.length > 0) {
+ albumId = albumQuery.albums.data[0].id;
+ console.log(albumId)
+ }
+ } catch (e) {
+ }
+ }
+ if (albumId != "") {
+ self.appRoute(`album/${albumId}`)
+ }
+ break;
+ case "recordLabel":
+ let labelId = '';
+ try {
+ labelId = item.relationships['record-labels'].data[0].id
+ } catch (_) {
+ }
+
+ if (labelId == "") {
+ try {
+ let labelQuery = (await app.mk.api.v3.music(`v1/catalog/${app.mk.storefrontId}/search?term=${item.attributes.recordLabel}`, {
+ limit: 1,
+ types: 'record-labels'
+ })).data.results;
+ if (labelQuery["record-labels"].data.length > 0) {
+ labelId = labelQuery["record-labels"].data[0].id;
+ console.log(labelId)
+ }
+ } catch (e) {
+ }
+ }
+ if (labelId != "") {
+ app.showingPlaylist = []
+ await app.getTypeFromID("recordLabel", labelId, false, { views: 'top-releases,latest-releases,top-artists' });
+ app.page = "recordLabel_" + labelId;
+ }
+
+ break;
+ }
+ },
+ exitMV() {
+ MusicKit.getInstance().stop()
+ document.getElementById("apple-music-video-container").style.display = "none";
+ },
+ getArtistInfo(id, isLibrary) {
+ this.getArtistFromID(id)
+ //this.getTypeFromID("artist",id,isLibrary,query)
+ },
+ followArtistById(id, follow) {
+ if (follow && !this.followingArtist(id)) {
+ this.cfg.home.followedArtists.push(id)
+ } else {
+ let index = this.cfg.home.followedArtists.indexOf(id)
+ if (index > -1) {
+ this.cfg.home.followedArtists.splice(index, 1)
+ }
+ }
+ },
+ followingArtist(id) {
+ console.log(`check for ${id}`)
+ return this.cfg.home.followedArtists.includes(id)
+ },
+ playMediaItem(item) {
+ let kind = (item.attributes.playParams ? (item.attributes.playParams.kind ?? (item.type ?? '')) : (item.type ?? ''));
+ let id = (item.attributes.playParams ? (item.attributes.playParams.id ?? (item.id ?? '')) : (item.id ?? ''));
+ ;
+ let isLibrary = item.attributes.playParams ? (item.attributes.playParams.isLibrary ?? false) : false;
+ let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
+ // console.log(kind, id, isLibrary)
+ app.mk.stop().then(() => {
+ if (kind.includes("artist")) {
+ app.mk.setStationQueue({ artist: 'a-' + id }).then(() => {
+ app.mk.play()
+ })
+ }
+ else {
+ app.playMediaItemById((id), (kind), (isLibrary), item.attributes.url ?? '')
+ }
+ })
+ },
+ async getTypeFromID(kind, id, isLibrary = false, params = {}, params2 = {}) {
+ let a;
+ if (kind == "album" | kind == "albums") {
+ params["include"] = "tracks,artists,record-labels,catalog";
+ }
+ params['l'] = this.mklang;
+ try {
+ a = await this.mkapi(kind.toString(), isLibrary, id.toString(), params, params2);
+ } catch (e) {
+ console.log(e);
+ try {
+ a = await this.mkapi(kind.toString(), !isLibrary, id.toString(), params, params2);
+ } catch (err) {
+ console.log(err);
+ a = []
+ } finally {
+ if (kind == "appleCurator") {
+ app.appleCurator = a.data.data[0]
+ } else {
+ this.getPlaylistContinuous(a, true)
+ }
+ }
+ } finally {
+ if (kind == "appleCurator") {
+ app.appleCurator = a.data.data[0]
+ } else {
+ this.getPlaylistContinuous(a, true)
+ }
+ }
+ ;
+ },
+ searchLibrarySongs() {
+ let self = this
+ let prefs = this.cfg.libraryPrefs.songs
+ let albumAdded = self.library?.albums?.listing?.map(function (i) {
+ return { [i.id]: i.attributes?.dateAdded }
+ })
+ let startTime = new Date().getTime()
+
+ function sortSongs() {
+ // sort this.library.songs.displayListing by song.attributes[self.library.songs.sorting] in descending or ascending order based on alphabetical order and numeric order
+ // check if song.attributes[self.library.songs.sorting] is a number and if so, sort by number if not, sort by alphabetical order ignoring case
+ self.library.songs.displayListing.sort((a, b) => {
+ let aa = a.attributes[prefs.sort]
+ let bb = b.attributes[prefs.sort]
+ if (prefs.sort == "genre") {
+ aa = a.attributes.genreNames[0]
+ bb = b.attributes.genreNames[0]
+ }
+ if (prefs.sort == "dateAdded") {
+ let albumida = a.relationships?.albums?.data[0]?.id ?? '1970-01-01T00:01:01Z'
+ let albumidb = b.relationships?.albums?.data[0]?.id ?? '1970-01-01T00:01:01Z'
+ aa = startTime - new Date(((albumAdded.find(i => i[albumida])) ?? [])[albumida] ?? '1970-01-01T00:01:01Z').getTime()
+ bb = startTime - new Date(((albumAdded.find(i => i[albumidb])) ?? [])[albumidb] ?? '1970-01-01T00:01:01Z').getTime()
+ }
+ if (aa == null) {
+ aa = ""
+ }
+ if (bb == null) {
+ bb = ""
+ }
+ if (prefs.sortOrder == "asc") {
+ if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
+ return aa - bb
+ } else {
+ return aa.toString().toLowerCase().localeCompare(bb.toString().toLowerCase())
+ }
+ } else if (prefs.sortOrder == "desc") {
+ if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
+ return bb - aa
+ } else {
+ return bb.toString().toLowerCase().localeCompare(aa.toString().toLowerCase())
+ }
+ }
+ })
+ }
+
+ if (this.library.songs.search == "") {
+ this.library.songs.displayListing = this.library.songs.listing
+ sortSongs()
+ } else {
+ this.library.songs.displayListing = this.library.songs.listing.filter(item => {
+ let itemName = item.attributes.name.toLowerCase()
+ let searchTerm = this.library.songs.search.toLowerCase()
+ let artistName = ""
+ let albumName = ""
+ if (item.attributes.artistName != null) {
+ artistName = item.attributes.artistName.toLowerCase()
+ }
+ if (item.attributes.albumName != null) {
+ albumName = item.attributes.albumName.toLowerCase()
+ }
+
+ // remove any non-alphanumeric characters and spaces from search term and item name
+ searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "")
+ itemName = itemName.replace(/[^a-z0-9 ]/gi, "")
+ artistName = artistName.replace(/[^a-z0-9 ]/gi, "")
+ albumName = albumName.replace(/[^a-z0-9 ]/gi, "")
+
+ if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
+ return item
+ }
+ })
+ sortSongs()
+ }
+ },
+ getAlbumSort() {
+ this.library.albums.sortOrder[1] = this.cfg.libraryPrefs.albums.sortOrder;
+ this.library.albums.sorting[1] = this.cfg.libraryPrefs.albums.sort;
+ },
+ // make a copy of searchLibrarySongs except use Albums instead of Songs
+ searchLibraryAlbums(index) {
+ let self = this
+
+ function sortAlbums() {
+ // sort this.library.albums.displayListing by album.attributes[self.library.albums.sorting[index]] in descending or ascending order based on alphabetical order and numeric order
+ // check if album.attributes[self.library.albums.sorting[index]] is a number and if so, sort by number if not, sort by alphabetical order ignoring case
+ self.library.albums.displayListing.sort((a, b) => {
+ let aa = a.attributes[self.library.albums.sorting[index]]
+ let bb = b.attributes[self.library.albums.sorting[index]]
+ if (self.library.albums.sorting[index] == "genre") {
+ aa = a.attributes.genreNames[0]
+ bb = b.attributes.genreNames[0]
+ }
+ if (aa == null) {
+ aa = ""
+ }
+ if (bb == null) {
+ bb = ""
+ }
+ if (self.library.albums.sortOrder[index] == "asc") {
+ if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
+ return aa - bb
+ } else {
+ return aa.toString().toLowerCase().localeCompare(bb.toString().toLowerCase())
+ }
+ } else if (self.library.albums.sortOrder[index] == "desc") {
+ if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
+ return bb - aa
+ } else {
+ return bb.toString().toLowerCase().localeCompare(aa.toString().toLowerCase())
+ }
+ }
+ })
+ }
+
+ if (this.library.albums.search == "") {
+ this.library.albums.displayListing = this.library.albums.listing
+ sortAlbums()
+ } else {
+ this.library.albums.displayListing = this.library.albums.listing.filter(item => {
+ let itemName = item.attributes.name.toLowerCase()
+ let searchTerm = this.library.albums.search.toLowerCase()
+ let artistName = ""
+ let albumName = ""
+ if (item.attributes.artistName != null) {
+ artistName = item.attributes.artistName.toLowerCase()
+ }
+ if (item.attributes.albumName != null) {
+ albumName = item.attributes.albumName.toLowerCase()
+ }
+
+ // remove any non-alphanumeric characters and spaces from search term and item name
+ searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "")
+ itemName = itemName.replace(/[^a-z0-9 ]/gi, "")
+ artistName = artistName.replace(/[^a-z0-9 ]/gi, "")
+ albumName = albumName.replace(/[^a-z0-9 ]/gi, "")
+
+ if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
+ return item
+ }
+ })
+ sortAlbums()
+ }
+ },
+ // make a copy of searchLibrarySongs except use Albums instead of Songs
+ searchLibraryArtists(index) {
+ let self = this
+
+ function sortArtists() {
+ // sort this.library.albums.displayListing by album.attributes[self.library.albums.sorting[index]] in descending or ascending order based on alphabetical order and numeric order
+ // check if album.attributes[self.library.albums.sorting[index]] is a number and if so, sort by number if not, sort by alphabetical order ignoring case
+ self.library.artists.displayListing.sort((a, b) => {
+ let aa = a.attributes[self.library.artists.sorting[index]]
+ let bb = b.attributes[self.library.artists.sorting[index]]
+ if (self.library.artists.sorting[index] == "genre") {
+ aa = a.attributes.genreNames[0]
+ bb = b.attributes.genreNames[0]
+ }
+ if (aa == null) {
+ aa = ""
+ }
+ if (bb == null) {
+ bb = ""
+ }
+ if (self.library.artists.sortOrder[index] == "asc") {
+ if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
+ return aa - bb
+ } else {
+ return aa.toString().toLowerCase().localeCompare(bb.toString().toLowerCase())
+ }
+ } else if (self.library.artists.sortOrder[index] == "desc") {
+ if (aa.toString().match(/^\d+$/) && bb.toString().match(/^\d+$/)) {
+ return bb - aa
+ } else {
+ return bb.toString().toLowerCase().localeCompare(aa.toString().toLowerCase())
+ }
+ }
+ })
+ }
+
+ if (this.library.artists.search == "") {
+ this.library.artists.displayListing = this.library.artists.listing
+ sortArtists()
+ } else {
+ this.library.artists.displayListing = this.library.artists.listing.filter(item => {
+ let itemName = item.attributes.name.toLowerCase()
+ let searchTerm = this.library.artists.search.toLowerCase()
+ let artistName = ""
+ let albumName = ""
+ // if (item.attributes.artistName != null) {
+ // artistName = item.attributes.artistName.toLowerCase()
+ // }
+ // if (item.attributes.albumName != null) {
+ // albumName = item.attributes.albumName.toLowerCase()
+ // }
+
+ // remove any non-alphanumeric characters and spaces from search term and item name
+ searchTerm = searchTerm.replace(/[^a-z0-9 ]/gi, "")
+ itemName = itemName.replace(/[^a-z0-9 ]/gi, "")
+
+
+ if (itemName.includes(searchTerm) || artistName.includes(searchTerm) || albumName.includes(searchTerm)) {
+ return item
+ }
+ })
+ sortArtists()
+ }
+ },
+ getSidebarItemClass(page) {
+ if (this.page == page) {
+ return ["active"]
+ } else {
+ return []
+ }
+ },
+ async mkapi(method, library = false, term, params = {}, params2 = {}, attempts = 0) {
+ if (method.includes(`recordLabel`)) {
+ method = `record-labels`
+ }
+ if (method.includes(`appleCurator`)) {
+ method = `apple-curators`
+ }
+ if (attempts > 3) {
+ return
+ }
+ let truemethod = (!method.endsWith("s")) ? (method + "s") : method;
+ try {
+ if (library) {
+ return await this.mk.api.v3.music(`v1/me/library/${truemethod}/${term.toString()}`, params, params2)
+ } else {
+ return await this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/${truemethod}/${term.toString()}`, params, params2)
+ }
+ } catch (e) {
+ console.log(e)
+ return await this.mkapi(method, library, term, params, params2, attempts + 1)
+ }
+ },
+ getLibraryGenres() {
+ let genres = []
+ genres = []
+ this.library.songs.listing.forEach((item) => {
+ item.attributes.genreNames.forEach((genre) => {
+ if (!genres.includes(genre)) {
+ genres.push(genre)
+ }
+ })
+ })
+ return genres
+ },
+ async getLibrarySongsFull(force = false) {
+ let self = this
+ let library = []
+ let cacheId = "library-songs"
+ let downloaded = null;
+ if ((this.library.songs.downloadState == 2) && !force) {
+ return
+ }
+ if (this.library.songs.downloadState == 1) {
+ return
+ }
+ let librarySongs = await CiderCache.getCache(cacheId)
+ if (librarySongs) {
+ this.library.songs.listing.data = librarySongs
+ this.searchLibrarySongs()
+ }
+ if (this.songstest) {
+ return
+ }
+ this.library.songs.downloadState = 1
+ this.library.backgroundNotification.show = true
+ this.library.backgroundNotification.message = app.getLz('notification.updatingLibrarySongs')
+
+ library = await MusicKitTools.v3Continuous({
+ href: `/v1/me/library/songs/`,
+ options: {
+ "include[library-songs]": "catalog,artists,albums",
+ "fields[artists]": "name,url,id",
+ "fields[albums]": "name,url,id",
+ platform: "web",
+ "fields[catalog]": "artistUrl,albumUrl",
+ "fields[songs]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
+ limit: 100,
+ l: app.mklang,
+ },
+ onProgress: (data) => {
+ console.log(`${data.total}/${data.response.data.meta.total}`)
+ self.library.backgroundNotification.show = true
+ self.library.backgroundNotification.message = app.getLz('notification.updatingLibrarySongs')
+ self.library.backgroundNotification.total = data.response.data.meta.total
+ self.library.backgroundNotification.progress = data.total
+ },
+ onSuccess: () => {
+
+ }
+ })
+
+ self.library.songs.listing = library
+ self.library.songs.downloadState = 2
+ self.library.backgroundNotification.show = false
+ self.searchLibrarySongs()
+ CiderCache.putCache(cacheId, library)
+ console.log("Done!")
+
+ return
+ },
+ // copy the getLibrarySongsFull function except change Songs to Albums
+ async getLibraryAlbumsFull(force = false, index) {
+ let self = this
+ let library = []
+ let cacheId = "library-albums"
+ let downloaded = null;
+ if ((this.library.albums.downloadState == 2 || this.library.albums.downloadState == 1) && !force) {
+ return
+ }
+ let libraryAlbums = await CiderCache.getCache(cacheId)
+ if (libraryAlbums) {
+ this.library.albums.listing = libraryAlbums
+ this.searchLibraryAlbums(index)
+ }
+ if (this.songstest) {
+ return
+ }
+ this.library.albums.downloadState = 1
+ this.library.backgroundNotification.show = true
+ this.library.backgroundNotification.message = app.getLz('notification.updatingLibraryAlbums')
+
+ function downloadChunk() {
+ self.library.albums.downloadState = 1
+ const params = {
+ "include[library-albums]": "catalog,artists,albums",
+ "fields[artists]": "name,url,id",
+ // "fields[albums]": "name,url,id",
+ platform: "web",
+ "fields[catalog]": "artistUrl,albumUrl",
+ "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
+ limit: 100,
+ l: self.mklang
+ }
+ const safeparams = {
+ platform: "web",
+ limit: "60",
+ "include[library-albums]": "artists",
+ "include[library-artists]": "catalog",
+ "include[albums]": "artists",
+ "fields[artists]": "name,url",
+ "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
+ "includeOnly": "catalog,artists"
+ }
+ if (downloaded == null) {
+ app.mk.api.v3.music(`/v1/me/library/albums/`, params).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading');
+ app.mk.api.v3.music(`/v1/me/library/albums/`, safeparams).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading failed', error)
+ app.library.albums.downloadState = 2
+ app.library.backgroundNotification.show = false
+ })
+ })
+ } else {
+ if (downloaded.next != null) {
+ app.mk.api.v3.music(downloaded.next, params).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading');
+ app.mk.api.v3.music(downloaded.next, safeparams).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading failed', error);
+ app.library.albums.downloadState = 2
+ app.library.backgroundNotification.show = false
+ })
+ })
+ } else {
+ console.log("Download next", downloaded.next)
+ }
+ }
+ }
+
+ function processChunk(response) {
+ downloaded = response
+ library = library.concat(downloaded.data)
+ self.library.backgroundNotification.show = true
+ self.library.backgroundNotification.message = app.getLz('notification.updatingLibraryAlbums')
+ self.library.backgroundNotification.total = downloaded.meta.total
+ self.library.backgroundNotification.progress = library.length
+ if (downloaded.meta.total == 0) {
+ self.library.albums.downloadState = 3
+ return
+ }
+ if (typeof downloaded.next == "undefined") {
+ console.log("downloaded.next is undefined")
+ self.library.albums.listing = library
+ self.library.albums.downloadState = 2
+ self.library.backgroundNotification.show = false
+ CiderCache.putCache(cacheId, library)
+ self.searchLibraryAlbums(index)
+ }
+ if (downloaded.meta.total > library.length || typeof downloaded.meta.next != "undefined") {
+ console.log(`downloading next chunk - ${library.length
+ } albums so far`)
+ downloadChunk()
+ } else {
+ self.library.albums.listing = library
+ self.library.albums.downloadState = 2
+ self.library.backgroundNotification.show = false
+ CiderCache.putCache(cacheId, library)
+ self.searchLibraryAlbums(index)
+ // console.log(library)
+ }
+ }
+
+ downloadChunk()
+ },
+ // copy the getLibrarySongsFull function except change Songs to Albums
+ async getLibraryArtistsFull(force = false, index) {
+ let self = this
+ let library = []
+ let cacheId = "library-artists"
+ let downloaded = null;
+ if ((this.library.artists.downloadState == 2 || this.library.artists.downloadState == 1) && !force) {
+ return
+ }
+ let libraryArtists = await CiderCache.getCache(cacheId)
+ if (libraryArtists) {
+ this.library.artists.listing = libraryArtists
+ this.searchLibraryArtists(index)
+ }
+ if (this.songstest) {
+ return
+ }
+ this.library.artists.downloadState = 1
+ this.library.backgroundNotification.show = true
+ this.library.backgroundNotification.message = app.getLz('notification.updatingLibraryArtists')
+
+ function downloadChunk() {
+ self.library.artists.downloadState = 1
+ const params = {
+ include: "catalog",
+ // "include[library-artists]": "catalog,artists,albums",
+ // "fields[artists]": "name,url,id",
+ // "fields[albums]": "name,url,id",
+ platform: "web",
+ // "fields[catalog]": "artistUrl,albumUrl",
+ // "fields[artists]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url",
+ limit: 100,
+ l: self.mklang
+ }
+ const safeparams = {
+ include: "catalog",
+ platform: "web",
+ limit: 50,
+ }
+ if (downloaded == null) {
+ app.mk.api.v3.music(`/v1/me/library/artists/`, params).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading');
+ app.mk.api.v3.music(`/v1/me/library/artists/`, safeparams).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading failed', error)
+ app.library.artists.downloadState = 2
+ app.library.backgroundNotification.show = false
+ })
+ })
+
+ } else {
+ if (downloaded.next != null) {
+ app.mk.api.v3.music(downloaded.next, params).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading');
+ app.mk.api.v3.music(downloaded.next, safeparams).then((response) => {
+ processChunk(response.data)
+ }).catch((error) => {
+ console.log('safe loading failed', error)
+ app.library.artists.downloadState = 2
+ app.library.backgroundNotification.show = false
+ })
+ })
+ } else {
+ console.log("Download next", downloaded.next)
+ }
+
+ }
+ }
+
+ function processChunk(response) {
+ downloaded = response
+ library = library.concat(downloaded.data)
+ self.library.backgroundNotification.show = true
+ self.library.backgroundNotification.message = app.getLz('notification.updatingLibraryArtists')
+ self.library.backgroundNotification.total = downloaded.meta.total
+ self.library.backgroundNotification.progress = library.length
+ if (downloaded.meta.total == 0) {
+ self.library.albums.downloadState = 3
+ return
+ }
+ if (typeof downloaded.next == "undefined") {
+ console.log("downloaded.next is undefined")
+ self.library.artists.listing = library
+ self.library.artists.downloadState = 2
+ self.library.artists.show = false
+ CiderCache.putCache(cacheId, library)
+ self.searchLibraryArtists(index)
+ }
+ if (downloaded.meta.total > library.length || typeof downloaded.meta.next != "undefined") {
+ console.log(`downloading next chunk - ${library.length
+ } artists so far`)
+ downloadChunk()
+ } else {
+ self.library.artists.listing = library
+ self.library.artists.downloadState = 2
+ self.library.backgroundNotification.show = false
+ CiderCache.putCache(cacheId, library)
+ self.searchLibraryArtists(index)
+ // console.log(library)
+ }
+ }
+
+ downloadChunk()
+ },
+ getTotalTime() {
+ try {
+ if (app.showingPlaylist.relationships.tracks.data.length > 0) {
+ const timeInSeconds = Math.round([].concat(...app.showingPlaylist.relationships.tracks.data).reduce((a, { attributes: { durationInMillis } }) => a + durationInMillis, 0) / 1000);
+ return `${app.showingPlaylist.relationships.tracks.data.length} ${app.getLz('term.track', options = { count: app.showingPlaylist.relationships.tracks.data.length })}, ${this.convertTime(timeInSeconds, 'long')}`
+ } else return ""
+ } catch (err) {
+ return ""
+ }
+ },
+ async getLibrarySongs() {
+ let response = await this.mkapi("songs", true, "", { limit: 100, l: this.mklang }, { includeResponseMeta: !0 })
+ this.library.songs.listing = response.data.data
+ this.library.songs.meta = response.data.meta
+ },
+ async getLibraryAlbums() {
+ let response = await this.mkapi("albums", true, "", { limit: 100, l: this.mklang }, { includeResponseMeta: !0 })
+ this.library.albums.listing = response.data.data
+ this.library.albums.meta = response.data.meta
+ },
+ async getListenNow(attempt = 0) {
+ if (this.listennow.timestamp > Date.now() - 120000) {
+ return
+ }
+
+ if (attempt > 3) {
+ return
+ }
+ try {
+ this.listennow = (await this.mk.api.v3.music(`v1/me/recommendations?timezone=${encodeURIComponent(this.formatTimezoneOffset())}`, {
+ name: "listen-now",
+ with: "friendsMix,library,social",
+ "art[social-profiles:url]": "c",
+ "art[url]": "c,f",
+ "omit[resource]": "autos",
+ "relate[editorial-items]": "contents",
+ extend: ["editorialCard", "editorialVideo"],
+ "extend[albums]": ["artistUrl"],
+ "extend[library-albums]": ["artistUrl", "editorialVideo"],
+ "extend[playlists]": ["artistNames", "editorialArtwork", "editorialVideo"],
+ "extend[library-playlists]": ["artistNames", "editorialArtwork", "editorialVideo"],
+ "extend[social-profiles]": "topGenreNames",
+ "include[albums]": "artists",
+ "include[songs]": "artists",
+ "include[music-videos]": "artists",
+ "fields[albums]": ["artistName", "artistUrl", "artwork", "contentRating", "editorialArtwork", "editorialVideo", "name", "playParams", "releaseDate", "url"],
+ "fields[artists]": ["name", "url"],
+ "extend[stations]": ["airDate", "supportsAirTimeUpdates"],
+ "meta[stations]": "inflectionPoints",
+ types: "artists,albums,editorial-items,library-albums,library-playlists,music-movies,music-videos,playlists,stations,uploaded-audios,uploaded-videos,activities,apple-curators,curators,tv-shows,social-upsells",
+ platform: "web",
+ l: this.mklang
+ }, {
+ includeResponseMeta: !0,
+ reload: !0
+ })).data;
+ this.listennow.timestamp = Date.now()
+ console.log(this.listennow)
+ } catch (e) {
+ console.log(e)
+ this.getListenNow(attempt + 1)
+ }
+ },
+ async getBrowsePage(attempt = 0) {
+ if (this.browsepage.timestamp > Date.now() - 120000) {
+ return
+ }
+ if (attempt > 3) {
+ return
+ }
+ try {
+ let browse = await app.mk.api.v3.music(`/v1/editorial/${app.mk.storefrontId}/groupings`, {
+ platform: "web",
+ name: "music",
+ "omit[resource:artists]": "relationships",
+ "include[albums]": "artists",
+ "include[songs]": "artists",
+ "include[music-videos]": "artists",
+ extend: "editorialArtwork,artistUrl",
+ "fields[artists]": "name,url,artwork,editorialArtwork,genreNames,editorialNotes",
+ "art[url]": "f",
+ l: this.mklang
+ });
+ this.browsepage = browse.data.data[0];
+ this.browsepage.timestamp = Date.now()
+ console.log(this.browsepage)
+ } catch (e) {
+ console.log(e)
+ this.getBrowsePage(attempt + 1)
+ }
+ },
+ async getRadioStations(attempt = 0) {
+ if (attempt > 3) {
+ return
+ }
+ try {
+ this.radio.personal = (await app.mk.api.v3.music(`/v1/me/recent/radio-stations`, {
+ "platform": "web",
+ "art[url]": "f",
+ l: this.mklang
+ })).data.data;
+ } catch (e) {
+ console.log(e)
+ this.getRadioStations(attempt + 1)
+ }
+ },
+ async getMadeForYou(attempt = 0) {
+ if (attempt > 3) {
+ return
+ }
+ try {
+ let mfu = await app.mk.api.v3.music("/v1/me/library/playlists?platform=web&extend=editorialVideo&fields%5Bplaylists%5D=lastModifiedDate&filter%5Bfeatured%5D=made-for-you&include%5Blibrary-playlists%5D=catalog&fields%5Blibrary-playlists%5D=artwork%2Cname%2CplayParams%2CdateAdded")
+ this.madeforyou = mfu.data
+ } catch (e) {
+ console.log(e)
+ this.getMadeForYou(attempt + 1)
+ }
+ },
+ newPlaylistFolder(name = app.getLz('term.newPlaylistFolder')) {
+ let self = this
+ this.mk.api.v3.music(
+ "/v1/me/library/playlist-folders/", {}, {
+ fetchOptions: {
+ method: "POST",
+ body: JSON.stringify({
+ attributes: { name: name }
+ })
+ }
+ }
+ ).then((res) => {
+ let playlist = (res.data.data[0])
+ self.playlists.listing.push({
+ id: playlist.id,
+ attributes: {
+ name: playlist.attributes.name
+ },
+ type: "library-playlist-folders",
+ parent: "p.playlistsroot"
+ })
+ self.sortPlaylists()
+ setTimeout(() => {
+ app.refreshPlaylists()
+ }, 13000)
+ })
+ },
+ showSearch() {
+ this.page = "search"
+ },
+ loadLyrics() {
+ const musicType = (MusicKit.getInstance().nowPlayingItem != null) ? MusicKit.getInstance().nowPlayingItem["type"] ?? '' : '';
+ // console.log("mt", musicType)
+ if (musicType === "musicVideo") {
+ this.loadYTLyrics();
+ } else {
+ if (app.cfg.lyrics.enable_mxm) {
+ this.loadMXM();
+ } else {
+ this.loadAMLyrics();
+ }
+ }
+ },
+ loadAMLyrics() {
+ const songID = (this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem["_songId"] ?? (this.mk.nowPlayingItem["songId"] ?? -1) : -1;
+ // this.getMXM( trackName, artistName, 'en', duration);
+ if (songID != -1) {
+ this.mk.api.v3.music(`v1/catalog/${this.mk.storefrontId}/songs/${songID}/lyrics`)
+ .then((response) => {
+ this.lyricsMediaItem = response.data?.data[0]?.attributes["ttml"]
+ this.parseTTML()
+ })
+ }
+ },
+ addToLibrary(id) {
+ let self = this
+ this.mk.addToLibrary(id).then((data) => {
+ self.getLibrarySongsFull(true)
+ })
+ notyf.success(app.getLz('action.addToLibrary.success'));
+ },
+ removeFromLibrary(kind, id) {
+ let self = this
+ let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
+ app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`, {}, {
+ fetchOptions: {
+ method: "DELETE"
+ }
+ }).then((data) => {
+ self.getLibrarySongsFull(true)
+ })
+ notyf.success(app.getLz('action.removeFromLibrary.success'))
+ },
+ async loadYTLyrics() {
+ const track = (this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.title ?? '' : '';
+ const artist = (this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.artistName ?? '' : '';
+ const time = (this.mk.nowPlayingItem != null) ? (Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1) : -1;
+ ipcRenderer.invoke('getYTLyrics', track, artist).then((result) => {
+ if (result.length > 0) {
+ let ytid = result[0]['id']['videoId'];
+ if (app.cfg.lyrics.enable_yt) {
+ loadYT(ytid, app.cfg.lyrics.mxm_language ?? "en")
+ } else {
+ app.loadMXM()
+ }
+ } else {
+ app.loadMXM()
+ }
+
+ function loadYT(id, lang) {
+ let req = new XMLHttpRequest();
+ let url = `https://www.youtube.com/watch?&v=${id}`;
+ req.open('GET', url, true);
+ req.onerror = function (e) {
+ this.loadMXM();
+ }
+ req.onload = function () {
+ // console.log(this.responseText);
+ let res = this.responseText;
+ let captionurl1 = res.substring(res.indexOf(`{"playerCaptionsRenderer":{"baseUrl":"`) + (`{"playerCaptionsRenderer":{"baseUrl":"`).length);
+ let captionurl = captionurl1.substring(0, captionurl1.indexOf(`"`));
+ if (captionurl.includes("timedtext")) {
+ let json = JSON.parse(`{"url": "${captionurl}"}`);
+ let newurl = json.url + `&lang=${lang}&format=ttml`
+
+ let req2 = new XMLHttpRequest();
+
+ req2.open('GET', newurl, true);
+ req2.onerror = function (e) {
+ app.loadMXM();
+ }
+ req2.onload = function () {
+ try {
+ const ttmlLyrics = this.responseText;
+ if (ttmlLyrics) {
+ this.lyricsMediaItem = ttmlLyrics
+ this.parseTTML()
+ }
+ } catch (e) {
+ app.loadMXM();
+ }
+
+ }
+ req2.send();
+ } else {
+
+ app.loadMXM();
+
+ }
+ }
+ req.send();
+ }
+
+ })
+
+ },
+ loadMXM() {
+ let attempt = 0;
+ const track = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.title ?? '' : '');
+ const artist = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.artistName ?? '' : '');
+ const time = encodeURIComponent((this.mk.nowPlayingItem != null) ? (Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1) : -1);
+ const id = encodeURIComponent((this.mk.nowPlayingItem != null) ? app.mk.nowPlayingItem._songId ?? (app.mk.nowPlayingItem["songId"] ?? '') : '');
+ let lrcfile = "";
+ let richsync = [];
+ const lang = app.cfg.lyrics.mxm_language // translation language
+ function revisedRandId() {
+ return Math.random().toString(36).replace(/[^a-z]+/g, '').slice(2, 10);
+ }
+
+ /* get token */
+ function getToken(mode, track, artist, songid, lang, time, id) {
+ if (attempt > 2) {
+ app.loadAMLyrics();
+ } else {
+ attempt = attempt + 1;
+ let url = "https://apic-desktop.musixmatch.com/ws/1.1/token.get?app_id=web-desktop-app-v1.0&t=" + revisedRandId();
+ let req = new XMLHttpRequest();
+ req.overrideMimeType("application/json");
+ req.open('GET', url, true);
+ req.setRequestHeader("authority", "apic-desktop.musixmatch.com");
+ req.onload = function () {
+ let jsonResponse = JSON.parse(this.responseText);
+ let status2 = jsonResponse["message"]["header"]["status_code"];
+ if (status2 == 200) {
+ let token = jsonResponse["message"]["body"]["user_token"] ?? '';
+ if (token != "" && token != "UpgradeOnlyUpgradeOnlyUpgradeOnlyUpgradeOnly") {
+ console.log('200 token', mode);
+ // token good
+ app.mxmtoken = token;
+
+ if (mode == 1) {
+ getMXMSubs(track, artist, app.mxmtoken, lang, time, id);
+ } else {
+ getMXMTrans(songid, lang, app.mxmtoken);
+ }
+ } else {
+ console.log('fake 200 token');
+ getToken(mode, track, artist, songid, lang, time)
+ }
+ } else {
+ // console.log('token 4xx');
+ getToken(mode, track, artist, songid, lang, time)
+ }
+
+ };
+ req.onerror = function () {
+ console.log('error');
+ app.loadAMLyrics();
+ };
+ req.send();
+ }
+ }
+
+ function getMXMSubs(track, artist, token, lang, time, id) {
+ let usertoken = encodeURIComponent(token);
+ let richsyncQuery = (app.cfg.lyrics.mxm_karaoke) ? "&optional_calls=track.richsync" : ""
+ let timecustom = (!time || (time && time < 0)) ? '' : `&f_subtitle_length=${time}&q_duration=${time}&f_subtitle_length_max_deviation=40`;
+ let itunesid = (id && id != "") ? `&track_itunes_id=${id}` : '';
+ let url = "https://apic-desktop.musixmatch.com/ws/1.1/macro.subtitles.get?format=json&namespace=lyrics_richsynched" + richsyncQuery + "&subtitle_format=lrc&q_artist=" + artist + "&q_track=" + track + itunesid + "&usertoken=" + usertoken + timecustom + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId();
+ let req = new XMLHttpRequest();
+ req.overrideMimeType("application/json");
+ req.open('GET', url, true);
+ req.setRequestHeader("authority", "apic-desktop.musixmatch.com");
+ req.onload = function () {
+ let jsonResponse = JSON.parse(this.responseText);
+ console.log(jsonResponse);
+ let status1 = jsonResponse["message"]["header"]["status_code"];
+
+ if (status1 == 200) {
+ let id = '';
+ try {
+ if (jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["header"]["status_code"] == 200 && jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["header"]["status_code"] == 200) {
+ id = jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["body"]["track"]["track_id"] ?? '';
+ lrcfile = jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["body"]["subtitle_list"][0]["subtitle"]["subtitle_body"];
+
+ try {
+ let lrcrich = jsonResponse["message"]["body"]["macro_calls"]["track.richsync.get"]["message"]["body"]["richsync"]["richsync_body"];
+ richsync = JSON.parse(lrcrich);
+ app.richlyrics = richsync;
+ } catch (_) {
+ }
+ }
+
+ if (lrcfile == "") {
+ app.loadAMLyrics()
+ } else {
+ if (richsync == [] || richsync.length == 0) {
+ console.log("ok");
+ // process lrcfile to json here
+ app.lyricsMediaItem = lrcfile
+ let u = app.lyricsMediaItem.split(/[\r\n]/);
+ let preLrc = []
+ for (var i = u.length - 1; i >= 0; i--) {
+ let xline = (/(\[[0-9.:\[\]]*\])+(.*)/).exec(u[i])
+ let end = (preLrc.length > 0) ? ((preLrc[preLrc.length - 1].startTime) ?? 99999) : 99999
+ preLrc.push({
+ startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0,
+ endTime: end,
+ line: xline[2],
+ translation: ''
+ })
+ }
+ if (preLrc.length > 0)
+ preLrc.push({
+ startTime: 0,
+ endTime: preLrc[preLrc.length - 1].startTime,
+ line: "lrcInstrumental",
+ translation: ''
+ });
+ app.lyrics = preLrc.reverse();
+ } else {
+ let preLrc = richsync.map(function (item) {
+ return {
+ startTime: item.ts,
+ endTime: item.te,
+ line: item.x,
+ translation: ''
+ }
+ })
+ if (preLrc.length > 0)
+ preLrc.unshift({
+ startTime: 0,
+ endTime: preLrc[0].startTime,
+ line: "lrcInstrumental",
+ translation: ''
+ });
+ app.lyrics = preLrc;
+ }
+ if (lrcfile != null && lrcfile != '' && lang != "disabled") {
+ // load translation
+ getMXMTrans(id, lang, token);
+ } else {
+ app.loadAMLyrics()
+ }
+ }
+ } catch (e) {
+ console.log(e);
+ app.loadAMLyrics()
+ }
+ } else { //4xx rejected
+ getToken(1, track, artist, '', lang, time);
+ }
+ }
+ req.onerror = function () {
+ console.log('error');
+ app.loadAMLyrics();
+ };
+ req.send();
+ }
+
+ function getMXMTrans(id, lang, token) {
+ if (lang != "disabled" && id != '') {
+ let usertoken = encodeURIComponent(token);
+ let url2 = "https://apic-desktop.musixmatch.com/ws/1.1/crowd.track.translations.get?translation_fields_set=minimal&selected_language=" + lang + "&track_id=" + id + "&comment_format=text&part=user&format=json&usertoken=" + usertoken + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId();
+ let req2 = new XMLHttpRequest();
+ req2.overrideMimeType("application/json");
+ req2.open('GET', url2, true);
+ req2.setRequestHeader("authority", "apic-desktop.musixmatch.com");
+ req2.onload = function () {
+ let jsonResponse2 = JSON.parse(this.responseText);
+ console.log(jsonResponse2);
+ let status2 = jsonResponse2["message"]["header"]["status_code"];
+ if (status2 == 200) {
+ try {
+ let preTrans = []
+ let u = app.lyrics;
+ let translation_list = jsonResponse2["message"]["body"]["translations_list"];
+ if (translation_list.length > 0) {
+ for (var i = 0; i < u.length - 1; i++) {
+ preTrans[i] = ""
+ for (var trans_line of translation_list) {
+ if (u[i].line == " " + trans_line["translation"]["matched_line"] || u[i].line == trans_line["translation"]["matched_line"]) {
+ u[i].translation = trans_line["translation"]["description"];
+ break;
+ }
+ }
+ }
+ app.lyrics = u;
+ }
+ } catch (e) {
+ /// not found trans -> ignore
+ }
+ } else { //4xx rejected
+ getToken(2, '', '', id, lang, '');
+ }
+ }
+ req2.send();
+ }
+
+ }
+
+ if (track != "" & track != "No Title Found") {
+ if (app.mxmtoken != null && app.mxmtoken != '') {
+ getMXMSubs(track, artist, app.mxmtoken, lang, time, id)
+ } else {
+ getToken(1, track, artist, '', lang, time);
+ }
+ }
+ },
+ toMS(str) {
+ let rawTime = str.match(/(\d+:)?(\d+:)?(\d+)(\.\d+)?/);
+ let hours = (rawTime[2] != null) ? (rawTime[1].replace(":", "")) : 0;
+ let minutes = (rawTime[2] != null) ? (hours * 60 + rawTime[2].replace(":", "") * 1) : ((rawTime[1] != null) ? rawTime[1].replace(":", "") : 0);
+ let seconds = (rawTime[3] != null) ? (rawTime[3]) : 0;
+ let milliseconds = (rawTime[4] != null) ? (rawTime[4].replace(".", "")) : 0
+ return parseFloat(`${minutes * 60 + seconds * 1}.${milliseconds * 1}`);
+ },
+ parseTTML() {
+ this.lyrics = [];
+ let preLrc = [];
+ let xml = this.stringToXml(this.lyricsMediaItem);
+ let lyricsLines = xml.getElementsByTagName('p');
+ let synced = true;
+ let endTimes = [];
+ if (xml.getElementsByTagName('tt')[0].getAttribute("itunes:timing") === "None") {
+ synced = false;
+ }
+ endTimes.push(0);
+ if (synced) {
+ for (let element of lyricsLines) {
+ let start = this.toMS(element.getAttribute('begin'))
+ let end = this.toMS(element.getAttribute('end'))
+ if (start - endTimes[endTimes.length - 1] > 5 && endTimes[endTimes.length - 1] != 0) {
+ preLrc.push({
+ startTime: endTimes[endTimes.length - 1],
+ endTime: start,
+ line: "lrcInstrumental"
+ });
+ }
+ preLrc.push({ startTime: start, endTime: end, line: element.textContent });
+ endTimes.push(end);
+ }
+ // first line dot
+ if (preLrc.length > 0)
+ preLrc.unshift({ startTime: 0, endTime: preLrc[0].startTime, line: "lrcInstrumental" });
+ } else {
+ for (let element of lyricsLines) {
+ preLrc.push({ startTime: 9999999, endTime: 9999999, line: element.textContent });
+ }
+ }
+ this.lyrics = preLrc;
+
+ },
+ parseLyrics() {
+ let xml = this.stringToXml(this.lyricsMediaItem)
+ let json = xmlToJson(xml);
+ this.lyrics = json
+ },
+ stringToXml(st) {
+ // string to xml
+ let xml = (new DOMParser()).parseFromString(st, "text/xml");
+ return xml;
+
+ },
+ getCurrentTime() {
+ return parseFloat(this.hmsToSecondsOnly(this.parseTime(this.mk.nowPlayingItem.attributes.durationInMillis - app.mk.currentPlaybackTimeRemaining * 1000)));
+ },
+ seekTo(time) {
+ this.mk.seekToTime(time);
+ },
+ parseTime(value) {
+ let minutes = Math.floor(value / 60000);
+ let seconds = ((value % 60000) / 1000).toFixed(0);
+ return minutes + ":" + (seconds < 10 ? '0' : '') + seconds;
+ },
+ parseTimeDecimal(value) {
+ let minutes = Math.floor(value / 60000);
+ let seconds = ((value % 60000) / 1000).toFixed(0);
+ return minutes + "." + (seconds < 10 ? '0' : '') + seconds;
+ },
+ hmsToSecondsOnly(str) {
+ let p = str.split(':'),
+ s = 0,
+ m = 1;
+
+ while (p.length > 0) {
+ s += m * parseInt(p.pop(), 10);
+ m *= 60;
+ }
+
+ return s;
+ },
+ getLyricBGStyle(start, end) {
+ let currentTime = this.getCurrentTime();
+ // let duration = this.mk.nowPlayingItem.attributes.durationInMillis
+ let start2 = this.hmsToSecondsOnly(start)
+ let end2 = this.hmsToSecondsOnly(end)
+ // let currentProgress = ((100 * (currentTime)) / (end2))
+ // check if currenttime is between start and end
+ this.player.lyricsDebug.start = start2
+ this.player.lyricsDebug.end = end2
+ this.player.lyricsDebug.current = currentTime
+ if (currentTime >= start2 && currentTime <= end2) {
+ return {
+ "--bgSpeed": `${(end2 - start2)}s`
+ }
+ } else {
+ return {}
+ }
+ },
+ playMediaItemById(id, kind, isLibrary, raurl = "") {
+ let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
+ console.log(id, truekind, isLibrary)
+ try {
+ if (truekind.includes("artist")) {
+ app.mk.setStationQueue({ artist: 'a-' + id }).then(() => {
+ app.mk.play()
+ })
+ } else if (truekind == "radioStations") {
+ this.mk.setStationQueue({ url: raurl }).then(function (queue) {
+ MusicKit.getInstance().play()
+ });
+ } else {
+ this.mk.setQueue({
+ [truekind]: [id],
+ parameters: { l: this.mklang }
+ }).then(function (queue) {
+ MusicKit.getInstance().play()
+ })
+ }
+ } catch (err) {
+ console.log(err)
+ this.playMediaItemById(id, kind, isLibrary, raurl)
+ }
+ },
+ queueParentandplayChild(parent, childIndex, item) {
+
+ /* Randomize array in-place using Durstenfeld shuffle algorithm */
+ function shuffleArray(array) {
+ for (var i = array.length - 1; i > 0; i--) {
+ var j = Math.floor(Math.random() * (i + 1));
+ var temp = array[i];
+ array[i] = array[j];
+ array[j] = temp;
+ }
+ }
+
+ let kind = parent.substring(0, parent.indexOf(":"))
+ let id = parent.substring(parent.indexOf(":") + 1, parent.length)
+ let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
+ console.log(truekind, id)
+
+ try {
+ if (app.library.songs.displayListing.length > childIndex && parent == "librarysongs") {
+ console.log(item)
+ if (item && ((app.library.songs.displayListing[childIndex].id != item.id))) {
+ childIndex = app.library.songs.displayListing.indexOf(item)
+ }
+
+ let query = app.library.songs.displayListing.map(item => new MusicKit.MediaItem(item));
+
+
+ app.mk.stop().then(() => {
+ if (item) {
+ app.mk.setQueue({
+ [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id,
+ parameters: { l: app.mklang }
+ }).then(function () {
+ app.mk.play().then(() => {
+ if (app.mk.shuffleMode == 1) {
+ shuffleArray(query)
+ } else {
+ for (let i = 0; i < query.length; i++) {
+ if (query[i].id == item.id) {
+ query.splice(0, i + 1);
+ break;
+ }
+ }
+ }
+ app.mk.queue.append(query)
+ })
+ })
+ } else {
+ app.mk.queue.splice(0, app.mk.queue._itemIDs.length)
+ if (app.mk.shuffleMode == 1) {
+ shuffleArray(query)
+ }
+ app.mk.queue.append(query)
+ if (childIndex != -1) {
+ app.mk.changeToMediaAtIndex(childIndex)
+ } else {
+ app.mk.play()
+ }
+
+ }
+ })
+ } else if (parent.startsWith('listitem-hr')) {
+ app.mk.stop().then(() => {
+ if (app.mk.shuffleMode == 1) {
+ app.mk.setQueue({
+ [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id
+ }).then(function () {
+ app.mk.play().then(() => {
+ let data = JSON.parse(parent.split('listitem-hr')[1] ?? '[]')
+ let itemsToPlay = {}
+ let u = data.map(x => x.id)
+ try {
+ data.splice(u.indexOf(item.attributes.playParams.id ?? item.id), 1)
+ } catch (e) {
+ }
+ if (app.mk.shuffleMode == 1) {
+ shuffleArray(data)
+ }
+ data.forEach(item => {
+ if (!itemsToPlay[item.kind]) {
+ itemsToPlay[item.kind] = []
+ }
+ itemsToPlay[item.kind].push(item.id)
+ })
+ // loop through itemsToPlay
+ for (let kind in itemsToPlay) {
+ let ids = itemsToPlay[kind]
+ if (ids.length > 0) {
+ app.mk.playLater({ [kind + "s"]: itemsToPlay[kind] })
+ }
+ }
+ })
+ })
+ } else {
+ let data = JSON.parse(parent.split('listitem-hr')[1] ?? '[]')
+ let itemsToPlay = {}
+ data.forEach(item => {
+ if (!itemsToPlay[item.kind]) {
+ itemsToPlay[item.kind] = []
+ }
+ itemsToPlay[item.kind].push(item.id)
+ })
+ // loop through itemsToPlay
+ app.mk.queue.splice(0, app.mk.queue._itemIDs.length)
+ let ind = 0;
+ for (let kind in itemsToPlay) {
+ let ids = itemsToPlay[kind]
+ if (ids.length > 0) {
+ if (app.mk.queue._itemIDs.length > 0) {
+ app.mk.playLater({ [kind + "s"]: itemsToPlay[kind] }).then(function () {
+ ind += 1;
+ console.log(ind, Object.keys(itemsToPlay).length)
+ if (ind >= Object.keys(itemsToPlay).length) {
+ app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.attributes.playParams.id ?? item.id))
+ }
+ }
+ )
+ } else {
+ app.mk.setQueue({ [kind + "s"]: itemsToPlay[kind] }).then(function () {
+ ind += 1;
+ console.log(ind, Object.keys(itemsToPlay).length)
+ if (ind >= Object.keys(itemsToPlay).length) {
+ app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.attributes.playParams.id ?? item.id))
+ }
+ }
+ )
+ }
+ }
+
+ }
+ }
+ })
+ } else {
+ app.mk.stop().then(() => {
+ if (truekind == "playlists" && (id.startsWith("p.") || id.startsWith("pl.u"))) {
+ app.mk.setQueue({
+ [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id,
+ parameters: { l: app.mklang }
+ }).then(function () {
+ app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1).then(function () {
+ if ((app.showingPlaylist && app.showingPlaylist.id == id)) {
+ let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
+ let u = query;
+ if (app.mk.shuffleMode == 1) {
+ shuffleArray(u)
+ } else {
+ for (let i = 0; i < app.showingPlaylist.relationships.tracks.data.length; i++) {
+ if (app.showingPlaylist.relationships.tracks.data[i].id == item.id) {
+ u.splice(0, i + 1);
+ break;
+ }
+ }
+ }
+ app.mk.queue.append(u)
+ } else {
+ app.getPlaylistFromID(id, true).then(function () {
+ let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
+ let u = query;
+ if (app.mk.shuffleMode == 1) {
+ shuffleArray(u)
+ } else {
+ for (let i = 0; i < app.showingPlaylist.relationships.tracks.data.length; i++) {
+ if (app.showingPlaylist.relationships.tracks.data[i].id == item.id) {
+ u.splice(0, i + 1);
+ break;
+ }
+ }
+ }
+ app.mk.queue.append(u)
+ })
+ }
+ })
+
+ })
+ } else {
+ this.mk.setQueue({
+ [truekind]: [id],
+ parameters: { l: this.mklang }
+ }).then(function (queue) {
+ if (item && ((queue._itemIDs[childIndex] != item.id))) {
+ childIndex = queue._itemIDs.indexOf(item.id)
+ }
+ if (childIndex != -1) {
+ app.mk.changeToMediaAtIndex(childIndex)
+ } else if (item) {
+ app.mk.playNext({
+ [item.attributes.playParams.kind ?? item.type]: item.attributes.playParams.id ?? item.id
+ }).then(function () {
+ app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1)
+ app.mk.play()
+ })
+ } else {
+ app.mk.play()
+ }
+ })
+ }
+ })
+ }
+ } catch (err) {
+ console.log(err)
+ try {
+ app.mk.stop()
+ } catch (e) {
+ }
+ this.playMediaItemById(item.attributes.playParams.id ?? item.id, item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.url)
+ }
+
+ },
+ friendlyTypes(type) {
+ // use switch statement to return friendly name for media types "songs,artists,albums,playlists,music-videos,stations,apple-curators,curators"
+ switch (type) {
+ case "song":
+ return app.getLz('term.songs')
+ break;
+ case "artist":
+ return app.getLz('term.artists')
+ break;
+ case "album":
+ return app.getLz('term.albums')
+ break;
+ case "playlist":
+ return app.getLz('term.playlists')
+ break;
+ case "music_video":
+ return app.getLz('term.musicVideos')
+ break;
+ case "station":
+ return app.getLz('term.stations')
+ break;
+ case "apple-curator":
+ return app.getLz('term.appleCurators')
+ break;
+ case "radio_show":
+ return app.getLz('term.radioShows')
+ break;
+ case "record_label":
+ return app.getLz('term.recordLabels')
+ break;
+ case "radio_episode":
+ return app.getLz('podcast.episodes')
+ break;
+ case "video_extra":
+ return app.getLz('term.videoExtras')
+ break;
+ case "curator":
+ return app.getLz('term.curators')
+ break;
+ case "top":
+ return app.getLz('term.top')
+ break;
+ default:
+ return type
+ break;
+ }
+ },
+ async searchQuery(term = this.search.term) {
+ let self = this
+ if (term == "") {
+ return
+ }
+ //this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${this.search.term}`
+ this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/search?term=${encodeURIComponent(this.search.term)}`, {
+ types: "activities,albums,apple-curators,artists,curators,editorial-items,music-movies,music-videos,playlists,songs,stations,tv-episodes,uploaded-videos,record-labels",
+ "relate[editorial-items]": "contents",
+ "include[editorial-items]": "contents",
+ "include[albums]": "artists",
+ "include[artists]": "artists",
+ "include[songs]": "artists,albums",
+ "include[music-videos]": "artists",
+ "extend": "artistUrl",
+ "fields[artists]": "url,name,artwork,hero",
+ "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url",
+ "with": "serverBubbles,lyricHighlights",
+ "art[url]": "c,f",
+ "omit[resource]": "autos",
+ "platform": "web",
+ limit: 25,
+ l: this.mklang
+ }).then(function (results) {
+ results.data.results["meta"] = results.data.meta
+ self.search.results = results.data.results
+ })
+
+ await app.mk.api.v3.music(`v1/social/${app.mk.storefrontId}/search?term=${app.search.term}`, {
+ types: ["playlists", "social-profiles"],
+ limit: 25,
+ with: ["serverBubbles", "lyricSnippet"],
+ "art[url]": "f",
+ "art[social-profiles:url]": "c"
+ }, { includeResponseMeta: !0 }).then(function (results) {
+ results.data.results["meta"] = results.data.meta
+ self.search.resultsSocial = results.data.results
+ })
+ },
+ async inLibrary(items = []) {
+ let types = []
+
+ for (let item of items) {
+ let type = item.type
+ if (type.slice(-1) != "s") {
+ type += "s"
+ }
+ type = type.replace("library-", "")
+ let id = item.attributes.playParams.catalogId ?? item.attributes.playParams.id ?? item.id
+
+ let index = types.findIndex(function (type) {
+ return type.type == this
+ }, type)
+ if (index == -1) {
+ types.push({ type: type, id: [id] })
+ } else {
+ types[index].id.push(id)
+ }
+ }
+ let types2 = types.map(function (item) {
+ return {
+ [`ids[${item.type}]`]: [item.id]
+ }
+ })
+ types2 = types2.reduce(function (result, item) {
+ var key = Object.keys(item)[0]; //first property: a, b, c
+ result[key] = item[key];
+ return result;
+ }, {});
+ return (await this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}`, {
+ ...{
+ "omit[resource]": "autos",
+ relate: "library",
+ fields: "inLibrary"
+ },
+ ...types2
+ })).data.data
+ },
+ isInLibrary(playParams) {
+ let self = this
+ let id = ""
+ // ugly code to check if current playback item is in library
+ if (typeof playParams == "undefined") {
+ return true
+ }
+ if (playParams["isLibrary"]) {
+ return true
+ } else if (playParams["catalogId"]) {
+ id = playParams["catalogId"]
+ } else if (playParams["id"]) {
+ id = playParams["id"]
+ }
+ let found = this.library.songs.listing.filter((item) => {
+ if (item["attributes"]) {
+ if (item["attributes"]["playParams"] && (item["attributes"]["playParams"]["catalogId"] == id)) {
+ return item;
+ }
+ }
+ })
+ if (found.length != 0) {
+ return true
+ } else {
+ return false
+ }
+ },
+ mkReady() {
+ if (this.mk["nowPlayingItem"]) {
+ return true
+ } else {
+ return false
+ }
+ },
+ getMediaItemArtwork(url, height = 64, width) {
+ if (typeof url == "undefined" || url == "") {
+ return "https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg"
+ }
+ let newurl = `${url.replace('{w}', width ?? height).replace('{h}', height).replace('{f}', "webp").replace('{c}', ((width === 900) ? "sr" : "cc"))}`;
+
+ if (newurl.includes("900x516")) {
+ newurl = newurl.replace("900x516cc", "900x516sr").replace("900x516bb", "900x516sr");
+ }
+ return newurl
+ },
+ _rgbToRgb(rgb = [0, 0, 0]) {
+ // if rgb
+ return `rgb(${rgb[0]},${rgb[1]},${rgb[2]})`
+ },
+ getNowPlayingArtworkBG(size = 32, force = false) {
+ let self = this
+ if (typeof this.mk.nowPlayingItem === "undefined") return;
+ let bginterval = setInterval(() => {
+ if (!this.mkReady()) {
+ return ""
+ }
+
+ try {
+ if ((this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] != this.currentTrackID && document.querySelector('.bg-artwork')) || force) {
+ if (document.querySelector('.bg-artwork')) {
+ clearInterval(bginterval);
+ }
+ this.currentTrackID = this.mk.nowPlayingItem["id"];
+ document.querySelector('.bg-artwork').src = "";
+ if (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"]) {
+ getBase64FromUrl(this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"].replace('{w}', size).replace('{h}', size)).then(img => {
+ document.querySelectorAll('.bg-artwork').forEach(artwork => {
+ artwork.src = img;
+ })
+ self.$store.commit("setLCDArtwork", img)
+ })
+ try {
+ clearInterval(bginterval);
+ } catch (err) {
+ }
+ } else {
+ this.setLibraryArtBG()
+ }
+ } else if (this.mk.nowPlayingItem["id"] == this.currentTrackID) {
+ try {
+ clearInterval(bginterval);
+ } catch (err) {
+ }
+ }
+ } catch (e) {
+ if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] && document.querySelector('.bg-artwork')) {
+ this.setLibraryArtBG()
+ try {
+ clearInterval(bginterval);
+ } catch (err) {
+ }
+ }
+ }
+ }, 200)
+ },
+ async getCurrentArtURL() {
+ try {
+ let artworkSize = 50
+ if (app.getThemeDirective("lcdArtworkSize") != "") {
+ artworkSize = app.getThemeDirective("lcdArtworkSize")
+ } else if (this.cfg.visual.directives.windowLayout == "twopanel") {
+ artworkSize = 80
+ }
+ this.currentArtUrl = '';
+ this.currentArtUrlRaw = '';
+ if (app.mk.nowPlayingItem != null && app.mk.nowPlayingItem.attributes != null && app.mk.nowPlayingItem.attributes.artwork != null && app.mk.nowPlayingItem.attributes.artwork.url != null && app.mk.nowPlayingItem.attributes.artwork.url != '') {
+ this.currentArtUrlRaw = (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"] ?? '')
+ this.currentArtUrl = (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"] ?? '').replace('{w}', artworkSize).replace('{h}', artworkSize);
+ try {
+ document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
+ } catch (e) {
+ }
+ } else {
+ let data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`);
+ data = data.data.data[0];
+ if (data != null && data !== "" && data.attributes != null && data.attributes.artwork != null) {
+ this.currentArtUrlRaw = (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"] ?? '')
+ this.currentArtUrl = (data["attributes"]["artwork"]["url"] ?? '').replace('{w}', artworkSize).replace('{h}', artworkSize);
+ ipcRenderer.send('updateRPCImage', this.currentArtUrl ?? '');
+ try {
+ document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
+ } catch (e) {
+ }
+ } else {
+ this.currentArtUrlRaw = ''
+ this.currentArtUrl = '';
+ try {
+ document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
+ } catch (e) {
+ }
+ }
+ }
+ } catch (e) {
+
+ }
+ },
+ async setLibraryArt() {
+ if (typeof this.mk.nowPlayingItem === "undefined") return;
+ try {
+ let data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`);
+ data = data.data.data[0];
+
+ if (data != null && data !== "") {
+ document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', 'url("' + (data["attributes"]["artwork"]["url"]).toString() + '")');
+ } else {
+ document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("")`);
+ }
+ } catch (e) {
+ }
+ },
+ async setLibraryArtBG() {
+ if (typeof this.mk.nowPlayingItem === "undefined") return;
+ try {
+ let data = await this.mk.api.v3.music(`/v1/me/library/songs/${this.mk.nowPlayingItem.id}`);
+ data = data.data.data[0];
+
+ if (data != null && data !== "") {
+ getBase64FromUrl((data["attributes"]["artwork"]["url"]).toString()).then(img => {
+ document.querySelector('.bg-artwork').forEach(artwork => {
+ artwork.src = img;
+ })
+ self.$store.commit("setLCDArtwork", img)
+ })
+ }
+ } catch (e) {
+ }
+
+ },
+ quickPlay(query) {
+ let self = this
+ MusicKit.getInstance().api.search(query, { limit: 2, types: 'songs' }).then(function (data) {
+ MusicKit.getInstance().setQueue({
+ song: data["songs"]['data'][0]["id"],
+ parameters: { l: app.mklang }
+ }).then(function (queue) {
+ MusicKit.getInstance().play()
+ setTimeout(() => {
+ self.$forceUpdate()
+ }, 1000)
+ })
+ })
+ },
+ async getRating(item) {
+ let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
+ let id = item.attributes?.playParams?.catalogId ? item.attributes.playParams.catalogId : (item.attributes?.playParams?.id ?? item.id)
+ if (item.id != null && (item.id.toString()).startsWith("i.")) {
+ if (!type.startsWith("library-")) {
+ type = "library-" + type
+ }
+ id = item.id
+ }
+ let response = await this.mk.api.v3.music(`/v1/me/ratings/${type}?platform=web&ids=${type.includes('library') ? item.id : id}`)
+ if (response.data.data.length != 0) {
+ let value = response.data.data[0].attributes.value
+ return value
+ } else {
+ return 0
+ }
+ },
+ love(item) {
+ let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
+ let id = item.attributes?.playParams?.catalogId ? item.attributes.playParams.catalogId : (item.attributes?.playParams?.id ?? item.id)
+ if (item.id != null && (item.id.toString()).startsWith("i.")) {
+ if (!type.startsWith("library-")) {
+ type = "library-" + type
+ }
+ id = item.id
+ }
+ this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, {
+ fetchOptions: {
+ method: "PUT",
+ body: JSON.stringify({
+ "type": "rating",
+ "attributes": {
+ "value": 1
+ }
+ })
+ }
+ })
+ },
+ dislike(item) {
+ let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
+ let id = item.attributes?.playParams?.catalogId ? item.attributes.playParams.catalogId : (item.attributes?.playParams?.id ?? item.id)
+ if (item.id != null && (item.id.toString()).startsWith("i.")) {
+ if (!type.startsWith("library-")) {
+ type = "library-" + type
+ }
+ id = item.id
+ }
+ this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, {
+ fetchOptions: {
+ method: "PUT",
+ body: JSON.stringify({
+ "type": "rating",
+ "attributes": {
+ "value": -1
+ }
+ })
+ }
+ })
+ },
+ unlove(item) {
+ let type = item.type.slice(-1) === "s" ? item.type : item.type + "s"
+ let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id
+ if (item.id.startsWith("i.")) {
+ if (!type.startsWith("library-")) {
+ type = "library-" + type
+ }
+ id = item.id
+ }
+ this.mk.api.v3.music(`/v1/me/ratings/${type}/${id}`, {}, {
+ fetchOptions: {
+ method: "DELETE",
+ }
+ })
+ },
+ checkScrollDirectionIsUp(event) {
+ if (event.wheelDelta) {
+ return event.wheelDelta > 0;
+ }
+ return event.deltaY < 0;
+ },
+ volumeUp() {
+ if ((app.mk.volume + app.cfg.audio.volumeStep) > app.cfg.audio.maxVolume) {
+ app.mk.volume = app.cfg.audio.maxVolume;
+ console.log('setting max volume')
+ } else {
+ console.log('volume up')
+ app.mk.volume = ((app.mk.volume * 100) + (app.cfg.audio.volumeStep * 100)) / 100
+ }
+ },
+ volumeDown() {
+ if ((app.mk.volume - app.cfg.audio.volumeStep) < 0) {
+ app.mk.volume = 0;
+ console.log('setting volume to 0')
+ } else {
+ console.log('volume down')
+ app.mk.volume = ((app.mk.volume * 100) - (app.cfg.audio.volumeStep * 100)) / 100
+ }
+ },
+ volumeWheel(event) {
+ app.checkScrollDirectionIsUp(event) ? this.volumeUp() : this.volumeDown()
+ },
+ muteButtonPressed() {
+ if (this.cfg.audio.muted) {
+ this.mk.volume = this.cfg.audio.lastVolume;
+ this.cfg.audio.muted = false;
+ } else {
+ this.cfg.audio.lastVolume = this.cfg.audio.volume;
+ this.mk.volume = 0;
+ this.cfg.audio.muted = true;
+ }
+ },
+ checkMuteChange() {
+ if (this.cfg.audio.muted) {
+ this.cfg.audio.muted = false;
+ }
+ },
+ async apiCall(url, callback) {
+ const xmlHttp = new XMLHttpRequest();
+
+ xmlHttp.onreadystatechange = (e) => {
+ if (xmlHttp.readyState !== 4) {
+ return;
+ }
+
+ if (xmlHttp.status === 200) {
+ // console.log('SUCCESS', xmlHttp.responseText);
+ callback(JSON.parse(xmlHttp.responseText));
+ } else {
+ console.warn('request_error');
+ }
+ };
+
+ xmlHttp.open("GET", url);
+ xmlHttp.setRequestHeader("Authorization", "Bearer " + MusicKit.getInstance().developerToken);
+ xmlHttp.setRequestHeader("Music-User-Token", "" + MusicKit.getInstance().musicUserToken);
+ xmlHttp.setRequestHeader("Accept", "application/json");
+ xmlHttp.setRequestHeader("Content-Type", "application/json");
+ xmlHttp.responseType = "text";
+ xmlHttp.send();
+ },
+ fetchPlaylist(id, callback) {
+ // id can be found in playlist.attributes.playParams.globalId
+ // this.mk.api.
+ this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`).then(res => {
+ callback(res.data.data[0])
+ })
+
+ // tracks are found in relationship.data
+ },
+ windowFocus(val) {
+ if (val) {
+ document.querySelectorAll(".animated-artwork-video").forEach(el => {
+ el.play()
+ })
+ document.querySelector("body").classList.remove("stopanimation")
+ this.animateBackground = true
+ } else {
+ document.querySelectorAll(".animated-artwork-video").forEach(el => {
+ el.pause()
+ })
+ document.querySelector("body").classList.add("stopanimation")
+ this.animateBackground = false
+ }
+ },
+ async nowPlayingContextMenu(event) {
+ let self = this
+ let data_type = this.mk.nowPlayingItem.playParams.kind
+ let item_id = this.mk.nowPlayingItem.attributes.playParams.id ?? this.mk.nowPlayingItem.id
+ let isLibrary = this.mk.nowPlayingItem.attributes.playParams.isLibrary ?? false
+ let params = { "fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "t": "1" }
+ app.selectedMediaItems = []
+ app.select_selectMediaItem(item_id, data_type, 0, '12344', isLibrary)
+ let useMenu = "normal"
+ let menus = {
+ multiple: {
+ items: []
+ },
+ normal: {
+ headerItems: [{
+ "icon": "./assets/feather/heart.svg",
+ "id": "love",
+ "name": app.getLz('action.love'),
+ "hidden": false,
+ "disabled": true,
+ "action": function () {
+ app.love(app.mk.nowPlayingItem)
+ }
+ },
+ {
+ "icon": "./assets/feather/heart.svg",
+ "id": "unlove",
+ "active": true,
+ "name": app.getLz('action.unlove'),
+ "hidden": true,
+ "action": function () {
+ app.unlove(app.mk.nowPlayingItem)
+ }
+ },
+ {
+ "icon": "./assets/feather/thumbs-down.svg",
+ "id": "dislike",
+ "name": app.getLz('action.dislike'),
+ "hidden": false,
+ "disabled": true,
+ "action": function () {
+ app.dislike(app.mk.nowPlayingItem)
+ }
+ },
+ {
+ "icon": "./assets/feather/thumbs-down.svg",
+ "id": "undo_dislike",
+ "name": app.getLz('action.undoDislike'),
+ "active": true,
+ "hidden": true,
+ "action": function () {
+ app.unlove(app.mk.nowPlayingItem)
+ }
+ },
+ ],
+ items: [
+ {
+ "icon": "./assets/feather/plus.svg",
+ "id": "addToLibrary",
+ "name": app.getLz('action.addToLibrary') + " ...",
+ "disabled": true,
+ "action": function () {
+ app.addToLibrary(app.mk.nowPlayingItem.id);
+ }
+ },
+ {
+ "id": "removeFromLibrary",
+ "icon": "./assets/feather/x-circle.svg",
+ "name": app.getLz('action.removeFromLibrary'),
+ "hidden": true,
+ "action": function () {
+ self.removeFromLibrary()
+ }
+ },
+ {
+ "icon": "./assets/feather/list.svg",
+ "name": app.getLz('action.addToPlaylist') + " ...",
+ "action": function () {
+ app.promptAddToPlaylist()
+ }
+ },
+ {
+ "icon": "./assets/feather/radio.svg",
+ "name": app.getLz('action.startRadio'),
+ "action": function () {
+ app.mk.setStationQueue({ song: app.mk.nowPlayingItem.id }).then(() => {
+ app.mk.play()
+ app.selectedMediaItems = []
+ })
+ }
+ },
+ {
+ "icon": "./assets/feather/user.svg",
+ "name": app.getLz('action.goToArtist'),
+ "action": function () {
+ app.appRoute(`artist/${app.mk.nowPlayingItem.relationships.artists.data[0].id}`)
+ }
+ },
+ {
+ "icon": "./assets/feather/disc.svg",
+ "name": app.getLz('action.goToAlbum'),
+ "action": function () {
+ app.appRoute(`album/${app.mk.nowPlayingItem.relationships.albums.data[0].id}`)
+ }
+ },
+ {
+ "id": "showInMusic",
+ "icon": "./assets/music.svg",
+ "hidden": true,
+ "name": app.getLz('action.showInAppleMusic'),
+ "action": function () {
+ app.routeView(app.mk.nowPlayingItem._container)
+ }
+ },
+ {
+ "icon": "./assets/feather/share.svg",
+ "name": app.getLz('action.share'),
+ "action": function () {
+ app.mkapi(app.mk.nowPlayingItem.attributes?.playParams?.kind ?? app.mk.nowPlayingItem.type ?? 'songs', false, app.mk.nowPlayingItem._songId ?? (app.mk.nowPlayingItem.songId ?? app.mk.nowPlayingItem.id) ?? '').then(u => {
+ app.copyToClipboard((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url)
+ })
+ }
+ },
+ {
+ "icon": "./assets/feather/share.svg",
+ "name": `${app.getLz('action.share')} (song.link)`,
+ "action": function () {
+ app.mkapi(app.mk.nowPlayingItem.attributes?.playParams?.kind ?? app.mk.nowPlayingItem.type ?? 'songs', false, app.mk.nowPlayingItem._songId ?? (app.mk.nowPlayingItem.songId ?? app.mk.nowPlayingItem.id) ?? '').then(u => {
+ app.songLinkShare((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url)
+ })
+ }
+ }
+ ]
+ }
+ }
+ if (this.contextExt) {
+ if (this.contextExt.normal) {
+ menus.normal.items = menus.normal.items.concat(this.contextExt.normal)
+ }
+ }
+
+ if(app.mk.nowPlayingItem._container["attributes"] && app.mk.nowPlayingItem._container.name != "station") {
+ menus.normal.items.find(x => x.id == "showInMusic").hidden = false
+ }
+
+ this.showMenuPanel(menus[useMenu], event)
+
+ try {
+ let result = await this.inLibrary([this.mk.nowPlayingItem])
+ if (result[0].attributes.inLibrary) {
+ menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true
+ menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false
+ } else {
+ menus.normal.items.find(x => x.id == 'addToLibrary').disabled = false
+ }
+ } catch (e) {
+ e = null
+ }
+
+ try {
+ let rating = await app.getRating(app.mk.nowPlayingItem)
+ if (rating == 0) {
+ menus.normal.headerItems.find(x => x.id == 'love').disabled = false
+ menus.normal.headerItems.find(x => x.id == 'dislike').disabled = false
+ } else if (rating == 1) {
+ menus.normal.headerItems.find(x => x.id == 'unlove').hidden = false
+ menus.normal.headerItems.find(x => x.id == 'love').hidden = true
+ } else if (rating == -1) {
+ menus.normal.headerItems.find(x => x.id == 'undo_dislike').hidden = false
+ menus.normal.headerItems.find(x => x.id == 'dislike').hidden = true
+ }
+ } catch (err) {
+
+ }
+ },
+ LastFMDeauthorize() {
+ ipcRenderer.invoke('setStoreValue', 'lastfm.enabled', false).catch((e) => console.error(e));
+ ipcRenderer.invoke('setStoreValue', 'lastfm.auth_token', '').catch((e) => console.error(e));
+ app.cfg.lastfm.auth_token = "";
+ app.cfg.lastfm.enabled = false;
+ const element = document.getElementById('lfmConnect');
+ element.innerHTML = app.getLz('term.connect');
+ element.onclick = app.LastFMAuthenticate;
+ },
+ LastFMAuthenticate() {
+ console.log("[LastFM] Received LastFM authentication callback")
+ const element = document.getElementById('lfmConnect');
+ // new key : f9986d12aab5a0fe66193c559435ede3
+ window.open('https://www.last.fm/api/auth?api_key=f9986d12aab5a0fe66193c559435ede3&cb=cider://auth/lastfm');
+ element.innerText = app.getLz('term.connecting') + '...';
+
+ /* Just a timeout for the button */
+ setTimeout(() => {
+ if (element.innerText === app.getLz('term.connecting') + '...') {
+ element.innerText = app.getLz('term.connect');
+ console.warn('[LastFM] Attempted connection timed out.');
+ }
+ }, 20000);
+
+ ipcRenderer.on('LastfmAuthenticated', function (_event, lfmAuthKey) {
+ app.cfg.lastfm.auth_token = lfmAuthKey;
+ app.cfg.lastfm.enabled = true;
+ element.innerHTML = `${app.getLz('term.disconnect')}\n(${app.getLz('term.authed')}: ${lfmAuthKey})
`;
+ element.onclick = app.LastFMDeauthorize;
+ });
+ },
+ /**
+ parseSCTagToRG: function (tag) {
+ let soundcheck = tag.split(" ")
+ let numbers = []
+ for (item of soundcheck) {
+ numbers.push(parseInt(item, 16))
+
+ }
+ numbers.shift()
+ //let gain = Math.log10((Math.max(numbers[0], numbers[1]) ?? 1000) / 1000.0) * -10
+ let peak = Math.max(numbers[6], numbers[7]) / 32768.0
+ let gain = Math.pow(10, ((-7.63 - (Math.log10(peak) * 20)) / 20))// EBU R 128 Compliant
+ return {
+ gain: gain,
+ peak: peak
+ }
+ },*/
+ fullscreen(flag) {
+ if (flag) {
+ ipcRenderer.send('setFullScreen', true);
+ if (app.mk.nowPlayingItem.type && app.mk.nowPlayingItem.type.toLowerCase().includes("video")) {
+ document.querySelector('video#apple-music-video-player').requestFullscreen()
+ } else {
+ app.appMode = 'fullscreen';
+ }
+ document.addEventListener('keydown', event => {
+ if (event.key === 'Escape' && app.appMode === 'fullscreen') {
+ this.fullscreen(false);
+ }
+ });
+ } else {
+ ipcRenderer.send('setFullScreen', false);
+ app.appMode = 'player';
+ }
+ },
+ miniPlayer(flag) {
+ if (flag) {
+ this.tmpWidth = window.innerWidth;
+ this.tmpHeight = window.innerHeight;
+ ipcRenderer.send('unmaximize');
+ ipcRenderer.send('windowmin', 250, 250)
+ ipcRenderer.send('windowresize', 300, 300, false)
+ app.appMode = 'mini';
+ } else {
+ ipcRenderer.send('windowmin', 844, 410)
+ ipcRenderer.send('windowresize', this.tmpWidth, this.tmpHeight, false)
+ ipcRenderer.send('windowontop', false)
+ //this.cfg.visual.miniplayer_top_toggle = true;
+ app.appMode = 'player';
+ }
+ },
+ pinMiniPlayer(status = false) {
+ if (!status) {
+ if (!this.cfg.visual.miniplayer_top_toggle) {
+ ipcRenderer.send('windowontop', true)
+ this.cfg.visual.miniplayer_top_toggle = true;
+ } else {
+ ipcRenderer.send('windowontop', false)
+ this.cfg.visual.miniplayer_top_toggle = false;
+ }
+ } else {
+ ipcRenderer.send('windowontop', this.cfg.visual.miniplayer_top_toggle ?? false)
+ }
+ },
+ formatTimezoneOffset: (e = new Date) => {
+ let leadingZeros = (e, s = 2) => {
+ let n = "" + e;
+ for (; n.length < s;)
+ n = "0" + n;
+ return n
+ }
+
+ const s = e.getTimezoneOffset(),
+ n = Math.floor(Math.abs(s) / 60),
+ d = Math.round(Math.abs(s) % 60);
+ let h = "+";
+ return 0 !== s && (h = s > 0 ? "-" : "+"),
+ `${h}${leadingZeros(n, 2)}:${leadingZeros(d, 2)}`
+ },
+ toggleHideUserInfo() {
+ if (this.chrome.hideUserInfo) {
+ this.cfg.visual.showuserinfo = true
+ this.chrome.hideUserInfo = false
+ } else {
+ this.cfg.visual.showuserinfo = false
+ this.chrome.hideUserInfo = true
+ }
+ },
+ isElementOverflowing(selector) {
+ try {
+ let element = document.querySelector(selector);
+ var overflowX = element.offsetWidth < element.scrollWidth,
+ overflowY = element.offsetHeight < element.scrollHeight;
+ element.setAttribute('data-value', '\xa0\xa0\xa0\xa0' + element.textContent);
+
+ return (overflowX || overflowY);
+ } catch (e) {
+ return false
+ }
+ },
+ async showWebRemoteQR() {
+ //this.webremoteqr = await ipcRenderer.invoke('setRemoteQR','')
+ this.webremoteurl = await ipcRenderer.invoke('showQR', '')
+ //this.modals.qrcode = true;
+ },
+ checkMarquee() {
+ if (isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-artist') == true) {
+ document.getElementsByClassName('song-artist')[0].classList.add('marquee');
+ document.getElementsByClassName('song-artist')[1].classList.add('marquee-after');
+ }
+ if (isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') == true) {
+ document.getElementsByClassName('song-name')[0].classList.add('marquee');
+ document.getElementsByClassName('song-name')[1].classList.add('marquee-after');
+ }
+ },
+ closeWindow() {
+ ipcRenderer.send('close');
+ },
+ darwinShare(url) {
+ ipcRenderer.send('share-menu', url)
+ },
+ arrayToChunk(arr, chunkSize) {
+ let R = [];
+ for (let i = 0, len = arr.length; i < len; i += chunkSize) {
+ R.push(arr.slice(i, i + chunkSize));
+ }
+ return R;
+ },
+ SpacePause() {
+ const elems = document.querySelectorAll('input');
+ for (let elem of elems) {
+ if (elem === document.activeElement) {
+ return;
+ }
+ }
+ if (!this.isDev) // disable in dev mode to keep my sanity
+ MusicKitInterop.playPause();
+ },
+ async MKJSLang() {
+ let u = this.cfg.general.language;
+ // use MusicKit.getInstance or crash
+ try {
+ let item = await MusicKit.getInstance().api.v3.music(`v1/storefronts/${app.mk.storefrontId}`)
+ let langcodes = item.data.data[0].attributes.supportedLanguageTags;
+ if (langcodes) langcodes = langcodes.map(function (u) {
+ return u.replace(/-Han[s|t]/i, "").toLowerCase()
+ })
+ console.log(langcodes)
+ let sellang = ""
+ if (u && langcodes.includes(u.toLowerCase().replace('_', "-"))) {
+ sellang = ((u.toLowerCase()).replace('_', "-"))
+ } else if (u && u.includes('_') && langcodes.includes(((u.toLowerCase()).replace('_', "-")).split("-")[0])) {
+ sellang = ((u.toLowerCase()).replace('_', "-")).split("-")[0]
+ }
+ if (sellang == "") sellang = (item.data.data[0].attributes.defaultLanguageTag).toLowerCase()
+
+ // Fix weird locales:
+ if (sellang == "iw") sellang = "iw-il"
+ sellang = sellang.replace(/-Han[s|t]/i, "").toLowerCase()
+
+ console.log(sellang)
+ return await sellang
+ } catch (err) {
+ console.log('locale err', err)
+ let langcodes = ['af', 'sq', 'ar', 'eu', 'bg', 'be', 'ca', 'zh', 'zh-tw', 'zh-cn', 'zh-hk', 'zh-sg', 'hr', 'cs', 'da', 'nl', 'nl-be', 'en', 'en-us', 'en-eg', 'en-au', 'en-gb', 'en-ca', 'en-nz', 'en-ie', 'en-za', 'en-jm', 'en-bz', 'en-tt', 'en-001', 'et', 'fo', 'fa', 'fi', 'fr', 'fr-ca', 'gd', 'de', 'de-ch', 'el', 'he', 'hi', 'hu', 'is', 'id', 'it', 'ja', 'ko', 'lv', 'lt', 'mk', 'mt', 'no', 'nb', 'nn', 'pl', 'pt-br', 'pt', 'rm', 'ro', 'ru', 'sr', 'sk', 'sl', 'es', 'es-mx', 'es-419', 'sv', 'th', 'ts', 'tn', 'tr', 'uk', 'ur', 've', 'vi', 'xh', 'yi', 'zu', 'ms', 'iw', 'lo', 'tl', 'kk', 'ta', 'te', 'bn', 'ga', 'ht', 'la', 'pa', 'sa'];
+ let sellang = "en"
+ if (u && langcodes.includes(u.toLowerCase().replace('_', "-"))) {
+ sellang = ((u.toLowerCase()).replace('_', "-"))
+ } else if (u && u.includes('_') && langcodes.includes(((u.toLowerCase()).replace('_', "-")).split("-")[0])) {
+ sellang = ((u.toLowerCase()).replace('_', "-")).split("-")[0]
+ }
+ if (sellang.startsWith("en") && this.mk.storefrontId != "us") sellang = "en-gb"
+ return await sellang
+ }
+ },
+ skipToNextItem() {
+ app.prevButtonBackIndicator = false;
+ // app.mk.skipToNextItem() is buggy somehow so use this
+ if (this.mk.queue.nextPlayableItemIndex != -1 && this.mk.queue.nextPlayableItemIndex != null)
+ this.mk.changeToMediaAtIndex(this.mk.queue.nextPlayableItemIndex);
+ },
+ skipToPreviousItem() {
+ // app.mk.skipToPreviousItem() is buggy somehow so use this
+ if (this.mk.queue.previousPlayableItemIndex != -1 && this.mk.queue.previousPlayableItemIndex != null)
+ this.mk.changeToMediaAtIndex(this.mk.queue.previousPlayableItemIndex);
+ },
+ mediaKeyFixes() {
+ navigator.mediaSession.setActionHandler('previoustrack', function () {
+ app.prevButton()
+ });
+ navigator.mediaSession.setActionHandler('nexttrack', function () {
+ app.skipToNextItem()
+ });
+ },
+ checkForUpdate() {
+ ipcRenderer.send('check-for-update')
+ document.getElementById('settings.option.general.updateCider.check').innerHTML = 'Checking...'
+ notyf.success('Checking for update in background...')
+ ipcRenderer.on('update-response', (event, res) => {
+ if (res === "update-not-available") {
+ notyf.error(app.getLz(`settings.notyf.updateCider.${res}`))
+ } else if (res === "update-downloaded") {
+ notyf.success(app.getLz(`settings.notyf.updateCider.${res}`))
+ } else if (res === "update-error") {
+ notyf.error(app.getLz(`settings.notyf.updateCider.${res}`))
+ } else if (res === "update-timeout") {
+ notyf.error(app.getLz(`settings.notyf.updateCider.${res}`))
+ }
+ document.getElementById('settings.option.general.updateCider.check').innerHTML = app.getLz('term.check')
+ })
+ },
+ }
+})
+
+
+export { app }
\ No newline at end of file
diff --git a/src/renderer/main/vuex-store.js b/src/renderer/main/vuex-store.js
new file mode 100644
index 00000000..fb2b774f
--- /dev/null
+++ b/src/renderer/main/vuex-store.js
@@ -0,0 +1,20 @@
+const store = new Vuex.Store({
+ state: {
+ library: {
+ // songs: ipcRenderer.sendSync("get-library-songs"),
+ // albums: ipcRenderer.sendSync("get-library-albums"),
+ // recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"),
+ // playlists: ipcRenderer.sendSync("get-library-playlists")
+ },
+ artwork: {
+ playerLCD: ""
+ }
+ },
+ mutations: {
+ setLCDArtwork(state, artwork) {
+ state.artwork.playerLCD = artwork
+ }
+ }
+})
+
+export {store}
\ No newline at end of file
diff --git a/src/renderer/js/WSAPI_Interop.js b/src/renderer/main/wsapi_interop.js
similarity index 86%
rename from src/renderer/js/WSAPI_Interop.js
rename to src/renderer/main/wsapi_interop.js
index e86327be..2a85b5ff 100644
--- a/src/renderer/js/WSAPI_Interop.js
+++ b/src/renderer/main/wsapi_interop.js
@@ -49,13 +49,13 @@ const wsapi = {
},
musickitApi(method, id, params, library = false) {
if (library) {
- MusicKit.getInstance().api.library[method](id, params).then((results)=>{
- ipcRenderer.send('wsapi-returnMusicKitApi', JSON.stringify(results), method)
- })
+ MusicKit.getInstance().api.library[method](id, params).then((results)=>{
+ ipcRenderer.send('wsapi-returnMusicKitApi', JSON.stringify(results), method)
+ })
} else {
- MusicKit.getInstance().api[method](id, params).then((results)=>{
- ipcRenderer.send('wsapi-returnMusicKitApi', JSON.stringify(results), method)
- })
+ MusicKit.getInstance().api[method](id, params).then((results)=>{
+ ipcRenderer.send('wsapi-returnMusicKitApi', JSON.stringify(results), method)
+ })
}
},
getPlaybackState () {
@@ -81,14 +81,14 @@ const wsapi = {
},
playTrackById(id, kind = "song") {
- MusicKit.getInstance().setQueue({ [kind]: id }).then(function (queue) {
+ MusicKit.getInstance().setQueue({ [kind]: id , parameters : {l : app.mklang}}).then(function (queue) {
MusicKit.getInstance().play()
})
},
quickPlay(term) {
// Quick play by song name
MusicKit.getInstance().api.search(term, { limit: 2, types: 'songs' }).then(function (data) {
- MusicKit.getInstance().setQueue({ song: data["songs"][0]["id"] }).then(function (queue) {
+ MusicKit.getInstance().setQueue({ song: data["songs"][0]["id"],parameters : {l : app.mklang} }).then(function (queue) {
MusicKit.getInstance().play()
})
})
@@ -104,5 +104,10 @@ const wsapi = {
}else{
MusicKit.getInstance().repeatMode = 0
}
+ },
+ getmaxVolume() {
+ ipcRenderer.send('wsapi-returnvolumeMax',JSON.stringify(app.cfg.audio.maxVolume));
}
-}
\ No newline at end of file
+}
+
+export {wsapi}
\ No newline at end of file
diff --git a/src/renderer/sounds/btn1.ogg b/src/renderer/sounds/btn1.ogg
new file mode 100644
index 00000000..f6f75efa
Binary files /dev/null and b/src/renderer/sounds/btn1.ogg differ
diff --git a/src/renderer/sounds/confirm.ogg b/src/renderer/sounds/confirm.ogg
new file mode 100644
index 00000000..c4e3857b
Binary files /dev/null and b/src/renderer/sounds/confirm.ogg differ
diff --git a/src/renderer/sounds/hover.ogg b/src/renderer/sounds/hover.ogg
new file mode 100644
index 00000000..9da1b148
Binary files /dev/null and b/src/renderer/sounds/hover.ogg differ
diff --git a/src/renderer/style.css b/src/renderer/style.css
new file mode 100644
index 00000000..1ff1aa0c
--- /dev/null
+++ b/src/renderer/style.css
@@ -0,0 +1,13152 @@
+@import url("assets/fonts/Inter/inter.css");
+@import url("less/bootstrap-vue.min.css");
+@import url("less/codicon.css");
+@font-face {
+ font-family: 'Noto Sans JP';
+ font-style: normal;
+ font-weight: 100;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosansjp/v40/-F6ofjtqLzI2JPCgQBnw7HFQoggM.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans JP';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosansjp/v40/-F6pfjtqLzI2JPCgQBnw7HFQaioq1A.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans JP';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosansjp/v40/-F62fjtqLzI2JPCgQBnw7HFowA.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans JP';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosansjp/v40/-F6pfjtqLzI2JPCgQBnw7HFQMisq1A.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans JP';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosansjp/v40/-F6pfjtqLzI2JPCgQBnw7HFQei0q1A.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans JP';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosansjp/v40/-F6pfjtqLzI2JPCgQBnw7HFQQi8q1A.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 100;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v24/k3kJo84MPvpLmixcA63oeALZTYKL.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v24/k3kIo84MPvpLmixcA63oeALZhaCt9w.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v24/k3kXo84MPvpLmixcA63oeALhLw.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v24/k3kIo84MPvpLmixcA63oeALZ3aGt9w.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v24/k3kIo84MPvpLmixcA63oeALZlaet9w.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v24/k3kIo84MPvpLmixcA63oeALZraWt9w.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans HK';
+ font-style: normal;
+ font-weight: 100;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanshk/v19/nKKO-GM_FYFRJvXzVXaAPe9ZUHp1.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans HK';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanshk/v19/nKKP-GM_FYFRJvXzVXaAPe9ZmFhTHA.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans HK';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanshk/v19/nKKQ-GM_FYFRJvXzVXaAPe9hMg.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans HK';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanshk/v19/nKKP-GM_FYFRJvXzVXaAPe9ZwFlTHA.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans HK';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanshk/v19/nKKP-GM_FYFRJvXzVXaAPe9ZiF9THA.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans HK';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanshk/v19/nKKP-GM_FYFRJvXzVXaAPe9ZsF1THA.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans TC';
+ font-style: normal;
+ font-weight: 100;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanstc/v24/-nFlOG829Oofr2wohFbTp9i9WyEJ.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans TC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanstc/v24/-nFkOG829Oofr2wohFbTp9i9kwMvDQ.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans TC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanstc/v24/-nF7OG829Oofr2wohFbTp9iFOQ.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans TC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanstc/v24/-nFkOG829Oofr2wohFbTp9i9ywIvDQ.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans TC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanstc/v24/-nFkOG829Oofr2wohFbTp9i9gwQvDQ.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans TC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanstc/v24/-nFkOG829Oofr2wohFbTp9i9uwYvDQ.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans KR';
+ font-style: normal;
+ font-weight: 100;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanskr/v25/Pby6FmXiEBPT4ITbgNA5CgmOsn7u.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans KR';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanskr/v25/Pby7FmXiEBPT4ITbgNA5CgmOelzI7g.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans KR';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanskr/v25/PbykFmXiEBPT4ITbgNA5Cgm20A.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans KR';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanskr/v25/Pby7FmXiEBPT4ITbgNA5CgmOIl3I7g.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans KR';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanskr/v25/Pby7FmXiEBPT4ITbgNA5CgmOalvI7g.otf) format('opentype');
+}
+@font-face {
+ font-family: 'Noto Sans KR';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanskr/v25/Pby7FmXiEBPT4ITbgNA5CgmOUlnI7g.otf) format('opentype');
+}
+:root {
+ --appleEase: cubic-bezier(0.42, 0, 0.58, 1);
+ --appleTransition: 0.2s var(--appleEase);
+}
+/* Simple CSS framework for Apple Music Electron */
+.md-labeltext {
+ font-size: 14px;
+ text-transform: uppercase;
+ opacity: 0.75;
+ font-weight: 500;
+}
+.md-option-container {
+ /* border-radius: 10px; */
+ overflow: hidden;
+}
+.md-option-line {
+ display: flex;
+ width: 100%;
+ padding: 14px;
+ background: var(--opaquePageBGColor);
+ font-size: 0.85em;
+}
+.md-option-segment.md-option-segment_auto {
+ width: auto;
+ white-space: nowrap;
+}
+.md-option-container .md-option-line:not(:last-child) {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.15);
+}
+input[type="range"].md-slider {
+ -webkit-appearance: none;
+ height: 7px;
+ background: rgba(255, 255, 255, 0.6);
+ border-radius: 5px;
+ background-size: 70% 100%;
+ background-repeat: no-repeat;
+}
+input[type="range"].md-slider::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ height: 20px;
+ width: 20px;
+ border-radius: 50%;
+ background: #ffffff;
+ cursor: ew-resize;
+ box-shadow: 0 0 2px 0 #555;
+}
+input[type=range].md-slider::-webkit-slider-runnable-track {
+ -webkit-appearance: none;
+ box-shadow: none;
+ border: none;
+ background: transparent;
+}
+.md-option-header {
+ padding: 10px;
+ border-bottom: 1px solid rgba(200, 200, 200, 0.25);
+ font-weight: 500;
+ font-size: 0.9em;
+ background: rgba(255, 255, 255, 0.1);
+}
+.md-option-segment {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+}
+.md-h1 {
+ font-size: 3em;
+ text-align: center;
+}
+.md-header {
+ padding: 16px;
+}
+.md-header-title {
+ padding: 18px;
+ font-weight: 600;
+ font-size: 16px;
+ height: 55px;
+ background: var(--opaquePageBGColor);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.15);
+}
+.md-footer {
+ padding: 16px;
+ text-align: center;
+}
+.md-transparent {
+ background: transparent;
+}
+.md-container {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ padding: 32px;
+}
+.md-container_panel {
+ padding: 0px;
+}
+.md-body {
+ height: 100%;
+ padding: 16px;
+ font-size: 1.25em;
+}
+@media (prefers-color-scheme: light) {
+ .md-btn {
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 1px, rgba(0, 0, 0, 0.2) 0px 1px 1px;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ }
+ .md-close-btn {
+ background-color: #000;
+ }
+}
+/* Vue transitions */
+.fade_simple-enter-active,
+.fade_simple-leave-active {
+ transition: all 0.5s;
+}
+.fade_simple-enter,
+.fade_simple-leave-to {
+ opacity: 0;
+}
+.fade-enter-active,
+.fade-leave-active {
+ transition: all 0.5s;
+}
+.fade-enter,
+.fade-leave-to {
+ opacity: 0;
+ transform: scale(0.95);
+}
+/* CSS Grids */
+.container,
+.container-fluid,
+.container-xxl,
+.container-xl,
+.container-lg,
+.container-md,
+.container-sm {
+ width: 100%;
+ padding-right: var(--bs-gutter-x, 0.75rem);
+ padding-left: var(--bs-gutter-x, 0.75rem);
+ margin-right: auto;
+ margin-left: auto;
+}
+.row {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ display: flex;
+ flex-wrap: wrap;
+ /*margin-top: calc(-1 * var(--bs-gutter-y));*/
+ /*margin-right: calc(-0.5 * var(--bs-gutter-x));*/
+ /*margin-left: calc(-0.5 * var(--bs-gutter-x));*/
+}
+.row > * {
+ box-sizing: border-box;
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-top: var(--bs-gutter-y);
+}
+.col {
+ flex: 1 0 0%;
+}
+.row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+.row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+.row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+.row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+.row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+.row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+.row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+.col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+.col-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+}
+.col-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+.col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+.col-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+.col-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+}
+.col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+.col-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+}
+.col-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+}
+.col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+.col-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+}
+.col-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+}
+.col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+.offset-1 {
+ margin-left: 8.33333333%;
+}
+.offset-2 {
+ margin-left: 16.66666667%;
+}
+.offset-3 {
+ margin-left: 25%;
+}
+.offset-4 {
+ margin-left: 33.33333333%;
+}
+.offset-5 {
+ margin-left: 41.66666667%;
+}
+.offset-6 {
+ margin-left: 50%;
+}
+.offset-7 {
+ margin-left: 58.33333333%;
+}
+.offset-8 {
+ margin-left: 66.66666667%;
+}
+.offset-9 {
+ margin-left: 75%;
+}
+.offset-10 {
+ margin-left: 83.33333333%;
+}
+.offset-11 {
+ margin-left: 91.66666667%;
+}
+.g-0,
+.gx-0 {
+ --bs-gutter-x: 0;
+}
+.g-0,
+.gy-0 {
+ --bs-gutter-y: 0;
+}
+.g-1,
+.gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+.g-1,
+.gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+.g-2,
+.gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+.g-2,
+.gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+.g-3,
+.gx-3 {
+ --bs-gutter-x: 1rem;
+}
+.g-3,
+.gy-3 {
+ --bs-gutter-y: 1rem;
+}
+.g-4,
+.gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+.g-4,
+.gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+.g-5,
+.gx-5 {
+ --bs-gutter-x: 3rem;
+}
+.g-5,
+.gy-5 {
+ --bs-gutter-y: 3rem;
+}
+.d-inline {
+ display: inline !important;
+}
+.d-inline-block {
+ display: inline-block !important;
+}
+.d-block {
+ display: block !important;
+}
+.d-grid {
+ display: grid !important;
+}
+.d-table {
+ display: table !important;
+}
+.d-table-row {
+ display: table-row !important;
+}
+.d-table-cell {
+ display: table-cell !important;
+}
+.d-flex {
+ display: flex !important;
+}
+.d-inline-flex {
+ display: inline-flex !important;
+}
+.d-none {
+ display: none !important;
+}
+.flex-fill {
+ flex: 1 1 auto !important;
+}
+.flex-row {
+ flex-direction: row !important;
+}
+.flex-column {
+ flex-direction: column !important;
+}
+.flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+.flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+.flex-grow-0 {
+ flex-grow: 0 !important;
+}
+.flex-grow-1 {
+ flex-grow: 1 !important;
+}
+.flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+.flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+.flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+.justify-content-start {
+ justify-content: flex-start !important;
+}
+.justify-content-end {
+ justify-content: flex-end !important;
+}
+.justify-content-center {
+ justify-content: center !important;
+}
+.justify-content-between {
+ justify-content: space-between !important;
+}
+.justify-content-around {
+ justify-content: space-around !important;
+}
+.justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+.align-items-start {
+ align-items: flex-start !important;
+}
+.align-items-end {
+ align-items: flex-end !important;
+}
+.align-items-center {
+ align-items: center !important;
+}
+.align-items-baseline {
+ align-items: baseline !important;
+}
+.align-items-stretch {
+ align-items: stretch !important;
+}
+.align-content-start {
+ align-content: flex-start !important;
+}
+.align-content-end {
+ align-content: flex-end !important;
+}
+.align-content-center {
+ align-content: center !important;
+}
+.align-content-between {
+ align-content: space-between !important;
+}
+.align-content-around {
+ align-content: space-around !important;
+}
+.align-content-stretch {
+ align-content: stretch !important;
+}
+.align-self-auto {
+ align-self: auto !important;
+}
+.align-self-start {
+ align-self: flex-start !important;
+}
+.align-self-end {
+ align-self: flex-end !important;
+}
+.align-self-center {
+ align-self: center !important;
+}
+.align-self-baseline {
+ align-self: baseline !important;
+}
+.align-self-stretch {
+ align-self: stretch !important;
+}
+.order-first {
+ order: -1 !important;
+}
+.order-0 {
+ order: 0 !important;
+}
+.order-1 {
+ order: 1 !important;
+}
+.order-2 {
+ order: 2 !important;
+}
+.order-3 {
+ order: 3 !important;
+}
+.order-4 {
+ order: 4 !important;
+}
+.order-5 {
+ order: 5 !important;
+}
+.order-last {
+ order: 6 !important;
+}
+.m-0 {
+ margin: 0 !important;
+}
+.m-1 {
+ margin: 0.25rem !important;
+}
+.m-2 {
+ margin: 0.5rem !important;
+}
+.m-3 {
+ margin: 1rem !important;
+}
+.m-4 {
+ margin: 1.5rem !important;
+}
+.m-5 {
+ margin: 3rem !important;
+}
+.m-auto {
+ margin: auto !important;
+}
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+.mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+.my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+.my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+.my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+.my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+.my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+.my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+.my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+.mt-0 {
+ margin-top: 0 !important;
+}
+.mt-1 {
+ margin-top: 0.25rem !important;
+}
+.mt-2 {
+ margin-top: 0.5rem !important;
+}
+.mt-3 {
+ margin-top: 1rem !important;
+}
+.mt-4 {
+ margin-top: 1.5rem !important;
+}
+.mt-5 {
+ margin-top: 3rem !important;
+}
+.mt-auto {
+ margin-top: auto !important;
+}
+.me-0 {
+ margin-right: 0 !important;
+}
+.me-1 {
+ margin-right: 0.25rem !important;
+}
+.me-2 {
+ margin-right: 0.5rem !important;
+}
+.me-3 {
+ margin-right: 1rem !important;
+}
+.me-4 {
+ margin-right: 1.5rem !important;
+}
+.me-5 {
+ margin-right: 3rem !important;
+}
+.me-auto {
+ margin-right: auto !important;
+}
+.mb-0 {
+ margin-bottom: 0 !important;
+}
+.mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+.mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+.mb-3 {
+ margin-bottom: 1rem !important;
+}
+.mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+.mb-5 {
+ margin-bottom: 3rem !important;
+}
+.mb-auto {
+ margin-bottom: auto !important;
+}
+.ms-0 {
+ margin-left: 0 !important;
+}
+.ms-1 {
+ margin-left: 0.25rem !important;
+}
+.ms-2 {
+ margin-left: 0.5rem !important;
+}
+.ms-3 {
+ margin-left: 1rem !important;
+}
+.ms-4 {
+ margin-left: 1.5rem !important;
+}
+.ms-5 {
+ margin-left: 3rem !important;
+}
+.ms-auto {
+ margin-left: auto !important;
+}
+.p-0 {
+ padding: 0 !important;
+}
+.p-1 {
+ padding: 0.25rem !important;
+}
+.p-2 {
+ padding: 0.5rem !important;
+}
+.p-3 {
+ padding: 1rem !important;
+}
+.p-4 {
+ padding: 1.5rem !important;
+}
+.p-5 {
+ padding: 3rem !important;
+}
+.px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+.py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+.py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+.py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+.py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+.py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+.py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+.pt-0 {
+ padding-top: 0 !important;
+}
+.pt-1 {
+ padding-top: 0.25rem !important;
+}
+.pt-2 {
+ padding-top: 0.5rem !important;
+}
+.pt-3 {
+ padding-top: 1rem !important;
+}
+.pt-4 {
+ padding-top: 1.5rem !important;
+}
+.pt-5 {
+ padding-top: 3rem !important;
+}
+.pe-0 {
+ padding-right: 0 !important;
+}
+.pe-1 {
+ padding-right: 0.25rem !important;
+}
+.pe-2 {
+ padding-right: 0.5rem !important;
+}
+.pe-3 {
+ padding-right: 1rem !important;
+}
+.pe-4 {
+ padding-right: 1.5rem !important;
+}
+.pe-5 {
+ padding-right: 3rem !important;
+}
+.pb-0 {
+ padding-bottom: 0 !important;
+}
+.pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+.pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+.pb-3 {
+ padding-bottom: 1rem !important;
+}
+.pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+.pb-5 {
+ padding-bottom: 3rem !important;
+}
+.ps-0 {
+ padding-left: 0 !important;
+}
+.ps-1 {
+ padding-left: 0.25rem !important;
+}
+.ps-2 {
+ padding-left: 0.5rem !important;
+}
+.ps-3 {
+ padding-left: 1rem !important;
+}
+.ps-4 {
+ padding-left: 1.5rem !important;
+}
+.ps-5 {
+ padding-left: 3rem !important;
+}
+.dropup,
+.dropend,
+.dropdown,
+.dropstart {
+ position: relative;
+}
+.dropdown-toggle {
+ white-space: nowrap;
+}
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+.dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropdown-menu {
+ position: absolute;
+ z-index: 1000;
+ display: none;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0;
+ font-size: 1rem;
+ color: #212529;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+}
+.dropdown-menu[data-bs-popper] {
+ top: 100%;
+ left: 0;
+ margin-top: 0.125rem;
+}
+.dropdown-menu-start {
+ --bs-position: start;
+}
+.dropdown-menu-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+}
+.dropdown-menu-end {
+ --bs-position: end;
+}
+.dropdown-menu-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+}
+@media (min-width: 576px) {
+ .dropdown-menu-sm-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-sm-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 768px) {
+ .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-md-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-md-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-md-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 992px) {
+ .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 1200px) {
+ .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-xl-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 1400px) {
+ .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+.dropup .dropdown-menu[data-bs-popper] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: 0.125rem;
+}
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropend .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: 0.125rem;
+}
+.dropend .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+.dropend .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropend .dropdown-toggle::after {
+ vertical-align: 0;
+}
+.dropstart .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: 0.125rem;
+}
+.dropstart .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+.dropstart .dropdown-toggle::after {
+ display: none;
+}
+.dropstart .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+.dropstart .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropstart .dropdown-toggle::before {
+ vertical-align: 0;
+}
+.dropdown-divider {
+ height: 0;
+ margin: 0.5rem 0;
+ overflow: hidden;
+ border-top: 1px solid rgba(0, 0, 0, 0.15);
+}
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: 0.25rem 1rem;
+ clear: both;
+ font-weight: 400;
+ color: #212529;
+ text-align: inherit;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+.dropdown-item:hover,
+.dropdown-item:focus {
+ color: #1e2125;
+ background-color: #e9ecef;
+}
+.dropdown-item.active,
+.dropdown-item:active {
+ color: #fff;
+ text-decoration: none;
+ background-color: #0d6efd;
+}
+.dropdown-item.disabled,
+.dropdown-item:disabled {
+ color: #adb5bd;
+ pointer-events: none;
+ background-color: transparent;
+}
+.dropdown-menu.show {
+ display: block;
+}
+.dropdown-header {
+ display: block;
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: #6c757d;
+ white-space: nowrap;
+}
+.dropdown-item-text {
+ display: block;
+ padding: 0.25rem 1rem;
+ color: #212529;
+}
+.dropdown-menu-dark {
+ color: #dee2e6;
+ background-color: #343a40;
+ border-color: rgba(0, 0, 0, 0.15);
+}
+.dropdown-menu-dark .dropdown-item {
+ color: #dee2e6;
+}
+.dropdown-menu-dark .dropdown-item:hover,
+.dropdown-menu-dark .dropdown-item:focus {
+ color: #fff;
+ background-color: rgba(255, 255, 255, 0.15);
+}
+.dropdown-menu-dark .dropdown-item.active,
+.dropdown-menu-dark .dropdown-item:active {
+ color: #fff;
+ background-color: #0d6efd;
+}
+.dropdown-menu-dark .dropdown-item.disabled,
+.dropdown-menu-dark .dropdown-item:disabled {
+ color: #adb5bd;
+}
+.dropdown-menu-dark .dropdown-divider {
+ border-color: rgba(0, 0, 0, 0.15);
+}
+.dropdown-menu-dark .dropdown-item-text {
+ color: #dee2e6;
+}
+.dropdown-menu-dark .dropdown-header {
+ color: #adb5bd;
+}
+.list-group {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ border-radius: 0.25rem;
+}
+.list-group-numbered {
+ list-style-type: none;
+ counter-reset: section;
+}
+.list-group-numbered > li::before {
+ content: counters(section, ".") ". ";
+ counter-increment: section;
+}
+.list-group-item-action {
+ width: 100%;
+ color: #495057;
+ text-align: inherit;
+}
+.list-group-item-action:hover,
+.list-group-item-action:focus {
+ z-index: 1;
+ color: #495057;
+ text-decoration: none;
+ background-color: #f8f9fa;
+}
+.list-group-item-action:active {
+ color: #212529;
+ background-color: #e9ecef;
+}
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 0.5rem 1rem;
+ color: #212529;
+ text-decoration: none;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+}
+.list-group-item:first-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
+.list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+.list-group-item.disabled,
+.list-group-item:disabled {
+ color: #6c757d;
+ pointer-events: none;
+ background-color: #fff;
+}
+.list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+.list-group-item + .list-group-item {
+ border-top-width: 0;
+}
+.list-group-item + .list-group-item.active {
+ margin-top: -1px;
+ border-top-width: 1px;
+}
+.list-group-horizontal {
+ flex-direction: row;
+}
+.list-group-horizontal > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+}
+.list-group-horizontal > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+}
+.list-group-horizontal > .list-group-item.active {
+ margin-top: 0;
+}
+.list-group-horizontal > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+}
+.list-group-horizontal > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+}
+@media (min-width: 576px) {
+ .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+ .list-group-horizontal-sm > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+}
+@media (min-width: 768px) {
+ .list-group-horizontal-md {
+ flex-direction: row;
+ }
+ .list-group-horizontal-md > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-md > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-md > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-md > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-md > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+}
+@media (min-width: 992px) {
+ .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+ .list-group-horizontal-lg > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+}
+@media (min-width: 1200px) {
+ .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+ .list-group-horizontal-xl > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+}
+@media (min-width: 1400px) {
+ .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+ .list-group-horizontal-xxl > .list-group-item:first-child {
+ border-bottom-left-radius: 0.25rem;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item:last-child {
+ border-top-right-radius: 0.25rem;
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item + .list-group-item {
+ border-top-width: 1px;
+ border-left-width: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+}
+.list-group-flush {
+ border-radius: 0;
+}
+.list-group-flush > .list-group-item {
+ border-width: 0 0 1px;
+}
+.list-group-flush > .list-group-item:last-child {
+ border-bottom-width: 0;
+}
+.list-group-item-primary {
+ color: #084298;
+ background-color: #cfe2ff;
+}
+.list-group-item-primary.list-group-item-action:hover,
+.list-group-item-primary.list-group-item-action:focus {
+ color: #084298;
+ background-color: #bacbe6;
+}
+.list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #084298;
+ border-color: #084298;
+}
+.list-group-item-secondary {
+ color: #41464b;
+ background-color: #e2e3e5;
+}
+.list-group-item-secondary.list-group-item-action:hover,
+.list-group-item-secondary.list-group-item-action:focus {
+ color: #41464b;
+ background-color: #cbccce;
+}
+.list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #41464b;
+ border-color: #41464b;
+}
+.list-group-item-success {
+ color: #0f5132;
+ background-color: #d1e7dd;
+}
+.list-group-item-success.list-group-item-action:hover,
+.list-group-item-success.list-group-item-action:focus {
+ color: #0f5132;
+ background-color: #bcd0c7;
+}
+.list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #0f5132;
+ border-color: #0f5132;
+}
+.list-group-item-info {
+ color: #055160;
+ background-color: #cff4fc;
+}
+.list-group-item-info.list-group-item-action:hover,
+.list-group-item-info.list-group-item-action:focus {
+ color: #055160;
+ background-color: #badce3;
+}
+.list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #055160;
+ border-color: #055160;
+}
+.list-group-item-warning {
+ color: #664d03;
+ background-color: #fff3cd;
+}
+.list-group-item-warning.list-group-item-action:hover,
+.list-group-item-warning.list-group-item-action:focus {
+ color: #664d03;
+ background-color: #e6dbb9;
+}
+.list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #664d03;
+ border-color: #664d03;
+}
+.list-group-item-danger {
+ color: #842029;
+ background-color: #f8d7da;
+}
+.list-group-item-danger.list-group-item-action:hover,
+.list-group-item-danger.list-group-item-action:focus {
+ color: #842029;
+ background-color: #dfc2c4;
+}
+.list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #842029;
+ border-color: #842029;
+}
+.list-group-item-light {
+ color: #636464;
+ background-color: #fefefe;
+}
+.list-group-item-light.list-group-item-action:hover,
+.list-group-item-light.list-group-item-action:focus {
+ color: #636464;
+ background-color: #e5e5e5;
+}
+.list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #636464;
+ border-color: #636464;
+}
+.list-group-item-dark {
+ color: var(--textColor);
+ background-color: #333;
+}
+.list-group-item-dark.list-group-item-action:hover,
+.list-group-item-dark.list-group-item-action:focus {
+ color: #141619;
+ background-color: #bebebf;
+}
+.list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #141619;
+ border-color: #141619;
+}
+.toast {
+ width: 350px;
+ max-width: 100%;
+ font-size: 0.875rem;
+ pointer-events: auto;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+}
+.toast.showing {
+ opacity: 0;
+}
+.toast:not(.show) {
+ display: none;
+}
+.toast-container {
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+.toast-container > :not(:last-child) {
+ margin-bottom: 0.75rem;
+}
+.toast-header {
+ display: flex;
+ align-items: center;
+ padding: 0.5rem 0.75rem;
+ color: #6c757d;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+.toast-header .btn-close {
+ margin-right: -0.375rem;
+ margin-left: 0.75rem;
+}
+.toast-body {
+ padding: 0.75rem;
+ word-wrap: break-word;
+}
+.card {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #333;
+ background-clip: border-box;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+ border-radius: 0.25rem;
+}
+.card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+.card > .list-group {
+ border-top: inherit;
+ border-bottom: inherit;
+}
+.card > .list-group:first-child {
+ border-top-width: 0;
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+.card > .list-group:last-child {
+ border-bottom-width: 0;
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
+}
+.card > .card-header + .list-group,
+.card > .list-group + .card-footer {
+ border-top: 0;
+}
+.card-body {
+ flex: 1 1 auto;
+ padding: 1rem 1rem;
+}
+.card-title {
+ margin-bottom: 0.5rem;
+}
+.card-subtitle {
+ margin-top: -0.25rem;
+ margin-bottom: 0;
+}
+.card-text:last-child {
+ margin-bottom: 0;
+}
+.card-link + .card-link {
+ margin-left: 1rem;
+}
+.card-header {
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+}
+.card-header:first-child {
+ border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
+}
+.card-footer {
+ padding: 0.5rem 1rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-top: 1px solid rgba(0, 0, 0, 0.125);
+}
+.card-footer:last-child {
+ border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
+}
+.card-header-tabs {
+ margin-right: -0.5rem;
+ margin-bottom: -0.5rem;
+ margin-left: -0.5rem;
+ border-bottom: 0;
+}
+.card-header-pills {
+ margin-right: -0.5rem;
+ margin-left: -0.5rem;
+}
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1rem;
+ border-radius: calc(0.25rem - 1px);
+}
+.card-img,
+.card-img-top,
+.card-img-bottom {
+ width: 100%;
+}
+.card-img,
+.card-img-top {
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+.card-img,
+.card-img-bottom {
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
+}
+.card-group > .card {
+ margin-bottom: 0.75rem;
+}
+@media (min-width: 576px) {
+ .card-group {
+ display: flex;
+ flex-flow: row wrap;
+ }
+ .card-group > .card {
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+ .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+ .card-group > .card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ .card-group > .card:not(:last-child) .card-img-top,
+ .card-group > .card:not(:last-child) .card-header {
+ border-top-right-radius: 0;
+ }
+ .card-group > .card:not(:last-child) .card-img-bottom,
+ .card-group > .card:not(:last-child) .card-footer {
+ border-bottom-right-radius: 0;
+ }
+ .card-group > .card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ .card-group > .card:not(:first-child) .card-img-top,
+ .card-group > .card:not(:first-child) .card-header {
+ border-top-left-radius: 0;
+ }
+ .card-group > .card:not(:first-child) .card-img-bottom,
+ .card-group > .card:not(:first-child) .card-footer {
+ border-bottom-left-radius: 0;
+ }
+}
+.modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1055;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ outline: 0;
+ user-select: none;
+}
+.modal .close {
+ width: 50px;
+ height: 42px;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+.modal .close:hover {
+ background-color: #c42b1c;
+}
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.5rem;
+ pointer-events: none;
+ color: var(--textColor);
+}
+.modal.fade .modal-dialog {
+ transition: transform 0.1s var(--appleEase), opacity 0.1s var(--appleEase);
+ transform: scale(0.9);
+ opacity: 0;
+}
+@media (prefers-reduced-motion: reduce) {
+ .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+.modal.show .modal-dialog {
+ transform: none;
+ opacity: 1;
+}
+.modal.modal-static .modal-dialog {
+ transform: scale(1.02);
+}
+.modal-dialog-scrollable {
+ height: calc(100% - 1rem);
+}
+.modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow: hidden;
+}
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+.modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - 1rem);
+}
+.modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ pointer-events: auto;
+ background-color: var(--modalBackground);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
+ outline: 0;
+ box-shadow: var(--ciderShadow-Generic);
+ overflow: hidden;
+}
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1050;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
+}
+.modal-backdrop.fade {
+ opacity: 0;
+}
+.modal-backdrop.show {
+ opacity: 0.5;
+}
+.modal-header {
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 1rem;
+ border-top-left-radius: calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
+}
+.modal-header .btn-close {
+ padding: 0.5rem 0.5rem;
+ margin: -0.5rem -0.5rem -0.5rem auto;
+}
+.modal-title {
+ line-height: 1.5;
+ margin: 0;
+}
+.modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: 3rem 1rem 1rem 1rem;
+ font-size: 0.9em;
+}
+.modal-footer {
+ display: flex;
+ flex-wrap: wrap;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: flex-end;
+ padding: 0.75rem;
+ border-bottom-right-radius: calc(0.3rem - 1px);
+ border-bottom-left-radius: calc(0.3rem - 1px);
+}
+.modal-footer > * {
+ margin: 0.25rem;
+}
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto;
+ }
+ .modal-dialog-scrollable {
+ height: calc(100% - 3.5rem);
+ }
+ .modal-dialog-centered {
+ min-height: calc(100% - 3.5rem);
+ }
+ .modal-sm {
+ max-width: 300px;
+ }
+}
+@media (min-width: 992px) {
+ .modal-lg,
+ .modal-xl {
+ max-width: 800px;
+ }
+}
+@media (min-width: 1200px) {
+ .modal-xl {
+ max-width: 1140px;
+ }
+}
+.modal-fullscreen {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+}
+.modal-fullscreen .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+}
+.modal-fullscreen .modal-header {
+ border-radius: 0;
+}
+.modal-fullscreen .modal-body {
+ overflow-y: auto;
+}
+.modal-fullscreen .modal-footer {
+ border-radius: 0;
+}
+@media (max-width: 575.98px) {
+ .modal-fullscreen-sm-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-sm-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-sm-down .modal-header {
+ border-radius: 0;
+ }
+ .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
+ }
+ .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
+ }
+}
+@media (max-width: 767.98px) {
+ .modal-fullscreen-md-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-md-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-md-down .modal-header {
+ border-radius: 0;
+ }
+ .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
+ }
+ .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
+ }
+}
+@media (max-width: 991.98px) {
+ .modal-fullscreen-lg-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-lg-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-lg-down .modal-header {
+ border-radius: 0;
+ }
+ .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
+ }
+ .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
+ }
+}
+@media (max-width: 1199.98px) {
+ .modal-fullscreen-xl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-xl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-xl-down .modal-header {
+ border-radius: 0;
+ }
+ .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
+ }
+ .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
+ }
+}
+@media (max-width: 1399.98px) {
+ .modal-fullscreen-xxl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-xxl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-xxl-down .modal-header {
+ border-radius: 0;
+ }
+ .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
+ }
+ .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
+}
+.btn {
+ display: inline-block;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #212529;
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ background-color: transparent;
+ border: 1px solid transparent;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ border-radius: 0.25rem;
+ font-family: inherit;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .btn {
+ transition: none;
+ }
+}
+.btn:hover {
+ color: #212529;
+}
+.btn-check:focus + .btn,
+.btn:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+}
+.btn:disabled,
+.btn.disabled,
+fieldset:disabled .btn {
+ pointer-events: none;
+ opacity: 0.65;
+}
+.btn-primary {
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+.btn-primary:hover {
+ color: #fff;
+ background-color: #0b5ed7;
+ border-color: #0a58ca;
+}
+.btn-check:focus + .btn-primary,
+.btn-primary:focus {
+ color: #fff;
+ background-color: #0b5ed7;
+ border-color: #0a58ca;
+ box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
+}
+.btn-check:checked + .btn-primary,
+.btn-check:active + .btn-primary,
+.btn-primary:active,
+.btn-primary.active,
+.show > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #0a58ca;
+ border-color: #0a53be;
+}
+.btn-check:checked + .btn-primary:focus,
+.btn-check:active + .btn-primary:focus,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.show > .btn-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);
+}
+.btn-primary:disabled,
+.btn-primary.disabled {
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+.btn-secondary {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-secondary:hover {
+ color: #fff;
+ background-color: #5c636a;
+ border-color: #565e64;
+}
+.btn-check:focus + .btn-secondary,
+.btn-secondary:focus {
+ color: #fff;
+ background-color: #5c636a;
+ border-color: #565e64;
+ box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
+}
+.btn-check:checked + .btn-secondary,
+.btn-check:active + .btn-secondary,
+.btn-secondary:active,
+.btn-secondary.active,
+.show > .btn-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #565e64;
+ border-color: #51585e;
+}
+.btn-check:checked + .btn-secondary:focus,
+.btn-check:active + .btn-secondary:focus,
+.btn-secondary:active:focus,
+.btn-secondary.active:focus,
+.show > .btn-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);
+}
+.btn-secondary:disabled,
+.btn-secondary.disabled {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-success {
+ color: #fff;
+ background-color: #198754;
+ border-color: #198754;
+}
+.btn-success:hover {
+ color: #fff;
+ background-color: #157347;
+ border-color: #146c43;
+}
+.btn-check:focus + .btn-success,
+.btn-success:focus {
+ color: #fff;
+ background-color: #157347;
+ border-color: #146c43;
+ box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
+}
+.btn-check:checked + .btn-success,
+.btn-check:active + .btn-success,
+.btn-success:active,
+.btn-success.active,
+.show > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #146c43;
+ border-color: #13653f;
+}
+.btn-check:checked + .btn-success:focus,
+.btn-check:active + .btn-success:focus,
+.btn-success:active:focus,
+.btn-success.active:focus,
+.show > .btn-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);
+}
+.btn-success:disabled,
+.btn-success.disabled {
+ color: #fff;
+ background-color: #198754;
+ border-color: #198754;
+}
+.btn-info {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-info:hover {
+ color: #000;
+ background-color: #31d2f2;
+ border-color: #25cff2;
+}
+.btn-check:focus + .btn-info,
+.btn-info:focus {
+ color: #000;
+ background-color: #31d2f2;
+ border-color: #25cff2;
+ box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
+}
+.btn-check:checked + .btn-info,
+.btn-check:active + .btn-info,
+.btn-info:active,
+.btn-info.active,
+.show > .btn-info.dropdown-toggle {
+ color: #000;
+ background-color: #3dd5f3;
+ border-color: #25cff2;
+}
+.btn-check:checked + .btn-info:focus,
+.btn-check:active + .btn-info:focus,
+.btn-info:active:focus,
+.btn-info.active:focus,
+.show > .btn-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);
+}
+.btn-info:disabled,
+.btn-info.disabled {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-warning {
+ color: #000;
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-warning:hover {
+ color: #000;
+ background-color: #ffca2c;
+ border-color: #ffc720;
+}
+.btn-check:focus + .btn-warning,
+.btn-warning:focus {
+ color: #000;
+ background-color: #ffca2c;
+ border-color: #ffc720;
+ box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
+}
+.btn-check:checked + .btn-warning,
+.btn-check:active + .btn-warning,
+.btn-warning:active,
+.btn-warning.active,
+.show > .btn-warning.dropdown-toggle {
+ color: #000;
+ background-color: #ffcd39;
+ border-color: #ffc720;
+}
+.btn-check:checked + .btn-warning:focus,
+.btn-check:active + .btn-warning:focus,
+.btn-warning:active:focus,
+.btn-warning.active:focus,
+.show > .btn-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);
+}
+.btn-warning:disabled,
+.btn-warning.disabled {
+ color: #000;
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-danger {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-danger:hover {
+ color: #fff;
+ background-color: #bb2d3b;
+ border-color: #b02a37;
+}
+.btn-check:focus + .btn-danger,
+.btn-danger:focus {
+ color: #fff;
+ background-color: #bb2d3b;
+ border-color: #b02a37;
+ box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
+}
+.btn-check:checked + .btn-danger,
+.btn-check:active + .btn-danger,
+.btn-danger:active,
+.btn-danger.active,
+.show > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #b02a37;
+ border-color: #a52834;
+}
+.btn-check:checked + .btn-danger:focus,
+.btn-check:active + .btn-danger:focus,
+.btn-danger:active:focus,
+.btn-danger.active:focus,
+.show > .btn-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);
+}
+.btn-danger:disabled,
+.btn-danger.disabled {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-light {
+ color: #000;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-light:hover {
+ color: #000;
+ background-color: #f9fafb;
+ border-color: #f9fafb;
+}
+.btn-check:focus + .btn-light,
+.btn-light:focus {
+ color: #000;
+ background-color: #f9fafb;
+ border-color: #f9fafb;
+ box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
+}
+.btn-check:checked + .btn-light,
+.btn-check:active + .btn-light,
+.btn-light:active,
+.btn-light.active,
+.show > .btn-light.dropdown-toggle {
+ color: #000;
+ background-color: #f9fafb;
+ border-color: #f9fafb;
+}
+.btn-check:checked + .btn-light:focus,
+.btn-check:active + .btn-light:focus,
+.btn-light:active:focus,
+.btn-light.active:focus,
+.show > .btn-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);
+}
+.btn-light:disabled,
+.btn-light.disabled {
+ color: #000;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-dark {
+ color: #fff;
+ background-color: #212529;
+ border-color: #212529;
+}
+.btn-dark:hover {
+ color: #fff;
+ background-color: #1c1f23;
+ border-color: #1a1e21;
+}
+.btn-check:focus + .btn-dark,
+.btn-dark:focus {
+ color: #fff;
+ background-color: #1c1f23;
+ border-color: #1a1e21;
+ box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
+}
+.btn-check:checked + .btn-dark,
+.btn-check:active + .btn-dark,
+.btn-dark:active,
+.btn-dark.active,
+.show > .btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #1a1e21;
+ border-color: #191c1f;
+}
+.btn-check:checked + .btn-dark:focus,
+.btn-check:active + .btn-dark:focus,
+.btn-dark:active:focus,
+.btn-dark.active:focus,
+.show > .btn-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);
+}
+.btn-dark:disabled,
+.btn-dark.disabled {
+ color: #fff;
+ background-color: #212529;
+ border-color: #212529;
+}
+.btn-outline-primary {
+ color: #0d6efd;
+ border-color: #0d6efd;
+}
+.btn-outline-primary:hover {
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+.btn-check:focus + .btn-outline-primary,
+.btn-outline-primary:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
+}
+.btn-check:checked + .btn-outline-primary,
+.btn-check:active + .btn-outline-primary,
+.btn-outline-primary:active,
+.btn-outline-primary.active,
+.btn-outline-primary.dropdown-toggle.show {
+ color: #fff;
+ background-color: #0d6efd;
+ border-color: #0d6efd;
+}
+.btn-check:checked + .btn-outline-primary:focus,
+.btn-check:active + .btn-outline-primary:focus,
+.btn-outline-primary:active:focus,
+.btn-outline-primary.active:focus,
+.btn-outline-primary.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);
+}
+.btn-outline-primary:disabled,
+.btn-outline-primary.disabled {
+ color: #0d6efd;
+ background-color: transparent;
+}
+.btn-outline-secondary {
+ color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-outline-secondary:hover {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-check:focus + .btn-outline-secondary,
+.btn-outline-secondary:focus {
+ box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
+}
+.btn-check:checked + .btn-outline-secondary,
+.btn-check:active + .btn-outline-secondary,
+.btn-outline-secondary:active,
+.btn-outline-secondary.active,
+.btn-outline-secondary.dropdown-toggle.show {
+ color: #fff;
+ background-color: #6c757d;
+ border-color: #6c757d;
+}
+.btn-check:checked + .btn-outline-secondary:focus,
+.btn-check:active + .btn-outline-secondary:focus,
+.btn-outline-secondary:active:focus,
+.btn-outline-secondary.active:focus,
+.btn-outline-secondary.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);
+}
+.btn-outline-secondary:disabled,
+.btn-outline-secondary.disabled {
+ color: #6c757d;
+ background-color: transparent;
+}
+.btn-outline-success {
+ color: #198754;
+ border-color: #198754;
+}
+.btn-outline-success:hover {
+ color: #fff;
+ background-color: #198754;
+ border-color: #198754;
+}
+.btn-check:focus + .btn-outline-success,
+.btn-outline-success:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
+}
+.btn-check:checked + .btn-outline-success,
+.btn-check:active + .btn-outline-success,
+.btn-outline-success:active,
+.btn-outline-success.active,
+.btn-outline-success.dropdown-toggle.show {
+ color: #fff;
+ background-color: #198754;
+ border-color: #198754;
+}
+.btn-check:checked + .btn-outline-success:focus,
+.btn-check:active + .btn-outline-success:focus,
+.btn-outline-success:active:focus,
+.btn-outline-success.active:focus,
+.btn-outline-success.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);
+}
+.btn-outline-success:disabled,
+.btn-outline-success.disabled {
+ color: #198754;
+ background-color: transparent;
+}
+.btn-outline-info {
+ color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-outline-info:hover {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-check:focus + .btn-outline-info,
+.btn-outline-info:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
+}
+.btn-check:checked + .btn-outline-info,
+.btn-check:active + .btn-outline-info,
+.btn-outline-info:active,
+.btn-outline-info.active,
+.btn-outline-info.dropdown-toggle.show {
+ color: #000;
+ background-color: #0dcaf0;
+ border-color: #0dcaf0;
+}
+.btn-check:checked + .btn-outline-info:focus,
+.btn-check:active + .btn-outline-info:focus,
+.btn-outline-info:active:focus,
+.btn-outline-info.active:focus,
+.btn-outline-info.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);
+}
+.btn-outline-info:disabled,
+.btn-outline-info.disabled {
+ color: #0dcaf0;
+ background-color: transparent;
+}
+.btn-outline-warning {
+ color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-outline-warning:hover {
+ color: #000;
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-check:focus + .btn-outline-warning,
+.btn-outline-warning:focus {
+ box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
+}
+.btn-check:checked + .btn-outline-warning,
+.btn-check:active + .btn-outline-warning,
+.btn-outline-warning:active,
+.btn-outline-warning.active,
+.btn-outline-warning.dropdown-toggle.show {
+ color: #000;
+ background-color: #ffc107;
+ border-color: #ffc107;
+}
+.btn-check:checked + .btn-outline-warning:focus,
+.btn-check:active + .btn-outline-warning:focus,
+.btn-outline-warning:active:focus,
+.btn-outline-warning.active:focus,
+.btn-outline-warning.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);
+}
+.btn-outline-warning:disabled,
+.btn-outline-warning.disabled {
+ color: #ffc107;
+ background-color: transparent;
+}
+.btn-outline-danger {
+ color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-outline-danger:hover {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-check:focus + .btn-outline-danger,
+.btn-outline-danger:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
+}
+.btn-check:checked + .btn-outline-danger,
+.btn-check:active + .btn-outline-danger,
+.btn-outline-danger:active,
+.btn-outline-danger.active,
+.btn-outline-danger.dropdown-toggle.show {
+ color: #fff;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+.btn-check:checked + .btn-outline-danger:focus,
+.btn-check:active + .btn-outline-danger:focus,
+.btn-outline-danger:active:focus,
+.btn-outline-danger.active:focus,
+.btn-outline-danger.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);
+}
+.btn-outline-danger:disabled,
+.btn-outline-danger.disabled {
+ color: #dc3545;
+ background-color: transparent;
+}
+.btn-outline-light {
+ color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-outline-light:hover {
+ color: #000;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-check:focus + .btn-outline-light,
+.btn-outline-light:focus {
+ box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
+}
+.btn-check:checked + .btn-outline-light,
+.btn-check:active + .btn-outline-light,
+.btn-outline-light:active,
+.btn-outline-light.active,
+.btn-outline-light.dropdown-toggle.show {
+ color: #000;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+.btn-check:checked + .btn-outline-light:focus,
+.btn-check:active + .btn-outline-light:focus,
+.btn-outline-light:active:focus,
+.btn-outline-light.active:focus,
+.btn-outline-light.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);
+}
+.btn-outline-light:disabled,
+.btn-outline-light.disabled {
+ color: #f8f9fa;
+ background-color: transparent;
+}
+.btn-outline-dark {
+ color: #212529;
+ border-color: #212529;
+}
+.btn-outline-dark:hover {
+ color: #fff;
+ background-color: #212529;
+ border-color: #212529;
+}
+.btn-check:focus + .btn-outline-dark,
+.btn-outline-dark:focus {
+ box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
+}
+.btn-check:checked + .btn-outline-dark,
+.btn-check:active + .btn-outline-dark,
+.btn-outline-dark:active,
+.btn-outline-dark.active,
+.btn-outline-dark.dropdown-toggle.show {
+ color: #fff;
+ background-color: #212529;
+ border-color: #212529;
+}
+.btn-check:checked + .btn-outline-dark:focus,
+.btn-check:active + .btn-outline-dark:focus,
+.btn-outline-dark:active:focus,
+.btn-outline-dark.active:focus,
+.btn-outline-dark.dropdown-toggle.show:focus {
+ box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);
+}
+.btn-outline-dark:disabled,
+.btn-outline-dark.disabled {
+ color: #212529;
+ background-color: transparent;
+}
+.btn-link {
+ font-weight: 400;
+ color: #0d6efd;
+ text-decoration: underline;
+}
+.btn-link:hover {
+ color: #0a58ca;
+}
+.btn-link:disabled,
+.btn-link.disabled {
+ color: #6c757d;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.3rem;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.2rem;
+}
+.form-control {
+ width: 100%;
+}
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+.btn-group > .btn-check:checked + .btn,
+.btn-group > .btn-check:focus + .btn,
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn-check:checked + .btn,
+.btn-group-vertical > .btn-check:focus + .btn,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+.btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+.btn-toolbar .input-group {
+ width: auto;
+}
+.btn-group > .btn:not(:first-child),
+.btn-group > .btn-group:not(:first-child) {
+ margin-left: -1px;
+}
+.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn:nth-child(n+3),
+.btn-group > :not(.btn-check) + .btn,
+.btn-group > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+.dropdown-toggle-split::after,
+.dropup .dropdown-toggle-split::after,
+.dropend .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+.dropstart .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+.btn-sm + .dropdown-toggle-split,
+.btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+.btn-lg + .dropdown-toggle-split,
+.btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+.btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+ width: 100%;
+}
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: -1px;
+}
+.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group-vertical > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn ~ .btn,
+.btn-group-vertical > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.table {
+ --bs-table-bg: transparent;
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: #212529;
+ --bs-table-striped-bg: rgba(0, 0, 0, 0.05);
+ --bs-table-active-color: #212529;
+ --bs-table-active-bg: rgba(0, 0, 0, 0.1);
+ --bs-table-hover-color: #212529;
+ --bs-table-hover-bg: rgba(0, 0, 0, 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ color: #212529;
+ vertical-align: top;
+ border-color: #dee2e6;
+}
+.table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ background-color: var(--bs-table-bg);
+ border-bottom-width: 1px;
+ box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
+}
+.table > tbody {
+ vertical-align: inherit;
+}
+.table > thead {
+ vertical-align: bottom;
+}
+.table > :not(:first-child) {
+ border-top: 2px solid currentColor;
+}
+.caption-top {
+ caption-side: top;
+}
+.table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
+}
+.table-bordered > :not(caption) > * {
+ border-width: 1px 0;
+}
+.table-bordered > :not(caption) > * > * {
+ border-width: 0 1px;
+}
+.table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
+}
+.table-borderless > :not(:first-child) {
+ border-top-width: 0;
+}
+.table-striped > tbody > tr:nth-of-type(odd) > * {
+ --bs-table-accent-bg: var(--bs-table-striped-bg);
+ color: var(--bs-table-striped-color);
+}
+.table-active {
+ --bs-table-accent-bg: var(--bs-table-active-bg);
+ color: var(--bs-table-active-color);
+}
+.table-hover > tbody > tr:hover > * {
+ --bs-table-accent-bg: var(--bs-table-hover-bg);
+ color: var(--bs-table-hover-color);
+}
+.table-primary {
+ --bs-table-bg: #cfe2ff;
+ --bs-table-striped-bg: #c5d7f2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bacbe6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfd1ec;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #bacbe6;
+}
+.table-secondary {
+ --bs-table-bg: #e2e3e5;
+ --bs-table-striped-bg: #d7d8da;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #cbccce;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d1d2d4;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #cbccce;
+}
+.table-success {
+ --bs-table-bg: #d1e7dd;
+ --bs-table-striped-bg: #c7dbd2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #bcd0c7;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c1d6cc;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #bcd0c7;
+}
+.table-info {
+ --bs-table-bg: #cff4fc;
+ --bs-table-striped-bg: #c5e8ef;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #badce3;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #bfe2e9;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #badce3;
+}
+.table-warning {
+ --bs-table-bg: #fff3cd;
+ --bs-table-striped-bg: #f2e7c3;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #e6dbb9;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #ece1be;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #e6dbb9;
+}
+.table-danger {
+ --bs-table-bg: #f8d7da;
+ --bs-table-striped-bg: #eccccf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfc2c4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5c7ca;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #dfc2c4;
+}
+.table-light {
+ --bs-table-bg: #f8f9fa;
+ --bs-table-striped-bg: #ecedee;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #dfe0e1;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e5e6e7;
+ --bs-table-hover-color: #000;
+ color: #000;
+ border-color: #dfe0e1;
+}
+.table-dark {
+ --bs-table-bg: #212529;
+ --bs-table-striped-bg: #2c3034;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #373b3e;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #323539;
+ --bs-table-hover-color: #fff;
+ color: #fff;
+ border-color: #373b3e;
+}
+.table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+@media (max-width: 575.98px) {
+ .table-responsive-sm {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 767.98px) {
+ .table-responsive-md {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 991.98px) {
+ .table-responsive-lg {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 1199.98px) {
+ .table-responsive-xl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 1399.98px) {
+ .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+.nav-tabs {
+ border-bottom: 1px solid #dee2e6;
+}
+.nav-tabs .nav-link {
+ margin-bottom: -1px;
+ background: none;
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+.nav-tabs .nav-link:hover,
+.nav-tabs .nav-link:focus {
+ border-color: #e9ecef #e9ecef #dee2e6;
+ isolation: isolate;
+}
+.nav-tabs .nav-link.disabled {
+ color: #6c757d;
+ background-color: transparent;
+ border-color: transparent;
+}
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #495057;
+ background-color: #fff;
+ border-color: #dee2e6 #dee2e6 #fff;
+}
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.nav-pills .nav-link {
+ background: none;
+ border: 0;
+ border-radius: 0.25rem;
+}
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: #fff;
+ background-color: #0d6efd;
+}
+.nav-fill > .nav-link,
+.nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+.nav-justified > .nav-link,
+.nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+.nav-fill .nav-item .nav-link,
+.nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+.tab-content > .tab-pane {
+ display: none;
+}
+.tab-content > .active {
+ display: block;
+}
+/*!
+ * Bootstrap Grid v5.1.1 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+:root {
+ --bs-blue: #0d6efd;
+ --bs-indigo: #6610f2;
+ --bs-purple: #6f42c1;
+ --bs-pink: #d63384;
+ --bs-red: #dc3545;
+ --bs-orange: #fd7e14;
+ --bs-yellow: #ffc107;
+ --bs-green: #198754;
+ --bs-teal: #20c997;
+ --bs-cyan: #0dcaf0;
+ --bs-white: #fff;
+ --bs-gray: #6c757d;
+ --bs-gray-dark: #343a40;
+ --bs-gray-100: #f8f9fa;
+ --bs-gray-200: #e9ecef;
+ --bs-gray-300: #dee2e6;
+ --bs-gray-400: #ced4da;
+ --bs-gray-500: #adb5bd;
+ --bs-gray-600: #6c757d;
+ --bs-gray-700: #495057;
+ --bs-gray-800: #343a40;
+ --bs-gray-900: #212529;
+ --bs-primary: #0d6efd;
+ --bs-secondary: #6c757d;
+ --bs-success: #198754;
+ --bs-info: #0dcaf0;
+ --bs-warning: #ffc107;
+ --bs-danger: #dc3545;
+ --bs-light: #f8f9fa;
+ --bs-dark: #212529;
+ --bs-primary-rgb: 13, 110, 253;
+ --bs-secondary-rgb: 108, 117, 125;
+ --bs-success-rgb: 25, 135, 84;
+ --bs-info-rgb: 13, 202, 240;
+ --bs-warning-rgb: 255, 193, 7;
+ --bs-danger-rgb: 220, 53, 69;
+ --bs-light-rgb: 248, 249, 250;
+ --bs-dark-rgb: 33, 37, 41;
+ --bs-white-rgb: 255, 255, 255;
+ --bs-black-rgb: 0, 0, 0;
+ --bs-body-color-rgb: 33, 37, 41;
+ --bs-body-bg-rgb: 255, 255, 255;
+ --bs-font-sans-serif: inherit;
+ --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ --bs-body-font-family: inherit;
+ --bs-body-font-size: 1rem;
+ --bs-body-font-weight: 400;
+ --bs-body-line-height: 1.5;
+ --bs-body-color: #212529;
+ --bs-body-bg: #fff;
+}
+.container,
+.container-fluid,
+.container-xxl,
+.container-xl,
+.container-lg,
+.container-md,
+.container-sm {
+ width: 100%;
+ padding-right: var(--bs-gutter-x, 0.75rem);
+ padding-left: var(--bs-gutter-x, 0.75rem);
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 576px) {
+ .container-sm,
+ .container {
+ max-width: 540px;
+ }
+}
+@media (min-width: 768px) {
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 720px;
+ }
+}
+@media (min-width: 992px) {
+ .container-lg,
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 960px;
+ }
+}
+@media (min-width: 1200px) {
+ .container-xl,
+ .container-lg,
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 1140px;
+ }
+}
+@media (min-width: 1400px) {
+ .container-xxl,
+ .container-xl,
+ .container-lg,
+ .container-md,
+ .container-sm,
+ .container {
+ max-width: 1320px;
+ }
+}
+.col {
+ flex: 1 0 0%;
+}
+.row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+.row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+.row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+.row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+.row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+.row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+.row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+.col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+.col-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+}
+.col-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+.col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+.col-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+.col-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+}
+.col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+.col-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+}
+.col-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+}
+.col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+.col-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+}
+.col-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+}
+.col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+.offset-1 {
+ margin-left: 8.33333333%;
+}
+.offset-2 {
+ margin-left: 16.66666667%;
+}
+.offset-3 {
+ margin-left: 25%;
+}
+.offset-4 {
+ margin-left: 33.33333333%;
+}
+.offset-5 {
+ margin-left: 41.66666667%;
+}
+.offset-6 {
+ margin-left: 50%;
+}
+.offset-7 {
+ margin-left: 58.33333333%;
+}
+.offset-8 {
+ margin-left: 66.66666667%;
+}
+.offset-9 {
+ margin-left: 75%;
+}
+.offset-10 {
+ margin-left: 83.33333333%;
+}
+.offset-11 {
+ margin-left: 91.66666667%;
+}
+.g-0,
+.gx-0 {
+ --bs-gutter-x: 0;
+}
+.g-0,
+.gy-0 {
+ --bs-gutter-y: 0;
+}
+.g-1,
+.gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+.g-1,
+.gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+.g-2,
+.gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+.g-2,
+.gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+.g-3,
+.gx-3 {
+ --bs-gutter-x: 1rem;
+}
+.g-3,
+.gy-3 {
+ --bs-gutter-y: 1rem;
+}
+.g-4,
+.gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+.g-4,
+.gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+.g-5,
+.gx-5 {
+ --bs-gutter-x: 3rem;
+}
+.g-5,
+.gy-5 {
+ --bs-gutter-y: 3rem;
+}
+@media (min-width: 576px) {
+ .col-sm {
+ flex: 1 0 0%;
+ }
+ .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-sm-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-sm-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-sm-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-sm-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-sm-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-sm-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-sm-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-sm-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-sm-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-sm-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-sm-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-sm-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-sm-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-sm-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-sm-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-sm-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-sm-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-sm-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-sm-0 {
+ margin-left: 0;
+ }
+ .offset-sm-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-sm-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .offset-sm-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-sm-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .offset-sm-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-sm-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .offset-sm-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-sm-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-sm-0,
+ .gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-sm-0,
+ .gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-sm-1,
+ .gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-sm-1,
+ .gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-sm-2,
+ .gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-sm-2,
+ .gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-sm-3,
+ .gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-sm-3,
+ .gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-sm-4,
+ .gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-sm-4,
+ .gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-sm-5,
+ .gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-sm-5,
+ .gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 768px) {
+ .col-md {
+ flex: 1 0 0%;
+ }
+ .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-md-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-md-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-md-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-md-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-md-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-md-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-md-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-md-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-md-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-md-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-md-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-md-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-md-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-md-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-md-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-md-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-md-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-md-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-md-0 {
+ margin-left: 0;
+ }
+ .offset-md-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-md-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+ .offset-md-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-md-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+ .offset-md-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-md-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+ .offset-md-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-md-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-md-0,
+ .gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-md-0,
+ .gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-md-1,
+ .gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-md-1,
+ .gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-md-2,
+ .gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-md-2,
+ .gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-md-3,
+ .gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-md-3,
+ .gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-md-4,
+ .gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-md-4,
+ .gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-md-5,
+ .gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-md-5,
+ .gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 992px) {
+ .col-lg {
+ flex: 1 0 0%;
+ }
+ .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-lg-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-lg-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-lg-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-lg-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-lg-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-lg-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-lg-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-lg-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-lg-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-lg-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-lg-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-lg-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-lg-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-lg-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-lg-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-lg-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-lg-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-lg-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-lg-0 {
+ margin-left: 0;
+ }
+ .offset-lg-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-lg-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .offset-lg-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-lg-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .offset-lg-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-lg-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-lg-0,
+ .gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-lg-0,
+ .gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-lg-1,
+ .gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-lg-1,
+ .gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-lg-2,
+ .gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-lg-2,
+ .gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-lg-3,
+ .gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-lg-3,
+ .gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-lg-4,
+ .gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-lg-4,
+ .gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-lg-5,
+ .gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-lg-5,
+ .gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 1200px) {
+ .col-xl {
+ flex: 1 0 0%;
+ }
+ .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-xl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-xl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-xl-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-xl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-xl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-xl-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-xl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-xl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-xl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-xl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-xl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-xl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-xl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-xl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-xl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-xl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-xl-0 {
+ margin-left: 0;
+ }
+ .offset-xl-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-xl-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .offset-xl-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-xl-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-xl-0,
+ .gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-xl-0,
+ .gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-xl-1,
+ .gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-xl-1,
+ .gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-xl-2,
+ .gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-xl-2,
+ .gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-xl-3,
+ .gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-xl-3,
+ .gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-xl-4,
+ .gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-xl-4,
+ .gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-xl-5,
+ .gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-xl-5,
+ .gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 1400px) {
+ .col-xxl {
+ flex: 1 0 0%;
+ }
+ .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-xxl-0 {
+ margin-left: 0;
+ }
+ .offset-xxl-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-xxl-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-xxl-3 {
+ margin-left: 25%;
+ }
+ .offset-xxl-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-xxl-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-xxl-6 {
+ margin-left: 50%;
+ }
+ .offset-xxl-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-xxl-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-xxl-9 {
+ margin-left: 75%;
+ }
+ .offset-xxl-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-xxl-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-xxl-0,
+ .gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-xxl-0,
+ .gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-xxl-1,
+ .gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-xxl-1,
+ .gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-xxl-2,
+ .gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-xxl-2,
+ .gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-xxl-3,
+ .gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-xxl-3,
+ .gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-xxl-4,
+ .gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-xxl-4,
+ .gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-xxl-5,
+ .gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-xxl-5,
+ .gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+.d-inline {
+ display: inline !important;
+}
+.d-inline-block {
+ display: inline-block !important;
+}
+.d-block {
+ display: block !important;
+}
+.d-grid {
+ display: grid !important;
+}
+.d-table {
+ display: table !important;
+}
+.d-table-row {
+ display: table-row !important;
+}
+.d-table-cell {
+ display: table-cell !important;
+}
+.d-flex {
+ display: flex !important;
+}
+.d-inline-flex {
+ display: inline-flex !important;
+}
+.d-none {
+ display: none !important;
+}
+.flex-fill {
+ flex: 1 1 auto !important;
+}
+.flex-row {
+ flex-direction: row !important;
+}
+.flex-column {
+ flex-direction: column !important;
+}
+.flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+.flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+.flex-grow-0 {
+ flex-grow: 0 !important;
+}
+.flex-grow-1 {
+ flex-grow: 1 !important;
+}
+.flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+.flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+.flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+.justify-content-start {
+ justify-content: flex-start !important;
+}
+.justify-content-end {
+ justify-content: flex-end !important;
+}
+.justify-content-center {
+ justify-content: center !important;
+}
+.justify-content-between {
+ justify-content: space-between !important;
+}
+.justify-content-around {
+ justify-content: space-around !important;
+}
+.justify-content-evenly {
+ justify-content: space-evenly !important;
+}
+.align-items-start {
+ align-items: flex-start !important;
+}
+.align-items-end {
+ align-items: flex-end !important;
+}
+.align-items-center {
+ align-items: center !important;
+}
+.align-items-baseline {
+ align-items: baseline !important;
+}
+.align-items-stretch {
+ align-items: stretch !important;
+}
+.align-content-start {
+ align-content: flex-start !important;
+}
+.align-content-end {
+ align-content: flex-end !important;
+}
+.align-content-center {
+ align-content: center !important;
+}
+.align-content-between {
+ align-content: space-between !important;
+}
+.align-content-around {
+ align-content: space-around !important;
+}
+.align-content-stretch {
+ align-content: stretch !important;
+}
+.align-self-auto {
+ align-self: auto !important;
+}
+.align-self-start {
+ align-self: flex-start !important;
+}
+.align-self-end {
+ align-self: flex-end !important;
+}
+.align-self-center {
+ align-self: center !important;
+}
+.align-self-baseline {
+ align-self: baseline !important;
+}
+.align-self-stretch {
+ align-self: stretch !important;
+}
+.order-first {
+ order: -1 !important;
+}
+.order-0 {
+ order: 0 !important;
+}
+.order-1 {
+ order: 1 !important;
+}
+.order-2 {
+ order: 2 !important;
+}
+.order-3 {
+ order: 3 !important;
+}
+.order-4 {
+ order: 4 !important;
+}
+.order-5 {
+ order: 5 !important;
+}
+.order-last {
+ order: 6 !important;
+}
+.m-0 {
+ margin: 0 !important;
+}
+.m-1 {
+ margin: 0.25rem !important;
+}
+.m-2 {
+ margin: 0.5rem !important;
+}
+.m-3 {
+ margin: 1rem !important;
+}
+.m-4 {
+ margin: 1.5rem !important;
+}
+.m-5 {
+ margin: 3rem !important;
+}
+.m-auto {
+ margin: auto !important;
+}
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+.mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+.my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+.my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+.my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+.my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+.my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+.my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+.my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+.mt-0 {
+ margin-top: 0 !important;
+}
+.mt-1 {
+ margin-top: 0.25rem !important;
+}
+.mt-2 {
+ margin-top: 0.5rem !important;
+}
+.mt-3 {
+ margin-top: 1rem !important;
+}
+.mt-4 {
+ margin-top: 1.5rem !important;
+}
+.mt-5 {
+ margin-top: 3rem !important;
+}
+.mt-auto {
+ margin-top: auto !important;
+}
+.me-0 {
+ margin-right: 0 !important;
+}
+.me-1 {
+ margin-right: 0.25rem !important;
+}
+.me-2 {
+ margin-right: 0.5rem !important;
+}
+.me-3 {
+ margin-right: 1rem !important;
+}
+.me-4 {
+ margin-right: 1.5rem !important;
+}
+.me-5 {
+ margin-right: 3rem !important;
+}
+.me-auto {
+ margin-right: auto !important;
+}
+.mb-0 {
+ margin-bottom: 0 !important;
+}
+.mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+.mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+.mb-3 {
+ margin-bottom: 1rem !important;
+}
+.mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+.mb-5 {
+ margin-bottom: 3rem !important;
+}
+.mb-auto {
+ margin-bottom: auto !important;
+}
+.ms-0 {
+ margin-left: 0 !important;
+}
+.ms-1 {
+ margin-left: 0.25rem !important;
+}
+.ms-2 {
+ margin-left: 0.5rem !important;
+}
+.ms-3 {
+ margin-left: 1rem !important;
+}
+.ms-4 {
+ margin-left: 1.5rem !important;
+}
+.ms-5 {
+ margin-left: 3rem !important;
+}
+.ms-auto {
+ margin-left: auto !important;
+}
+.p-0 {
+ padding: 0 !important;
+}
+.p-1 {
+ padding: 0.25rem !important;
+}
+.p-2 {
+ padding: 0.5rem !important;
+}
+.p-3 {
+ padding: 1rem !important;
+}
+.p-4 {
+ padding: 1.5rem !important;
+}
+.p-5 {
+ padding: 3rem !important;
+}
+.px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+.py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+.py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+.py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+.py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+.py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+.py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+.pt-0 {
+ padding-top: 0 !important;
+}
+.pt-1 {
+ padding-top: 0.25rem !important;
+}
+.pt-2 {
+ padding-top: 0.5rem !important;
+}
+.pt-3 {
+ padding-top: 1rem !important;
+}
+.pt-4 {
+ padding-top: 1.5rem !important;
+}
+.pt-5 {
+ padding-top: 3rem !important;
+}
+.pe-0 {
+ padding-right: 0 !important;
+}
+.pe-1 {
+ padding-right: 0.25rem !important;
+}
+.pe-2 {
+ padding-right: 0.5rem !important;
+}
+.pe-3 {
+ padding-right: 1rem !important;
+}
+.pe-4 {
+ padding-right: 1.5rem !important;
+}
+.pe-5 {
+ padding-right: 3rem !important;
+}
+.pb-0 {
+ padding-bottom: 0 !important;
+}
+.pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+.pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+.pb-3 {
+ padding-bottom: 1rem !important;
+}
+.pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+.pb-5 {
+ padding-bottom: 3rem !important;
+}
+.ps-0 {
+ padding-left: 0 !important;
+}
+.ps-1 {
+ padding-left: 0.25rem !important;
+}
+.ps-2 {
+ padding-left: 0.5rem !important;
+}
+.ps-3 {
+ padding-left: 1rem !important;
+}
+.ps-4 {
+ padding-left: 1.5rem !important;
+}
+.ps-5 {
+ padding-left: 3rem !important;
+}
+@media (min-width: 576px) {
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
+ display: block !important;
+ }
+ .d-sm-grid {
+ display: grid !important;
+ }
+ .d-sm-table {
+ display: table !important;
+ }
+ .d-sm-table-row {
+ display: table-row !important;
+ }
+ .d-sm-table-cell {
+ display: table-cell !important;
+ }
+ .d-sm-flex {
+ display: flex !important;
+ }
+ .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+ .d-sm-none {
+ display: none !important;
+ }
+ .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-sm-row {
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+ .justify-content-sm-evenly {
+ justify-content: space-evenly !important;
+ }
+ .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+ .order-sm-first {
+ order: -1 !important;
+ }
+ .order-sm-0 {
+ order: 0 !important;
+ }
+ .order-sm-1 {
+ order: 1 !important;
+ }
+ .order-sm-2 {
+ order: 2 !important;
+ }
+ .order-sm-3 {
+ order: 3 !important;
+ }
+ .order-sm-4 {
+ order: 4 !important;
+ }
+ .order-sm-5 {
+ order: 5 !important;
+ }
+ .order-sm-last {
+ order: 6 !important;
+ }
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-sm-auto {
+ margin-top: auto !important;
+ }
+ .me-sm-0 {
+ margin-right: 0 !important;
+ }
+ .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+ .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+ .me-sm-auto {
+ margin-right: auto !important;
+ }
+ .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+ .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-sm-auto {
+ margin-left: auto !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+ .p-sm-3 {
+ padding: 1rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+ .p-sm-5 {
+ padding: 3rem !important;
+ }
+ .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+ .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+ .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+}
+@media (min-width: 768px) {
+ .d-md-inline {
+ display: inline !important;
+ }
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+ .d-md-block {
+ display: block !important;
+ }
+ .d-md-grid {
+ display: grid !important;
+ }
+ .d-md-table {
+ display: table !important;
+ }
+ .d-md-table-row {
+ display: table-row !important;
+ }
+ .d-md-table-cell {
+ display: table-cell !important;
+ }
+ .d-md-flex {
+ display: flex !important;
+ }
+ .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+ .d-md-none {
+ display: none !important;
+ }
+ .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-md-row {
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+ .justify-content-md-evenly {
+ justify-content: space-evenly !important;
+ }
+ .align-items-md-start {
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+ .order-md-first {
+ order: -1 !important;
+ }
+ .order-md-0 {
+ order: 0 !important;
+ }
+ .order-md-1 {
+ order: 1 !important;
+ }
+ .order-md-2 {
+ order: 2 !important;
+ }
+ .order-md-3 {
+ order: 3 !important;
+ }
+ .order-md-4 {
+ order: 4 !important;
+ }
+ .order-md-5 {
+ order: 5 !important;
+ }
+ .order-md-last {
+ order: 6 !important;
+ }
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.25rem !important;
+ }
+ .m-md-2 {
+ margin: 0.5rem !important;
+ }
+ .m-md-3 {
+ margin: 1rem !important;
+ }
+ .m-md-4 {
+ margin: 1.5rem !important;
+ }
+ .m-md-5 {
+ margin: 3rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-md-0 {
+ margin-top: 0 !important;
+ }
+ .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-md-auto {
+ margin-top: auto !important;
+ }
+ .me-md-0 {
+ margin-right: 0 !important;
+ }
+ .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-md-3 {
+ margin-right: 1rem !important;
+ }
+ .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-md-5 {
+ margin-right: 3rem !important;
+ }
+ .me-md-auto {
+ margin-right: auto !important;
+ }
+ .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-md-0 {
+ margin-left: 0 !important;
+ }
+ .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-md-auto {
+ margin-left: auto !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
+ .p-md-3 {
+ padding: 1rem !important;
+ }
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
+ .p-md-5 {
+ padding: 3rem !important;
+ }
+ .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-md-0 {
+ padding-top: 0 !important;
+ }
+ .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-md-0 {
+ padding-right: 0 !important;
+ }
+ .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-md-0 {
+ padding-left: 0 !important;
+ }
+ .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+}
+@media (min-width: 992px) {
+ .d-lg-inline {
+ display: inline !important;
+ }
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+ .d-lg-block {
+ display: block !important;
+ }
+ .d-lg-grid {
+ display: grid !important;
+ }
+ .d-lg-table {
+ display: table !important;
+ }
+ .d-lg-table-row {
+ display: table-row !important;
+ }
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
+ .d-lg-flex {
+ display: flex !important;
+ }
+ .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+ .d-lg-none {
+ display: none !important;
+ }
+ .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-lg-row {
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+ .justify-content-lg-evenly {
+ justify-content: space-evenly !important;
+ }
+ .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+ .order-lg-first {
+ order: -1 !important;
+ }
+ .order-lg-0 {
+ order: 0 !important;
+ }
+ .order-lg-1 {
+ order: 1 !important;
+ }
+ .order-lg-2 {
+ order: 2 !important;
+ }
+ .order-lg-3 {
+ order: 3 !important;
+ }
+ .order-lg-4 {
+ order: 4 !important;
+ }
+ .order-lg-5 {
+ order: 5 !important;
+ }
+ .order-lg-last {
+ order: 6 !important;
+ }
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+ .m-lg-3 {
+ margin: 1rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+ .m-lg-5 {
+ margin: 3rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-lg-auto {
+ margin-top: auto !important;
+ }
+ .me-lg-0 {
+ margin-right: 0 !important;
+ }
+ .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+ .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+ .me-lg-auto {
+ margin-right: auto !important;
+ }
+ .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+ .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-lg-auto {
+ margin-left: auto !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+ .p-lg-3 {
+ padding: 1rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+ .p-lg-5 {
+ padding: 3rem !important;
+ }
+ .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+ .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+ .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+}
+@media (min-width: 1200px) {
+ .d-xl-inline {
+ display: inline !important;
+ }
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xl-block {
+ display: block !important;
+ }
+ .d-xl-grid {
+ display: grid !important;
+ }
+ .d-xl-table {
+ display: table !important;
+ }
+ .d-xl-table-row {
+ display: table-row !important;
+ }
+ .d-xl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xl-flex {
+ display: flex !important;
+ }
+ .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+ .d-xl-none {
+ display: none !important;
+ }
+ .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-xl-row {
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+ .justify-content-xl-evenly {
+ justify-content: space-evenly !important;
+ }
+ .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+ .order-xl-first {
+ order: -1 !important;
+ }
+ .order-xl-0 {
+ order: 0 !important;
+ }
+ .order-xl-1 {
+ order: 1 !important;
+ }
+ .order-xl-2 {
+ order: 2 !important;
+ }
+ .order-xl-3 {
+ order: 3 !important;
+ }
+ .order-xl-4 {
+ order: 4 !important;
+ }
+ .order-xl-5 {
+ order: 5 !important;
+ }
+ .order-xl-last {
+ order: 6 !important;
+ }
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+ .m-xl-3 {
+ margin: 1rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+ .m-xl-5 {
+ margin: 3rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-xl-auto {
+ margin-top: auto !important;
+ }
+ .me-xl-0 {
+ margin-right: 0 !important;
+ }
+ .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+ .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+ .me-xl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+ .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-xl-auto {
+ margin-left: auto !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+ .p-xl-3 {
+ padding: 1rem !important;
+ }
+ .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+ .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+ .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+ .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+}
+@media (min-width: 1400px) {
+ .d-xxl-inline {
+ display: inline !important;
+ }
+ .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xxl-block {
+ display: block !important;
+ }
+ .d-xxl-grid {
+ display: grid !important;
+ }
+ .d-xxl-table {
+ display: table !important;
+ }
+ .d-xxl-table-row {
+ display: table-row !important;
+ }
+ .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xxl-flex {
+ display: flex !important;
+ }
+ .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+ .d-xxl-none {
+ display: none !important;
+ }
+ .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-xxl-row {
+ flex-direction: row !important;
+ }
+ .flex-xxl-column {
+ flex-direction: column !important;
+ }
+ .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+ .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+ .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+ .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+ .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+ .align-items-xxl-center {
+ align-items: center !important;
+ }
+ .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+ .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+ .align-content-xxl-center {
+ align-content: center !important;
+ }
+ .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+ .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+ .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+ .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+ .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+ .align-self-xxl-center {
+ align-self: center !important;
+ }
+ .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+ .order-xxl-first {
+ order: -1 !important;
+ }
+ .order-xxl-0 {
+ order: 0 !important;
+ }
+ .order-xxl-1 {
+ order: 1 !important;
+ }
+ .order-xxl-2 {
+ order: 2 !important;
+ }
+ .order-xxl-3 {
+ order: 3 !important;
+ }
+ .order-xxl-4 {
+ order: 4 !important;
+ }
+ .order-xxl-5 {
+ order: 5 !important;
+ }
+ .order-xxl-last {
+ order: 6 !important;
+ }
+ .m-xxl-0 {
+ margin: 0 !important;
+ }
+ .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+ .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+ .m-xxl-3 {
+ margin: 1rem !important;
+ }
+ .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+ .m-xxl-5 {
+ margin: 3rem !important;
+ }
+ .m-xxl-auto {
+ margin: auto !important;
+ }
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+ .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+ .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+ .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+ .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+ .me-xxl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+ .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+ .p-xxl-0 {
+ padding: 0 !important;
+ }
+ .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+ .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+ .p-xxl-3 {
+ padding: 1rem !important;
+ }
+ .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+ .p-xxl-5 {
+ padding: 3rem !important;
+ }
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+ .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+ .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+ .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+}
+@media print {
+ .d-print-inline {
+ display: inline !important;
+ }
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+ .d-print-block {
+ display: block !important;
+ }
+ .d-print-grid {
+ display: grid !important;
+ }
+ .d-print-table {
+ display: table !important;
+ }
+ .d-print-table-row {
+ display: table-row !important;
+ }
+ .d-print-table-cell {
+ display: table-cell !important;
+ }
+ .d-print-flex {
+ display: flex !important;
+ }
+ .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+ .d-print-none {
+ display: none !important;
+ }
+}
+.tooltip {
+ position: absolute;
+ z-index: 1080;
+ display: block;
+ margin: 0;
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ opacity: 0;
+}
+.tooltip.show {
+ opacity: 0.9;
+}
+.tooltip .tooltip-arrow {
+ position: absolute;
+ display: block;
+ width: 0.8rem;
+ height: 0.4rem;
+}
+.tooltip .tooltip-arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+.bs-tooltip-top,
+.bs-tooltip-auto[data-popper-placement^=top] {
+ padding: 0.4rem 0;
+}
+.bs-tooltip-top .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: 0;
+}
+.bs-tooltip-top .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top: -1px;
+ border-width: 0.4rem 0.4rem 0;
+ border-top-color: #000;
+}
+.bs-tooltip-end,
+.bs-tooltip-auto[data-popper-placement^=right] {
+ padding: 0 0.4rem;
+}
+.bs-tooltip-end .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left: 0;
+ width: 0.4rem;
+ height: 0.8rem;
+}
+.bs-tooltip-end .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right: -1px;
+ border-width: 0.4rem 0.4rem 0.4rem 0;
+ border-right-color: #000;
+}
+.bs-tooltip-bottom,
+.bs-tooltip-auto[data-popper-placement^=bottom] {
+ padding: 0.4rem 0;
+}
+.bs-tooltip-bottom .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: 0;
+}
+.bs-tooltip-bottom .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom: -1px;
+ border-width: 0 0.4rem 0.4rem;
+ border-bottom-color: #000;
+}
+.bs-tooltip-start,
+.bs-tooltip-auto[data-popper-placement^=left] {
+ padding: 0 0.4rem;
+}
+.bs-tooltip-start .tooltip-arrow,
+.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right: 0;
+ width: 0.4rem;
+ height: 0.8rem;
+}
+.bs-tooltip-start .tooltip-arrow::before,
+.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left: -1px;
+ border-width: 0.4rem 0 0.4rem 0.4rem;
+ border-left-color: #000;
+}
+.tooltip-inner {
+ max-width: 200px;
+ padding: 0.25rem 0.5rem;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 0.25rem;
+ -webkit-user-select: none;
+ user-select: none;
+ pointer-events: none;
+}
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0 /* rtl:ignore */;
+ z-index: 1070;
+ display: block;
+ max-width: 276px;
+ font-family: var(--bs-font-sans-serif);
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
+}
+.popover .popover-arrow {
+ position: absolute;
+ display: block;
+ width: 1rem;
+ height: 0.5rem;
+}
+.popover .popover-arrow::before,
+.popover .popover-arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+.bs-popover-top > .popover-arrow,
+.bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
+ bottom: calc(-0.5rem - 1px);
+}
+.bs-popover-top > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
+ bottom: 0;
+ border-width: 0.5rem 0.5rem 0;
+ border-top-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-top > .popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ bottom: 1px;
+ border-width: 0.5rem 0.5rem 0;
+ border-top-color: #fff;
+}
+.bs-popover-end > .popover-arrow,
+.bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
+ left: calc(-0.5rem - 1px);
+ width: 0.5rem;
+ height: 1rem;
+}
+.bs-popover-end > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
+ left: 0;
+ border-width: 0.5rem 0.5rem 0.5rem 0;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-end > .popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ left: 1px;
+ border-width: 0.5rem 0.5rem 0.5rem 0;
+ border-right-color: #fff;
+}
+.bs-popover-bottom > .popover-arrow,
+.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
+ top: calc(-0.5rem - 1px);
+}
+.bs-popover-bottom > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
+ top: 0;
+ border-width: 0 0.5rem 0.5rem 0.5rem;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-bottom > .popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ top: 1px;
+ border-width: 0 0.5rem 0.5rem 0.5rem;
+ border-bottom-color: #fff;
+}
+.bs-popover-bottom .popover-header::before,
+.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 1rem;
+ margin-left: -0.5rem;
+ content: "";
+ border-bottom: 1px solid #f0f0f0;
+}
+.bs-popover-start > .popover-arrow,
+.bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
+ right: calc(-0.5rem - 1px);
+ width: 0.5rem;
+ height: 1rem;
+}
+.bs-popover-start > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
+ right: 0;
+ border-width: 0.5rem 0 0.5rem 0.5rem;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-start > .popover-arrow::after,
+.bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ right: 1px;
+ border-width: 0.5rem 0 0.5rem 0.5rem;
+ border-left-color: #fff;
+}
+.popover-header {
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ background-color: #f0f0f0;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ border-top-left-radius: calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
+}
+.popover-header:empty {
+ display: none;
+}
+.popover-body {
+ padding: 1rem 1rem;
+ color: #212529;
+}
+@-webkit-keyframes notyf-fadeinup {
+ 0% {
+ opacity: 0;
+ transform: translateY(25%);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+@keyframes notyf-fadeinup {
+ 0% {
+ opacity: 0;
+ transform: translateY(25%);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+@-webkit-keyframes notyf-fadeinleft {
+ 0% {
+ opacity: 0;
+ transform: translateX(25%);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+@keyframes notyf-fadeinleft {
+ 0% {
+ opacity: 0;
+ transform: translateX(25%);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+@-webkit-keyframes notyf-fadeoutright {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ to {
+ opacity: 0;
+ transform: translateX(25%);
+ }
+}
+@keyframes notyf-fadeoutright {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ to {
+ opacity: 0;
+ transform: translateX(25%);
+ }
+}
+@-webkit-keyframes notyf-fadeoutdown {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ to {
+ opacity: 0;
+ transform: translateY(25%);
+ }
+}
+@keyframes notyf-fadeoutdown {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ to {
+ opacity: 0;
+ transform: translateY(25%);
+ }
+}
+@-webkit-keyframes ripple {
+ 0% {
+ transform: scale(0) translateY(-45%) translateX(13%);
+ }
+ to {
+ transform: scale(1) translateY(-45%) translateX(13%);
+ }
+}
+@keyframes ripple {
+ 0% {
+ transform: scale(0) translateY(-45%) translateX(13%);
+ }
+ to {
+ transform: scale(1) translateY(-45%) translateX(13%);
+ }
+}
+.notyf {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ color: #fff;
+ z-index: 9999;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ justify-content: flex-end;
+ pointer-events: none;
+ box-sizing: border-box;
+ padding: 20px;
+}
+.notyf__icon--error,
+.notyf__icon--success {
+ height: 21px;
+ width: 21px;
+ background: #fff;
+ border-radius: 50%;
+ display: block;
+ margin: 0 auto;
+ position: relative;
+}
+.notyf__icon--error:after,
+.notyf__icon--error:before {
+ content: "";
+ background: currentColor;
+ display: block;
+ position: absolute;
+ width: 3px;
+ border-radius: 3px;
+ left: 9px;
+ height: 12px;
+ top: 5px;
+}
+.notyf__icon--error:after {
+ transform: rotate(-45deg);
+}
+.notyf__icon--error:before {
+ transform: rotate(45deg);
+}
+.notyf__icon--success:after,
+.notyf__icon--success:before {
+ content: "";
+ background: currentColor;
+ display: block;
+ position: absolute;
+ width: 3px;
+ border-radius: 3px;
+}
+.notyf__icon--success:after {
+ height: 6px;
+ transform: rotate(-45deg);
+ top: 9px;
+ left: 6px;
+}
+.notyf__icon--success:before {
+ height: 11px;
+ transform: rotate(45deg);
+ top: 5px;
+ left: 10px;
+}
+.notyf__toast {
+ display: block;
+ overflow: hidden;
+ pointer-events: auto;
+ -webkit-animation: notyf-fadeinup 0.3s ease-in forwards;
+ animation: notyf-fadeinup 0.3s ease-in forwards;
+ box-shadow: 0 3px 7px 0 rgba(0, 0, 0, 0.25);
+ position: relative;
+ padding: 0 15px;
+ border-radius: 2px;
+ max-width: 300px;
+ transform: translateY(25%);
+ box-sizing: border-box;
+ flex-shrink: 0;
+}
+.notyf__toast--disappear {
+ transform: translateY(0);
+ -webkit-animation: notyf-fadeoutdown 0.3s forwards;
+ animation: notyf-fadeoutdown 0.3s forwards;
+ -webkit-animation-delay: 0.25s;
+ animation-delay: 0.25s;
+}
+.notyf__toast--disappear .notyf__icon,
+.notyf__toast--disappear .notyf__message {
+ -webkit-animation: notyf-fadeoutdown 0.3s forwards;
+ animation: notyf-fadeoutdown 0.3s forwards;
+ opacity: 1;
+ transform: translateY(0);
+}
+.notyf__toast--disappear .notyf__dismiss {
+ -webkit-animation: notyf-fadeoutright 0.3s forwards;
+ animation: notyf-fadeoutright 0.3s forwards;
+ opacity: 1;
+ transform: translateX(0);
+}
+.notyf__toast--disappear .notyf__message {
+ -webkit-animation-delay: 0.05s;
+ animation-delay: 0.05s;
+}
+.notyf__toast--upper {
+ margin-bottom: 20px;
+}
+.notyf__toast--lower {
+ margin-top: 20px;
+}
+.notyf__toast--dismissible .notyf__wrapper {
+ padding-right: 30px;
+}
+.notyf__ripple {
+ height: 400px;
+ width: 400px;
+ position: absolute;
+ transform-origin: bottom right;
+ right: 0;
+ top: 0;
+ border-radius: 50%;
+ transform: scale(0) translateY(-51%) translateX(13%);
+ z-index: 5;
+ -webkit-animation: ripple 0.4s ease-out forwards;
+ animation: ripple 0.4s ease-out forwards;
+}
+.notyf__wrapper {
+ display: flex;
+ align-items: center;
+ padding-top: 17px;
+ padding-bottom: 17px;
+ padding-right: 15px;
+ border-radius: 3px;
+ position: relative;
+ z-index: 10;
+}
+.notyf__icon {
+ width: 22px;
+ text-align: center;
+ font-size: 1.3em;
+ opacity: 0;
+ -webkit-animation: notyf-fadeinup 0.3s forwards;
+ animation: notyf-fadeinup 0.3s forwards;
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s;
+ margin-right: 13px;
+}
+.notyf__dismiss {
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 100%;
+ width: 26px;
+ margin-right: -15px;
+ -webkit-animation: notyf-fadeinleft 0.3s forwards;
+ animation: notyf-fadeinleft 0.3s forwards;
+ -webkit-animation-delay: 0.35s;
+ animation-delay: 0.35s;
+ opacity: 0;
+}
+.notyf__dismiss-btn {
+ background-color: rgba(0, 0, 0, 0.25);
+ border: none;
+ cursor: pointer;
+ transition: opacity 0.2s ease, background-color 0.2s ease;
+ outline: none;
+ opacity: 0.35;
+ height: 100%;
+ width: 100%;
+}
+.notyf__dismiss-btn:after,
+.notyf__dismiss-btn:before {
+ content: "";
+ background: #fff;
+ height: 12px;
+ width: 2px;
+ border-radius: 3px;
+ position: absolute;
+ left: calc(50% - 1px);
+ top: calc(50% - 5px);
+}
+.notyf__dismiss-btn:after {
+ transform: rotate(-45deg);
+}
+.notyf__dismiss-btn:before {
+ transform: rotate(45deg);
+}
+.notyf__dismiss-btn:hover {
+ opacity: 0.7;
+ background-color: rgba(0, 0, 0, 0.15);
+}
+.notyf__dismiss-btn:active {
+ opacity: 0.8;
+}
+.notyf__message {
+ vertical-align: middle;
+ position: relative;
+ opacity: 0;
+ -webkit-animation: notyf-fadeinup 0.3s forwards;
+ animation: notyf-fadeinup 0.3s forwards;
+ -webkit-animation-delay: 0.25s;
+ animation-delay: 0.25s;
+ line-height: 1.5em;
+}
+@media only screen and (max-width: 480px) {
+ .notyf {
+ padding: 0;
+ }
+ .notyf__ripple {
+ height: 600px;
+ width: 600px;
+ -webkit-animation-duration: 0.5s;
+ animation-duration: 0.5s;
+ }
+ .notyf__toast {
+ max-width: none;
+ border-radius: 0;
+ box-shadow: 0 -2px 7px 0 rgba(0, 0, 0, 0.13);
+ width: 100%;
+ }
+ .notyf__dismiss {
+ width: 56px;
+ }
+}
+.md-select {
+ padding: 6px;
+ border-radius: 6px;
+ border: 1px solid rgba(200, 200, 200, 0.1);
+ border-top: 1px solid rgba(100, 100, 100, 0.5);
+ font-family: inherit;
+ font-size: 14px;
+ background: rgba(100, 100, 100, 0.25);
+ color: #eee;
+}
+.md-select option {
+ font-size: 1em;
+ font-family: inherit;
+ padding: 8px 16px;
+ background: #404040;
+}
+.md-select optgroup {
+ background: #2c2c2c;
+}
+.md-select:focus {
+ outline: solid 1px var(--selected);
+}
+.md-btn {
+ font-family: inherit;
+ background: rgba(100, 100, 100, 0.25);
+ padding: 8px 14px;
+ border-radius: 6px;
+ font-size: 14px;
+ border: 1px solid rgba(100, 100, 100, 0.35);
+ border-top: 1px solid rgba(100, 100, 100, 0.5);
+ color: #eee;
+ white-space: nowrap;
+ transition: transform 0.2s var(--appleEase), box-shadow 0.2s var(--appleEase);
+}
+.md-btn.md-btn-block {
+ display: block;
+ width: 100%;
+}
+.md-btn.md-btn-glyph {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+}
+.md-btn.md-btn-primary {
+ background: #ff2b52a6;
+ color: white;
+ border: 1px solid rgba(220, 53, 69, 0.25);
+ border-top: 1px solid rgba(220, 53, 69, 0.5);
+}
+.md-btn.md-btn-small {
+ padding: 6px 8px;
+ font-size: 13px;
+}
+.md-btn:hover {
+ filter: brightness(125%);
+}
+.md-btn:active {
+ filter: brightness(75%);
+ transform: scale(0.98);
+ transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
+}
+.md-btn.md-btn-icon {
+ display: inline-flex;
+ vertical-align: middle;
+ justify-content: center;
+}
+.md-btn.md-btn-icon > img {
+ margin: 0px 16px 0px 0px;
+ pointer-events: none;
+}
+.md-btn.md-btn-icon > .md-btn-text {
+ margin: 0px;
+}
+.btn-group {
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+}
+.btn-group > .md-btn {
+ border-radius: 0px;
+ width: 100%;
+}
+.btn-group > .md-btn:first-child {
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 6px;
+}
+.btn-group > .md-btn:last-child {
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+}
+.btn-group > .md-btn:not(:first-child):not(:last-child) {
+ border-radius: 0px;
+}
+.md-close-btn {
+ -webkit-mask-image: url("ameres://icons/webui/close.svg");
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-position: center;
+ background-color: white;
+ opacity: 0.75;
+ -webkit-mask-size: contain;
+ height: 18px;
+ width: 18px;
+}
+.md-ico-play {
+ content: url("assets/play.svg");
+ width: 10px;
+ height: 12px;
+ margin-right: 1px;
+ align-self: center;
+}
+.md-ico-shuffle {
+ content: url("assets/shuffle.svg");
+ width: 1em;
+ height: 1em;
+ margin-right: 1px;
+ margin-bottom: -2px;
+ align-self: center;
+}
+.md-ico-remove {
+ content: url("assets/feather/x-circle-white.svg");
+ width: 16px;
+ height: 16px;
+ margin-right: 1px;
+ margin-bottom: -1.5px;
+ align-self: center;
+}
+.md-ico-add {
+ content: url("assets/feather/plus-circle-white.svg");
+ width: 1em;
+ height: 1em;
+ margin-right: 1px;
+ margin-bottom: -1.5px;
+ align-self: center;
+}
+.reload-btn {
+ background: rgba(86, 86, 86, 0.52);
+ border-radius: 100%;
+ width: 32px;
+ height: 32px;
+ border: 0px;
+ appearance: none;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.reload-btn:hover {
+ background: rgba(86, 86, 86, 0.8);
+ cursor: pointer;
+}
+.reload-btn > svg {
+ height: 50%;
+ color: #eee;
+}
+.wr-btn {
+ font-family: inherit;
+ appearance: none;
+ border: 0px;
+ border-radius: 6px;
+ padding: 8px;
+ font-weight: 600;
+ background: rgba(80, 80, 80, 0.7);
+ color: white;
+}
+.cd-btn-seeall {
+ background: transparent;
+ border: 0px;
+ color: var(--keyColor);
+ font-family: inherit;
+ font-weight: 500;
+ font-size: 16px;
+ border-radius: 4px;
+ padding: 6px;
+}
+.cd-btn-seeall:hover {
+ cursor: pointer;
+ background: rgba(200, 200, 200, 0.1);
+}
+.mediaitem-artwork {
+ border-radius: var(--mediaItemRadius);
+ overflow: hidden;
+ flex: 0 0 auto;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background-image: url("https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg");
+ background-size: cover;
+ background-position: center;
+}
+.mediaitem-artwork .animatedartwork-view-box {
+ position: absolute;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+}
+.mediaitem-artwork .animatedartwork-view-box .animated {
+ position: absolute;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+}
+.mediaitem-artwork .animatedartwork-view-box .animated video {
+ width: 100%;
+ height: 100%;
+}
+.mediaitem-artwork.rounded {
+ border-radius: 100%;
+}
+.mediaitem-artwork.rounded::after {
+ border-radius: 100%;
+}
+.mediaitem-artwork::after {
+ content: "";
+ box-shadow: var(--mediaItemShadow);
+ z-index: 1;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border-radius: inherit;
+}
+.mediaitem-artwork img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ image-rendering: -webkit-optimize-contrast;
+ pointer-events: none;
+}
+.mediaitem-artwork.no-shadow {
+ box-shadow: none;
+}
+.mediaitem-artwork.no-shadow::after {
+ display: none;
+}
+.mediaitem-artwork.subtle-shadow {
+ box-shadow: var(--mediaItemShadow-ShadowSubtle);
+}
+.mediaitem-artwork.shadow {
+ box-shadow: var(--mediaItemShadow-Shadow);
+}
+/* queue item */
+.cd-queue-item {
+ border-bottom: 1px solid rgba(200, 200, 200, 0.1);
+ padding: 8px;
+}
+.cd-queue-item .row,
+.cd-queue-item .col {
+ padding: 0px;
+ margin: 0px;
+}
+.cd-queue-item .artwork {
+ width: 32px;
+ height: 32px;
+ flex: 0 0 auto;
+}
+.cd-queue-item.selected {
+ background: var(--selected);
+}
+.cd-queue-item:active {
+ background: var(--selected-click);
+ color: #eee;
+}
+.cd-queue-item .queue-info {
+ display: flex;
+ flex-direction: column;
+}
+.cd-queue-item .queue-info .queue-title {
+ font-size: 14px;
+}
+.cd-queue-item .queue-info .queue-subtitle {
+ font-size: 13px;
+ opacity: 0.85;
+}
+/* horizontal media scroller */
+.cd-hmedia-scroller::-webkit-scrollbar-thumb {
+ box-shadow: none;
+}
+.cd-hmedia-scroller:hover::-webkit-scrollbar-thumb {
+ box-shadow: inset 0px 0px 10px 10px rgba(200, 200, 200, 0.5);
+}
+.cd-hmedia-scroller.hmedia-scroller-card .mediaitem-card {
+ margin: 16px;
+}
+/* mediaitem-list-item */
+.cd-mediaitem-list-item {
+ width: 100%;
+ height: 60px;
+ display: flex;
+ flex: 0 0 auto;
+ flex-direction: row;
+ font-size: 14px;
+ justify-content: center-between;
+ align-items: center;
+ border-radius: var(--mediaItemRadius);
+ /* CSS.gg
+ */
+}
+.cd-mediaitem-list-item .artwork {
+ height: 42px;
+ width: 42px;
+ border-radius: var(--mediaItemRadius);
+ object-fit: cover;
+ object-position: center;
+ flex: 0 0 auto;
+ background-repeat: no-repeat;
+ margin: 12px;
+ border: 0px;
+ outline: none;
+ position: relative;
+ overflow: hidden;
+}
+.cd-mediaitem-list-item .artwork .overlay-play {
+ background: rgba(0, 0, 0, 0.5);
+ opacity: 0;
+ appearance: none;
+ border: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ padding: 0px;
+ z-index: 5;
+ cursor: pointer;
+}
+.cd-mediaitem-list-item .artwork .overlay-play:hover {
+ opacity: 1;
+}
+.cd-mediaitem-list-item .artwork .overlay-play:active {
+ background: var(--selected-click);
+}
+.cd-mediaitem-list-item .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+.cd-mediaitem-list-item .info-rect {
+ height: 100%;
+ display: flex;
+ flex-flow: column;
+ justify-content: center;
+ flex-grow: 1;
+}
+.cd-mediaitem-list-item .title {
+ width: 100%;
+}
+.cd-mediaitem-list-item .subtitle {
+ width: 90%;
+ font-size: 0.8em;
+ opacity: 0.7;
+}
+.cd-mediaitem-list-item .duration {
+ min-width: 60px;
+ text-align: center;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.cd-mediaitem-list-item .metainfo {
+ min-width: 145px;
+ text-align: center;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.cd-mediaitem-list-item .explicit-icon {
+ background-image: url("assets/explicit.svg");
+ height: 12px;
+ width: 36px;
+ filter: contrast(0);
+ background-repeat: no-repeat;
+}
+@keyframes load-bar {
+ 10% {
+ box-shadow: inset 0 -4px 0;
+ }
+ 20% {
+ box-shadow: inset 0 -10px 0;
+ }
+ 30% {
+ box-shadow: inset 0 -12px 0;
+ }
+ 40% {
+ box-shadow: inset 0 -8px 0;
+ }
+ 50% {
+ box-shadow: inset 0 -4px 0;
+ }
+ 60% {
+ box-shadow: inset 0 -6px 0;
+ }
+ 80% {
+ box-shadow: inset 0 -12px 0;
+ }
+ 90% {
+ box-shadow: inset 0 -6px 0;
+ }
+ to {
+ box-shadow: inset 0 -2px 0;
+ }
+}
+.cd-mediaitem-list-item .loadbar-sound,
+.cd-mediaitem-list-item .loadbar-sound::after,
+.cd-mediaitem-list-item .loadbar-sound::before {
+ animation: load-bar 1.3s ease infinite alternate;
+ box-sizing: border-box;
+ width: 3px;
+ height: 28px;
+ box-shadow: inset 0 -12px 0;
+}
+.cd-mediaitem-list-item .loadbar-sound {
+ margin-left: 22px;
+ margin-top: -16px;
+ position: relative;
+ transform: scale(var(--load-bar, 1));
+ color: var(--keyColor);
+ display: block;
+}
+.cd-mediaitem-list-item .loadbar-sound::after,
+.cd-mediaitem-list-item .loadbar-sound::before {
+ content: "";
+ position: absolute;
+ bottom: 0;
+}
+.cd-mediaitem-list-item .loadbar-sound::before {
+ left: -4.5px;
+ animation-delay: -2.4s;
+}
+.cd-mediaitem-list-item .loadbar-sound::after {
+ right: -4.2px;
+ animation-delay: -3.7s;
+}
+.cd-mediaitem-list-item .isLibrary {
+ flex: 0 0 auto;
+ width: 40px;
+ text-align: center;
+}
+.cd-mediaitem-list-item .isLibrary button {
+ appearance: none;
+ border: 0px;
+ background: transparent;
+ cursor: pointer;
+ filter: contrast(0.8);
+}
+.cd-mediaitem-list-item:hover {
+ background: rgba(200, 200, 200, 0.1);
+ box-shadow: var(--mediaItemShadow);
+}
+.cd-mediaitem-list-item:hover .overlay-play {
+ opacity: 1;
+}
+.cd-mediaitem-list-item.mediaitem-selected {
+ background: var(--selected);
+ box-shadow: var(--mediaItemShadow);
+}
+.cd-mediaitem-list-item:active {
+ background: var(--selected-click);
+ box-shadow: var(--mediaItemShadow);
+ color: #eee;
+}
+.cd-mediaitem-list-item.compact {
+ height: 40px;
+ font-size: 13px;
+}
+.cd-mediaitem-list-item.compact .artwork {
+ display: none;
+}
+.cd-mediaitem-list-item.compact .info-rect {
+ padding-left: 1em;
+}
+/* mediaitem-hrect */
+.cd-mediaitem-hrect {
+ background: rgba(255, 255, 255, 0.18);
+ width: 264px;
+ height: 100px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: row;
+ font-size: 14px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 6px;
+ cursor: pointer;
+}
+.cd-mediaitem-hrect .artwork {
+ height: 70px;
+ width: 70px;
+ background: blue;
+ border-radius: var(--mediaItemRadius);
+ background: var(--artwork);
+ background-size: contain;
+ flex: 0 0 auto;
+ background-repeat: no-repeat;
+ margin: 18px;
+}
+.cd-mediaitem-hrect .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+.cd-mediaitem-hrect .info-rect {
+ width: 100%;
+}
+.cd-mediaitem-hrect .title {
+ width: 100%;
+ text-align: center;
+}
+.cd-mediaitem-hrect .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+}
+/* mediaitem-square-sp */
+.cd-mediaitem-square-sp {
+ --spcolor: var("");
+ width: 190px;
+ height: 245px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: flex-start;
+ align-items: center;
+ border-radius: 6px;
+ margin-left: 10px;
+ cursor: pointer;
+ background-color: var(--spcolor);
+}
+.cd-mediaitem-square-sp .artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+}
+.cd-mediaitem-square-sp .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+.cd-mediaitem-square-sp .artwork:hover {
+ box-shadow: rgba(0, 0, 0, 0.5) 0 0 0 1000000px inset;
+}
+.cd-mediaitem-square-sp .title {
+ width: 90%;
+ text-align: center;
+}
+.cd-mediaitem-square-sp .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+}
+.cd-mediaitem-square-sp > .cd-mediaitem-square-large-overlay {
+ z-index: 3;
+}
+.cd-mediaitem-square-sp > .cd-mediaitem-square-large-overlay:hover {
+ opacity: 1;
+}
+.cd-mediaitem-square-sp + .cd-mediaitem-square-large-overlay {
+ pointer-events: none;
+}
+.cd-mediaitem-square-sp:hover + .cd-mediaitem-square-large-overlay {
+ opacity: 1;
+}
+.cd-mediaitem-square-sp:hover {
+ box-shadow: rgba(0, 0, 0, 0.5) 0 0 0 1000000px inset;
+}
+/* mediaitem-square-large */
+.cd-mediaitem-square-large {
+ width: 190px;
+ height: 250px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: flex-start;
+ align-items: center;
+ border-radius: 6px;
+ margin-left: 10px;
+ cursor: pointer;
+}
+.cd-mediaitem-square-large > * {
+ z-index: inherit;
+}
+.cd-mediaitem-square-large .artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+}
+.cd-mediaitem-square-large-overlay {
+ position: absolute;
+ width: 190px;
+ float: right;
+ height: 250px;
+ top: 0px;
+ margin: 10px;
+ margin-top: 0px;
+ opacity: 0;
+}
+.cd-mediaitem-square-large-overlay > * {
+ pointer-events: auto;
+}
+.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay {
+ z-index: 3;
+}
+.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay:hover {
+ opacity: 1;
+}
+.cd-mediaitem-square-large + .cd-mediaitem-square-large-overlay {
+ pointer-events: none;
+}
+.cd-mediaitem-square-large:hover + .cd-mediaitem-square-large-overlay {
+ opacity: 1;
+}
+.cd-mediaitem-square-large .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+.cd-mediaitem-square-large .title {
+ width: 90%;
+ text-align: center;
+}
+.cd-mediaitem-square-large .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+}
+/* mediaitem-mvview */
+/* mediaitem-mvview */
+.cd-mediaitem-mvview {
+ width: 300px;
+ height: 250px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: flex-start;
+ align-items: center;
+ border-radius: 6px;
+ margin-left: 10px;
+ cursor: pointer;
+}
+.cd-mediaitem-mvview > * {
+ z-index: inherit;
+}
+.cd-mediaitem-mvview .artwork {
+ height: 172px;
+ width: 300px;
+ background: blue;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+}
+.cd-mediaitem-mvview-overlay {
+ position: absolute;
+ width: 300px;
+ float: right;
+ height: 250px;
+ top: 0px;
+ margin: 10px;
+ margin-top: 0px;
+ opacity: 0;
+}
+.cd-mediaitem-mvview-overlay > * {
+ pointer-events: auto;
+}
+.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay {
+ z-index: 3;
+}
+.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay:hover {
+ opacity: 1;
+}
+.cd-mediaitem-mvview + .cd-mediaitem-mvview-overlay {
+ pointer-events: none;
+}
+.cd-mediaitem-mvview:hover + .cd-mediaitem-mvview-overlay {
+ opacity: 1;
+}
+.cd-mediaitem-mvview .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+.cd-mediaitem-mvview .title {
+ width: 90%;
+ text-align: center;
+}
+.cd-mediaitem-mvview .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+}
+/* mediaitem-square */
+.cd-mediaitem-square {
+ width: 220px;
+ height: 238px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 6px;
+}
+.cd-mediaitem-square .artwork-container {
+ position: relative;
+}
+.cd-mediaitem-square .artwork-container .artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-radius: var(--mediaItemRadius);
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: 6px;
+ cursor: pointer;
+}
+.cd-mediaitem-square .artwork-container .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+.cd-mediaitem-square .artwork-container .badge-container {
+ transition: opacity 0.1s var(--appleEase);
+ opacity: 1;
+}
+.cd-mediaitem-square .artwork-container .badge-container .socialBadge {
+ width: 32px;
+ height: 32px;
+ position: absolute;
+ right: 14px;
+ bottom: 14px;
+ border-radius: 100%;
+ overflow: hidden;
+ z-index: 2;
+ pointer-events: none;
+}
+.cd-mediaitem-square .artwork-container > .play-btn,
+.cd-mediaitem-square .artwork-container > .menu-btn {
+ opacity: 0;
+ appearance: none;
+ padding: 0px;
+ border: 0px;
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ background: rgba(50, 50, 50, 0.7);
+ cursor: pointer;
+ transition: opacity 0.1s var(--appleEase);
+}
+.cd-mediaitem-square .artwork-container > .play-btn :hover,
+.cd-mediaitem-square .artwork-container > .menu-btn :hover {
+ border-radius: 50%;
+ background: rgba(250, 0, 0, 0.7);
+}
+.cd-mediaitem-square .artwork-container > .play-btn {
+ position: absolute;
+ bottom: 14px;
+ left: 14px;
+ z-index: 2;
+}
+.cd-mediaitem-square .artwork-container > .menu-btn {
+ position: absolute;
+ bottom: 14px;
+ right: 14px;
+ z-index: 2;
+}
+.cd-mediaitem-square .artwork-container:hover > .badge-container {
+ opacity: 0;
+}
+.cd-mediaitem-square .artwork-container:hover > .play-btn,
+.cd-mediaitem-square .artwork-container:hover > .menu-btn {
+ opacity: 1;
+}
+.cd-mediaitem-square .info-rect {
+ width: 90%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+.cd-mediaitem-square .title {
+ width: 100%;
+ text-align: center;
+ display: flex;
+ align-content: center;
+ justify-content: center;
+}
+.cd-mediaitem-square .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: 12px;
+}
+.cd-mediaitem-square .unavailable-overlay {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ bottom: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ z-index: 2;
+ pointer-events: none;
+ background: rgba(0, 0, 0, 0.4);
+ margin: 2em;
+ border-radius: 10px;
+}
+.cd-mediaitem-square .unavailable-overlay > .codicon {
+ font-size: 4em;
+ font-weight: bold;
+ opacity: 0.5;
+}
+.cd-mediaitem-square.mediaitem-video {
+ height: 200px;
+ width: 240px;
+}
+.cd-mediaitem-square.mediaitem-video .artwork {
+ height: 120px;
+ width: 212px;
+}
+.cd-mediaitem-square.mediaitem-brick {
+ height: 200px;
+ width: 240px;
+}
+.cd-mediaitem-square.mediaitem-brick .artwork {
+ height: 123px;
+ width: 220px;
+}
+.cd-mediaitem-square.mediaitem-small {
+ width: 140px;
+ height: 180px;
+}
+.cd-mediaitem-square.mediaitem-small .artwork {
+ height: 128px;
+ width: 128px;
+}
+.cd-mediaitem-square.mediaitem-card {
+ background: #ccc;
+ background: var(--spcolor);
+ height: 298px;
+ width: 230px;
+ max-width: 250px;
+ max-height: 500px;
+ overflow: hidden;
+ position: relative;
+ border-radius: calc(var(--mediaItemRadius) * 2);
+ box-shadow: var(--mediaItemShadow-ShadowSubtle);
+}
+.cd-mediaitem-square.mediaitem-card .artwork {
+ width: 230px;
+ height: 230px;
+ overflow: hidden;
+ border-radius: 0px;
+ margin: 0;
+}
+.cd-mediaitem-square.mediaitem-card .artwork .mediaitem-artwork {
+ border-radius: 0px;
+}
+.cd-mediaitem-square.mediaitem-card .artwork .mediaitem-artwork::after {
+ box-shadow: unset;
+}
+.cd-mediaitem-square.mediaitem-card .info-rect-card {
+ padding: 10px 10px 14px;
+ position: relative;
+ width: 100%;
+}
+.cd-mediaitem-square.mediaitem-card .info-rect-card::before {
+ background: var(--bgartwork);
+ content: "";
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ position: absolute;
+ background-size: cover;
+ background-position: bottom;
+ z-index: 0;
+ opacity: 1;
+ filter: brightness(0.5) blur(50px) saturate(180%);
+}
+.cd-mediaitem-square.mediaitem-card .title {
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 0.9em;
+ font-weight: 500;
+ z-index: 1;
+}
+.cd-mediaitem-square.mediaitem-card .subtitle {
+ height: 100%;
+ justify-content: center;
+ align-items: center;
+ font-size: 0.75em;
+ width: 100%;
+ display: flex;
+ z-index: 1;
+}
+.cd-mediaitem-square.mediaitem-card::after {
+ box-shadow: var(--mediaItemShadow);
+ content: "";
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ pointer-events: none;
+ border-radius: inherit;
+}
+/* mediaitem-square */
+.albums-square-containeru > * > .cd-mediaitem-square {
+ --frame: max(220px, 15vw);
+ width: var(--frame);
+ height: calc(var(--frame) * 13 / 11);
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: calc(var(--frame) / 220 * 14);
+ justify-content: center;
+ align-items: center;
+ border-radius: calc(var(--frame) / 220 * 6);
+}
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container {
+ position: relative;
+}
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container .artwork {
+ height: calc(var(--frame) * 19 / 22);
+ width: calc(var(--frame) * 19 / 22);
+ background: blue;
+ border-radius: var(--mediaItemRadius);
+ background: var(--artwork);
+ background-size: cover;
+ flex: 0 0 auto;
+ margin: calc(var(--frame) / 220 * 6);
+ cursor: pointer;
+}
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container .artwork.round {
+ border-radius: var(--mediaItemRadiusRound);
+}
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container > .play-btn,
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container > .menu-btn {
+ opacity: 0;
+ appearance: none;
+ padding: 0px;
+ border: 0px;
+ width: calc(var(--frame) / 220 * 30);
+ height: calc(var(--frame) / 220 * 30);
+ border-radius: 50%;
+ background: rgba(50, 50, 50, 0.7);
+ cursor: pointer;
+ backdrop-filter: blur(32px) saturate(180%);
+ transition: opacity 0.1s var(--appleEase);
+}
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container > .play-btn {
+ position: absolute;
+ bottom: calc(var(--frame) / 220 * 14);
+ left: calc(var(--frame) / 220 * 14);
+ z-index: 2;
+}
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container > .menu-btn {
+ position: absolute;
+ bottom: calc(var(--frame) / 220 * 14);
+ right: calc(var(--frame) / 220 * 14);
+ z-index: 2;
+}
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container:hover > .play-btn,
+.albums-square-containeru > * > .cd-mediaitem-square .artwork-container:hover > .menu-btn {
+ opacity: 1;
+}
+.albums-square-containeru > * > .cd-mediaitem-square .title {
+ width: 90%;
+ text-align: center;
+}
+.albums-square-containeru > * > .cd-mediaitem-square .subtitle {
+ width: 100%;
+ text-align: center;
+ font-size: calc(var(--frame) / 220 * 12);
+}
+.albums-square-containeru > * > .cd-mediaitem-square.mediaitem-video {
+ height: calc(var(--frame) / 220 * 200);
+ width: calc(var(--frame) / 220 * 240);
+}
+.albums-square-containeru > * > .cd-mediaitem-square.mediaitem-video .artwork {
+ height: calc(var(--frame) / 220 * 120);
+ width: calc(var(--frame) / 220 * 212);
+}
+.albums-square-containeru > * > .cd-mediaitem-square.mediaitem-brick {
+ height: calc(var(--frame) / 220 * 200);
+ width: calc(var(--frame) / 220 * 240);
+}
+.albums-square-containeru > * > .cd-mediaitem-square.mediaitem-brick .artwork {
+ height: calc(var(--frame) / 220 * 123);
+ width: calc(var(--frame));
+}
+.listitem-horizontal .cd-mediaitem-list-item {
+ width: 350px;
+ height: 60px;
+}
+.mediaitem-list-item__grid {
+ background: rgba(200, 200, 200, 0.05);
+ border-radius: 10px;
+ padding: var(--contentInnerPadding);
+ box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;
+ width: 100%;
+}
+.mediaitem-list-item__grid .cd-mediaitem-list-item {
+ width: 350px;
+ height: 60px;
+}
+.mediaitem-list-item__grid::-webkit-scrollbar {
+ display: none;
+}
+.mediaitem-list-item__grid:hover::-webkit-scrollbar {
+ display: initial;
+}
+.svg-icon {
+ --color: #aaa;
+ --url: url("assets/feather/share.svg");
+ -webkit-mask-image: var(--url);
+ -webkit-mask-size: cover;
+ height: 18px;
+ width: 18px;
+ background: var(--color);
+}
+.svg-icon.inline {
+ display: inline-block;
+}
+.sidebar-icon {
+ width: 18px;
+ height: 18px;
+ margin-right: 8px;
+}
+.sidebar-icon > .svg-icon {
+ width: 100%;
+ height: 100%;
+ --color: #aaa;
+}
+.sidebar-icon > svg {
+ width: 100%;
+ height: 100%;
+ color: #aaa;
+}
+/* Switch Checkbox */
+input[type=checkbox][switch] {
+ width: 38px;
+ appearance: none;
+ border-radius: 32px;
+ height: 24px;
+ zoom: 1;
+ top: 0;
+ cursor: pointer;
+ left: 0;
+ position: relative;
+ transform: scale(1);
+ background: #8e8e93;
+ padding: 0;
+ margin: 0;
+}
+input[type=checkbox][switch]:focus,
+input[type=checkbox][switch]:active {
+ outline: none;
+}
+input[type=checkbox][switch]:checked {
+ background: var(--keyColor);
+ border: 0 solid var(--keyColor);
+ mix-blend-mode: unset;
+}
+input[type=checkbox][switch]:checked:hover {
+ background: var(--keyColor-rollover);
+}
+input[type=checkbox][switch]:checked:active {
+ background: var(--keyColor-pressed);
+}
+input[type=checkbox][switch]::before {
+ background: white;
+ width: 26px;
+ height: 26px;
+ top: -1px;
+ left: -1px;
+ position: absolute;
+ content: ' ';
+ border-radius: 32px;
+ transition: 0.1s left var(--appleEase);
+ transform: scale(0.75);
+}
+input[type=checkbox][switch]:checked::before {
+ background: white;
+ top: -1px;
+ left: 13px;
+ transition: 0.1s left var(--appleEase);
+ transform: scale(0.75);
+}
+input[type=checkbox][switch]:disabled::before {
+ opacity: 0.5;
+}
+input[type=checkbox][switch]:active::before {
+ left: 13px;
+}
+input[type=checkbox][switch]:checked:active::before {
+ left: -1px;
+}
+/* End Switch Checkbox */
+.header-text {
+ margin: 0px;
+}
+.media-item--small {
+ background: rgba(0, 0, 0, 0.25);
+ height: 162px;
+ width: 132px;
+ display: inline-flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ border-radius: 10px;
+}
+.media-item--small .artwork {
+ background: red;
+ margin: 6px;
+ border-radius: 100%;
+ width: 90px;
+ height: 90px;
+ box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.3);
+}
+.playlist-artwork {
+ height: 190px;
+ width: 190px;
+ background: blue;
+ border-radius: 6px;
+ background: var(--artwork);
+ background-size: cover;
+ box-shadow: var(--mediaItemShadow);
+ flex: 0 0 auto;
+ margin: 6px;
+ margin-top: 0px;
+}
+.media-item--small .text {
+ font-weight: 600;
+ font-size: 0.9em;
+}
+.media-item--small .subtext {
+ font-size: 0.75em;
+}
+.player-duration-time {
+ opacity: 0.5;
+}
+.player-artwork-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.player-duration-container {
+ font-size: 0.85em;
+ font-weight: 500;
+}
+.media-artwork {
+ --artwork: url("");
+ width: 80vw;
+ height: 80vw;
+ max-height: 500px;
+ max-width: 500px;
+ background: black;
+ background-image: var(--artwork);
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ border-radius: 8px;
+ box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.16), 0 8px 40px rgba(0, 0, 0, 0.55);
+ transition: transform 0.1s var(--appleEase);
+}
+.media-artwork.paused {
+ transition: transform 0.35s var(--appleEase);
+ transform: scale(0.85);
+}
+.playback-slider {
+ width: 90%;
+}
+.volume-slider {
+ width: 100%;
+}
+.volume-slider-container {
+ width: 90%;
+ margin: 0 auto;
+ padding: 0px;
+}
+.volume-slider-container .col-auto,
+.volume-slider-container .col {
+ display: flex;
+ align-items: center;
+ justify-self: center;
+ padding: 0px;
+ margin: 0px;
+}
+.playback-button {
+ font-size: 2em;
+ width: 40px;
+ height: 36px;
+ padding: 0px;
+ background: transparent;
+ border: 0px;
+ border-radius: 0px;
+ box-shadow: unset;
+ background-size: 12px;
+ background-position: center;
+ background-repeat: no-repeat;
+ opacity: 0.7;
+ border-radius: 6px;
+}
+.playback-button:active {
+ transform: scale(0.95);
+}
+.playback-button--small {
+ border-radius: 6px;
+ font-size: 1em;
+ color: inherit;
+ background-size: 14px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-color: transparent;
+ width: 40px;
+ height: 32px;
+ border: 0px;
+ box-shadow: unset;
+ opacity: 0.7;
+}
+.playback-button:hover,
+.playback-button--small:hover {
+ background-color: rgba(200, 200, 200, 0.1);
+}
+.playback-button:active,
+.playback-button--small:active {
+ transform: scale(0.9);
+}
+.playback-button--small.active {
+ background-color: rgba(200, 200, 200, 0.25);
+}
+.playback-button--small.search {
+ background-image: url("assets/search.svg");
+}
+.playback-button--small.cast {
+ background-image: url("assets/cast_white.svg");
+}
+.playback-button--small.miniplayer {
+ background-image: url("assets/pip.svg");
+}
+.playback-button--small.queue {
+ background-image: url("assets/list.svg");
+}
+.playback-button--small.lyrics {
+ background-image: url("assets/quote-right.svg");
+}
+.playback-button--small.shuffle {
+ background-image: url("assets/shuffle.svg");
+}
+.playback-button--small.repeat {
+ background-image: url("assets/repeat.svg");
+}
+.playback-button--small.repeat.repeatOne {
+ background-color: rgba(200, 200, 200, 0.25);
+ background-image: url("assets/repeatOne.svg");
+}
+.playback-button.pause {
+ background-image: url('assets/pause.svg');
+}
+.playback-button.play {
+ background-image: url('assets/play.svg');
+}
+.playback-button.next {
+ background-image: url('assets/forward.svg');
+}
+.playback-button.previous {
+ background-image: url('assets/backward.svg');
+}
+.playback-buttons {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.player-volume-glyph {
+ width: 32px;
+ height: 16px;
+ background-repeat: no-repeat;
+ background-size: contain;
+ background-position: center;
+}
+.player-volume-glyph.decrease {
+ background-image: url("assets/volume.svg");
+ opacity: 0.5;
+}
+.player-volume-glyph.increase {
+ background-image: url("assets/volume-2.svg");
+ opacity: 0.5;
+}
+.player-track-info {
+ width: 90%;
+ margin: 0 auto;
+}
+.player-song-title {
+ font-size: 1.25em;
+ text-align: left;
+ margin: 0 auto;
+ font-weight: 500;
+}
+.player-song-artist {
+ font-size: 1em;
+ text-align: left;
+ margin: 0 auto;
+ color: var(--keyColor);
+ font-weight: 400;
+}
+.player-song-artist:hover {
+ cursor: pointer;
+ text-decoration: underline;
+}
+.player-more-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.player-more-button {
+ appearance: none;
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ border: 0px;
+ background: var(--keyColor);
+ cursor: pointer;
+ box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.16);
+ color: white;
+ font-weight: bold;
+ padding: 0px;
+ font-size: 16px;
+}
+.back-button {
+ width: 40px;
+ height: 40px;
+ background-color: transparent;
+ background-size: 16px;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-image: url("assets/arrow-left.svg");
+ border: 0px;
+ border-radius: 0px;
+}
+.header-text {
+ height: 40px;
+ display: flex;
+ align-items: center;
+}
+.list-entry-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12px;
+ font-size: 1em;
+ font-family: inherit;
+}
+.list-entry {
+ display: flex;
+ align-items: center;
+ /* justify-content: space-between; */
+ padding: 12px;
+ font-size: 1em;
+ font-family: inherit;
+ border-bottom: 1px solid rgba(255 255 255 / 0.1);
+ cursor: pointer;
+}
+.list-entry-image {
+ --artwork: url("");
+ width: 64px;
+ height: 64px;
+ background: var(--artwork);
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ border-radius: 8px;
+ box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.16), 0 8px 40px rgba(0, 0, 0, 0.55);
+}
+.list-entry-image.artist {
+ border-radius: 50%;
+}
+.list-entry-body {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: flex-start;
+ margin-left: 12px;
+}
+.list-entry-name {
+ font-size: 14px;
+ font-weight: 500;
+ overflow: hidden;
+ width: 100%;
+}
+.list-entry-artist {
+ font-size: 12px;
+ overflow: hidden;
+ width: 100%;
+}
+.list-entry .handle {
+ height: 100%;
+ width: 28px;
+ background: var(--keyColor);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.artist-chip {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ margin: 4px 0px;
+ border-radius: 4px;
+ color: white;
+ font-size: 1em;
+ font-weight: 500;
+ cursor: pointer;
+ padding: 8px;
+}
+.artist-chip:hover {
+ background: var(--selected);
+}
+.artist-chip .artist-chip__follow {
+ appearance: none;
+ border: 0;
+ height: 32px;
+ width: 32px;
+ background: #ffffff0f;
+ margin: 0px 0px 0px 10px;
+ font-weight: bold;
+ color: white;
+ border-radius: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 12px;
+ cursor: pointer;
+ flex: 0 0 32px;
+}
+.artist-chip .artist-chip__follow:hover {
+ background: var(--selected);
+}
+.artist-chip .artist-chip__image {
+ width: 32px;
+ height: 32px;
+ background-size: contain;
+ background-position: center;
+ background-repeat: no-repeat;
+ border-radius: 100%;
+ overflow: hidden;
+ margin: 0px 12px 0px 0px;
+ pointer-events: none;
+ flex: 0 0 32px;
+}
+.artist-chip .artist-chip__image .mediaitem-artwork {
+ border-radius: inherit;
+}
+.artist-chip .artist-chip__name {
+ pointer-events: none;
+}
+.search-panel {
+ background: rgba(0, 0, 0, 0.5);
+}
+.search-header {
+ position: absolute;
+ width: 100%;
+ z-index: 1;
+ backdrop-filter: blur(16px);
+ -webkit-backdrop-filter: blur(16px);
+ border-bottom: 1px solid rgba(200, 200, 200, 0.08);
+}
+.connection-error-panel {
+ background: rgba(0, 0, 0, 0.5);
+}
+.search-type-container {
+ display: flex;
+}
+.search-type-button {
+ background: rgba(20, 20, 20, 0.85);
+ border-radius: 50px;
+ color: white;
+ border: 0px;
+ box-shadow: unset;
+ font-family: inherit;
+ padding: 8px 16px;
+ font-size: 14px;
+ font-weight: 500;
+ margin: 8px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+.search-type-button.active {
+ background: var(--keyColor);
+}
+.search-tab-container {
+ overflow: auto;
+ white-space: nowrap;
+ overflow-y: hidden;
+}
+.search-body-container {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+.search-body {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ padding-top: 220px;
+}
+.search-tab {
+ background: rgba(20, 20, 20, 0.85);
+ border-radius: 50px;
+ color: white;
+ border: 0px;
+ box-shadow: unset;
+ font-family: inherit;
+ padding: 8px 16px;
+ font-size: 14px;
+ font-weight: 500;
+}
+.search-tab.active {
+ background: var(--keyColor);
+}
+.notyf__toast {
+ -webkit-app-region: no-drag;
+ cursor: pointer;
+}
+.notyf-info {
+ background: var(--keyColor);
+}
+.modal-fullscreen {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.3);
+ z-index: 1000;
+}
+.modal-fullscreen .modal-window {
+ background: #333;
+ border-radius: 10px;
+ box-shadow: var(--mediaItemShadow-Shadow);
+ display: flex;
+ flex-flow: column;
+ max-height: 500px;
+ max-width: 360px;
+ background: #121212;
+ width: 100%;
+ position: relative;
+}
+.modal-fullscreen .modal-window:after {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ box-shadow: var(--mediaItemShadow);
+ z-index: 1;
+ border-radius: inherit;
+}
+.modal-fullscreen .modal-window .modal-header {
+ width: 100%;
+ padding: 6px;
+}
+.modal-fullscreen .modal-window .modal-content {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ overflow-y: overlay;
+}
+.spatialproperties-panel .modal-window {
+ height: 700px;
+ max-height: 700px;
+ width: 800px;
+ max-width: 800px;
+ overflow: hidden;
+}
+.spatialproperties-panel .modal-window .info-header {
+ padding-left: 12px;
+}
+.spatialproperties-panel .modal-window .visual-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: hidden;
+}
+.spatialproperties-panel .modal-window .visual {
+ position: relative;
+ height: 250px;
+ width: 300px;
+ display: inline-flex;
+ align-items: flex-end;
+ justify-content: center;
+ filter: drop-shadow(2px 12px 6px rgba(0, 0, 0, 0.25));
+ margin: 0 auto;
+}
+.spatialproperties-panel .modal-window .visual .face {
+ position: absolute;
+ width: calc(12px * 6);
+ height: calc(12px * 6);
+ border-radius: 6px;
+ transform: rotateX(60deg) rotateZ(-45deg);
+ transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
+}
+.spatialproperties-panel .modal-window .visual .listener {
+ position: absolute;
+ width: 32px;
+ height: 32px;
+ border-radius: 6px;
+ transform: rotateX(60deg) rotateZ(-45deg);
+ transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
+ background: white;
+ color: black;
+ z-index: 2;
+}
+.spatialproperties-panel .modal-window .visual .audiosource {
+ position: absolute;
+ width: 32px;
+ height: 32px;
+ border-radius: 6px;
+ transform: rotateX(60deg) rotateZ(-45deg);
+ transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
+ background: yellow;
+ z-index: 2;
+}
+.spatialproperties-panel .modal-window .visual .face:nth-of-type(1) {
+ background: linear-gradient(45deg, #28223a, #1f2038);
+ z-index: 1;
+}
+.spatialproperties-panel .modal-window .visual .face:nth-of-type(2) {
+ background: linear-gradient(45deg, #7d53ad, #5763ff);
+ transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px);
+ opacity: 0.7;
+ z-index: 3;
+}
+.spatialproperties-panel .modal-window .modal-header {
+ padding: 16px;
+ position: relative;
+ overflow: hidden;
+}
+.spatialproperties-panel .modal-window .modal-header .modal-title {
+ text-align: center;
+}
+.spatialproperties-panel .modal-window .modal-header .close-btn {
+ width: 50px;
+ height: 100%;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+.spatialproperties-panel .modal-window .modal-header .close-btn:hover {
+ background-color: #c42b1c;
+}
+.addtoplaylist-panel .modal-window {
+ max-height: 600px;
+ max-width: 400px;
+ background: rgba(18, 18, 18, 0.9);
+ overflow: hidden;
+ backdrop-filter: blur(16px) saturate(180%);
+}
+.addtoplaylist-panel .modal-window .modal-header {
+ padding: 16px;
+ position: relative;
+}
+.addtoplaylist-panel .modal-window .modal-header .modal-title {
+ text-align: center;
+}
+.addtoplaylist-panel .modal-window .modal-header .close-btn {
+ width: 50px;
+ height: 100%;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+.addtoplaylist-panel .modal-window .modal-header .close-btn:hover {
+ background-color: #c42b1c;
+}
+.addtoplaylist-panel .modal-window .modal-search {
+ width: 100%;
+ padding: 0px 16px;
+ position: relative;
+}
+.addtoplaylist-panel .modal-window .playlist-item {
+ appearance: none;
+ border: 0px;
+ text-align: left;
+ width: 100%;
+ margin: 0;
+ display: flex;
+ background: rgba(32, 32, 32, 0.46);
+ color: #eee;
+ font-family: inherit;
+ font-size: 0.98em;
+ padding: 6px 12px;
+ align-items: center;
+ flex-flow: row;
+}
+.addtoplaylist-panel .modal-window .playlist-item .icon {
+ pointer-events: none;
+ width: 32px;
+ height: 32px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-right: 6px;
+}
+.addtoplaylist-panel .modal-window .playlist-item .name {
+ position: relative;
+}
+.addtoplaylist-panel .modal-window .playlist-item:hover {
+ background: var(--selected);
+}
+.addtoplaylist-panel .modal-window .playlist-item:active {
+ background: var(--selected-click);
+}
+.addtoplaylist-panel .modal-window .playlist-item.focused {
+ background: var(--keyColor);
+}
+.addtoplaylist-panel .modal-window .playlist-item:last-child {
+ border-bottom: 0px;
+}
+.menu-panel {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 100001;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ -webkit-app-region: no-drag;
+}
+.menu-panel .menu-header-body {
+ padding: 6px;
+ display: flex;
+ background: rgba(200, 200, 200, 0.1);
+}
+.menu-panel .menu-header-body .menu-option-header {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: var(--mediaItemRadius);
+ appearance: none;
+ border: 0;
+ background: transparent;
+}
+.menu-panel .menu-header-body .menu-option-header.active .sidebar-icon > .svg-icon {
+ --color: var(--keyColor);
+}
+.menu-panel .menu-header-body .menu-option-header:hover {
+ background: var(--selected);
+}
+.menu-panel .menu-header-body .menu-option-header:active {
+ background: var(--selected-click);
+}
+.menu-panel .menu-panel-body {
+ display: flex;
+ flex-flow: column;
+ background: #262626;
+ position: relative;
+ min-width: 200px;
+ box-shadow: var(--ciderShadow-Generic);
+ border-radius: var(--mediaItemRadius);
+ overflow: hidden;
+ font-size: 13px;
+}
+.menu-panel .menu-panel-body .menu-option {
+ text-align: left;
+ display: flex;
+ width: 100%;
+ padding: 9px 16px;
+ appearance: none;
+ border: 0px;
+ font: inherit;
+ background: transparent;
+ color: inherit;
+}
+.menu-panel .menu-panel-body .menu-option:hover {
+ background: var(--selected);
+}
+.menu-panel .menu-panel-body .menu-option:active {
+ background: var(--selected-click);
+}
+.menu-panel .menu-header-text {
+ margin: 18px 6px;
+}
+.menu-panel .menu-header-text .close-btn {
+ width: 50px;
+ height: 42px;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+.menu-panel .menu-header-text .close-btn:hover {
+ background-color: #c42b1c;
+}
+.menu-panel .menu-body {
+ overflow: overlay;
+ height: 100%;
+}
+.menu-panel .menu-footer {
+ width: 100%;
+ padding: 12px;
+}
+.queue-panel {
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-flow: column;
+}
+.queue-panel .queue-header-text {
+ margin: 18px 6px;
+}
+.queue-panel .queue-body {
+ overflow: overlay;
+ height: 100%;
+}
+.queue-panel .queue-footer {
+ width: 100%;
+ padding: 12px;
+}
+.queue-panel .autoplay {
+ background: rgba(200, 200, 200, 0.15);
+ display: flex;
+ justify-content: center;
+ appearance: none;
+ border: 0;
+ border-radius: 6px;
+ height: 32px;
+ width: 32px;
+}
+.queue-panel .infinity {
+ content: url("assets/infinity.svg");
+ margin: auto;
+}
+.content-inner {
+ position: absolute;
+ top: var(--navigationBarHeight);
+ left: 0;
+ padding: 32px;
+ width: 100%;
+ transition: zoom 1s;
+ zoom: 1;
+}
+.content-inner.centered {
+ height: 100%;
+ display: flex;
+ flex-flow: column;
+ justify-content: center;
+ align-items: center;
+}
+.github-themes-page {
+ display: flex;
+ flex-direction: column;
+ padding: 0px;
+ height: calc(100% - var(--navigationBarHeight));
+}
+.github-themes-page .github-avatar {
+ height: 42px;
+ width: 42px;
+ margin: 6px;
+ border-radius: 32px;
+}
+.github-themes-page .repo-name {
+ margin: 0px;
+ font-weight: 500;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: break-spaces;
+}
+.github-themes-page .repo-url {
+ color: var(--textColor);
+ font-size: 0.8em;
+}
+.github-themes-page .repo-preview-name {
+ margin: 0px;
+}
+.github-themes-page .repos-list {
+ height: 100%;
+ overflow-y: overlay;
+ width: 320px;
+ font-size: 14px;
+}
+.github-themes-page .repos-list > .list-group {
+ margin: 0px;
+}
+.github-themes-page .repos-list .list-group-item {
+ padding: 12px 6px;
+}
+.github-themes-page .repos-list .list-group-item:hover {
+ filter: brightness(1.2);
+}
+.github-themes-page .repos-list .list-group-item:active {
+ filter: brightness(0.8);
+}
+.github-themes-page .github-preview {
+ height: 100%;
+ flex: 1;
+ background: var(--color2);
+ padding: 16px 32px;
+ overflow-y: overlay;
+}
+.github-themes-page .gh-content {
+ display: flex;
+ flex-direction: row;
+ flex: 1;
+ overflow: hidden;
+}
+.github-themes-page .gh-header {
+ padding: 16px;
+}
+.library-page {
+ padding: 0px;
+}
+.library-page .library-header {
+ position: sticky;
+ top: 0;
+ left: 0;
+ border-bottom: 1px solid rgba(200, 200, 200, 0.05);
+ z-index: 6;
+ background: black;
+ padding: 0px 2em;
+ backdrop-filter: blur(32px);
+ background: rgba(0, 0, 0, 0.25);
+ top: var(--navigationBarHeight);
+}
+.library-page .well {
+ margin: 2em;
+}
+.content-inner.podcasts-page {
+ display: flex;
+ height: calc(100% - var(--navigationBarHeight));
+ padding: 0px;
+}
+.content-inner.podcasts-page .list-flat {
+ border-radius: 0px;
+}
+.content-inner.podcasts-page .podcast-artwork {
+ width: 200px;
+ margin: 16px auto;
+ height: 200px;
+}
+.content-inner.podcasts-page .podcasts-list {
+ height: 100%;
+ width: 280px;
+ background: rgba(200, 200, 200, 0.1);
+ overflow-y: overlay;
+ border-right: 1px solid var(--color2);
+ flex: none;
+ overflow-x: hidden;
+}
+.content-inner.podcasts-page .podcasts-list .podcast-list-header {
+ border-bottom: 1px solid var(--color2);
+ font-size: 0.7em;
+ padding: 6px;
+ background: #ffffff17;
+ text-transform: uppercase;
+ font-weight: 600;
+ opacity: 0.5;
+}
+.content-inner.podcasts-page .podcasts-list .podcasts-search {
+ padding: 10px;
+ position: sticky;
+ top: 0;
+ left: 0;
+ width: 100%;
+ border-bottom: 1px solid var(--color2);
+ z-index: 2;
+ background: #303030;
+}
+.content-inner.podcasts-page .episodes-list {
+ height: 100%;
+ width: 100%;
+ background: rgba(200, 200, 200, 0.06);
+ overflow-y: overlay;
+ overflow-x: hidden;
+}
+.content-inner.podcasts-page .episodes-list .episodes-inline-info {
+ padding: 14px 14px 0px 14px;
+}
+.content-inner.podcasts-page .episodes-list .episodes-inline-info .podcast-show-info {
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+}
+.content-inner.podcasts-page .episodes-list .episodes-inline-info .podcast-show-description {
+ margin: 32px 6px;
+ font-size: 0.8rem;
+ white-space: pre-wrap;
+ display: block;
+}
+.content-inner.podcasts-page .episodes-list .episodes-inline-info .podcast-artwork {
+ width: 120px;
+ margin: 0px auto;
+ height: 120px;
+}
+.content-inner.podcasts-page .episodes-list .podcast-no-search-results {
+ text-align: center;
+ margin-top: 40px;
+}
+.content-inner.podcasts-page .podcasts-details {
+ width: 300px;
+ flex: none;
+ background: rgba(255, 255, 255, 0.05);
+ overflow-y: overlay;
+ overflow-x: hidden;
+ top: 2%;
+ z-index: 2;
+ border-left: 1px solid var(--color2);
+ padding-bottom: 1em;
+}
+.content-inner.podcasts-page .podcasts-details .meta-btn {
+ font-size: 0.75em;
+}
+.content-inner.podcasts-page .podcasts-details .podcasts-details-header {
+ display: flex;
+ justify-content: end;
+ align-items: center;
+ position: sticky;
+ top: 0;
+ z-index: 2;
+}
+.content-inner.podcasts-page .podcasts-details .close-btn {
+ width: 50px;
+ height: 42px;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+.content-inner.podcasts-page .podcasts-details .close-btn:hover {
+ background-color: #c42b1c;
+}
+.content-inner.podcasts-page .podcasts-details .podcast-genre {
+ text-align: center;
+ margin: 6px;
+ font-size: 0.8em;
+ font-weight: 500;
+ opacity: 0.8;
+}
+.content-inner.podcasts-page .podcasts-details .podcast-metainfo {
+ text-align: center;
+ font-size: 0.7em;
+ opacity: 0.8;
+}
+.content-inner.podcasts-page .podcasts-details .podcast-header {
+ text-align: center;
+}
+.content-inner.podcasts-page .podcasts-details .podcast-play-btn {
+ width: 50%;
+ display: block;
+ margin: 0 auto;
+}
+.content-inner.podcasts-page .podcasts-details .podcast-description {
+ margin: 12px;
+ font-size: 0.75em;
+ white-space: pre-wrap;
+ display: block;
+ line-break: anywhere;
+}
+@media only screen and (max-width: 1230px) {
+ .content-inner.podcasts-page .podcasts-details {
+ height: 96%;
+ width: 300px;
+ flex: none;
+ background: rgba(20, 20, 20, 0.97);
+ overflow-y: overlay;
+ overflow-x: hidden;
+ position: absolute;
+ right: 2%;
+ top: 2%;
+ border-radius: 10px;
+ box-shadow: var(--ciderShadow-Generic);
+ z-index: 2;
+ }
+}
+/* Album / Playlist Page */
+.playlist-page {
+ --bgColor: transparent;
+ padding: 0px;
+ top: 0;
+ padding-top: var(--navigationBarHeight);
+}
+.playlist-page .playlist-body {
+ padding: var(--contentInnerPadding) 2em;
+ margin-top: -75px;
+}
+.playlist-page .floating-header {
+ position: sticky;
+ top: 0;
+ left: 0;
+ border-bottom: 1px solid rgba(200, 200, 200, 0.05);
+ z-index: 6;
+ padding: 0px 1em;
+ backdrop-filter: blur(32px);
+ background: rgba(0, 0, 0, 0.25);
+ top: var(--navigationBarHeight);
+ transition: opacity 0.1s var(--appleEase);
+}
+.playlist-page .playlist-display {
+ padding: var(--contentInnerPadding);
+ min-height: 300px;
+ position: relative;
+}
+.playlist-page .playlist-display .artworkContainer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ margin: 0;
+ margin-top: calc(var(--navigationBarHeight) * -1);
+ margin-bottom: -10px;
+ padding: 0;
+ -webkit-mask-image: radial-gradient(at top left, black, transparent 70%), radial-gradient(at top right, black, transparent 70%), linear-gradient(180deg, #c8c8c8, transparent 98%);
+ opacity: 0.7;
+ animation: playlistArtworkFadeIn 1s var(--appleEase);
+}
+.playlist-page .playlist-display .artworkContainer .artworkMaterial > img {
+ filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
+ object-position: center;
+ object-fit: cover;
+ width: 100%;
+ height: 100%;
+ transform: unset;
+}
+.playlist-page .playlist-display .playlistInfo {
+ z-index: 1;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ top: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+}
+.playlist-page .playlist-display .playlistInfo > .row {
+ width: calc(100% - 32px);
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info {
+ flex-shrink: unset;
+ display: flex;
+ flex-flow: column;
+ justify-content: flex-end;
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .playlist-name {
+ font-weight: 700;
+ font-size: 1.6rem;
+ margin-right: 6px;
+ flex-shrink: unset;
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .nameEdit {
+ font-weight: 700;
+ font-size: 1.6rem;
+ margin-bottom: 6px;
+ margin-right: 6px;
+ flex-shrink: unset;
+ background: transparent;
+ border: 0px;
+ color: inherit;
+ font-family: inherit;
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .playlist-artist {
+ font-size: 20px;
+ margin-bottom: 6px;
+ margin-right: 6px;
+ flex-shrink: unset;
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .playlist-desc {
+ box-sizing: border-box;
+ font-size: 14px;
+ flex-shrink: unset;
+ margin-right: 5px;
+ max-height: 100px;
+ position: relative;
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .playlist-desc .content {
+ height: 100px;
+ -webkit-mask-image: -webkit-gradient(linear, left 50%, left 90%, from(#000000), to(rgba(0, 0, 0, 0)));
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .playlist-desc .more-btn {
+ appearance: none;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ padding: 0 5px;
+ font-size: 14px;
+ color: var(--keyColor);
+ background-color: transparent;
+ border: 0px;
+ cursor: pointer;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ display: flex;
+ justify-content: flex-end;
+ align-items: flex-end;
+ font-weight: 600;
+ font-family: inherit;
+ text-transform: uppercase;
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .playlist-desc-expanded {
+ box-sizing: border-box;
+ font-size: 14px;
+ position: relative;
+}
+.playlist-page .playlist-display .playlistInfo .playlist-info .playlist-desc-expanded .more-btn {
+ appearance: none;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ padding: 0 5px;
+ font-size: 14px;
+ color: var(--keyColor);
+ background-color: transparent;
+ border: 0px;
+ cursor: pointer;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ display: flex;
+ justify-content: flex-end;
+ align-items: flex-end;
+ font-weight: 600;
+ font-family: inherit;
+ text-transform: uppercase;
+}
+.playlist-page .friends-info {
+ display: flex;
+ flex-flow: column;
+}
+.playlist-page .friends-info .badge-container {
+ display: flex;
+ flex-flow: wrap;
+}
+.playlist-page .friends-info .badge-container .socialBadge {
+ width: 40px;
+ height: 40px;
+ border-radius: 100%;
+ overflow: hidden;
+ box-shadow: var(--mediaItemShadow-ShadowSubtle);
+ transition: transform 0.2s var(--appleEase);
+ margin: 6px;
+}
+.playlist-page .friends-info .badge-container .socialBadge:hover {
+ transform: scale(1.2);
+}
+.playlist-page .friends-info .friends-name {
+ text-align: center;
+ font-size: 0.9em;
+ margin: 8px;
+}
+.playlist-page .playlist-time {
+ font-size: 0.9em;
+ margin: 6px;
+ opacity: 0.7;
+}
+.playlist-page.inline-playlist {
+ overflow: hidden;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.5);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 6;
+ position: sticky;
+ margin-top: calc(var(--navigationBarHeight) * -1);
+}
+.playlist-page.inline-playlist .floating-header {
+ opacity: 1;
+ top: 0px;
+ z-index: 6;
+ padding: 1em;
+ backdrop-filter: unset;
+ background: black;
+}
+.playlist-page.inline-playlist .floating-header h3 {
+ display: none;
+}
+.playlist-page.inline-playlist .playlist-inner {
+ background: black;
+ width: 80%;
+ height: 100%;
+ overflow: overlay;
+ box-shadow: var(--ciderShadow-Generic);
+ border-radius: var(--mediaItemRadius) var(--mediaItemRadius) 0px 0px;
+}
+.playlist-page.inline-playlist .playlist-inner .close-btn {
+ position: sticky;
+ top: 16px;
+ left: 16px;
+ margin-left: 16px;
+ z-index: 7;
+}
+@keyframes playlistArtworkFadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 0.7;
+ }
+}
+.collection-page {
+ padding-bottom: 128px;
+}
+.collection-page .top-fab {
+ height: 52px;
+ width: 52px;
+ position: fixed;
+ bottom: 32px;
+ right: 32px;
+ border-radius: 100%;
+ background: #3c3c3c;
+ border: 0px;
+ appearance: none;
+ box-shadow: var(--ciderShadow-Generic);
+}
+.collection-page .top-fab > svg {
+ height: 50%;
+ color: #eee;
+ pointer-events: none;
+}
+.collection-page .top-fab:hover {
+ background: #646464;
+}
+.collection-page .top-fab:active {
+ background: var(--keyColor);
+}
+.collection-page .header-text {
+ margin-bottom: 32px;
+}
+/* Artist Page */
+.artist-page {
+ padding: 0px;
+ top: 0;
+}
+.artist-page .floating-header {
+ position: sticky;
+ top: 0;
+ left: 0;
+ border-bottom: 1px solid rgba(200, 200, 200, 0.05);
+ z-index: 6;
+ padding: 0px 1em;
+ backdrop-filter: blur(32px);
+ background: rgba(0, 0, 0, 0.25);
+ top: var(--navigationBarHeight);
+ transition: opacity 0.1s var(--appleEase);
+}
+.artist-page.animated .artist-header .more-btn-round {
+ position: absolute;
+ bottom: 22px !important;
+ right: 28px;
+}
+.artist-page .artist-header {
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ min-height: 400px;
+ position: relative;
+ pointer-events: none;
+}
+.artist-page .artist-header .header-content {
+ z-index: 1;
+ margin-top: -16px;
+}
+.artist-page .artist-header .artworkContainer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ margin: 0;
+ padding: 0;
+ -webkit-mask-image: radial-gradient(at top left, black, transparent 70%), radial-gradient(at top right, black, transparent 70%), linear-gradient(180deg, #c8c8c8, transparent 98%);
+ opacity: 0.7;
+ animation: playlistArtworkFadeIn 1s var(--appleEase);
+}
+.artist-page .artist-header .artworkContainer .artworkMaterial > img {
+ filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
+ object-position: center;
+ object-fit: cover;
+ width: 100%;
+ height: 100%;
+ transform: unset;
+}
+.artist-page .artist-header .more-btn-round {
+ position: absolute;
+ bottom: 82px;
+ right: 28px;
+}
+.artist-page .artist-header .animated {
+ width: 100%;
+ height: 100%;
+ align-self: center;
+ position: absolute;
+ overflow: hidden;
+ box-shadow: rgba(0, 0, 0, 0.5) 0 0 0 1000000px inset;
+}
+.artist-page .artist-header .animated video {
+ overflow: hidden;
+ height: 100%;
+ width: 100%;
+ min-height: 56.25vw;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+}
+.artist-page .artist-header .row .col.flex-center {
+ z-index: 4;
+}
+.artist-page .artist-image {
+ width: 200px;
+ height: 200px;
+ margin: 32px;
+ position: relative;
+}
+.artist-page .artist-image .overlay-play {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ background: rgba(0, 0, 0, 0.5);
+ transition: opacity 0.1s var(--appleEase);
+ border-radius: 100%;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ appearance: none;
+ border: 0px;
+ padding: 0px;
+}
+.artist-page .artist-image .overlay-play:hover {
+ opacity: 1;
+}
+.artist-page .artist-image .overlay-play:active {
+ background: var(--selected-click);
+}
+.artist-page .artist-image .overlay-play > svg {
+ width: 70%;
+}
+.artist-page .artist-play {
+ width: 32px;
+ height: 32px;
+ background: rgba(100, 100, 100, 0.5);
+ box-shadow: var(--ciderShadow-Generic);
+ border-radius: 100%;
+ box-shadow: var(--mediaItemShadow);
+ display: none;
+ cursor: pointer;
+ appearance: none;
+ border: 0px;
+ padding: 0px;
+}
+.artist-page .artist-play:hover {
+ filter: brightness(125%);
+}
+.artist-page .artist-play:active {
+ filter: brightness(75%);
+ transform: scale(0.98);
+ transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
+}
+.artist-page .artist-title .artist-play {
+ transform: translateY(3px);
+ margin: 14px;
+}
+.artist-page .artist-title.artist-animation-on {
+ width: 100%;
+ flex: unset;
+ margin-left: 0.5em;
+ color: whitesmoke;
+ position: absolute;
+ bottom: 0;
+}
+.artist-page .artist-title.artist-animation-on .artist-play {
+ display: block;
+}
+.artist-page .artist-body {
+ padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
+ margin: -140px 20px;
+}
+.artist-page.animated > .artist-body {
+ padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
+ margin-top: -57px;
+}
+.artist-page .showmoreless {
+ font-family: inherit;
+ font-size: 16px;
+ font-weight: 500;
+ background: transparent;
+ border: 0px;
+ border-radius: 6px;
+ appearance: none;
+ color: var(--keyColor);
+ padding: 8px 12px;
+ cursor: pointer;
+ margin-top: 12px;
+ float: right;
+}
+.artist-page .showmoreless:hover {
+ background: rgba(200, 200, 200, 0.1);
+}
+/* Artist Page End */
+.settings-page {
+ padding: 0px;
+}
+.settings-page .md-option-header {
+ padding: 1.25em 1.25em;
+ border-bottom: unset;
+ border-top: unset;
+ font-weight: 600;
+ font-size: 1em;
+ background: rgba(255, 255, 255, 0.03);
+}
+.settings-page .settings-option-body {
+ margin: 16px;
+}
+.home-page {
+ top: 0;
+ padding-top: var(--navbarHeight);
+}
+.home-page .md-btn-replay {
+ background: var(--replayGradient);
+ border: 0px;
+ box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.2);
+ text-transform: uppercase;
+ font-weight: bold;
+}
+.home-page .md-btn-replay--hero {
+ font-size: 1em;
+ padding: 16px;
+ background: var(--replayGradient);
+ border: 0px;
+ box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.2);
+ margin-top: 1em;
+ font-size: 0.9em;
+ text-transform: uppercase;
+ font-weight: bold;
+}
+.home-page .artist-feed-card {
+ position: absolute;
+ bottom: 0;
+ left: 10%;
+ z-index: 1;
+ background: black;
+ width: 80%;
+ height: 96%;
+ overflow: scroll;
+ border-radius: 10px;
+}
+.home-page .col.madeforyou-col {
+ width: 420px;
+ min-width: 0px;
+ max-width: 420px;
+}
+.home-page .well.artistfeed-well {
+ margin-top: 0px;
+ height: 392px;
+ align-content: flex-start;
+}
+.home-page .hint-text {
+ font-size: 0.9rem;
+ color: rgba(200, 200, 200, 0.7);
+}
+.home-page .user-icon {
+ border-radius: 100%;
+ width: 128px;
+ height: 128px;
+ overflow: hidden;
+ box-shadow: var(--mediaItemShadow-Shadow);
+ margin: 16px;
+}
+.home-page .well.profile-well {
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+.home-page .well.profile-well .name {
+ margin: 4px;
+ font-weight: 500;
+}
+.home-page .well.profile-well .handle {
+ margin: 4px;
+ opacity: 0.7;
+ font-weight: 500;
+}
+.replay-page {
+ --replayTextShadow: 0px 3px 2px #6f3f52;
+}
+.replay-page .replay-period {
+ height: 200px;
+ width: 200px;
+ margin: 6px;
+ border-radius: var(--mediaItemRadius);
+ overflow: hidden;
+ cursor: pointer;
+ transition: transform 0.2s var(--appleEase);
+ transition-delay: 0.1s;
+ align-self: center;
+}
+.replay-page .replay-period:hover {
+ transform: translateY(-6px);
+ transition-delay: 0s;
+}
+.replay-page .replay-period .artwork-container {
+ height: 200px;
+ width: 200px;
+}
+.replay-page .replay-playlist-container .cd-mediaitem-square {
+ height: 230px;
+ width: 230px;
+}
+.replay-page .replay-playlist-container .cd-mediaitem-square .info-rect {
+ display: none;
+}
+.replay-page .replay-video {
+ max-height: 300px;
+ max-width: 800px;
+ margin: 0 auto;
+}
+.replay-page .replay-video .mediaitem-artwork {
+ max-height: 300px;
+ max-width: 800px;
+}
+.replay-page .replay-video .mediaitem-artwork .animatedartwork-view-box .animated video {
+ object-fit: cover;
+}
+.replay-page .top-genres-container .genre-name {
+ font-size: 0.9em;
+ margin: 6px 0px;
+ font-weight: 500;
+}
+.replay-page .top-genres-container .genre-count {
+ width: 100%;
+ height: 32px;
+ background: #ffffff14;
+ border-radius: 10px;
+ overflow: hidden;
+}
+.replay-page .top-genres-container .genre-count .genre-count-bar {
+ height: 100%;
+ width: 0%;
+ background: var(--keyColor);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-width: 32px;
+ font-size: 0.9em;
+ font-weight: 500;
+}
+.replay-page .cd-mediaitem-square {
+ transition: transform 0.2s var(--appleEase);
+ transition-delay: 0.1s;
+}
+.replay-page .cd-mediaitem-square .mediaitem-artwork {
+ animation: replayFadeIn 0.5s var(--appleEase);
+}
+.replay-page .cd-mediaitem-square:hover {
+ transform: scale(1.1);
+ transition-delay: 0s;
+}
+@keyframes replayFadeIn {
+ 0% {
+ transform: translateY(10px) scale(0.9);
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+.replay-page .replay-viewport {
+ background: var(--replayGradient);
+ padding: 16px 40px;
+ border-radius: 10px;
+ box-shadow: var(--mediaItemShadow), var(--mediaItemShadow-Shadow);
+ color: rgba(238, 238, 238, 0.86);
+}
+.replay-page .replay-viewport .replay-header {
+ text-align: center;
+ font-size: 3em;
+ text-shadow: var(--replayTextShadow);
+}
+.replay-page .replay-card {
+ background: transparent;
+ border: 0px;
+}
+:root {
+ --appleEase: cubic-bezier(0.42, 0, 0.58, 1);
+ --mediaItemShadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.16);
+ --mediaItemShadow-Shadow: 0 8px 40px rgba(0, 0, 0, 0.55);
+ --mediaItemShadow-ShadowSubtle: 0 4px 14px rgba(0, 0, 0, 0.1);
+ --ciderShadow-Generic: var(--mediaItemShadow), 0 8px 40px rgb(0 0 0 / 0.55);
+ --mediaItemRadius: 6px;
+ --mediaItemRadiusRound: 100%;
+ --contentInnerPadding: 16px;
+ --navbarHeight1: 48px;
+ --navbarHeight2: 0px;
+ --navbarHeight: calc(var(--navbarHeight1) + var(--navbarHeight2));
+ --selected: rgba(130, 130, 130, 0.3);
+ --selected-click: rgba(80, 80, 80, 0.3);
+ --hover: rgba(200, 200, 200, 0.1);
+ --keyColor: #fa586a;
+ --keyColor-rgb: 250, 88, 106;
+ --keyColor-rollover: #ff8a9c;
+ --keyColor-rollover-rgb: 255, 138, 156;
+ --keyColor-pressed: #ff7183;
+ --keyColor-pressed-rgb: 255, 113, 131;
+ --keyColor-deepPressed: #ff8a9c;
+ --keyColor-deepPressed-rgb: 255, 138, 156;
+ --keyColor-disabled: rgba(250, 88, 106, 0.35);
+ --navigationBarHeight: 38px;
+ --modalBackground: #262626;
+ --songProgressColor: var(--keyColor);
+ --songProgressBackground: #333;
+ --textColor: #eee;
+ --replayGradient: linear-gradient(45deg, hsl(248, 58%, 29%), hsl(13, 41%, 42%));
+}
+*:focus-visible {
+ outline: 2px solid var(--keyColor);
+}
+html,
+body {
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+ background-size: cover;
+ background-position: center;
+ background: #0000;
+ font-family: "Inter var experimental", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ transition: opacity 0.1s var(--appleEase);
+}
+a:-webkit-any-link {
+ color: var(--keyColor);
+}
+hr {
+ appearance: none;
+ border: none;
+ height: 1px;
+ background-color: rgba(255, 255, 255, 0.2);
+}
+body[loading] .app-navigation {
+ pointer-events: none;
+}
+body.stopanimation * {
+ animation: unset !important;
+}
+body.stopanimation * .loadbar-sound {
+ display: none;
+}
+body.notransparency::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ opacity: 0.5;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==);
+}
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+/* Modern style overlay scrollbars */
+::-webkit-scrollbar {
+ width: 16px;
+ height: 24px;
+}
+::-webkit-scrollbar-button {
+ display: none;
+}
+::-webkit-scrollbar-track-piece {
+ background: transparent;
+}
+::-webkit-scrollbar-thumb {
+ background: transparent;
+ border: 6px solid transparent;
+ box-shadow: inset 0px 0px 10px 10px rgba(200, 200, 200, 0.5);
+ border-radius: 16px;
+ min-height: 64px;
+ transition: border 1s;
+}
+::-webkit-scrollbar-thumb:hover {
+ border: 5px solid transparent;
+ box-shadow: inset 0px 0px 10px 10px rgba(200, 200, 200, 0.8);
+}
+[disabled] {
+ pointer-events: none;
+ opacity: 0.5;
+}
+#app {
+ --color1: rgba(30, 30, 30, 0.3);
+ --color2: rgba(15, 15, 15, 0.3);
+ --bgColor: transparent;
+ --bgWidth: 0px;
+ --bgHeight: 0px;
+ --chromeHeight1: 55px;
+ --chromeHeight2: 0px;
+ --chromeHeight: calc(var(--chromeHeight1) + var(--chromeHeight2));
+ width: 100%;
+ height: 100%;
+ background: var(--color1);
+ color: var(--textColor);
+ user-select: none;
+ margin: 0 auto;
+ position: relative;
+ overflow: hidden;
+ background-size: 400% 400%;
+}
+#app.simplebg {
+ background: #0e0e0e;
+}
+#app.simplebg::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ opacity: 0.5;
+ z-index: 0;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==);
+}
+#app.simplebg .app-chrome {
+ z-index: 1;
+}
+.bgGradientMaterial-base {
+ position: relative;
+}
+.bgGradientMaterial-base::before {
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 250%;
+ background-image: var(--bgColor);
+ content: "";
+ z-index: -1;
+ transform: rotateZ(0deg);
+ transform-origin: center;
+ animation: bgRotate 10s linear infinite;
+ filter: brightness(100%) saturate(200%) contrast(1.5);
+}
+@keyframes bgRotate {
+ 0% {
+ transform: rotateZ(0deg);
+ }
+ 100% {
+ transform: rotateZ(360deg);
+ }
+}
+[hidden] {
+ display: none !important;
+}
+input[type="text"],
+input[type="number"] {
+ background: #1c1c1c;
+ border-radius: 3px;
+ border: 1px solid rgba(200, 200, 200, 0.25);
+ color: #eee;
+ padding: 6px;
+ font-size: 1em;
+ font-family: inherit;
+}
+.bg-artwork--placeholder {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #222;
+ z-index: -1;
+ background-size: cover;
+ background-position: center;
+ opacity: 0.7;
+}
+.bg-artwork {
+ position: absolute;
+ width: 200%;
+ background: var(--artwork);
+ filter: brightness(200%) blur(180px) saturate(280%) contrast(2);
+ opacity: 1;
+ transition: opacity 0.25s var(--appleEase);
+ pointer-events: none;
+ transform: translateZ(0px);
+ animation: rotateBg 35s linear infinite;
+ backface-visibility: hidden;
+}
+@keyframes rotateBg {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+.bg-artwork-container {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ pointer-events: none;
+ transform: translateZ(0px);
+ z-index: -1;
+}
+.bg-artwork-container .bg-artwork.a {
+ top: 0;
+ left: 0;
+}
+.bg-artwork-container .bg-artwork.b {
+ bottom: 0;
+ right: 0;
+ animation-direction: reverse;
+ animation-delay: 10s;
+}
+.bg-artwork-container.noanimation .bg-artwork {
+ animation: none;
+}
+.artworkMaterial {
+ position: relative;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+ pointer-events: none;
+}
+.artworkMaterial > img {
+ position: absolute;
+ width: 200%;
+ opacity: 0.5;
+ filter: brightness(200%) blur(180px) saturate(280%) contrast(2);
+}
+.artworkMaterial > img:first-child {
+ top: 0;
+ left: 0;
+}
+.artworkMaterial > img:last-child {
+ bottom: 0;
+ right: 0;
+ transform: rotate(180deg);
+}
+[artwork-hidden] {
+ transition: opacity 0.25s var(--appleEase);
+ opacity: 0;
+}
+input[type="range"].web-slider {
+ -webkit-appearance: none;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.6);
+ border-radius: 5px;
+ background-size: 70% 100%;
+ background-repeat: no-repeat;
+}
+input[type="range"].web-slider::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ height: 20px;
+ width: 20px;
+ border-radius: 50%;
+ background: #ffffff;
+ cursor: ew-resize;
+ box-shadow: 0 0 2px 0 #555;
+}
+input[type=range].web-slider::-webkit-slider-runnable-track {
+ -webkit-appearance: none;
+ box-shadow: none;
+ border: none;
+ background: transparent;
+}
+.nopadding {
+ padding: 0px;
+}
+#app-main {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ flex-direction: column;
+ opacity: 1;
+ overflow: hidden;
+}
+#app-sidebar {
+ /* background-color: var(--color1); */
+ height: 100%;
+ width: 260px;
+ display: flex;
+ flex-direction: column;
+ flex: 0 0 auto;
+ position: relative;
+}
+#app-navbar {
+ height: 40px;
+ width: 100%;
+ background: rgba(30, 30, 30, 0.85);
+ position: sticky;
+ top: 0px;
+ left: 0;
+ z-index: 2;
+ backdrop-filter: blur(16px) saturate(180%);
+}
+#app-content {
+ background-color: var(--color2);
+ height: 100%;
+ width: 100%;
+ overflow-y: scroll;
+ overflow-y: overlay;
+ overflow-x: hidden;
+ border-radius: 10px 0px 0px 0px;
+ border-left: 1px solid rgba(0, 0, 0, 0.25);
+ border-top: 1px solid rgba(0, 0, 0, 0.25);
+ position: relative;
+}
+.app-drawer {
+ width: 300px;
+ flex: 0 0 auto;
+ position: absolute;
+ right: 16px;
+ top: 3%;
+ background: #1c1c1c8f;
+ border-radius: 12px;
+ z-index: 9;
+ height: 94%;
+ backdrop-filter: blur(40px) saturate(180%);
+ box-shadow: var(--ciderShadow-Generic);
+ overflow: hidden;
+}
+.app-drawer .bgArtworkMaterial {
+ display: none;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+.app-drawer .bgArtworkMaterial .bg-artwork-container .bg-artwork {
+ filter: brightness(80%) blur(180px) saturate(180%) contrast(1);
+}
+.search-input-container {
+ position: relative;
+}
+.search-input {
+ width: 100%;
+ padding: 6px;
+ border-radius: 6px;
+ border: 1px solid rgba(200, 200, 200, 0.1);
+ font-family: inherit;
+ font-size: 14px;
+ background: rgba(100, 100, 100, 0.25);
+ color: #c8c8c8;
+ font-weight: 500;
+ padding-left: 32px;
+ position: relative;
+ filter: contrast(0.1);
+}
+.search-input:focus {
+ outline: none;
+ border-bottom: 1px solid var(--keyColor);
+}
+.search-input--icon {
+ content: '';
+ width: 100%;
+ height: 100%;
+ display: block;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ background-image: url('assets/search.svg');
+ background-position: 10px;
+ background-repeat: no-repeat;
+ background-size: 12px;
+ pointer-events: none;
+ opacity: 0.55;
+}
+.app-sidebar-header {
+ font-size: 14px;
+ padding: 11px;
+ font-weight: 600;
+}
+.app-sidebar-header-text {
+ font-size: 11px;
+ margin: 6px 3px;
+ font-weight: 600;
+ opacity: 0.5;
+}
+.app-sidebar-footer {
+ border-top: 1px solid rgba(200, 200, 200, 0.15);
+ padding: 11px;
+}
+.app-sidebar-footer .app-playback-controls {
+ margin: 0 auto;
+}
+.app-sidebar-footer .app-playback-controls .control-buttons {
+ display: flex;
+ justify-content: center;
+ align-content: center;
+}
+.app-sidebar-footer .app-playback-controls .volume {
+ display: flex;
+}
+.app-sidebar-button {
+ width: 100%;
+ padding: 0px;
+ font-family: inherit;
+ display: flex;
+ border-radius: 6px;
+ border: 1px solid rgba(200, 200, 200, 0.05);
+ background: rgba(100, 100, 100, 0.25);
+ color: #eee;
+ font-weight: 500;
+ align-items: center;
+}
+.app-sidebar-button.active {
+ background: rgba(200, 200, 200, 0.15);
+ animation: usermenuBtnClick 0.3s cubic-bezier(0.36, 0, 0.66, -0.56);
+}
+@keyframes usermenuBtnClick {
+ 0% {
+ transform: translateY(0px);
+ }
+ 50% {
+ transform: translateY(-6px);
+ }
+ 100% {
+ transform: translateY(0px);
+ }
+}
+.app-sidebar-button > .sidebar-user-icon {
+ width: 32px;
+ height: 32px;
+ border-radius: 100%;
+ background-image: var(--artwork);
+ margin: 10px;
+ flex: 0 0 auto;
+ box-shadow: var(--mediaItemShadow);
+ background-size: contain;
+}
+.app-sidebar-button > .sidebar-user-text {
+ width: 100%;
+ display: flex;
+ font-size: 14px;
+ flex-direction: column;
+ text-align: center;
+ margin-right: 35px;
+}
+.app-sidebar-button > .sidebar-user-text .fullname {
+ text-align: left;
+}
+.app-sidebar-button > .sidebar-user-text .handle-text {
+ font-size: 12px;
+ opacity: 0.7;
+ text-align: left;
+}
+.app-sidebar-notification {
+ text-align: center;
+ font-size: 12px;
+ min-height: 36px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-top: 1px solid rgba(200, 200, 200, 0.15);
+ background: rgba(0, 0, 0, 0.15);
+ flex-direction: column;
+ padding: 10px 0px;
+}
+.app-sidebar-notification.libraryNotification {
+ flex-direction: row;
+ padding: 0px;
+}
+.app-sidebar-notification.libraryNotification .message {
+ flex-grow: 1;
+}
+.app-sidebar-notification.libraryNotification .spinner {
+ width: 46px;
+ height: 30px;
+ margin-left: 1em;
+}
+.app-sidebar-content {
+ padding: 8px;
+ overflow-y: scroll;
+ overflow-y: overlay;
+ height: 100%;
+}
+.search-hints-container {
+ top: 44px;
+ position: absolute;
+ width: 100%;
+ padding: 10px;
+ z-index: 1;
+}
+.search-hints-container .search-hints {
+ background: #242424;
+ padding: 6px;
+ border-radius: 6px;
+ width: 100%;
+ box-shadow: var(--ciderShadow-Generic);
+}
+.search-hints-container .search-hints .search-hint {
+ background: transparent;
+ display: block;
+ width: 100%;
+ text-align: left;
+ color: #eee;
+ font-family: inherit;
+ font-size: 15px;
+ padding: 8px 12px;
+ border: 0px;
+ appearance: none;
+ border-radius: 6px;
+ margin: 2px 0px;
+}
+.search-hints-container .search-hints .search-hint:hover {
+ background: var(--keyColor);
+}
+.usermenu-container {
+ top: 0px;
+ z-index: 200001 !important;
+ position: absolute;
+ width: 100%;
+ padding: 10px;
+ z-index: 1;
+}
+.usermenu-container .usermenu-body {
+ background: #242424;
+ padding: 6px;
+ border-radius: 6px;
+ width: 100%;
+ box-shadow: var(--ciderShadow-Generic);
+}
+.usermenu-container .usermenu-body .usermenu-item {
+ background: transparent;
+ display: block;
+ width: 100%;
+ text-align: left;
+ color: #eee;
+ font-family: inherit;
+ font-size: 15px;
+ padding: 8px 12px;
+ border: 0px;
+ appearance: none;
+ border-radius: 6px;
+ margin: 2px 0px;
+}
+.usermenu-container .usermenu-body .usermenu-item:hover {
+ background: var(--keyColor);
+}
+.usermenu-container .usermenu-body .usermenu-item .usermenu-item-icon {
+ position: relative;
+ top: 1.5px;
+ right: 3px;
+ display: table-cell;
+}
+.usermenu-container .usermenu-body .usermenu-item .usermenu-item-name {
+ position: relative;
+ bottom: 2px;
+ padding-left: 5px;
+ display: table-cell;
+}
+.context-menu {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0);
+ z-index: 100;
+}
+.context-menu .context-menu-item {
+ background: transparent;
+ display: flex;
+ width: 100%;
+ text-align: left;
+ color: #eee;
+ font-family: inherit;
+ font-size: 14px;
+ padding: 6px 12px;
+ border: 0px;
+ appearance: none;
+ border-radius: 6px;
+ margin: 2px 0px;
+}
+.context-menu .context-menu-item:hover {
+ background: var(--selected);
+ cursor: pointer;
+}
+.context-menu .context-menu-item:active {
+ background: var(--selected-click);
+}
+.context-menu .context-menu-body {
+ background: #242424;
+ padding: 6px;
+ border-radius: 6px;
+ box-shadow: var(--ciderShadow-Generic);
+}
+.context-menu .context-menu-body.context-menu-open {
+ animation-duration: 0.1s;
+ animation-name: contextMenuIn;
+ animation-iteration-count: 1;
+ animation-easings: var(--appleEase);
+}
+.context-menu .context-menu-body.context-menu-close {
+ animation-duration: 0.1s;
+ animation-name: contextMenuOut;
+ animation-iteration-count: 1;
+ animation-easings: var(--appleEase);
+}
+@keyframes contextMenuIn {
+ 0% {
+ transform: scale(0.9);
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes contextMenuOut {
+ 0% {
+ transform: scale(1);
+ opacity: 1;
+ }
+ 100% {
+ transform: scale(0.9);
+ opacity: 0;
+ }
+}
+.hidden-opacity {
+ opacity: 0;
+ height: 0px;
+ width: 0px;
+ margin: 0px;
+}
+.spinner {
+ background-image: url("assets/spinner.svg");
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: contain;
+ width: 50px;
+ height: 50px;
+ display: inline-block;
+}
+.app-sidebar-content::-webkit-scrollbar {
+ display: none;
+}
+.app-sidebar-content:hover::-webkit-scrollbar {
+ display: initial;
+}
+.app-sidebar-item {
+ display: flex;
+ width: 100%;
+ padding: 8px 12px;
+ font-weight: 400;
+ font-family: inherit;
+ font-size: 14px;
+ margin: 3px 0px;
+ border: 1px solid transparent;
+ border-radius: 6px;
+ background: transparent;
+ color: #eee;
+ transition: transform 0.1s;
+ text-align: left;
+}
+.app-sidebar-item.app-sidebar-item-playlist {
+ -webkit-user-drag: element;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.app-sidebar-item.app-sidebar-item-playlist .presentNotice {
+ align-self: center;
+ margin-left: 8px;
+ text-transform: uppercase;
+ font-size: 0.7em;
+ opacity: 0.6;
+}
+.app-sidebar-item:hover {
+ border: 1px solid rgba(200, 200, 200, 0.05);
+ background: rgba(200, 200, 200, 0.15);
+}
+.app-sidebar-item:active {
+ border: 1px solid rgba(200, 200, 200, 0.05);
+ background: rgba(200, 200, 200, 0.15);
+ transform: scale(0.98);
+ transition: transform 0s;
+}
+.app-sidebar-item.active {
+ border: 1px solid rgba(200, 200, 200, 0.05);
+ background: rgba(200, 200, 200, 0.15);
+ transform: scale(1);
+ transition: transform 0s;
+}
+.app-sidebar-item.active::after {
+ content: '';
+ width: 4px;
+ height: 16px;
+ display: block;
+ position: absolute;
+ top: calc(100% - 72%);
+ border-radius: 10px;
+ left: 0px;
+ background: var(--keyColor);
+}
+.app-chrome {
+ background: var(--color1);
+ width: 100%;
+ height: var(--chromeHeight1);
+ display: flex;
+ flex-direction: row;
+ -webkit-app-region: drag;
+}
+.mv-chrome {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 90%;
+ height: 55px;
+ -webkit-app-region: drag;
+}
+.app-chrome .app-chrome--left,
+.app-chrome .app-chrome--center,
+.app-chrome .app-chrome--right {
+ height: 100%;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.app-chrome .app-chrome--left {
+ width: 30%;
+ justify-content: left;
+ -webkit-app-region: drag;
+}
+.app-chrome .app-chrome--center {
+ width: 40%;
+}
+.app-chrome .app-chrome--right {
+ width: 30%;
+ justify-content: right;
+}
+.app-chrome .app-chrome-item {
+ height: 100%;
+ width: auto;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ -webkit-app-region: no-drag;
+ height: auto;
+}
+.app-chrome .app-chrome-item.generic {
+ width: 50px;
+ opacity: 0.7;
+}
+.app-chrome .app-chrome-item.volume {
+ width: 100px;
+ margin-right: 6px;
+}
+.volume-button {
+ background-image: url("assets/feather/volume-2.svg");
+ height: 15px;
+ width: 30px;
+ padding: 0px;
+ background: transparent;
+ border: 0px;
+ border-radius: 0px;
+ box-shadow: unset;
+ background-size: 12px;
+ background-position: center;
+ background-repeat: no-repeat;
+ opacity: 0.7;
+ border-radius: 6px;
+}
+.volume-button:active,
+.volume-button--small:active {
+ transform: scale(0.9);
+}
+.volume-button.active,
+.volume-button--small.active {
+ background-image: url("assets/feather/volume.svg");
+}
+.volume-button--small {
+ border-radius: 6px;
+ color: inherit;
+ background-size: 16px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-color: transparent;
+ height: 15px;
+ width: 30px;
+ border: 0px;
+ box-shadow: unset;
+ opacity: 0.7;
+ background-image: url("assets/feather/volume-2.svg");
+}
+.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ height: 14px;
+ width: 14px;
+ border-radius: 50%;
+ background: #323232;
+ cursor: default;
+ box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
+ transition: all var(--appleTransition);
+}
+.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb:hover {
+ background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
+ transform: scale(1.2);
+}
+.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb:active {
+ background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
+ transform: scale(1);
+}
+.app-chrome .app-chrome-item.volume > input[type=range] {
+ -webkit-appearance: none;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.4);
+ border-radius: 5px;
+ background-size: 70% 100%;
+ background-repeat: no-repeat;
+ width: 100%;
+}
+.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-runnable-track {
+ -webkit-appearance: none;
+ box-shadow: none;
+ border: none;
+ background: transparent;
+}
+.app-chrome .back-button {
+ height: 100%;
+ width: 60px;
+}
+.app-chrome .app-chrome-item.full-height {
+ height: 100%;
+}
+.app-chrome .app-chrome-item > .app-mainmenu {
+ width: 110px;
+ font-size: 13px;
+ background: url("assets/AppChromeBtn.svg");
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ height: 70%;
+ margin-right: 16px;
+ margin-left: 16px;
+ margin-top: 1.5px;
+ border: 0px;
+ border-radius: 6px;
+}
+.app-chrome .app-chrome-item > .app-mainmenu:hover {
+ background-color: var(--selected);
+}
+.app-chrome .app-chrome-item > .app-mainmenu:active,
+.app-chrome .app-chrome-item > .app-mainmenu.active {
+ background-color: var(--selected-click);
+}
+.app-chrome .app-chrome-item > .app-mainmenu.active {
+ background-image: url("assets/AppChromeBtn-Open.svg");
+}
+.app-chrome .app-chrome-item > .window-controls {
+ width: 138px;
+ font-size: 13px;
+ height: 100%;
+ display: flex;
+}
+.app-chrome .app-chrome-item > .window-controls > div {
+ height: 100%;
+ width: 32px;
+}
+.app-chrome .app-chrome-item > .window-controls > div:hover {
+ background: rgba(200, 200, 200, 0.1);
+}
+.app-chrome .app-chrome-item > .window-controls > div.close {
+ width: 100%;
+ height: 100%;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+}
+.app-chrome .app-chrome-item > .window-controls > div.close:hover {
+ background-color: #c42b1c;
+}
+.app-chrome .app-chrome-item > .window-controls > div.minmax {
+ background-image: var(--gfx-maxBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ width: 100%;
+ height: 100%;
+}
+.app-chrome .app-chrome-item > .window-controls > div.minmax.restore {
+ background-image: var(--gfx-restoreBtn);
+}
+.app-chrome .app-chrome-item > .window-controls > div.minimize {
+ background-image: var(--gfx-minBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ width: 100%;
+ height: 100%;
+}
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize {
+ height: 12px;
+ width: 12px;
+ background-color: #ff5c5c;
+ border-radius: 50%;
+ display: inline-block;
+ margin: auto 4px;
+ color: #820005;
+ -webkit-app-region: no-drag;
+ background-image: unset;
+}
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls {
+ width: 67px;
+}
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minmax {
+ height: 12px;
+ width: 12px;
+ background-color: #ffbd4c;
+ border-radius: 50%;
+ display: inline-block;
+ margin: auto 4px;
+ -webkit-app-region: no-drag;
+ background-image: unset;
+}
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.close {
+ height: 12px;
+ width: 12px;
+ background-color: #00ca56;
+ border-radius: 50%;
+ display: inline-block;
+ margin: auto 4px auto 4px;
+ -webkit-app-region: no-drag;
+ background-image: unset;
+}
+.app-chrome .app-chrome-item.playback-controls {
+ width: 80%;
+ height: 90%;
+ display: flex;
+ max-width: 500px;
+ border-left: 1px solid rgba(200, 200, 200, 0.08);
+ border-right: 1px solid rgba(200, 200, 200, 0.08);
+ -webkit-app-region: drag;
+}
+.app-chrome .app-chrome-item > .app-playback-controls {
+ display: flex;
+ justify-content: center;
+ align-content: center;
+ width: 100%;
+ -webkit-app-region: no-drag;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-name {
+ font-weight: 600;
+ text-align: center;
+ font-size: 13px;
+ height: 1.3em;
+ line-height: 1.3em;
+ white-space: nowrap;
+ max-width: 360px;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-name .song-name-normal {
+ height: inherit;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-name .explicit-icon {
+ background-image: url("assets/explicit.svg");
+ height: 9px;
+ width: 13px;
+ filter: contrast(0);
+ background-repeat: no-repeat;
+ margin-left: 3px;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .lossless-icon {
+ background-image: url("assets/lossless.svg") !important;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .ppe-icon {
+ background-image: url("assets/ppe.svg") !important;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .audio-type {
+ filter: contrast(0);
+ background-repeat: no-repeat;
+ background-size: contain;
+ height: 15px;
+ width: 15px;
+ position: absolute;
+ right: 0;
+ margin-bottom: 15px;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-duration p {
+ font-weight: 400;
+ font-size: 10px;
+ height: 1.2em;
+ line-height: 1.3em;
+ overflow: hidden;
+ margin: 0 0 0 0.25em;
+}
+.app-playback-controls:hover .marquee {
+ animation: unset;
+}
+.app-playback-controls:hover .marquee.song-artist {
+ overflow: hidden;
+}
+.app-playback-controls:hover .marquee .song-artist {
+ overflow: hidden;
+}
+.app-playback-controls:hover .marquee.song-name {
+ overflow: hidden;
+}
+.app-playback-controls:hover .marquee::after {
+ content: none !important;
+ display: none;
+}
+.marquee {
+ animation: marquee 15s linear infinite;
+}
+.marquee.song-artist {
+ overflow: unset;
+}
+.marquee .song-artist {
+ overflow: unset;
+}
+.marquee.song-name {
+ overflow: unset;
+}
+.marquee::after {
+ content: attr(data-value);
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-progress {
+ position: absolute;
+ bottom: 0px;
+ left: 0px;
+ background: transparent;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-progress:hover > input[type=range]::-webkit-slider-thumb {
+ opacity: 1;
+ transform: scale(1);
+ z-index: 1;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-progress > input[type=range] {
+ appearance: none;
+ width: 100%;
+ height: 4px;
+ background-color: rgba(200, 200, 200, 0.1);
+ border-radius: 2px;
+ margin: 0;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-progress > input[type=range]::-webkit-slider-thumb {
+ opacity: 0;
+ transform: scale(0.5);
+ -webkit-appearance: none;
+ appearance: none;
+ width: 12px;
+ height: 12px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+ transition: opacity 0.1s var(--appleEase), transform 0.1s var(--appleEase);
+}
+.app-chrome .app-chrome-item > .app-playback-controls .song-progress > input[type=range]::-moz-range-thumb {
+ width: 8px;
+ height: 8px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+}
+@keyframes marquee {
+ from {
+ transform: translateX(0);
+ }
+ to {
+ transform: translateX(-140%);
+ }
+}
+.app-chrome .app-chrome-item > .app-playback-controls .artwork {
+ width: 42px;
+ height: 42px;
+ background-image: var(--artwork);
+ background-position: center;
+ background-size: contain;
+ background-repeat: no-repeat;
+ border-radius: 4px;
+ flex: 0 0 auto;
+ margin: 6px;
+ image-rendering: -webkit-optimize-contrast;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .actions {
+ width: 42px;
+ height: 42px;
+ border-radius: 2px;
+ flex: 0 0 auto;
+ margin: 6px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ filter: contrast(0.8);
+}
+.app-chrome .app-chrome-item > .app-playback-controls .actions .lcdMenu {
+ height: 100%;
+ width: 100%;
+ padding: 0px;
+ margin: 0px;
+ background: transparent;
+ border: 0px;
+ appearance: none;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 6px;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .actions .lcdMenu:focus {
+ outline: none;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .actions .lcdMenu:hover {
+ background: var(--hover);
+}
+.app-chrome .app-chrome-item > .app-playback-controls .actions .lcdMenu:active {
+ background: var(--selected-click);
+ transform: scale(0.95);
+}
+.app-chrome .app-chrome-item > .app-playback-controls .actions .lcdMenu .svg-icon {
+ --url: url('views/svg/more.svg') !important;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .playback-info {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ position: relative;
+ overflow: hidden;
+}
+.app-chrome .app-chrome-item > .app-playback-controls .playback-info > .song-progress {
+ width: 100%;
+}
+.app-navigation {
+ background: var(--color1);
+ height: calc(100% - var(--chromeHeight));
+ width: 100%;
+ display: flex;
+ position: relative;
+}
+.app-chrome .app-chrome-item > .app-playback-controls > div > .song-artist-album {
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ /*height: 1.2em;
+ line-height: 1.2em;*/
+ z-index: 1;
+ align-items: center;
+ justify-content: center;
+ width: 80%;
+ max-width: 340px;
+ overflow: hidden;
+}
+.app-chrome .app-chrome-item > .app-playback-controls > div > .song-artist-album .song-artist-album-content {
+ font-weight: 400;
+ font-size: 12px;
+ text-align: center;
+ width: 100%;
+}
+.app-chrome .app-chrome-item > .app-playback-controls > div > .song-artist-album .song-artist-album-content.song-artist-normal {
+ height: inherit;
+}
+.app-chrome .app-chrome-item > .app-playback-controls > div > .song-artist-album.song-artist-marquee > marquee {
+ margin-bottom: -3px;
+}
+.display--small {
+ display: none !important;
+}
+.web-slider.display--small {
+ margin: 10px;
+}
+input[type="range"].web-slider.display--small::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ height: 14px;
+ width: 14px;
+ border-radius: 50%;
+ background: #323232;
+ cursor: default;
+ box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
+}
+/* Window is smaller <= 1023px width */
+@media only screen and (max-width: 1120px) {
+ .display--small {
+ display: inherit !important;
+ }
+ .display--small .slider {
+ width: 100%;
+ z-index: 1;
+ }
+ .display--small .input-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ padding-bottom: 10px;
+ }
+ .display--small input[type=range] {
+ -webkit-appearance: none;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.4);
+ border-radius: 5px;
+ background-size: 70% 100%;
+ background-repeat: no-repeat;
+ }
+ .display--small input[type=range]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ height: 14px;
+ width: 14px;
+ border-radius: 50%;
+ background: #323232;
+ cursor: default;
+ box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
+ transition: all var(--appleTransition);
+ }
+ .display--small input[type=range]::-webkit-slider-thumb:hover {
+ background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
+ transform: scale(1.2);
+ }
+ .display--small input[type=range]::-webkit-slider-thumb:active {
+ background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
+ transform: scale(1);
+ }
+ .display--small input[type=range]::-webkit-slider-runnable-track {
+ -webkit-appearance: none;
+ box-shadow: none;
+ border: none;
+ background: transparent;
+ }
+ .display--large {
+ display: none !important;
+ }
+}
+.flex-center {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+}
+.md-container {
+ width: 100%;
+ position: relative;
+}
+.lyric-body {
+ -webkit-mask-image: -webkit-gradient(linear, left 95%, left bottom, from(#000000), to(rgba(0, 0, 0, 0)));
+ overflow-y: scroll;
+ overflow-x: hidden;
+ display: flex;
+ flex-flow: column;
+ font-family: 'Inter', 'Noto Sans JP', 'Source Han Sans SC', 'Source Han Sans HK', 'Noto Sans SC', 'Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', sans-serif;
+}
+.lyric-body .no-lyrics {
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+ font-weight: bold;
+ font-size: 26px;
+}
+.lyric-line {
+ --bgSpeed: 1s;
+ appearance: none;
+ color: white;
+ font-size: 26px;
+ transform: scale(0.8);
+ transform-origin: left center;
+ transition: transform 0.2s var(--appleEase);
+ opacity: 0.75;
+ width: auto;
+ display: inline-block;
+ margin: 10px;
+ margin-left: 5%;
+ margin-right: 0px;
+}
+.lyric-line.active .verse {
+ opacity: 0.6;
+}
+.lyric-line.active .verse.verse-active {
+ opacity: 1;
+}
+.lyric-line:hover {
+ cursor: pointer;
+}
+.lyric-line:hover::after {
+ content: ' ';
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ transform: scale(1.06);
+ background: rgba(200, 200, 200, 0.1);
+ pointer-events: none;
+ border-radius: 10px;
+ -webkit-backface-visibility: hidden;
+}
+.lyric-line.active {
+ --bgSpeed: 1s;
+ opacity: 1;
+ transform: scale(1);
+ /*background: var(--keyColor);*/
+ transition: transform 0.2s var(--appleEase);
+}
+.lyric-line:not(.active) {
+ filter: blur(1px);
+}
+.lyric-line:not(.active).unsynced {
+ filter: none !important;
+}
+.lyric-line.unsynced {
+ filter: none !important;
+}
+.lyricWaiting {
+ margin-top: 8px;
+ display: none;
+}
+.lyric-line.active .lyricWaiting {
+ display: inline-flex;
+ animation: lyricWaitingLine 6s cubic-bezier(0.42, 0, 0.58, 1) infinite;
+}
+.lyric-line.active .lyricWaiting > div {
+ width: 10px;
+ height: 10px;
+ background: white;
+ border-radius: 50%;
+ margin: 3px;
+}
+.lyrics-translation {
+ font-size: 1.6rem;
+ font-weight: 450;
+ font-family: 'Inter', 'Noto Sans JP', 'Noto Sans SC', 'Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', sans-serif;
+ filter: contrast(0.5);
+}
+.lyric-footer {
+ bottom: 0;
+ height: 50px;
+ width: 100%;
+ position: absolute;
+ z-index: 1000;
+ opacity: 1;
+ background: rgba(30, 30, 30, 0.8);
+ justify-content: center;
+ align-items: center;
+ display: none;
+ transition: opacity 0.1s var(--appleEase);
+}
+.lyric-body:hover + .lyric-footer,
+.lyric-footer:hover {
+ display: flex;
+}
+.modular-fs .app-drawer .lyric-footer {
+ background: unset;
+ display: flex;
+ opacity: 0.3;
+}
+.modular-fs .app-drawer .lyric-footer:hover {
+ opacity: 1;
+}
+.modular-fs .app-drawer .lyric-body .no-lyrics {
+ height: 100%;
+ display: flex;
+}
+@keyframes lyricWaitingLine {
+ 0% {
+ opacity: 0.25;
+ transform: scale(0.85);
+ }
+ 50% {
+ opacity: 1;
+ transform: scale(1);
+ }
+ 100% {
+ opacity: 0.25;
+ transform: scale(0.85);
+ }
+}
+@keyframes dotOpacity {
+ 0% {
+ opacity: 0.25;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+.lyric-line2:before {
+ background: var(--keyColor);
+ content: '';
+ width: 0%;
+ height: 6px;
+ position: absolute;
+ bottom: -8px;
+ left: 0;
+ border-radius: 10px;
+ z-index: -1;
+ transition: width var(--bgSpeed);
+}
+.lyric-line2.active:before {
+ width: 100%;
+ transition: width var(--bgSpeed);
+}
+.player_top {
+ height: 100%;
+}
+/* Cider */
+.more-btn-round {
+ border-radius: 100%;
+ background: rgba(100, 100, 100, 0.5);
+ box-shadow: var(--ciderShadow-Generic);
+ width: 32px;
+ height: 32px;
+ border: 0px;
+ cursor: pointer;
+ z-index: 5;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.more-btn-round:hover {
+ filter: brightness(125%);
+}
+.more-btn-round:active {
+ filter: brightness(75%);
+ transform: scale(0.98);
+ transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
+}
+.more-btn-round .svg-icon {
+ width: 100%;
+ background: #eee;
+ --url: url("views/svg/more.svg");
+}
+.about-page .teamBtn {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ font-size: 14px;
+ padding: 6px 16px;
+ margin: 4px;
+}
+.about-page .teamBtn > img {
+ width: 30px;
+ margin: 0px 16px 0px 0px;
+ pointer-events: none;
+ border-radius: 100%;
+ box-shadow: var(--mediaItemShadow);
+ image-rendering: -webkit-optimize-contrast;
+}
+.about-page .sponsorBtn {
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+}
+.about-page .sponsorBtn > img {
+ width: 26px;
+ margin: 0px 16px 0px 0px;
+ pointer-events: none;
+}
+.sidebar-playlist .folder-button-active {
+ background: rgba(255, 255, 255, 0.12);
+}
+.sidebar-playlist .folder-body {
+ background: #ffffff0a;
+ border-radius: 10px;
+ padding: 1px 6px;
+}
+.sidebar-playlist .folder-body .spinner {
+ display: block;
+ width: 100%;
+ height: 32px;
+ background-size: 16px;
+}
+#navigation-bar {
+ width: 100%;
+ background: rgba(0, 0, 0, 0.25);
+ height: var(--navigationBarHeight);
+ display: flex;
+ align-items: center;
+ padding: 0px 6px;
+ z-index: 7;
+ position: sticky;
+ top: 0;
+ left: 0;
+ backdrop-filter: blur(32px);
+ mix-blend-mode: hard-light;
+}
+#navigation-bar .nav-item {
+ appearance: none;
+ border: 0px;
+ height: 32px;
+ width: 40px;
+ background: transparent;
+ padding: 6px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ color: rgba(200, 200, 200, 0.8);
+ margin: 2px;
+ border-radius: 6px;
+ transition: transform 0.1s var(--appleEase);
+}
+#navigation-bar .nav-item:active {
+ background: var(--selected-click);
+ transform: scale(0.96);
+ transition: transform 0s var(--appleEase);
+}
+#navigation-bar .nav-item > svg {
+ width: 8px;
+ pointer-events: none;
+}
+#navigation-bar .nav-item:hover {
+ background: var(--selected);
+}
+#navigation-bar .nav-item:hover > svg {
+ color: #c8c8c8;
+}
+.well {
+ background: rgba(200, 200, 200, 0.05);
+ border-radius: 10px;
+ padding: var(--contentInnerPadding);
+ box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;
+ margin-top: 16px;
+}
+.well.itemContainer {
+ display: flex;
+ flex-flow: wrap;
+ justify-content: center;
+}
+.well.itemContainer .cd-mediaitem-square {
+ width: 220px;
+ height: 260px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 6px;
+ max-width: 240px;
+ flex-grow: 1;
+}
+.text-overflow-elipsis {
+ display: -webkit-box;
+ min-width: 0px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+}
+.no-animation {
+ animation: unset !important;
+}
+.fullscreen-view-container {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: black;
+ z-index: 99;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ opacity: 1;
+}
+.fullscreen-view {
+ width: 100%;
+ height: 100%;
+ background: black;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.fullscreen-view .fs-row {
+ flex-grow: 1;
+}
+.fullscreen-view .playback-button--small.active {
+ background-color: rgba(200, 200, 200, 0.25);
+}
+.fullscreen-view .playback-button--small {
+ opacity: 0.7;
+}
+.fullscreen-view .right-col {
+ height: 50vh;
+}
+.fullscreen-view .bg-artwork-container {
+ display: block !important;
+}
+@media only screen and (max-width: 1121px) {
+ .fullscreen-view .display--large {
+ display: flex !important;
+ }
+}
+.fullscreen-view .display--large {
+ display: flex;
+}
+.fullscreen-view .display--large .slider {
+ width: 100%;
+ z-index: 1;
+}
+.fullscreen-view .display--large .input-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+}
+.fullscreen-view .display--large .volume-button--small {
+ border-radius: 6px;
+ color: inherit;
+ background-size: 16px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-color: transparent;
+ height: 15px;
+ width: 30px;
+ border: 0px;
+ box-shadow: unset;
+ opacity: 0.7;
+ background-image: url("assets/feather/volume-2.svg");
+}
+.fullscreen-view .display--large .volume-button--small:active {
+ transform: scale(0.9);
+}
+.fullscreen-view .display--large .volume-button--small.active {
+ background-image: url("assets/feather/volume.svg");
+}
+.fullscreen-view .display--large input[type=range] {
+ -webkit-appearance: none;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.4);
+ border-radius: 5px;
+ background-size: 70% 100%;
+ background-repeat: no-repeat;
+}
+.fullscreen-view .display--large input[type=range]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ height: 14px;
+ width: 14px;
+ border-radius: 50%;
+ background: #323232;
+ cursor: default;
+ box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
+ transition: all var(--appleTransition);
+}
+.fullscreen-view .display--large input[type=range]::-webkit-slider-thumb:hover {
+ background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
+ transform: scale(1.2);
+}
+.fullscreen-view .display--large input[type=range]::-webkit-slider-thumb:active {
+ background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
+ transform: scale(1);
+}
+.fullscreen-view .display--large input[type=range]::-webkit-slider-runnable-track {
+ -webkit-appearance: none;
+ box-shadow: none;
+ border: none;
+ background: transparent;
+}
+.fullscreen-view .background {
+ position: absolute;
+ background-size: cover;
+ width: 100%;
+ height: 100%;
+}
+.fullscreen-view .background .bgArtworkMaterial {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+.fullscreen-view .background .bgArtworkMaterial .bg-artwork-container {
+ z-index: unset;
+}
+.fullscreen-view .background .bgArtworkMaterial .bg-artwork-container .bg-artwork {
+ filter: brightness(85%) saturate(95%) blur(180px) contrast(0.9) opacity(0.9);
+}
+.fullscreen-view .lyrics-col {
+ height: 62vh;
+ display: flex;
+ justify-content: center;
+ align-content: center;
+ width: 80%;
+}
+.fullscreen-view .lyrics-col ::-webkit-scrollbar-thumb {
+ box-shadow: unset;
+}
+.fullscreen-view .lyrics-col:hover ::-webkit-scrollbar-thumb {
+ box-shadow: inset 0px 0px 10px 10px rgba(200, 200, 200, 0.5);
+}
+.fullscreen-view .lyrics-col .no-lyrics {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+}
+.fullscreen-view .lyrics-col .lyric-line {
+ font-size: 35px;
+}
+.fullscreen-view .queue-col {
+ width: 60vh;
+ height: 62vh;
+}
+.fullscreen-view .queue-col .queue-title {
+ opacity: 0.6;
+}
+.fullscreen-view .queue-col .queue-panel > * {
+ z-index: 3;
+}
+.fullscreen-view .queue-col ::-webkit-scrollbar-thumb {
+ box-shadow: unset;
+}
+.fullscreen-view .queue-col:hover ::-webkit-scrollbar-thumb {
+ box-shadow: inset 0px 0px 10px 10px rgba(200, 200, 200, 0.5);
+}
+.fullscreen-view .tab-toggles {
+ display: flex;
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ width: 15vh;
+ height: 5vh;
+ justify-content: space-evenly;
+}
+.fullscreen-view .tab-toggles .volume {
+ background-image: url("assets/feathers/volume.svg");
+ padding: 0.5vh;
+ width: 2vh;
+ height: 2vh;
+ background-origin: content-box;
+ background-repeat: no-repeat;
+}
+.fullscreen-view .tab-toggles .queue {
+ background-image: url("assets/list.svg");
+ padding: 0.5vh;
+ width: 2.5vh;
+ height: 2.5vh;
+ background-origin: content-box;
+ background-repeat: no-repeat;
+}
+.fullscreen-view .tab-toggles .lyrics {
+ background-image: url("assets/quote-right.svg");
+ padding: 0.5vh;
+ width: 2.5vh;
+ height: 2.5vh;
+ background-origin: content-box;
+ background-repeat: no-repeat;
+}
+.fullscreen-view .tab-toggles .active {
+ background-color: rgba(200, 200, 200, 0.7);
+ border-radius: 3px;
+}
+.fullscreen-view .artwork-col {
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+}
+.fullscreen-view .artwork-col .artwork {
+ width: 50vh;
+ height: 50vh;
+}
+.fullscreen-view .artwork-col .controls-parents {
+ width: 50vh;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-artist,
+.fullscreen-view .artwork-col .app-playback-controls .song-name {
+ font-weight: 600;
+ text-align: center;
+ font-size: 0.9em;
+ height: 1.2em;
+ line-height: 0.9em;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 360px;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-artist .song-name-normal,
+.fullscreen-view .artwork-col .app-playback-controls .song-name .song-name-normal {
+ height: inherit;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-artist {
+ font-size: 0.875em;
+ font-weight: 400;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-name {
+ width: unset !important;
+ margin-top: 0.15vh;
+ display: -webkit-box;
+ line-height: 1.2;
+ text-overflow: ellipsis;
+ text-align: center;
+}
+.fullscreen-view .artwork-col .app-playback-controls .playback-info {
+ margin-top: 0.5vh;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ position: relative;
+}
+.fullscreen-view .artwork-col .app-playback-controls .playback-info input[type="range"] {
+ width: 100%;
+}
+.fullscreen-view .artwork-col .app-playback-controls .playback-info > div {
+ width: 100%;
+ text-align: center;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-progress {
+ position: absolute;
+ bottom: -1.5vh;
+ left: 0px;
+ background: transparent;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-progress .song-duration p {
+ font-weight: 400;
+ font-size: 10px;
+ height: 1.2em;
+ line-height: 1.3em;
+ overflow: hidden;
+ margin: 0 0 0 0.25em;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-progress:hover > input[type=range]::-webkit-slider-thumb {
+ opacity: 1;
+ transform: scale(1);
+ z-index: 1;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-progress input[type=range] {
+ appearance: none;
+ width: 100%;
+ height: 4px;
+ background-color: rgba(200, 200, 200, 0.1);
+ border-radius: 2px;
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-progress input[type=range]::-webkit-slider-thumb {
+ opacity: 0;
+ transform: scale(0.5);
+ -webkit-appearance: none;
+ appearance: none;
+ width: 12px;
+ height: 12px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+ transition: opacity 0.1s var(--appleEase), transform 0.1s var(--appleEase);
+}
+.fullscreen-view .artwork-col .app-playback-controls .song-progress input[type=range]::-moz-range-thumb {
+ width: 8px;
+ height: 8px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+}
+.fullscreen-view .artwork-col .control-buttons {
+ margin-top: 2vh;
+ display: inline-flex;
+ width: 100%;
+ justify-content: center;
+}
+.mini-view {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.mini-view .fs-row {
+ flex-grow: 1;
+}
+.mini-view .playback-button--small.active {
+ background-color: rgba(200, 200, 200, 0.25);
+}
+.mini-view .player-exit {
+ z-index: 3;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ -webkit-app-region: no-drag;
+}
+.mini-view .player-pin {
+ z-index: 3;
+ position: absolute;
+ min-width: 20px;
+ min-height: 20px;
+ top: 5px;
+ right: 30px;
+ -webkit-app-region: no-drag;
+}
+.mini-view #mini-pin {
+ display: none;
+}
+.mini-view .player-pin:hover #mini-pin {
+ display: block;
+}
+.mini-view .playback-button--small {
+ opacity: 0.7;
+}
+.mini-view .right-col {
+ height: 50vh;
+}
+@media only screen and (max-width: 1121px) {
+ .mini-view .display--large {
+ display: flex !important;
+ }
+}
+.mini-view .display--large {
+ display: flex;
+}
+.mini-view .display--large .slider {
+ width: 100%;
+ z-index: 1;
+}
+.mini-view .display--large .input-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+}
+.mini-view .display--large .volume-button--small {
+ border-radius: 6px;
+ color: inherit;
+ background-size: 16px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-color: transparent;
+ height: 15px;
+ width: 30px;
+ border: 0px;
+ box-shadow: unset;
+ opacity: 0.7;
+ background-image: url("assets/feather/volume-2.svg");
+}
+.mini-view .display--large .volume-button--small:active {
+ transform: scale(0.9);
+}
+.mini-view .display--large .volume-button--small.active {
+ background-image: url("assets/feather/volume.svg");
+}
+.mini-view .display--large input[type=range] {
+ -webkit-appearance: none;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.4);
+ border-radius: 5px;
+ background-size: 70% 100%;
+ background-repeat: no-repeat;
+}
+.mini-view .display--large input[type=range]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ height: 14px;
+ width: 14px;
+ border-radius: 50%;
+ background: #323232;
+ cursor: default;
+ box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
+ transition: all var(--appleTransition);
+}
+.mini-view .display--large input[type=range]::-webkit-slider-thumb:hover {
+ background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
+ transform: scale(1.2);
+}
+.mini-view .display--large input[type=range]::-webkit-slider-thumb:active {
+ background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
+ transform: scale(1);
+}
+.mini-view .display--large input[type=range]::-webkit-slider-runnable-track {
+ -webkit-appearance: none;
+ box-shadow: none;
+ border: none;
+ background: transparent;
+}
+.mini-view .background {
+ position: absolute;
+ background-size: cover;
+ width: 100%;
+ height: 100%;
+ -webkit-user-select: none;
+ -webkit-app-region: drag;
+}
+.mini-view .background .bgArtworkMaterial {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+.mini-view .background .bgArtworkMaterial .bg-artwork-container {
+ z-index: unset;
+}
+.mini-view .background .bgArtworkMaterial .bg-artwork-container .bg-artwork {
+ filter: brightness(85%) saturate(95%) blur(180px) contrast(0.9) opacity(0.9);
+}
+.mini-view .background .bgArtworkMaterial .no-animation {
+ animation: unset;
+}
+.mini-view .lyrics-col {
+ height: 62vh;
+ display: flex;
+ justify-content: center;
+ align-content: center;
+ width: 80%;
+}
+.mini-view .lyrics-col ::-webkit-scrollbar-thumb {
+ box-shadow: unset;
+}
+.mini-view .lyrics-col:hover ::-webkit-scrollbar-thumb {
+ box-shadow: inset 0px 0px 10px 10px rgba(200, 200, 200, 0.5);
+}
+.mini-view .lyrics-col .no-lyrics {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+}
+.mini-view .lyrics-col .lyric-line {
+ font-size: 35px;
+}
+.mini-view .queue-col {
+ width: 60vh;
+ height: 50vh;
+}
+.mini-view .queue-col .queue-title {
+ opacity: 0.6;
+}
+.mini-view .queue-col .queue-panel > * {
+ z-index: 3;
+}
+.mini-view .queue-col ::-webkit-scrollbar-thumb {
+ box-shadow: unset;
+}
+.mini-view .queue-col:hover ::-webkit-scrollbar-thumb {
+ box-shadow: inset 0px 0px 10px 10px rgba(200, 200, 200, 0.5);
+}
+.mini-view .tab-toggles {
+ display: flex;
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ width: 15vh;
+ height: 5vh;
+ justify-content: space-evenly;
+}
+.mini-view .tab-toggles .volume {
+ background-image: url("assets/feathers/volume.svg");
+ padding: 0.5vh;
+ width: 2vh;
+ height: 2vh;
+ background-origin: content-box;
+ background-repeat: no-repeat;
+}
+.mini-view .tab-toggles .queue {
+ background-image: url("assets/list.svg");
+ padding: 0.5vh;
+ width: 2.5vh;
+ height: 2.5vh;
+ background-origin: content-box;
+ background-repeat: no-repeat;
+}
+.mini-view .tab-toggles .lyrics {
+ background-image: url("assets/quote-right.svg");
+ padding: 0.5vh;
+ width: 2.5vh;
+ height: 2.5vh;
+ background-origin: content-box;
+ background-repeat: no-repeat;
+}
+.mini-view .tab-toggles .active {
+ background-color: rgba(200, 200, 200, 0.7);
+ border-radius: 3px;
+}
+.mini-view .artwork-col {
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+}
+.mini-view .artwork-col .artwork {
+ width: 100%;
+ height: 100%;
+}
+.mini-view .artwork-col .artwork .mediaitem-artwork {
+ border-radius: unset;
+}
+.mini-view .artwork-col .controls-parents {
+ width: 100%;
+ position: absolute;
+ background: #0000009e;
+ backdrop-filter: blur(10px);
+ bottom: 0px;
+ z-index: 3;
+ opacity: 0;
+ padding: 3%;
+}
+.mini-view .artwork-col .controls-parents:hover {
+ opacity: 1;
+}
+.mini-view .artwork-col .app-playback-controls {
+ -webkit-app-region: no-drag;
+}
+.mini-view .artwork-col .app-playback-controls .song-artist,
+.mini-view .artwork-col .app-playback-controls .song-name {
+ font-weight: 600;
+ text-align: center;
+ font-size: 0.9em;
+ height: 1.2em;
+ line-height: 0.9em;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 360px;
+}
+.mini-view .artwork-col .app-playback-controls .song-artist .song-name-normal,
+.mini-view .artwork-col .app-playback-controls .song-name .song-name-normal {
+ height: inherit;
+}
+.mini-view .artwork-col .app-playback-controls .song-artist {
+ font-size: 0.875em;
+ font-weight: 400;
+}
+.mini-view .artwork-col .app-playback-controls .song-name {
+ width: unset !important;
+ margin-top: 0.15vh;
+ display: -webkit-box;
+ line-height: 1.2;
+ text-overflow: ellipsis;
+ text-align: center;
+}
+.mini-view .artwork-col .app-playback-controls .playback-info {
+ margin-top: 0.5vh;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ position: relative;
+}
+.mini-view .artwork-col .app-playback-controls .playback-info input[type="range"] {
+ width: 100%;
+}
+.mini-view .artwork-col .app-playback-controls .playback-info > div {
+ width: 100%;
+ text-align: center;
+}
+.mini-view .artwork-col .app-playback-controls .song-progress {
+ position: absolute;
+ bottom: -3.5vh;
+ left: 0px;
+ background: transparent;
+}
+.mini-view .artwork-col .app-playback-controls .song-progress .song-duration p {
+ font-weight: 400;
+ font-size: 10px;
+ height: 1.2em;
+ line-height: 1.3em;
+ overflow: hidden;
+ margin: 0 0 0 0.25em;
+}
+.mini-view .artwork-col .app-playback-controls .song-progress:hover > input[type=range]::-webkit-slider-thumb {
+ opacity: 1;
+ transform: scale(1);
+ z-index: 1;
+}
+.mini-view .artwork-col .app-playback-controls .song-progress input[type=range] {
+ appearance: none;
+ width: 100%;
+ height: 4px;
+ background-color: rgba(200, 200, 200, 0.1);
+ border-radius: 2px;
+}
+.mini-view .artwork-col .app-playback-controls .song-progress input[type=range]::-webkit-slider-thumb {
+ opacity: 0;
+ transform: scale(0.5);
+ -webkit-appearance: none;
+ appearance: none;
+ width: 12px;
+ height: 12px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+ transition: opacity 0.1s var(--appleEase), transform 0.1s var(--appleEase);
+}
+.mini-view .artwork-col .app-playback-controls .song-progress input[type=range]::-moz-range-thumb {
+ width: 8px;
+ height: 8px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+}
+.mini-view .artwork-col .control-buttons {
+ margin-top: 3.5vh;
+ display: inline-flex;
+ width: 100%;
+ justify-content: center;
+}
+@keyframes rotate {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+.modular-fs .app-drawer {
+ width: 100%;
+ right: 0px;
+ top: 0px;
+ height: 100%;
+ border-radius: 0px;
+ box-shadow: unset;
+ background: black;
+}
+.modular-fs .app-drawer .bgArtworkMaterial {
+ display: block;
+}
+.modular-fs .app-drawer .bgArtworkMaterial::before {
+ top: -50%;
+ left: -20%;
+ width: 200VH;
+ height: 200VH;
+}
+.modular-fs .app-drawer .bgArtworkMaterial .bg-artwork-container {
+ display: block !important;
+}
+.modular-fs .app-drawer .lyric-body {
+ justify-content: center;
+ align-items: center;
+ padding: 0px;
+ margin: 0px;
+ overflow: hidden;
+ filter: drop-shadow(0px 4px 6px rgba(0, 0, 0, 0.7));
+}
+.modular-fs .app-drawer .lyric-body .lyric-line {
+ pointer-events: none;
+ font-weight: 600;
+ font-size: 2em;
+ transform-origin: center;
+ animation: fsLyricIn var(--appleEase) 0.2s;
+ opacity: 0.9;
+}
+.modular-fs .app-drawer .lyric-body .lyric-line:not(.active) {
+ display: none;
+ margin: 0;
+ transform: scale(1);
+}
+.modular-fs .app-drawer .lyric-body .lyric-line.active {
+ margin: 0;
+ transform: scale(1);
+}
+@keyframes fsLyricIn {
+ 0% {
+ opacity: 0;
+ transform: scale(0.98);
+ }
+ 100% {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+/* Transitions */
+.replaycard-enter-active,
+.replaycard-leave-active {
+ transition: opacity 0.5s var(--appleEase), transform 0.5s var(--appleEase);
+}
+.replaycard-enter,
+.replaycard-leave-to {
+ opacity: 0;
+ transform: translateY(20px);
+}
+.modal-enter-active,
+.modal-leave-active {
+ transition: opacity 0.1s var(--appleEase), transform 0.1s var(--appleEase);
+}
+.modal-enter,
+.modal-leave-to {
+ opacity: 0;
+ transform: scale(1.1);
+}
+.wpfade-enter-active,
+.wpfade-leave-active {
+ transition: opacity 0.1s var(--appleEase);
+}
+.wpfade-enter,
+.wpfade-leave-to {
+ opacity: 0;
+}
+.wpfade_transform-enter-active,
+.wpfade_transform-leave-active {
+ --transitionTime: 0.2s;
+ transition: opacity var(--transitionTime) var(--appleEase), transform var(--transitionTime) var(--appleEase);
+ will-change: opacity, transform;
+}
+.wpfade_transform-enter {
+ opacity: 0;
+ transform: translateX(50%) translate3d(0, 0, 0);
+ will-change: opacity, transform;
+}
+.wpfade_transform-leave-to {
+ opacity: 0;
+ transform: translateX(-50%) translate3d(0, 0, 0);
+ will-change: opacity, transform;
+}
+.wpfade_transform_backwards-enter-active,
+.wpfade_transform_backwards-leave-active {
+ --transitionTime: 0.2s;
+ transition: opacity var(--transitionTime) var(--appleEase), transform var(--transitionTime) var(--appleEase);
+}
+.wpfade_transform_backwards-enter {
+ opacity: 0;
+ transform: translateX(-50%) translate3d(0, 0, 0);
+ will-change: opacity, transform;
+}
+.wpfade_transform_backwards-leave-to {
+ opacity: 0;
+ transform: translateX(50%) translate3d(0, 0, 0);
+ will-change: opacity, transform;
+}
+.fabfade-enter-active,
+.fabfade-leave-active {
+ transition: transform 0.1s var(--appleEase), opacity 0.1s var(--appleEase);
+}
+.fabfade-enter,
+.fabfade-leave-to {
+ opacity: 0;
+ transform: scale(0.5);
+}
+.fsModeSwitch-enter-active,
+.fsModeSwitch-leave-active {
+ transition: transform 1s var(--appleEase), opacity 1s var(--appleEase);
+}
+.fsModeSwitch-enter,
+.fsModeSwitch-leave-to {
+ transform: scale(1.1);
+ opacity: 0;
+}
+.drawertransition-enter-active,
+.drawertransition-leave-active {
+ transition: right 0.25s var(--appleEase);
+}
+.drawertransition-enter,
+.drawertransition-leave-to {
+ right: -300px;
+}
+:root {
+ --gfx-closeBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjM2LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MzYtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PmN2D9EAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEtJREFUGJWNkMENwDAIA1FGY/8hkn8HOAqPfBsFKvz1yZYtbqwAlUIB6saUAH2NJ4MvL4PLgK/x13LAGTSqEaVa1a0x7XvcmI3D1wbntaRbB2haYwAAAABJRU5ErkJggg==');
+ --gfx-maxBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6NTgtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjU4LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6NTgtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PlwQMBUAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAFBJREFUGJXV0LERgCAUBNHVsQADM3uwWWbojQIs47MEGhgAuS/eSw41qeFYqGlRA7iAm74DKLyrfRABoLrOgq+/hJXngi71BOoGZKBMHqhAbtMvQzel9pREAAAAAElFTkSuQmCC');
+ --gfx-restoreBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6Mjc6MjQtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI3OjI0LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6Mjc6MjQtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PqiFCFwAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHNJREFUGJWtkKEOwlAMRc+QM5AwQYJFoPjZCWb2YRPIaeRTLwfTLQs0UxzX3tumtxCog78UdVTbZmM8AmsdXIABeKH2ak221dDuamnUCjyA+WtbB0zAGXgT0ycSFk31kBky/moUeBLpbsl91wi6Nnbfs/g+7XOQq6ifjfkAAAAASUVORK5CYII=');
+ --gfx-minBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGOmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wMi0xN1QxMzowMDozMloiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NWQwZWRiMC1mZDAwLWI2NGYtOWVmYi1hMmI0NTg3MDVhOGEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDphMzAwMWUxYS0yOTE5LWU0NDktYjk0Yy1jMjEyMjQ4YTlmOGEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHN0RXZ0OndoZW49IjIwMjAtMDItMTdUMTM6MDA6MzJaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1ZDBlZGIwLWZkMDAtYjY0Zi05ZWZiLWEyYjQ1ODcwNWE4YSIgc3RFdnQ6d2hlbj0iMjAyMC0wMi0xN1QxMzowMDozMloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cmRmOkJhZz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLupKEiIHBob3Rvc2hvcDpMYXllclRleHQ9Iu6koSIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FwvRXAAAABdJREFUGNNj/P//PwMxgHGIKPw/XDwDAOr1HuzlELLnAAAAAElFTkSuQmCC');
+}
+#apple-music-video-container {
+ background: black;
+ position: absolute;
+ float: left;
+ display: none;
+ width: 100%;
+ height: calc(100% - var(--chromeHeight));
+ bottom: 0;
+ z-index: 100000;
+}
+#apple-music-video-player {
+ position: absolute;
+ top: 50%;
+ width: 100%;
+ transform: translate(0, -50%);
+ height: 100%;
+}
+#app.twopanel #apple-music-video-container {
+ top: var(--chromeHeight1);
+ bottom: unset;
+}
+#apple-music-video-player-controls {
+ position: absolute;
+ z-index: 100001;
+ float: left;
+ width: 100%;
+ height: 100%;
+}
+#apple-music-video-player-controls #player-exit {
+ position: absolute;
+ z-index: 100001;
+ float: left;
+ width: 100%;
+ margin: 10px;
+ cursor: pointer;
+}
+#apple-music-video-player-controls #player-pip {
+ position: absolute;
+ z-index: 100001;
+ width: 32px;
+ height: 32px;
+ margin: 10px;
+ right: 50px;
+ border-radius: 100%;
+ background: rgba(255, 255, 255, 0.5);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+}
+#apple-music-video-player-controls #player-pip > svg {
+ width: 50%;
+}
+#apple-music-video-player-controls #player-fullscreen {
+ position: absolute;
+ z-index: 100001;
+ width: 32px;
+ height: 32px;
+ margin: 10px;
+ right: 0px;
+ border-radius: 100%;
+ background: rgba(255, 255, 255, 0.5);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+}
+#apple-music-video-player-controls #player-fullscreen > svg {
+ width: 70%;
+}
+#apple-music-video-player-controls:hover {
+ opacity: 1;
+}
+img[src=""] {
+ text-indent: -10000px;
+}
+div#captions {
+ font-size: 1.2rem;
+ position: absolute;
+ top: 85%;
+ text-align: center;
+ width: auto;
+ align-self: center;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ background: rgba(0, 0, 0, 0.6);
+ color: yellow;
+ white-space: pre-line;
+ font-family: 'Inter', 'Noto Sans JP', 'Source Han Sans SC', 'Source Han Sans HK', 'Source Han Sans SC', 'Source Han Sans HK', 'Noto Sans SC', 'Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', sans-serif;
+}
+[v-cloak] {
+ display: none !important;
+}
+.item-navigate:hover {
+ text-decoration: underline;
+ cursor: pointer;
+}
+.title-browse-sp {
+ width: 100%;
+ text-align: left;
+ margin-bottom: 2px;
+}
+.bold {
+ font-weight: bold;
+}
+.semibold {
+ font-weight: 500;
+}
+.madeforyou-body {
+ margin-top: 15px;
+}
+.albums-square-container {
+ text-align: center;
+}
+body.no-gpu {
+ --ciderShadow-Generic: var(--mediaItemShadow);
+ --mediaItemShadow-Shadow: var(--mediaItemShadow);
+ --mediaItemShadow-ShadowSubtle: var(--mediaItemShadow);
+}
+body.no-gpu .bg-artwork-container {
+ display: none;
+ animation: none !important;
+}
+body.no-gpu .bg-artwork-container .bg-artwork {
+ animation: none !important;
+}
+body.no-gpu #navigation-bar {
+ backdrop-filter: unset;
+ mix-blend-mode: unset;
+ background: #000000;
+}
+body.no-gpu .addtoplaylist-panel .modal-window {
+ background: #121212;
+ backdrop-filter: unset;
+}
+body.no-gpu .app-drawer {
+ backdrop-filter: unset;
+ mix-blend-mode: unset;
+ background: #1c1c1c;
+}
+body.no-gpu .wpfade-enter-active,
+body.no-gpu .wpfade-leave-active {
+ transition: opacity 0s var(--appleEase);
+}
+body.no-gpu .wpfade-enter,
+body.no-gpu .wpfade-leave-to {
+ opacity: 0;
+}
+body.no-gpu .drawertransition-enter-active,
+body.no-gpu .drawertransition-leave-active {
+ transition: right 0s var(--appleEase);
+}
+body.no-gpu .drawertransition-enter,
+body.no-gpu .drawertransition-leave-to {
+ right: -300px;
+}
+body.no-gpu .lyric-line:hover::after {
+ display: none;
+}
+.qrimg {
+ width: -webkit-fill-available;
+ max-block-size: -webkit-fill-available;
+ object-fit: contain;
+ overflow-x: hidden;
+ overflow-y: hidden;
+}
+.equalizer-panel .modal-window {
+ height: 330px;
+ max-height: 330px;
+ width: 740px;
+ max-width: 800px;
+ overflow: hidden;
+}
+.equalizer-panel .modal-window .info-header {
+ padding-left: 12px;
+}
+.equalizer-panel .modal-window .visual-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: hidden;
+}
+.equalizer-panel .modal-window .modal-header {
+ padding: 16px;
+ position: relative;
+ overflow: hidden;
+}
+.equalizer-panel .modal-window .modal-header .modal-title {
+ text-align: center;
+}
+.equalizer-panel .modal-window .modal-header .close-btn {
+ width: 50px;
+ height: 100%;
+ background-image: var(--gfx-closeBtn);
+ background-position: center;
+ background-repeat: no-repeat;
+ -webkit-app-region: no-drag;
+ appearance: none;
+ border: 0;
+ background-color: transparent;
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+.equalizer-panel .modal-window .modal-header .close-btn:hover {
+ background-color: #c42b1c;
+}
+.equalizer-panel .modal-window .modal-content {
+ display: block;
+}
+.equalizer-panel .modal-window .modal-content .inputs-container {
+ margin-left: 8px;
+}
+.equalizer-panel .modal-window .modal-content .input-container {
+ display: inline-grid;
+ width: 54px;
+ justify-items: center;
+ font-size: 0.7em;
+}
+.equalizer-panel .modal-window .modal-content .input-container.mini {
+ display: inline-grid;
+ width: 43px;
+ justify-items: center;
+ font-size: 0.7em;
+}
+.equalizer-panel .modal-window .modal-content .freq-header {
+ margin-bottom: 2px;
+}
+.equalizer-panel .modal-window .modal-content .reset-button {
+ width: 50%;
+ margin-left: 25%;
+ text-align: center;
+}
+.equalizer-panel .modal-window .modal-content input.eq-slider {
+ -webkit-appearance: slider-vertical;
+ width: 5%;
+}
+.equalizer-panel .modal-window .modal-content input[type="number"] {
+ padding: unset;
+ width: 55px;
+}
+.equalizer-panel .modal-window .modal-content .header input.eq-slider {
+ -webkit-appearance: slider-vertical;
+ width: 5%;
+ opacity: 0;
+}
+.equalizer-panel .modal-window .modal-lowercontent {
+ padding: 16px;
+ background-color: var(--modalBackground);
+}
+body[platform='darwin'] #window-controls-container {
+ display: none;
+}
+body[platform='darwin'] .app-chrome .app-chrome-item > .app-mainmenu {
+ opacity: 0;
+ pointer-events: none;
+ -webkit-app-region: drag;
+}
+.percent {
+ display: inline-block;
+ position: relative;
+}
+.percent::after {
+ position: relative;
+ right: 2em;
+ transition: all 0.05s ease-in-out;
+}
+.percent:hover::after,
+.percent:focus-within::after {
+ right: 3.5em;
+}
+.percent::after {
+ content: '%';
+}
+.spatialproperties-panel.modal-fullscreen {
+ flex-direction: column;
+}
+.cursor {
+ background: rgba(255, 255, 255, 0.5);
+ width: 16px;
+ height: 16px;
+ position: fixed;
+ z-index: 9999999999;
+ pointer-events: none;
+ border-radius: 100%;
+ box-shadow: 0px 0px 0px 2px #c8c8c8;
+ top: 0;
+ left: 0;
+ display: none;
+}
+body[platform="darwin"] html {
+ background: transparent!important;
+}
+body[platform="darwin"].notransparency::before {
+ display: none;
+}
+body[platform="darwin"] #app.simplebg {
+ background: transparent;
+}
+body[platform="darwin"] #app::before {
+ display: none;
+}
+body[platform="linux"] #window-controls-container {
+ display: none;
+}
+#app.compact .content-inner {
+ zoom: 0.95;
+}
+#app.compact .app-sidebar-content {
+ padding: 0px;
+}
+#app.compact .app-sidebar-content .app-sidebar-header-text {
+ padding: 6px 10px;
+ margin: 0px;
+}
+#app.compact .app-sidebar-content .app-sidebar-item {
+ display: flex;
+ width: 100%;
+ padding: 8px 12px;
+ font-size: 13px;
+ margin: 0px;
+ border: 1px solid transparent;
+ border-radius: 0px;
+ transition: unset;
+ transform: unset;
+}
+#app.compact .app-sidebar-content .app-sidebar-item:active {
+ background: var(--selected-click);
+}
+#app.compact .app-sidebar-content .app-sidebar-item::after {
+ display: none;
+}
+#app.compact .app-sidebar-content .app-sidebar-item.active {
+ background: var(--keyColor-disabled);
+}
+#app.compact .app-sidebar-content .sidebar-icon {
+ width: 14px;
+ height: 16px;
+ margin-right: 8px;
+}
+#app.compact .app-sidebar-content .folder-body {
+ border-radius: 0px;
+ padding: 0px;
+}
+@media (max-width: 951px) {
+ #app.compact #app-content {
+ zoom: 0.8;
+ }
+}
+@media (max-width: 951px) {
+ #app-content {
+ zoom: 0.8;
+ }
+}
+#app.twopanel {
+ --chromeHeight1: 42px;
+ --chromeHeight2: 76px;
+ --chromeHeight: calc(var(--chromeHeight1) + var(--chromeHeight2));
+}
+#app.twopanel .app-chrome {
+ height: var(--chromeHeight1);
+}
+#app.twopanel .app-chrome .app-mainmenu {
+ margin-left: 10px;
+ width: 88px;
+}
+#app.twopanel .app-chrome.chrome-bottom {
+ height: var(--chromeHeight2);
+ box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25);
+}
+#app.twopanel .app-sidebar-footer--controls {
+ display: none !important;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-playback-controls .actions {
+ align-self: center;
+}
+#app.twopanel .app-chrome.chrome-bottom .playback-button.play,
+#app.twopanel .app-chrome.chrome-bottom .playback-button.pause {
+ width: 42px;
+ height: 42px;
+ background-color: rgba(200, 200, 200, 0.2);
+ border-radius: 50%;
+ margin: 6px;
+ box-shadow: 0px 0px 0px 2px var(--keyColor);
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center {
+ display: flex;
+ flex-direction: column;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-controls {
+ display: flex;
+ z-index: 1;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-duration {
+ position: relative;
+ width: 80%;
+ -webkit-app-region: no-drag;
+ height: 16px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-duration .song-progress {
+ height: 16px;
+ position: absolute;
+ bottom: 4px;
+ left: 0px;
+ right: 4px;
+ background: transparent;
+ z-index: 0;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-duration .song-progress .song-duration {
+ display: flex;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-duration .song-progress .song-duration p {
+ font-weight: 400;
+ font-size: 10px;
+ height: 1.2em;
+ line-height: 1.3em;
+ overflow: hidden;
+ margin: 0 0 0 0.25em;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-duration .song-progress:hover > input[type=range]::-webkit-slider-thumb {
+ opacity: 1;
+ transform: scale(1);
+ z-index: 1;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-duration .song-progress input[type=range] {
+ appearance: none;
+ width: 100%;
+ height: 4px;
+ background-color: rgba(200, 200, 200, 0.1);
+ border-radius: 2px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--center .app-chrome-playback-duration .song-progress input[type=range]::-webkit-slider-thumb {
+ opacity: 0;
+ transform: scale(0.5);
+ -webkit-appearance: none;
+ appearance: none;
+ width: 12px;
+ height: 12px;
+ border-radius: 100%;
+ background: var(--keyColor);
+ cursor: default;
+ transition: opacity 0.1s var(--appleEase), transform 0.1s var(--appleEase);
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left {
+ width: 30%;
+ justify-content: flex-start;
+ align-items: flex-start;
+ flex: 0 0 auto;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls {
+ width: 100%;
+ height: 100%;
+ max-width: 100%;
+ border: 0px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .artwork {
+ width: var(--chromeHeight2);
+ height: var(--chromeHeight2);
+ margin: 0px 6px 0px 0px;
+ box-shadow: unset;
+ border: 0px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .artwork .mediaitem-artwork,
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .artwork img {
+ border-radius: 0px;
+ box-shadow: unset;
+ border: 0px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .playback-info {
+ align-items: flex-start;
+ margin: 6px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .playback-info .song-name {
+ text-align: left;
+ font-size: 15px;
+ font-weight: initial;
+ width: 100%;
+ -webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .playback-info .song-artist-album {
+ width: 100%;
+ -webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .playback-info .audio-type {
+ margin: 0px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--left .playback-controls .playback-info .song-artist-album-content {
+ text-align: left;
+ font-size: 12px;
+}
+#app.twopanel .app-chrome.chrome-bottom .app-chrome--right {
+ width: 30%;
+ flex: 0 0 auto;
+}
+#app.twopanel .collection-page .top-fab {
+ bottom: 96px;
+}
diff --git a/src/renderer/style.less b/src/renderer/style.less
index 8ed97e9d..f0505165 100644
--- a/src/renderer/style.less
+++ b/src/renderer/style.less
@@ -1,12 +1,17 @@
-@import url("ameframework.css");
@import url("assets/fonts/Inter/inter.css");
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap');
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap");
+@import url("less/bootstrap-vue.min.css");
+@import url("less/ameframework.less");
+@import url("less/codicon.css");
@import url("less/bootstrap.less");
@import url("less/notyf.less");
+@import url("less/elements.less");
+@import url("less/helpers.less");
+@import url("less/pages.less");
:root {
--appleEase: cubic-bezier(0.42, 0, 0.58, 1);
@@ -17,7 +22,9 @@
--mediaItemRadius: 6px;
--mediaItemRadiusRound: 100%;
--contentInnerPadding: 16px;
- --navbarHeight: 48px;
+ --navbarHeight1: 48px;
+ --navbarHeight2: 0px;
+ --navbarHeight: calc(var(--navbarHeight1) + var(--navbarHeight2));
--selected: rgb(130 130 130 / 30%);
--selected-click: rgb(80 80 80 / 30%);
--hover: rgb(200 200 200 / 10%);
@@ -32,7 +39,14 @@
--keyColor-disabled: rgba(250, 88, 106, 0.35);
--navigationBarHeight: 38px;
--modalBackground: #262626;
+ --songProgressColor: var(--keyColor);
+ --songProgressBackground: #333;
--textColor: #eee;
+ --replayGradient: linear-gradient(45deg, hsl(248deg 58% 29%), hsl(13deg 41% 42%));
+}
+
+*:focus-visible {
+ outline:2px solid var(--keyColor);
}
html,
@@ -68,8 +82,12 @@ body[loading] {
}
}
-body[platform='linux'] {
- background: #222;
+body.stopanimation * {
+ animation: unset !important;
+
+ .loadbar-sound {
+ display: none;
+ }
}
body.notransparency::before {
@@ -129,11 +147,13 @@ body.notransparency::before {
--bgColor: transparent;
--bgWidth: 0px;
--bgHeight: 0px;
- --chromeHeight: 55px;
+ --chromeHeight1: 55px;
+ --chromeHeight2: 0px;
+ --chromeHeight: calc(var(--chromeHeight1) + var(--chromeHeight2));
width: 100%;
height: 100%;
background: var(--color1);
- color: white;
+ color: var(--textColor);
user-select: none;
margin: 0 auto;
position: relative;
@@ -151,7 +171,7 @@ body.notransparency::before {
right: 0;
bottom: 0;
opacity: 0.5;
- z-index:0;
+ z-index: 0;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==);
}
@@ -159,20 +179,6 @@ body.notransparency::before {
z-index: 1;
}
}
- //&::before {
- // position: absolute;
- // top: -50%;
- // left: -50%;
- // width: var(--bgWidth);
- // height: var(--bgHeight);
- // background-image: var(--bgColor);
- // content: "";
- // z-index: -1;
- // transform: rotateZ(0deg);
- // transform-origin: center;
- // animation: bgRotate 10s linear infinite;
- // filter: brightness(100%) saturate(200%) contrast(1.5);
- //}
}
.bgGradientMaterial-base {
@@ -287,25 +293,25 @@ input[type="text"], input[type="number"] {
.artworkMaterial {
position: relative;
- height:100%;
- width:100%;
+ height: 100%;
+ width: 100%;
overflow: hidden;
pointer-events: none;
- >img {
+ > img {
position: absolute;
width: 200%;
opacity: 0.5;
filter: brightness(200%) blur(180px) saturate(280%) contrast(2);
}
- >img:first-child {
- top:0;
- left:0;
+ > img:first-child {
+ top: 0;
+ left: 0;
}
- >img:last-child {
- bottom:0;
+ > img:last-child {
+ bottom: 0;
right: 0;
transform: rotate(180deg);
}
@@ -347,11 +353,6 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
padding: 0px;
}
-.md-btn {
- font-family: inherit;
- font-size: 14px;
-}
-
#app-main {
display: flex;
width: 100%;
@@ -395,24 +396,6 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
position: relative;
}
-.content-inner {
- position: absolute;
- top: var(--navigationBarHeight);
- left: 0;
- padding: 32px;
- width: 100%;
- transition: zoom 1s;
- zoom: 1;
-}
-
-.content-inner.centered {
- height: 100%;
- display: flex;
- flex-flow: column;
- justify-content: center;
- align-items: center;
-}
-
.app-drawer {
width: 300px;
flex: 0 0 auto;
@@ -493,9 +476,11 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
}
.app-sidebar-footer {
+ border-top: 1px solid rgba(200, 200, 200, 0.15);
padding: 11px;
.app-playback-controls {
+ margin: 0 auto;
.control-buttons {
display: flex;
justify-content: center;
@@ -557,7 +542,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
font-size: 14px;
flex-direction: column;
text-align: center;
- margin-right: 35px ;
+ margin-right: 35px;
}
.app-sidebar-button > .sidebar-user-text .fullname {
@@ -573,14 +558,14 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
.app-sidebar-notification {
text-align: center;
font-size: 12px;
- min-height: 60px;
+ min-height: 36px;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid rgb(200 200 200 / 15%);
background: rgb(0 0 0 / 15%);
flex-direction: column;
- padding: 20px 0px;
+ padding: 10px 0px;
&.libraryNotification {
flex-direction: row;
@@ -655,7 +640,8 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
}
.usermenu-container {
- bottom: 66px;
+ top: 0px;
+ z-index: 200001 !important;
#cmenu.container();
.usermenu-body {
@@ -663,19 +649,19 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
.usermenu-item {
#cmenu.item();
-
+
.usermenu-item-icon {
- position:relative;
- top:1.5px;
- right:3px;
- display:table-cell;
+ position: relative;
+ top: 1.5px;
+ right: 3px;
+ display: table-cell;
}
.usermenu-item-name {
- position:relative;
- bottom:2px;
+ position: relative;
+ bottom: 2px;
padding-left: 5px;
- display:table-cell;
+ display: table-cell;
}
}
}
@@ -792,18 +778,26 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
font-weight: 400;
font-family: inherit;
font-size: 14px;
- margin: 6px 0px;
+ margin: 3px 0px;
border: 1px solid transparent;
border-radius: 6px;
background: transparent;
color: #eee;
- transition: transform .1s;
+ transition: transform 0.1s;
text-align: left;
&.app-sidebar-item-playlist {
-webkit-user-drag: element;
overflow: hidden;
text-overflow: ellipsis;
+
+ .presentNotice {
+ align-self: center;
+ margin-left: 8px;
+ text-transform: uppercase;
+ font-size: 0.7em;
+ opacity: 0.6;
+ }
}
}
@@ -841,7 +835,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
.app-chrome {
background: var(--color1);
width: 100%;
- height: var(--chromeHeight);
+ height: var(--chromeHeight1);
display: flex;
flex-direction: row;
-webkit-app-region: drag;
@@ -869,10 +863,11 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
.app-chrome .app-chrome--left {
width: 30%;
justify-content: left;
+ -webkit-app-region: drag;
}
.app-chrome .app-chrome--center {
- width: 100%;
+ width: 40%;
}
.app-chrome .app-chrome--right {
@@ -986,18 +981,31 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
height: 100%;
}
-.app-chrome .app-chrome-item > .app-title {
- width: 100px;
+.app-chrome .app-chrome-item > .app-mainmenu {
+ width: 110px;
font-size: 13px;
- background: url("./AppHeader.svg");
- background-size: 95px;
+ background: url("./assets/AppChromeBtn.svg");
+ background-size: contain;
background-repeat: no-repeat;
background-position: center;
- height: 100%;
+ height: 70%;
margin-right: 16px;
margin-left: 16px;
- image-rendering: -webkit-optimize-contrast;
- -webkit-app-region: drag;
+ margin-top: 1.5px;
+ border: 0px;
+ border-radius: 6px;
+
+ &:hover {
+ background-color: var(--selected);
+ }
+
+ &:active, &.active {
+ background-color: var(--selected-click);
+ }
+
+ &.active {
+ background-image: url("./assets/AppChromeBtn-Open.svg");
+ }
}
.app-chrome .app-chrome-item > .window-controls {
@@ -1051,6 +1059,44 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
height: 100%;
}
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize {
+ height: 12px;
+ width: 12px;
+ background-color: rgb(255, 92, 92);
+ border-radius: 50%;
+ display: inline-block;
+ margin: auto 4px;
+ color: rgb(130, 0, 5);
+ -webkit-app-region: no-drag;
+ background-image: unset;
+}
+
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls {
+ width: 67px;
+}
+
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minmax {
+ height: 12px;
+ width: 12px;
+ background-color: rgb(255, 189, 76);
+ border-radius: 50%;
+ display: inline-block;
+ margin: auto 4px;
+ -webkit-app-region: no-drag;
+ background-image: unset;
+}
+
+body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.close {
+ height: 12px;
+ width: 12px;
+ background-color: rgb(0, 202, 86);
+ border-radius: 50%;
+ display: inline-block;
+ margin: auto 4px auto 4px;
+ -webkit-app-region: no-drag;
+ background-image: unset;
+}
+
.app-chrome .app-chrome-item.playback-controls {
width: 80%;
height: 90%;
@@ -1058,6 +1104,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
max-width: 500px;
border-left: 1px solid rgb(200 200 200 / 8%);
border-right: 1px solid rgb(200 200 200 / 8%);
+ -webkit-app-region: drag;
}
.app-chrome .app-chrome-item > .app-playback-controls {
@@ -1065,34 +1112,56 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
justify-content: center;
align-content: center;
width: 100%;
+ -webkit-app-region: no-drag;
}
-.app-chrome .app-chrome-item > .app-playback-controls .song-name {
- font-weight: 600;
- text-align: center;
- font-size: 13px;
- height: 1.3em;
- line-height: 1.3em;
- white-space: nowrap;
- max-width: 360px;
+.app-chrome .app-chrome-item > .app-playback-controls {
+ .song-name {
+ font-weight: 600;
+ text-align: center;
+ font-size: 13px;
+ height: 1.3em;
+ line-height: 1.3em;
+ white-space: nowrap;
+ max-width: 360px;
- .song-name-normal {
- height: inherit;
- }
+ .song-name-normal {
+ height: inherit;
+ }
- &.song-artist-marquee {
- > marquee {
- //margin-bottom: -3px;
+ &.song-artist-marquee {
+ > marquee {
+ //margin-bottom: -3px;
+ }
+ }
+
+ .explicit-icon {
+ background-image: url("./assets/explicit.svg");
+ height: 9px;
+ width: 13px;
+ filter: contrast(0);
+ background-repeat: no-repeat;
+ margin-left: 3px;
}
}
- .explicit-icon {
- background-image: url("./assets/explicit.svg");
- height: 9px;
- width: 36px;
+ .lossless-icon {
+ background-image: url("./assets/lossless.svg") !important;
+ }
+
+ .ppe-icon {
+ background-image: url("./assets/ppe.svg") !important;
+ }
+
+ .audio-type {
filter: contrast(0);
background-repeat: no-repeat;
- margin-left: 3px;
+ background-size: contain;
+ height: 15px;
+ width: 15px;
+ position: absolute;
+ right: 0;
+ margin-bottom: 15px;
}
}
@@ -1105,43 +1174,49 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
margin: 0 0 0 0.25em;
}
-.app-playback-controls:hover .marquee{
- animation: unset;
- &.song-artist{
+.app-playback-controls:hover .marquee {
+ animation: unset;
+
+ &.song-artist {
overflow: hidden;
}
- .song-artist{
+
+ .song-artist {
overflow: hidden;
}
- &.song-name{
+
+ &.song-name {
overflow: hidden;
}
- &::after{
+
+ &::after {
content: none !important;
display: none;
}
}
-.marquee{
- animation: marquee 15s linear infinite;
- &.song-artist{
- overflow: unset ;
+.marquee {
+ animation: marquee 15s linear infinite;
+
+ &.song-artist {
+ overflow: unset;
}
- .song-artist{
- overflow: unset ;
+
+ .song-artist {
+ overflow: unset;
}
- &.song-name{
- overflow: unset ;
+
+ &.song-name {
+ overflow: unset;
}
- &::after{
+
+ &::after {
content: attr(data-value);
}
}
-
-
.app-chrome .app-chrome-item > .app-playback-controls .song-progress {
@bgColor: transparent;
//height: 16px;
@@ -1166,6 +1241,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
height: 4px;
background-color: rgb(200 200 200 / 10%);
border-radius: 2px;
+ margin: 0;
&::-webkit-slider-thumb {
opacity: 0;
@@ -1210,7 +1286,6 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
border-radius: 4px;
flex: 0 0 auto;
margin: 6px;
- box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 25%);
image-rendering: -webkit-optimize-contrast;
}
@@ -1241,15 +1316,18 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
&:focus {
outline: none;
}
+
&:hover {
background: var(--hover);
}
+
&:active {
background: var(--selected-click);
transform: scale(0.95);
}
+
.svg-icon {
- --url: url('views/svg/more.svg')!important;
+ --url: url('views/svg/more.svg') !important;
}
}
}
@@ -1264,7 +1342,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
overflow: hidden;
}
-.app-chrome .app-chrome-item > .app-playback-controls .playback-info > .song-progress{
+.app-chrome .app-chrome-item > .app-playback-controls .playback-info > .song-progress {
width: 100%;
}
@@ -1275,7 +1353,8 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
display: flex;
position: relative;
}
-.app-chrome .app-chrome-item > .app-playback-controls > div >.song-artist-album {
+
+.app-chrome .app-chrome-item > .app-playback-controls > div > .song-artist-album {
font-weight: 400;
font-size: 12px;
text-align: center;
@@ -1288,17 +1367,17 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
max-width: 340px;
overflow: hidden;
- .song-artist-album-content{
+ .song-artist-album-content {
font-weight: 400;
font-size: 12px;
text-align: center;
- width:100%;
+ width: 100%;
&.song-artist-normal {
height: inherit;
}
}
-
+
&.song-artist-marquee {
> marquee {
@@ -1326,7 +1405,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
/* Window is smaller <= 1023px width */
-@media only screen and (max-width: 1023px) {
+@media only screen and (max-width: 1120px) {
.display--small {
display: inherit !important;;
@@ -1361,12 +1440,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
transition: all var(--appleTransition);
}
-
+
&::-webkit-slider-thumb:hover {
background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
transform: scale(1.2);
}
-
+
&::-webkit-slider-thumb:active {
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
transform: scale(1);
@@ -1382,456 +1461,22 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
-
.display--large {
display: none !important;
}
}
-.header-text {
- margin: 0px;
-}
-
-.media-item--small {
- background: rgb(0 0 0 / 25%);
- height: 162px;
- width: 132px;
- display: inline-flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- border-radius: 10px;
-}
-
-.media-item--small .artwork {
- background: red;
- margin: 6px;
- border-radius: 100%;
- width: 90px;
- height: 90px;
- box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 30%);
-}
-
-.playlist-artwork {
- height: 190px;
- width: 190px;
- background: blue;
- border-radius: 6px;
- background: var(--artwork);
- background-size: cover;
- box-shadow: var(--mediaItemShadow);
- flex: 0 0 auto;
- margin: 6px;
- margin-top: 0px;
-}
-
-.media-item--small .text {
- font-weight: 600;
- font-size: 0.90em;
-}
-
-.media-item--small .subtext {
- font-size: 0.75em;
-}
-
-.player-duration-time {
- opacity: 0.5;
-}
-
-.player-artwork-container {
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.player-duration-container {
- font-size: 0.85em;
- font-weight: 500;
-}
-
-.media-artwork {
- --artwork: url("");
- width: 80vw;
- height: 80vw;
- max-height: 500px;
- max-width: 500px;
- background: black;
- background-image: var(--artwork);
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
- border-radius: 8px;
- box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%), 0 8px 40px rgb(0 0 0 / 0.55);
- transition: transform .10s var(--appleEase);
-}
-
-.media-artwork.paused {
- transition: transform .35s var(--appleEase);
- transform: scale(0.85);
-}
-
-.playback-slider {
- width: 90%;
-}
-
-.volume-slider {
- width: 100%;
-}
-
-.volume-slider-container {
- width: 90%;
- margin: 0 auto;
- padding: 0px;
-}
-
-.volume-slider-container .col-auto,
-.volume-slider-container .col {
- display: flex;
- align-items: center;
- justify-self: center;
- padding: 0px;
- margin: 0px;
-}
-
-.playback-button {
- font-size: 2em;
- width: 40px;
- height: 36px;
- padding: 0px;
- background: transparent;
- border: 0px;
- border-radius: 0px;
- box-shadow: unset;
- background-size: 12px;
- background-position: center;
- background-repeat: no-repeat;
- opacity: 0.70;
- border-radius: 6px;
-}
-
-.playback-button:active {
- transform: scale(0.95);
-}
-
-.playback-button--small {
- border-radius: 6px;
- font-size: 1em;
- color: inherit;
- background-size: 14px;
- background-repeat: no-repeat;
- background-position: center;
- background-color: transparent;
- width: 40px;
- height: 32px;
- border: 0px;
- box-shadow: unset;
- opacity: 0.70;
-}
-
-.playback-button:hover,
-.playback-button--small:hover {
- background-color: rgb(200 200 200 / 10%);
-}
-
-.playback-button:active,
-.playback-button--small:active {
- transform: scale(0.9);
-}
-
-.playback-button--small.active {
- background-color: rgb(200 200 200 / 25%);
-}
-
-.playback-button--small.search {
- background-image: url("./assets/search.svg");
-}
-
-.playback-button--small.cast {
- background-image: url("./assets/cast_white.svg");
-}
-
-.playback-button--small.miniplayer {
- background-image: url("./assets/pip.svg");
-}
-
-.playback-button--small.queue {
- background-image: url("./assets/list.svg");
-}
-
-.playback-button--small.lyrics {
- background-image: url("./assets/quote-right.svg");
-}
-
-.playback-button--small.shuffle {
- background-image: url("./assets/shuffle.svg");
-}
-
-.playback-button--small.repeat {
- background-image: url("./assets/repeat.svg");
-}
-
-.playback-button--small.repeat.repeatOne {
- background-color: rgb(200 200 200 / 25%);
- background-image: url("./assets/repeatOne.svg");
-}
-
-.playback-button.pause {
- background-image: url('./assets/pause.svg');
-}
-
-.playback-button.play {
- background-image: url('./assets/play.svg');
-}
-
-.playback-button.next {
- background-image: url('./assets/forward.svg');
-}
-
-.playback-button.previous {
- background-image: url('./assets/backward.svg');
-}
-
-.playback-buttons {
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.player-volume-glyph {
- width: 32px;
- height: 16px;
- background-repeat: no-repeat;
- background-size: contain;
- background-position: center;
-}
-
-.player-volume-glyph.decrease {
- background-image: url("./assets/volume.svg");
- opacity: 0.5;
-}
-
-.player-volume-glyph.increase {
- background-image: url("./assets/volume-2.svg");
- opacity: 0.5;
-}
-
-.player-track-info {
- width: 90%;
- margin: 0 auto;
-}
-
-.player-song-title {
- font-size: 1.25em;
- text-align: left;
- margin: 0 auto;
- font-weight: 500;
-}
-
-.player-song-artist {
- font-size: 1.0em;
- text-align: left;
- margin: 0 auto;
- color: var(--keyColor);
- font-weight: 400;
-}
-
-.player-song-artist:hover {
- cursor: pointer;
- text-decoration: underline;
-}
-
-.player-more-container {
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.player-more-button {
- appearance: none;
- width: 32px;
- height: 32px;
- border-radius: 50%;
- border: 0px;
- background: var(--keyColor);
- cursor: pointer;
- box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%);
- color: white;
- font-weight: bold;
- padding: 0px;
- font-size: 16px;
-}
-
-.back-button {
- width: 40px;
- height: 40px;
- background-color: transparent;
- background-size: 16px;
- background-position: center;
- background-repeat: no-repeat;
- background-image: url("./assets/arrow-left.svg");
- border: 0px;
- border-radius: 0px;
-}
-
-.header-text {
- height: 40px;
- display: flex;
- align-items: center;
-
-}
-
-
.flex-center {
display: flex;
align-items: center;
flex-wrap: wrap;
}
-.list-entry-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 12px;
- font-size: 1em;
- font-family: inherit;
-}
-
-.list-entry {
- display: flex;
- align-items: center;
- /* justify-content: space-between; */
- padding: 12px;
- font-size: 1em;
- font-family: inherit;
- border-bottom: 1px solid rgba(255 255 255 / 0.1);
- cursor: pointer;
-}
-
-.list-entry-image {
- --artwork: url("");
- width: 64px;
- height: 64px;
- background: var(--artwork);
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
- border-radius: 8px;
- box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%), 0 8px 40px rgb(0 0 0 / 0.55);
-}
-
-.list-entry-image.artist {
- border-radius: 50%;
-}
-
-.list-entry-body {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: flex-start;
- margin-left: 12px;
-}
-
-.list-entry-name {
- font-size: 14px;
- font-weight: 500;
- overflow: hidden;
- width: 100%;
-}
-
-.list-entry-artist {
- font-size: 12px;
- overflow: hidden;
- width: 100%;
-}
-
-.list-entry .handle {
- height: 100%;
- width: 28px;
- background: var(--keyColor);
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
.md-container {
width: 100%;
position: relative;
}
-.search-panel {
- background: rgb(0 0 0 / 50%);
-}
-
-.search-header {
- position: absolute;
- width: 100%;
- z-index: 1;
- backdrop-filter: blur(16px);
- -webkit-backdrop-filter: blur(16px);
- border-bottom: 1px solid rgb(200 200 200 / 8%);
-}
-
-.connection-error-panel {
- background: rgb(0 0 0 / 50%);
-}
-
-.search-type-container {
- display: flex;
-}
-
-.search-type-button {
- background: rgb(20 20 20 / 0.85);
- border-radius: 50px;
- color: white;
- border: 0px;
- box-shadow: unset;
- font-family: inherit;
- padding: 8px 16px;
- font-size: 14px;
- font-weight: 500;
- margin: 8px;
- margin-top: 0px;
- margin-bottom: 0px;
-}
-
-.search-type-button.active {
- background: var(--keyColor);
-}
-
-.search-tab-container {
- overflow: auto;
- white-space: nowrap;
- overflow-y: hidden;
-}
-
-.search-body-container {
- position: relative;
- width: 100%;
- height: 100%;
-}
-
-.search-body {
- position: absolute;
- width: 100%;
- height: 100%;
- padding-top: 220px;
-}
-
-.search-tab {
- background: rgb(20 20 20 / 0.85);
- border-radius: 50px;
- color: white;
- border: 0px;
- box-shadow: unset;
- font-family: inherit;
- padding: 8px 16px;
- font-size: 14px;
- font-weight: 500;
-}
-
-.search-tab.active {
- background: var(--keyColor);
-}
.lyric-body {
-webkit-mask-image: -webkit-gradient(linear, left 95%, left bottom, from(rgba(0, 0, 0, 1)), to(rgba(0, 0, 0, 0)));
@@ -2021,66 +1666,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
height: 100%;
}
-.home-page {
- top: 0;
- padding-top: var(--navbarHeight);
-
- .artist-feed-card {
- position: absolute;
- bottom: 0;
- left: 10%;
- z-index: 1;
- background: black;
- width: 80%;
- height: 96%;
- overflow: scroll;
- border-radius: 10px;
- }
-
- .col.madeforyou-col {
- width: 420px;
- min-width: 0px;
- max-width: 420px;
- }
-
- .well.artistfeed-well {
- margin-top: 0px;
- height: 392px;
- align-content: flex-start;
- }
-
- .hint-text {
- font-size: 0.9rem;
- color: rgb(200 200 200 / 70%);
- }
-
- .user-icon {
- border-radius: 100%;
- width: 128px;
- height: 128px;
- overflow: hidden;
- box-shadow: var(--mediaItemShadow-Shadow);
- margin: 16px;
- }
-
- .well.profile-well {
- flex-direction: column;
- justify-content: center;
- align-items: center;
-
- .name {
- margin: 4px;
- font-weight: 500;
- }
-
- .handle {
- margin: 4px;
- opacity: 0.7;
- font-weight: 500;
- }
- }
-}
-
/* Cider */
.more-btn-round {
@@ -2145,132 +1730,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
}
-.md-close-btn {
- -webkit-mask-image: url("ameres://icons/webui/close.svg");
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-position: center;
- background-color: white;
- opacity: 0.75;
- -webkit-mask-size: contain;
- height: 18px;
- width: 18px;
-}
-
-.md-btn {
- background: rgb(100 100 100 / 25%);
- padding: 8px 14px;
- border-radius: 6px;
- font-size: 14px;
- border: 1px solid rgba(100, 100, 100, 0.35);
- border-top: 1px solid rgba(100, 100, 100, 0.5);
- color: #eee;
- transition: transform 0.2s var(--appleEase), box-shadow 0.2s var(--appleEase);
-
- &.md-btn-block {
- display: block;
- width:100%;
- }
-
- &.md-btn-glyph {
- display:flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- }
-
- &.md-btn-primary {
- background: #ff2b52a6;
- color: white;
- border: 1px solid rgb(220 53 69 / 25%);
- border-top: 1px solid rgb(220 53 69 / 50%);
- }
-
- &:hover {
- filter: brightness(125%);
- }
-
- &:active {
- filter: brightness(75%);
- transform: scale(0.98);
- transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
- }
-
- &.md-btn-icon {
- display: inline-flex;
- vertical-align: middle;
- justify-content: center;
-
- > img {
- margin: 0px 16px 0px 0px;
- pointer-events: none;
- }
-
- > .md-btn-text {
- margin: 0px;
- }
- }
-}
-
-.md-ico-play {
- content:url("./assets/play.svg");
- width: 10px;
- height: 12px;
- margin-right: 1px;
- align-self: center;
-}
-
-.md-ico-shuffle {
- content:url("./assets/shuffle.svg");
- width: 1em;
- height: 1em;
- margin-right: 1px;
- margin-bottom: -2px;
- align-self: center;
-}
-
-.md-ico-remove {
- content:url("./assets/feather/x-circle-white.svg");
- width: 16px;
- height: 16px;
- margin-right: 1px;
- margin-bottom: -1.5px;
- align-self: center;
-}
-
-.md-ico-add {
- content:url("./assets/feather/plus-circle-white.svg");
- width: 1em;
- height: 1em;
- margin-right: 1px;
- margin-bottom: -1.5px;
- align-self: center;
-}
-
-.md-select {
- padding: 6px;
- border-radius: 6px;
- border: 1px solid rgba(200, 200, 200, 0.1);
- border-top: 1px solid rgba(100, 100, 100, 0.5);
- font-family: inherit;
- font-size: 14px;
- background: rgba(100, 100, 100, 0.25);
- color: #eee;
-
- option {
- font-size: 1em;
- font-family: inherit;
- padding: 8px 16px;
- background: #404040;
- }
-
- optgroup {
- background: #2c2c2c;
- }
-
- &:focus {
- outline: solid 1px var(--selected);
- }
-}
.sidebar-playlist {
.folder-button-active {
@@ -2291,254 +1750,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
}
-.modal-fullscreen {
- display: flex;
- justify-content: center;
- align-items: center;
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(0, 0, 0, 0.3);
- z-index: 1000;
-
- .modal-window {
- background: #333;
- border-radius: 10px;
- box-shadow: var(--mediaItemShadow-Shadow);
- display: flex;
- flex-flow: column;
- max-height: 500px;
- max-width: 360px;
- background: #121212;
- width: 100%;
- position: relative;
-
- &:after {
- content: "";
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- pointer-events: none;
- box-shadow: var(--mediaItemShadow);
- z-index: 1;
- border-radius: inherit;
- }
-
- .modal-header {
- width: 100%;
- padding: 6px;
- }
-
- .modal-content {
- width: 100%;
- height: 100%;
- overflow: hidden;
- overflow-y: overlay;
- }
-
- .modal-footer {
- }
- }
-}
-
-.spatialproperties-panel {
- .modal-window {
- height: 700px;
- max-height: 700px;
- width: 800px;
- max-width: 800px;
- overflow: hidden;
-
- .info-header {
- padding-left: 12px;
- }
-
- .visual-container {
- display: flex;
- justify-content: center;
- align-items: center;
- overflow: hidden;
- }
-
- .visual {
- position: relative;
- height: 250px;
- width: 300px;
- display: inline-flex;
- align-items: flex-end;
- justify-content: center;
- filter: drop-shadow(2px 12px 6px rgb(0 0 0 / 25%));
- margin: 0 auto;
-
- .face {
- position: absolute;
- width: calc(12px * 6);
- height: calc(12px * 6);
- border-radius: 6px;
- transform: rotateX(60deg) rotateZ(-45deg);
- transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
- }
-
- .listener {
- position: absolute;
- width: 32px;
- height: 32px;
- border-radius: 6px;
- transform: rotateX(60deg) rotateZ(-45deg);
- transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
- background: white;
- color: black;
- z-index: 2;
- }
-
- .audiosource {
- position: absolute;
- width: 32px;
- height: 32px;
- border-radius: 6px;
- transform: rotateX(60deg) rotateZ(-45deg);
- transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
- background: yellow;
- z-index: 2;
- }
-
- .face:nth-of-type(1) {
- background: linear-gradient(45deg, #28223a, #1f2038);
- z-index: 1;
- }
-
- .face:nth-of-type(2) {
- background: linear-gradient(45deg, #7d53ad, #5763ff);
- transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px);
- opacity: 0.7;
- z-index: 3;
- }
- }
-
- .modal-header {
- padding: 16px;
- position: relative;
- overflow: hidden;
-
- .modal-title {
- text-align: center;
- }
-
- .close-btn {
- width: 50px;
- height: 100%;
- background-image: var(--gfx-closeBtn);
- background-position: center;
- background-repeat: no-repeat;
- -webkit-app-region: no-drag;
- appearance: none;
- border: 0;
- background-color: transparent;
- position: absolute;
- top: 0;
- right: 0;
-
- &:hover {
- background-color: rgb(196, 43, 28)
- }
- }
- }
- }
-}
-
-.addtoplaylist-panel {
- .modal-window {
- max-height: 600px;
- max-width: 400px;
- background: rgb(18 18 18 / 90%);
- overflow: hidden;
- backdrop-filter: blur(16px) saturate(180%);
-
- .modal-header {
- padding: 16px;
- position: relative;
-
- .modal-title {
- text-align: center;
- }
-
- .close-btn {
- width: 50px;
- height: 100%;
- background-image: var(--gfx-closeBtn);
- background-position: center;
- background-repeat: no-repeat;
- -webkit-app-region: no-drag;
- appearance: none;
- border: 0;
- background-color: transparent;
- position: absolute;
- top: 0;
- right: 0;
-
- &:hover {
- background-color: rgb(196, 43, 28)
- }
- }
- }
-
- .modal-search {
- width: 100%;
- padding: 0px 16px;
- position: relative;
- }
-
- .playlist-item {
- appearance: none;
- border: 0px;
- text-align: left;
- width: 100%;
- margin: 0;
- display: flex;
- background: rgba(32, 32, 32, 0.46);
- color: #eee;
- font-family: inherit;
- font-size: 0.98em;
- padding: 6px 12px;
- align-items: center;
- flex-flow: row;
-
- .icon {
- pointer-events: none;
- width: 32px;
- height: 32px;
- display: flex;
- justify-content: center;
- align-items: center;
- margin-right: 6px;
- }
-
- .name {
- }
-
- &:hover {
- background: var(--selected);
- }
-
- &:active {
- background: var(--selected-click);
- }
-
- &.focused {
- background: var(--keyColor);
- }
- }
-
- .playlist-item:last-child {
- border-bottom: 0px;
- }
- }
-}
-
#navigation-bar {
width: 100%;
background: rgba(0, 0, 0, 0.25);
@@ -2590,733 +1801,34 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
}
-.reload-btn {
- background: rgb(86 86 86 / 52%);
- border-radius: 100%;
- width: 32px;
- height: 32px;
- border: 0px;
- appearance: none;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.reload-btn:hover {
- background: rgb(86 86 86 / 80%);
- cursor: pointer;
-}
-
-.reload-btn > svg {
- height: 50%;
- color: #eee;
-}
-
-.wr-btn {
- font-family: inherit;
- appearance: none;
- border: 0px;
- border-radius: 6px;
- padding: 8px;
- font-weight: 600;
- background: rgb(80 80 80 / 70%);
- color: white;
-}
-
.well {
background: rgba(200, 200, 200, 0.05);
border-radius: 10px;
padding: var(--contentInnerPadding);
box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;
margin-top: 16px;
- display: flex;
- flex-flow: wrap;
- justify-content: center;
- > .cd-mediaitem-square {
- width: 220px;
- height: 260px;
- display: inline-flex;
- flex: 0 0 auto;
- flex-direction: column;
- font-size: 14px;
+
+ &.itemContainer {
+ display: flex;
+ flex-flow: wrap;
justify-content: center;
- align-items: center;
- border-radius: 6px;
- max-width: 240px;
- flex-grow: 1;
- }
-}
-
-// Library - Songs page
-.library-page {
- padding: 0px;
-
- .library-header {
- position: sticky;
- top: 0;
- left: 0;
- border-bottom: 1px solid rgba(200, 200, 200, 0.05);
- z-index: 6;
- background: black;
- padding: 0px 2em;
- backdrop-filter: blur(32px);
- background: rgba(0, 0, 0, 0.25);
- top: var(--navigationBarHeight);
- }
-
- .well {
- margin: 2em;
- }
-}
-
-// Podcast Page
-.content-inner.podcasts-page {
- display: flex;
- height: calc(100% - var(--navigationBarHeight));
- padding: 0px;
-
- .list-flat {
- border-radius: 0px;
- }
-
- .podcast-artwork {
- width: 200px;
- margin: 16px auto;
- height: 200px;
- }
-
- .podcasts-list {
- height: 100%;
- width: 280px;
- background: rgb(200 200 200 / 10%);
- overflow-y: overlay;
- border-right: 1px solid var(--color2);
- flex: none;
- overflow-x: hidden;
-
- .podcast-list-header {
- border-bottom: 1px solid var(--color2);
- font-size: 0.7em;
- padding: 6px;
- background: #ffffff17;
- text-transform: uppercase;
- font-weight: 600;
- opacity: 0.5;
- }
-
- .podcasts-search {
- padding: 10px;
- position: sticky;
- top: 0;
- left: 0;
- width: 100%;
- border-bottom: 1px solid var(--color2);
- z-index: 2;
- background: #303030;
- }
- }
-
- .episodes-list {
- height: 100%;
- width: 100%;
- background: rgb(200 200 200 / 6%);
- overflow-y: overlay;
- overflow-x: hidden;
-
- .episodes-inline-info {
- padding: 14px 14px 0px 14px;
-
- .podcast-show-info {
- display: flex;
- justify-content: center;
- flex-direction: column;
- }
-
- .podcast-show-description {
- margin: 32px 6px;
- font-size: 0.8rem;
- white-space: pre-wrap;
- display:block;
- }
-
- .podcast-artwork {
- width: 120px;
- margin: 0px auto;
- height: 120px;
- }
- }
-
- .podcast-no-search-results {
- text-align: center;
- margin-top: 40px;
- }
- }
-
- .podcasts-details {
- width: 300px;
- flex: none;
- background: rgb(255 255 255 / 5%);
- overflow-y: overlay;
- overflow-x: hidden;
- top: 2%;
- z-index: 2;
- border-left: 1px solid var(--color2);
- padding-bottom: 1em;
-
- .meta-btn {
- font-size: 0.75em;
- }
-
- .podcasts-details-header {
- display: flex;
- justify-content: end;
- align-items: center;
- position: sticky;
- top: 0;
- z-index: 2;
- }
- .close-btn {
- width: 50px;
- height: 42px;
- background-image: var(--gfx-closeBtn);
- background-position: center;
- background-repeat: no-repeat;
- -webkit-app-region: no-drag;
- appearance: none;
- border: 0;
- background-color: transparent;
- position: absolute;
- top: 0;
- right: 0;
-
- &:hover {
- background-color: rgb(196, 43, 28)
- }
- }
-
- .podcast-genre {
- text-align: center;
- margin: 6px;
- font-size: 0.8em;
- font-weight: 500;
- opacity: 0.8;
- }
-
- .podcast-metainfo {
- text-align: center;
- font-size: 0.7em;
- opacity: 0.8;
- }
-
- .podcast-header {
- text-align:center;
- }
-
- .podcast-play-btn {
- width: 50%;
- display: block;
- margin: 0 auto;
- }
-
- .podcast-description {
- margin: 12px;
- font-size: 0.75em;
- white-space: pre-wrap;
- display:block;
- line-break: anywhere;
- }
-
-
- }
-
-}
-
-@media only screen and (max-width: 1230px) {
- .content-inner.podcasts-page {
- .podcasts-details {
- height: 96%;
- width: 300px;
- flex: none;
- background: rgb(20 20 20 / 97%);
- overflow-y: overlay;
- overflow-x: hidden;
- position: absolute;
- right: 2%;
- top: 2%;
- border-radius: 10px;
- box-shadow: var(--ciderShadow-Generic);
- z-index: 2;
- }
- }
-}
-
-
-
-/* Album / Playlist Page */
-.playlist-page {
- --bgColor: transparent;
- padding: 0px;
- //background: linear-gradient(180deg, var(--bgColor) 32px, var(--bgColor) 18px, transparent 60px, transparent 100%);
- top: 0;
- padding-top: var(--navigationBarHeight);
-
- .playlist-body {
- padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
- margin-top: -75px;
- }
-
- .floating-header {
- position: sticky;
- top: 0;
- left: 0;
- border-bottom: 1px solid rgba(200, 200, 200, 0.05);
- z-index: 6;
- padding: 0px 1em;
- backdrop-filter: blur(32px);
- background: rgba(0, 0, 0, 0.25);
- top: var(--navigationBarHeight);
- transition: opacity 0.1s var(--appleEase);
- }
-
- .playlist-display {
- padding: var(--contentInnerPadding);
- min-height: 300px;
- position: relative;
-
- .artworkContainer {
- position: absolute;
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
- margin: 0;
- margin-top: calc(var(--navigationBarHeight) * -1);
- margin-bottom: -10px;
- padding: 0;
- -webkit-mask-image: radial-gradient(at top left, black, transparent 70%), radial-gradient(at top right, black, transparent 70%), linear-gradient(180deg, rgb(200 200 200), transparent 98%);
- opacity: .7;
- animation: playlistArtworkFadeIn 1s var(--appleEase);
-
- .artworkMaterial>img {
- filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
- object-position: center;
- object-fit: cover;
- width: 100%;
- height: 100%;
- transform: unset;
- }
- }
-
- .playlistInfo {
- z-index: 1;
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- top: 0;
- display: flex;
+ .cd-mediaitem-square {
+ width: 220px;
+ height: 260px;
+ display: inline-flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ font-size: 14px;
justify-content: center;
align-items: center;
- width: 100%;
- height: 100%;
-
- >.row {
- width: calc(100% - 32px);
- }
-
- .playlist-info {
- flex-shrink: unset;
- display: flex;
- flex-flow: column;
- justify-content: flex-end;
-
- .playlist-name {
- font-weight: 700;
- font-size: 1.6rem;
- margin-bottom: 6px;
- margin-right: 6px;
- flex-shrink: unset;
- }
-
- .nameEdit {
- font-weight: 700;
- font-size: 1.6rem;
- margin-bottom: 6px;
- margin-right: 6px;
- flex-shrink: unset;
- background: transparent;
- border: 0px;
- color: inherit;
- font-family: inherit;
- }
-
- .playlist-artist {
- font-size: 20px;
- margin-bottom: 6px;
- margin-right: 6px;
- flex-shrink: unset;
- }
-
- .playlist-desc {
- box-sizing: border-box;
- font-size: 14px;
- flex-shrink: unset;
- margin-right: 5px;
- max-height: 100px;
- position: relative;
-
- .content {
- height: 100px;
- -webkit-mask-image: -webkit-gradient(linear, left 50%, left 90%, from(rgba(0, 0, 0, 1)), to(rgba(0, 0, 0, 0)));
- }
-
- .more-btn {
- appearance: none;
- position: absolute;
- right: 0;
- bottom: 0;
- padding: 0 5px;
- font-size: 14px;
- color: var(--keyColor);
- background-color: transparent;
- border: 0px;
- cursor: pointer;
- width: 100%;
- height: 100%;
- overflow: hidden;
- display: flex;
- justify-content: flex-end;
- align-items: flex-end;
- font-weight: 600;
- font-family: inherit;
- text-transform: uppercase;
- }
- }
-
- .playlist-desc-expanded {
- box-sizing: border-box;
- font-size: 14px;
- position: relative;
-
- .more-btn {
- appearance: none;
- position: absolute;
- right: 0;
- bottom: 0;
- padding: 0 5px;
- font-size: 14px;
- color: var(--keyColor);
- background-color: transparent;
- border: 0px;
- cursor: pointer;
- width: 100%;
- height: 100%;
- overflow: hidden;
- display: flex;
- justify-content: flex-end;
- align-items: flex-end;
- font-weight: 600;
- font-family: inherit;
- text-transform: uppercase;
- }
- }
- }
+ border-radius: 6px;
+ max-width: 240px;
+ flex-grow: 1;
}
-
-
- }
-
- .friends-info {
- display: flex;
- flex-flow: column;
-
- .badge-container {
- display: flex;
- flex-flow: wrap;
-
- .socialBadge {
- width: 40px;
- height: 40px;
- border-radius: 100%;
- overflow: hidden;
- box-shadow: var(--mediaItemShadow-ShadowSubtle);
- transition: transform .2s var(--appleEase);
- margin: 6px;
-
- &:hover {
- transform: scale(1.2);
- }
- }
- }
-
- .friends-name {
- text-align: center;
- font-size: 0.9em;
- margin: 8px;
- }
- }
-
- .playlist-time {
- font-size: 0.9em;
- margin: 6px;
- opacity: 0.7;
}
}
-@keyframes playlistArtworkFadeIn {
- 0%{
- opacity: 0;
- }
- 100%{
- opacity: 0.7;
- }
-}
-// Collection Page
-.collection-page {
- padding-bottom: 128px;
-
- .top-fab {
- height: 52px;
- width: 52px;
- position: fixed;
- bottom: 32px;
- right: 32px;
- border-radius: 100%;
- background: rgb(60 60 60);
- border: 0px;
- appearance: none;
- box-shadow: var(--ciderShadow-Generic);
-
- > svg {
- height: 50%;
- color: #eee;
- pointer-events: none;
- }
-
- &:hover {
- background: rgb(100 100 100);
- }
-
- &:active {
- background: var(--keyColor);
- }
- }
-
- .header-text {
- margin-bottom: 32px;
- }
-}
-
-/* Artist Page */
-
-.artist-page {
- padding: 0px;
- top: 0;
-
- .floating-header {
- position: sticky;
- top: 0;
- left: 0;
- border-bottom: 1px solid rgba(200, 200, 200, 0.05);
- z-index: 6;
- padding: 0px 1em;
- backdrop-filter: blur(32px);
- background: rgba(0, 0, 0, 0.25);
- top: var(--navigationBarHeight);
- transition: opacity 0.1s var(--appleEase);
- }
-
- &.animated .artist-header .more-btn-round {
- position: absolute;
- bottom: 22px !important;
- right: 28px;
- }
-
- .artist-header {
- //background: linear-gradient(45deg, var(--keyColor), #0e0e0e);
- color: white;
- display: flex;
- align-items: center;
- justify-content: space-between;
- min-height: 400px;
- position: relative;
- pointer-events: none;
-
- .header-content {
- z-index: 1;
- }
-
-
- .artworkContainer {
- position: absolute;
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
- margin: 0;
- padding: 0;
- -webkit-mask-image: radial-gradient(at top left, black, transparent 70%), radial-gradient(at top right, black, transparent 70%), linear-gradient(180deg, rgb(200 200 200), transparent 98%);
- opacity: .7;
- animation: playlistArtworkFadeIn 1s var(--appleEase);
-
- .artworkMaterial>img {
- filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
- object-position: center;
- object-fit: cover;
- width: 100%;
- height: 100%;
- transform: unset;
- }
- }
-
- .more-btn-round {
- position: absolute;
- bottom: 82px;
- right: 28px;
- }
-
- .animated {
- width: 100%;
- height: 100%;
- align-self: center;
- position: absolute;
- overflow: hidden;
- box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
-
- video {
- overflow: hidden;
- height: 100%;
- width: 100%;
- min-height: 56.25vw;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- }
- }
-
- .row .col.flex-center {
- z-index: 4;
- }
- }
-
- .artist-image {
- width: 200px;
- height: 200px;
- margin: 32px;
- margin-top: -5px;
- position: relative;
-
- .overlay-play {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- opacity: 0;
- background: rgb(0 0 0 / 50%);
- transition: opacity 0.1s var(--appleEase);
- border-radius: 100%;
- z-index: 1;
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- appearance: none;
- border: 0px;
- padding: 0px;
-
- &:hover {
- opacity: 1;
- }
-
- &:active {
- background: var(--selected-click);
- }
-
- > svg {
- width: 70%;
- }
- }
- }
-
- .artist-play {
- width: 32px;
- height: 32px;
- background: rgba(100, 100, 100, 0.5);
- box-shadow: var(--ciderShadow-Generic);
- border-radius: 100%;
- box-shadow: var(--mediaItemShadow);
- display: none;
- cursor: pointer;
- appearance: none;
- border: 0px;
- padding: 0px;
-
- &:hover {
- filter: brightness(125%);
- }
-
- &:active {
- filter: brightness(75%);
- transform: scale(0.98);
- transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
- }
- }
- .artist-title {
-
- .artist-play {
- transform: translateY(3px);
- margin: 14px;
- }
-
- &.artist-animation-on {
- width: 100%;
- flex: unset;
- margin-left: 0.5em;
- color: whitesmoke;
- position: absolute;
- bottom: 0;
-
- .artist-play {
- display: block;
- }
- }
- }
-
- .artist-body {
- padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
- margin-top: -140px;
- }
-
- &.animated > .artist-body {
- padding: 0px var(--contentInnerPadding) 0px var(--contentInnerPadding);
- margin-top: -57px;
- }
-
- .showmoreless {
- font-family: inherit;
- font-size: 16px;
- font-weight: 500;
- background: transparent;
- border: 0px;
- border-radius: 6px;
- appearance: none;
- color: var(--keyColor);
- padding: 8px 12px;
- cursor: pointer;
- margin-top: 12px;
- float: right;
- }
-
- .showmoreless:hover {
- background: rgb(200 200 200 / 10%);
- }
-}
-
-/* Artist Page End */
-
.text-overflow-elipsis {
display: -webkit-box;
min-width: 0px;
@@ -3326,1126 +1838,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
-webkit-box-orient: vertical;
}
-
-.mediaitem-artwork {
- border-radius: var(--mediaItemRadius);
- overflow: hidden;
- flex: 0 0 auto;
- position: relative;
- width: 100%;
- height: 100%;
- background-image: url("https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg");
- background-size: cover;
- background-position: center;
-
- .animatedartwork-view-box {
- position: absolute;
- top: 0px;
- width: 100%;
- height: 100%;
-
- .animated {
- position: absolute;
- top: 0px;
- width: 100%;
- height: 100%;
-
- video {
- width: 100%;
- height: 100%;
- }
- }
- }
-
- &.rounded {
- border-radius: 100%;
-
- &::after {
- border-radius: 100%;
- }
- }
-
- &::after {
- content: "";
- box-shadow: var(--mediaItemShadow);
- z-index: 1;
- width: 100%;
- height: 100%;
- position: absolute;
- top: 0;
- left: 0;
- border-radius: inherit;
- }
-
- img {
- width: 100%;
- height: 100%;
- object-fit: cover;
- image-rendering: -webkit-optimize-contrast;
- pointer-events: none;
- }
-
- &.no-shadow {
- box-shadow: none;
-
- &::after {
- display: none;
- }
- }
-
- &.subtle-shadow {
- box-shadow: var(--mediaItemShadow-ShadowSubtle);
- }
-
- &.shadow {
- box-shadow: var(--mediaItemShadow-Shadow);
- }
-}
-
-.menu-panel {
- width: 100%;
- height: 100%;
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1001;
- display: flex;
- justify-content: center;
- align-items: center;
-
- .menu-header-body {
- padding: 6px;
- display: flex;
- background: rgb(200 200 200 / 10%);
- .menu-option-header {
- width: 40px;
- height: 40px;
- display: flex;
- justify-content: center;
- align-items: center;
- border-radius: var(--mediaItemRadius);
- appearance: none;
- border: 0;
- background: transparent;
-
- &.active {
- .sidebar-icon>.svg-icon {
- --color: var(--keyColor);
- }
- }
-
- &:hover {
- background: var(--selected);
- }
-
- &:active {
- background: var(--selected-click);
- }
- }
- }
- .menu-panel-body {
- display: flex;
- flex-flow: column;
- background: rgb(38 38 38);
- position: relative;
- min-width: 200px;
- box-shadow: var(--ciderShadow-Generic);
- border-radius: var(--mediaItemRadius);
- overflow: hidden;
- font-size: 14px;
-
- .menu-option {
- text-align: left;
- display: flex;
- width: 100%;
- padding: 12px 16px;
- appearance: none;
- border: 0px;
- font: inherit;
- background: transparent;
- color: inherit;
-
- &:hover {
- background: var(--selected);
- }
-
- &:active {
- background: var(--selected-click);
- }
- }
- }
-
-
- .menu-header-text {
- margin: 18px 6px;
-
- .close-btn {
- width: 50px;
- height: 42px;
- background-image: var(--gfx-closeBtn);
- background-position: center;
- background-repeat: no-repeat;
- -webkit-app-region: no-drag;
- appearance: none;
- border: 0;
- background-color: transparent;
- position: absolute;
- top: 0;
- right: 0;
-
- &:hover {
- background-color: rgb(196, 43, 28)
- }
- }
- }
-
- .menu-body {
- overflow: overlay;
- height: 100%;
- }
-
- .menu-footer {
- width: 100%;
- padding: 12px;
- }
-}
-
-.queue-panel {
- height: 100%;
- width: 100%;
- display: flex;
- flex-flow: column;
-
- .queue-header-text {
- margin: 18px 6px;
- }
-
- .queue-body {
- overflow: overlay;
- height: 100%;
- }
-
- .queue-footer {
- width: 100%;
- padding: 12px;
- }
-
- .autoplay {
- background: rgb(200 200 200 / 15%);
- display: flex;
- justify-content: center;
- appearance: none;
- border: 0;
- border-radius: 6px;
- height: 32px;
- width: 32px;
- }
- .infinity{
- content: url("./assets/infinity.svg");
- margin: auto;
- }
-}
-
-/* queue item */
-.cd-queue-item {
- border-bottom: 1px solid rgb(200 200 200 / 10%);
- padding: 8px;
-
- .row,
- .col {
- padding: 0px;
- margin: 0px;
- }
-
- .artwork {
- width: 32px;
- height: 32px;
- flex: 0 0 auto;
- }
-
- &.selected {
- background: var(--selected);
- }
-
- &:active {
- background: var(--selected-click);
- color: #eee;
- }
-
- .queue-info {
- display: flex;
- flex-direction: column;
-
- .queue-title {
- font-size: 14px;
- }
-
- .queue-subtitle {
- font-size: 13px;
- opacity: 0.85;
- }
- }
-}
-
-/* horizontal media scroller */
-.cd-hmedia-scroller {
- margin: 0 auto;
- display: flex;
- flex-flow: row;
- overflow-x: scroll;
- overflow-y: hidden;
- height: 284px;
- align-items: center;
-
- &::-webkit-scrollbar-thumb {
- box-shadow: none;
- }
-
- &:hover::-webkit-scrollbar-thumb {
- box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%);
- }
-
- &.small {
- overflow-x: overlay;
- height: 210px;
- }
-
- &.hmedia-scroller-card {
- height: 370px;
-
- .mediaitem-card {
- margin: 12px;
- }
- }
-}
-
-/* mediaitem-list-item */
-.cd-mediaitem-list-item {
- width: 100%;
- height: 60px;
- display: flex;
- flex: 0 0 auto;
- flex-direction: row;
- font-size: 14px;
- justify-content: center-between;
- align-items: center;
- border-radius: var(--mediaItemRadius);
-
- .artwork {
- height: 42px;
- width: 42px;
- border-radius: var(--mediaItemRadius);
- object-fit: cover;
- object-position: center;
- flex: 0 0 auto;
- background-repeat: no-repeat;
- margin: 12px;
- border: 0px;
- outline: none;
- position: relative;
- overflow: hidden;
-
- .overlay-play {
- background: rgba(0, 0, 0, 0.5);
- opacity: 0;
- appearance: none;
- border: 0;
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- padding: 0px;
- z-index: 5;
- cursor: pointer;
-
- &:hover {
- opacity: 1;
- }
-
- &:active {
- background: var(--selected-click);
- }
- }
- }
-
- .artwork.round {
- border-radius: var(--mediaItemRadiusRound);
- }
-
- .info-rect {
- height: 100%;
- display: flex;
- flex-flow: column;
- justify-content: center;
- flex-grow: 1;
- }
-
- .title {
- width: 100%;
- }
-
- .subtitle {
- width: 90%;
- font-size: .8em;
- opacity: 0.7;
- }
-
- .duration {
- min-width: 60px;
- text-align: center;
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-
- .metainfo {
- min-width: 145px;
- text-align: center;
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-
- .explicit-icon {
- background-image: url("./assets/explicit.svg");
- height: 12px;
- width: 36px;
- filter: contrast(0);
- background-repeat: no-repeat;
- }
-
- /* CSS.gg
- */
- @keyframes load-bar {
- 10% {box-shadow: inset 0 -4px 0}
- 20% {box-shadow: inset 0 -10px 0}
- 30% {box-shadow: inset 0 -12px 0}
- 40% {box-shadow: inset 0 -8px 0}
- 50% {box-shadow: inset 0 -4px 0}
- 60% {box-shadow: inset 0 -6px 0}
- 80% {box-shadow: inset 0 -12px 0}
- 90% {box-shadow: inset 0 -6px 0}
- to {box-shadow: inset 0 -2px 0}
- }
-
- .loadbar-sound,
- .loadbar-sound::after,
- .loadbar-sound::before {
- animation: load-bar 1.3s ease infinite alternate;
- box-sizing: border-box;
- width: 3px;
- height: 28px;
- box-shadow: inset 0 -12px 0;
- }
- .loadbar-sound {
- margin-left: 22px;
- margin-top: -16px;
- position: relative;
- transform: scale(var(--load-bar,1));
- color: var(--keyColor);
- display: block;
- }
- .loadbar-sound::after,
- .loadbar-sound::before {
- content: "";
- position: absolute;
- bottom: 0
- }
- .loadbar-sound::before {
- left: -4.5px;
- animation-delay: -2.4s
- }
- .loadbar-sound::after {
- right: -4.2px;
- animation-delay: -3.7s
- }
-
- .isLibrary {
- flex: 0 0 auto;
- width: 40px;
- text-align: center;
-
- button {
- appearance: none;
- border: 0px;
- background: transparent;
- cursor: pointer;
- filter: contrast(0.8);
- }
- }
-
- &:hover {
- background: rgb(200 200 200 / 10%);
- box-shadow: var(--mediaItemShadow);
-
- .overlay-play {
- opacity: 1;
- }
- }
-
- &.mediaitem-selected {
- background: var(--selected);
- box-shadow: var(--mediaItemShadow);
- }
-
-
- &:active {
- background: var(--selected-click);
- box-shadow: var(--mediaItemShadow);
- color: #eee;
- }
-
- // list item compact
- &.compact {
- height: 40px;
- font-size: 13px;
-
- .artwork {
- display: none;
- }
-
- .info-rect {
- padding-left: 1em;
- }
- }
-}
-
-/* mediaitem-hrect */
-.cd-mediaitem-hrect {
- background: rgb(255 255 255 / 18%);
- width: 264px;
- height: 100px;
- display: inline-flex;
- flex: 0 0 auto;
- flex-direction: row;
- font-size: 14px;
- justify-content: center;
- align-items: center;
- border-radius: 6px;
- cursor: pointer;
-
- .artwork {
- height: 70px;
- width: 70px;
- background: blue;
- border-radius: var(--mediaItemRadius);
- background: var(--artwork);
- background-size: contain;
- flex: 0 0 auto;
- background-repeat: no-repeat;
- margin: 18px;
- }
-
- .artwork.round {
- border-radius: var(--mediaItemRadiusRound);
- }
-
- .info-rect {
- width: 100%;
- }
-
- .title {
- width: 100%;
- text-align: center;
- }
-
- .subtitle {
- width: 100%;
- text-align: center;
- font-size: 12px;
- }
-}
-
-/* mediaitem-square-sp */
-.cd-mediaitem-square-sp {
- --spcolor: var("");
- width: 190px;
- height: 250px;
- display: inline-flex;
- flex: 0 0 auto;
- flex-direction: column;
- font-size: 14px;
- justify-content: flex-start;
- align-items: center;
- border-radius: 6px;
- margin-left: 10px;
- cursor: pointer;
- background-color: var(--spcolor);
-
- .artwork {
- height: 190px;
- width: 190px;
- background: blue;
- border-top-left-radius: 6px;
- border-top-right-radius: 6px;
- background: var(--artwork);
- background-size: cover;
- flex: 0 0 auto;
- margin: 6px;
- margin-top: 0px;
-
- &.round {
- border-radius: var(--mediaItemRadiusRound);
- }
-
- &:hover {
- box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
- }
- }
-
- .title {
- width: 90%;
- text-align: center;
- }
-
- .subtitle {
- width: 100%;
- text-align: center;
- font-size: 12px;
- }
-
- > .cd-mediaitem-square-large-overlay {
- z-index: 3;
-
- &:hover {
- opacity: 1;
- }
- }
-
- + .cd-mediaitem-square-large-overlay {
- pointer-events: none;
- }
-
- &:hover + .cd-mediaitem-square-large-overlay {
- opacity: 1;
-
- }
-
- &:hover {
- box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
- }
-}
-
-
-/* mediaitem-square-large */
-.cd-mediaitem-square-large {
- width: 190px;
- height: 250px;
- display: inline-flex;
- flex: 0 0 auto;
- flex-direction: column;
- font-size: 14px;
- justify-content: flex-start;
- align-items: center;
- border-radius: 6px;
- margin-left: 10px;
- cursor: pointer;
-
- > * {
- z-index: inherit;
- }
-}
-
-.cd-mediaitem-square-large .artwork {
- height: 190px;
- width: 190px;
- background: blue;
- border-top-left-radius: 6px;
- border-top-right-radius: 6px;
- background: var(--artwork);
- background-size: cover;
- flex: 0 0 auto;
- margin: 6px;
- margin-top: 0px;
-}
-
-.cd-mediaitem-square-large-overlay {
- position: absolute;
- width: 190px;
- float: right;
- height: 250px;
- top: 0px;
- margin: 10px;
- margin-top: 0px;
- opacity: 0;
-
-}
-
-.cd-mediaitem-square-large-overlay > * {
- pointer-events: auto;
-
-}
-
-.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay {
- z-index: 3;
-}
-
-.cd-mediaitem-square-large > .cd-mediaitem-square-large-overlay:hover {
- opacity: 1;
-}
-
-.cd-mediaitem-square-large + .cd-mediaitem-square-large-overlay {
- pointer-events: none;
-
-}
-
-.cd-mediaitem-square-large:hover + .cd-mediaitem-square-large-overlay {
- opacity: 1;
-
-}
-
-
-.cd-mediaitem-square-large .artwork.round {
- border-radius: var(--mediaItemRadiusRound);
-}
-
-.cd-mediaitem-square-large .title {
- width: 90%;
- text-align: center;
-}
-
-.cd-mediaitem-square-large .subtitle {
- width: 100%;
- text-align: center;
- font-size: 12px;
-}
-
-/* mediaitem-mvview */
-
-/* mediaitem-mvview */
-.cd-mediaitem-mvview {
- width: 300px;
- height: 250px;
- display: inline-flex;
- flex: 0 0 auto;
- flex-direction: column;
- font-size: 14px;
- justify-content: flex-start;
- align-items: center;
- border-radius: 6px;
- margin-left: 10px;
- cursor: pointer;
-
- > * {
- z-index: inherit;
- }
-}
-
-.cd-mediaitem-mvview .artwork {
- height: 172px;
- width: 300px;
- background: blue;
- border-top-left-radius: 6px;
- border-top-right-radius: 6px;
- background: var(--artwork);
- background-size: cover;
- flex: 0 0 auto;
- margin: 6px;
- margin-top: 0px;
-}
-
-.cd-mediaitem-mvview-overlay {
- position: absolute;
- width: 300px;
- float: right;
- height: 250px;
- top: 0px;
- margin: 10px;
- margin-top: 0px;
- opacity: 0;
-
-}
-
-.cd-mediaitem-mvview-overlay > * {
- pointer-events: auto;
-
-}
-
-.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay {
- z-index: 3;
-}
-
-.cd-mediaitem-mvview > .cd-mediaitem-mvview-overlay:hover {
- opacity: 1;
-}
-
-.cd-mediaitem-mvview + .cd-mediaitem-mvview-overlay {
- pointer-events: none;
-
-}
-
-.cd-mediaitem-mvview:hover + .cd-mediaitem-mvview-overlay {
- opacity: 1;
-
-}
-
-
-.cd-mediaitem-mvview .artwork.round {
- border-radius: var(--mediaItemRadiusRound);
-}
-
-.cd-mediaitem-mvview .title {
- width: 90%;
- text-align: center;
-}
-
-.cd-mediaitem-mvview .subtitle {
- width: 100%;
- text-align: center;
- font-size: 12px;
-}
-
-
-/* mediaitem-square */
-.cd-mediaitem-square {
- width: 220px;
- height: 260px;
- display: inline-flex;
- flex: 0 0 auto;
- flex-direction: column;
- font-size: 14px;
- justify-content: center;
- align-items: center;
- border-radius: 6px;
-
- .artwork-container {
- position: relative;
-
- .artwork {
- height: 190px;
- width: 190px;
- background: blue;
- border-radius: var(--mediaItemRadius);
- background: var(--artwork);
- background-size: cover;
- flex: 0 0 auto;
- margin: 6px;
- cursor: pointer;
-
- &.round {
- border-radius: var(--mediaItemRadiusRound);
- }
- }
-
- .badge-container {
- transition: opacity 0.1s var(--appleEase);
- opacity: 1;
-
- .socialBadge {
- width: 32px;
- height: 32px;
- position: absolute;
- right: 14px;
- bottom: 14px;
- border-radius: 100%;
- overflow: hidden;
- z-index: 2;
- pointer-events: none;
- }
- }
-
- > .play-btn,
- > .menu-btn {
- opacity: 0;
- appearance: none;
- padding: 0px;
- border: 0px;
- width: 30px;
- height: 30px;
- border-radius: 50%;
- background: rgba(50, 50, 50, 0.7);
- cursor: pointer;
- transition: opacity 0.1s var(--appleEase);
-
- :hover {
- border-radius: 50%;
- background: rgba(250, 0, 0, 0.7);
- }
- }
-
- > .play-btn {
- position: absolute;
- bottom: 14px;
- left: 14px;
- z-index: 2;
-
- }
-
- > .menu-btn {
- position: absolute;
- bottom: 14px;
- right: 14px;
- z-index: 2;
- }
-
- &:hover {
- > .badge-container {
- opacity: 0;
- }
-
- > .play-btn,
- > .menu-btn {
- opacity: 1;
- }
- }
- }
-
- .info-rect {
- width: 90%;
- height: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- }
-
-
- .title {
- width: 100%;
- text-align: center;
- display: flex;
- align-content: center;
- justify-content: center;
- }
-
- .subtitle {
- width: 100%;
- text-align: center;
- font-size: 12px;
- }
-
- &.mediaitem-video {
- height: 200px;
- width: 240px;
-
- .artwork {
- height: 120px;
- width: 212px;
- }
- }
-
- &.mediaitem-brick {
- height: 200px;
- width: 240px;
-
- .artwork {
- height: 123px;
- width: 220px;
- }
- }
-
- &.mediaitem-small {
- width: 140px;
- height: 180px;
-
- .artwork {
- height: 128px;
- width: 128px;
- }
- }
-
- &.mediaitem-card {
- background: #ccc;
- background: var(--spcolor);
- height: 298px;
- width: 230px;
- max-width: 250px;
- max-height: 500px;
- overflow: hidden;
- position: relative;
- border-radius: calc(var(--mediaItemRadius) * 2);
- box-shadow: var(--mediaItemShadow-ShadowSubtle);
-
- .artwork {
- width: 230px;
- height: 230px;
- overflow: hidden;
- border-radius: 0px;
- margin: 0;
-
- .mediaitem-artwork {
- border-radius: 0px;
-
- &::after {
- box-shadow: unset;
- }
- }
- }
-
- .info-rect-card {
- padding: 10px 10px 14px;
- position: relative;
- width: 100%;
-
- &::before {
- background: var(--bgartwork);
- content: "";
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
- position: absolute;
- background-size: cover;
- background-position: bottom;
- z-index: 0;
- opacity: 1;
- filter: brightness(0.5) blur(50px) saturate(180%);
- }
- }
-
- .title {
- height: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- font-size: 0.9em;
- font-weight: 500;
- z-index: 1;
- }
-
- .subtitle {
- height: 100%;
- justify-content: center;
- align-items: center;
- font-size: 0.75em;
- width: 100%;
- display: flex;
- z-index: 1;
- }
-
- &::after {
- box-shadow: var(--mediaItemShadow);
- content: "";
- width: 100%;
- height: 100%;
- position: absolute;
- top: 0;
- left: 0;
- pointer-events: none;
- border-radius: inherit;
- }
- }
-}
-
-/* mediaitem-square */
-.albums-square-containeru > * > .cd-mediaitem-square {
- --frame: max(220px, 15vw);
- width: var(--frame);
- height: calc(var(--frame) * 13 / 11);
- display: inline-flex;
- flex: 0 0 auto;
- flex-direction: column;
- font-size: calc(var(--frame) / 220 * 14);
- justify-content: center;
- align-items: center;
- border-radius: calc(var(--frame) / 220 * 6);
-
- .artwork-container {
- position: relative;
-
- .artwork {
- height: calc(var(--frame) * 19 / 22);
- width: calc(var(--frame) * 19 / 22);
- background: blue;
- border-radius: var(--mediaItemRadius);
- background: var(--artwork);
- background-size: cover;
- flex: 0 0 auto;
- margin: calc(var(--frame) / 220 * 6);
- cursor: pointer;
-
- &.round {
- border-radius: var(--mediaItemRadiusRound);
- }
- }
-
- > .play-btn,
- > .menu-btn {
- opacity: 0;
- appearance: none;
- padding: 0px;
- border: 0px;
- width: calc(var(--frame) / 220 * 30);
- height: calc(var(--frame) / 220 * 30);
- border-radius: 50%;
- background: rgba(50, 50, 50, 0.7);
- cursor: pointer;
- backdrop-filter: blur(32px) saturate(180%);
- transition: opacity 0.1s var(--appleEase);
- }
-
- > .play-btn {
- position: absolute;
- bottom: calc(var(--frame) / 220 * 14);
- left: calc(var(--frame) / 220 * 14);
- z-index: 2;
- }
-
- > .menu-btn {
- position: absolute;
- bottom: calc(var(--frame) / 220 * 14);
- right: calc(var(--frame) / 220 * 14);
- z-index: 2;
- }
-
- &:hover {
-
- > .play-btn,
- > .menu-btn {
- opacity: 1;
- }
- }
- }
-
-
- .title {
- width: 90%;
- text-align: center;
- }
-
- .subtitle {
- width: 100%;
- text-align: center;
- font-size: calc(var(--frame) / 220 * 12);
- }
-
- &.mediaitem-video {
- height: calc(var(--frame) / 220 * 200);
- width: calc(var(--frame) / 220 * 240);
-
- .artwork {
- height: calc(var(--frame) / 220 * 120);
- width: calc(var(--frame) / 220 * 212);
- }
- }
-
- &.mediaitem-brick {
- height: calc(var(--frame) / 220 * 200);
- width: calc(var(--frame) / 220 * 240);
-
- .artwork {
- height: calc(var(--frame) / 220 * 123);
- width: calc(var(--frame));
- }
- }
-}
-
-.cd-btn-seeall {
- background: transparent;
- border: 0px;
- color: var(--keyColor);
- font-family: inherit;
- font-weight: 500;
- font-size: 16px;
- border-radius: 4px;
- padding: 6px;
-
- &:hover {
- cursor: pointer;
- background: rgb(200 200 200 / 10%)
- }
+.no-animation {
+ animation: unset !important;
}
.fullscreen-view-container {
@@ -4486,7 +1880,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
height: 50vh;
}
- @media only screen and (max-width: 1023px) {
+ .bg-artwork-container {
+ display: block !important;
+ }
+
+ @media only screen and (max-width: 1121px) {
.display--large {
display: flex !important;
}
@@ -4525,7 +1923,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.volume-button--small:active {
transform: scale(0.9);
}
-
+
.volume-button--small.active {
background-image: url("./assets/feather/volume.svg");
}
@@ -4548,12 +1946,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
transition: all var(--appleTransition);
}
-
+
&::-webkit-slider-thumb:hover {
background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
transform: scale(1.2);
}
-
+
&::-webkit-slider-thumb:active {
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
transform: scale(1);
@@ -4588,13 +1986,10 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
filter: brightness(85%) saturate(95%) blur(180px) contrast(0.9) opacity(0.9);
}
- .no-animation {
- animation: unset;
- }
+
}
}
-
.lyrics-col {
height: 62vh;
@@ -4854,14 +2249,14 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.player-pin {
z-index: 3;
position: absolute;
- min-width: 20px;
+ min-width: 20px;
min-height: 20px;
top: 5px;
right: 30px;
-webkit-app-region: no-drag;
}
-
- #mini-pin{
+
+ #mini-pin {
display: none;
}
@@ -4877,7 +2272,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
height: 50vh;
}
- @media only screen and (max-width: 1023px) {
+ @media only screen and (max-width: 1121px) {
.display--large {
display: flex !important;
}
@@ -4916,7 +2311,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.volume-button--small:active {
transform: scale(0.9);
}
-
+
.volume-button--small.active {
background-image: url("./assets/feather/volume.svg");
}
@@ -4939,12 +2334,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
transition: all var(--appleTransition);
}
-
+
&::-webkit-slider-thumb:hover {
background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
transform: scale(1.2);
}
-
+
&::-webkit-slider-thumb:active {
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
transform: scale(1);
@@ -5091,7 +2486,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
width: 100%;
height: 100%;
- .mediaitem-artwork{
+ .mediaitem-artwork {
border-radius: unset;
}
}
@@ -5105,11 +2500,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
z-index: 3;
opacity: 0;
padding: 3%;
+
&:hover {
- opacity : 1;
+ opacity: 1;
}
}
-
+
.app-playback-controls {
-webkit-app-region: no-drag;
@@ -5240,86 +2636,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
// Cider App
-.mediaitem-list-item__grid {
- overflow-x: overlay;
- overflow-y: hidden;
- background: rgba(200, 200, 200, 0.05);
- border-radius: 10px;
- padding: var(--contentInnerPadding);
- box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px;
- height: 300px;
- display: flex;
- align-items: center;
- .grid-body {
- display: grid;
- grid-auto-flow: column dense;
- grid-template-rows: auto auto auto auto;
- grid-gap: 0 6px;
- padding: 2px 0;
- justify-content: left;
- width: 0;
- }
-
- .cd-mediaitem-list-item {
- width: 350px;
- height: 60px;
- }
-
- &::-webkit-scrollbar {
- display: none;
- }
-
- &:hover::-webkit-scrollbar {
- display: initial;
-
- }
-}
-
-.settings-page {
- padding:0px;
-
- .md-option-header {
- padding: 1.25em 1.25em;
- border-bottom: unset;
- border-top: unset;
- font-weight: 600;
- font-size: 1.0em;
- background: rgb(255 255 255 / 3%);
- }
- .settings-option-body {
- margin: 16px;
- }
-}
-
-// sidebar icon
-.svg-icon {
- --color: #aaa;
- --url: url("./assets/feather/share.svg");
- -webkit-mask-image: var(--url);
- -webkit-mask-size: cover;
- height: 18px;
- width: 18px;
- background: var(--color);
-}
-
-.sidebar-icon {
- width: 18px;
- height: 18px;
- margin-right: 8px;
-
- > .svg-icon {
- width: 100%;
- height: 100%;
- --color: #aaa;
- }
-
- > svg {
- width: 100%;
- height: 100%;
- color: #aaa;
- }
-}
-
@keyframes rotate {
from {
transform: rotate(0deg);
@@ -5350,6 +2666,10 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
width: 200VH;
height: 200VH;
}
+
+ .bg-artwork-container{
+ display: block !important;
+ }
}
.lyric-body {
@@ -5358,22 +2678,15 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
padding: 0px;
margin: 0px;
overflow: hidden;
+ filter: drop-shadow(0px 4px 6px rgb(0 0 0 / 70%));
.lyric-line {
pointer-events: none;
- font-weight: 500;
+ font-weight: 600;
font-size: 2em;
transform-origin: center;
animation: fsLyricIn var(--appleEase) .2s;
opacity: 0.9;
- text-shadow: -1px -1px 0 #000,
- 0 -1px 0 #000,
- 1px -1px 0 #000,
- 1px 0 0 #000,
- 1px 1px 0 #000,
- 0 1px 0 #000,
- -1px 1px 0 #000,
- -1px 0 0 #000;
&:not(.active) {
display: none;
@@ -5405,6 +2718,17 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
/* Transitions */
+.replaycard-enter-active,
+.replaycard-leave-active {
+ transition: opacity .5s var(--appleEase), transform .5s var(--appleEase);
+}
+
+.replaycard-enter,
+.replaycard-leave-to {
+ opacity: 0;
+ transform: translateY(20px);
+}
+
.modal-enter-active,
.modal-leave-active {
transition: opacity .1s var(--appleEase), transform .1s var(--appleEase);
@@ -5428,13 +2752,38 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.wpfade_transform-enter-active,
.wpfade_transform-leave-active {
- transition: opacity .1s var(--appleEase), transform .1s var(--appleEase);
+ --transitionTime: 0.2s;
+ transition: opacity var(--transitionTime) var(--appleEase), transform var(--transitionTime) var(--appleEase);
+ will-change: opacity, transform;
}
-.wpfade_transform-enter,
-.wpfade_transform-leave-to {
- transform: scale(0.90);
+.wpfade_transform-enter {
opacity: 0;
+ transform: translateX(50%) translate3d(0,0,0);
+ will-change: opacity, transform;
+}
+.wpfade_transform-leave-to {
+ opacity: 0;
+ transform: translateX(-50%) translate3d(0,0,0);
+ will-change: opacity, transform;
+}
+
+
+.wpfade_transform_backwards-enter-active,
+.wpfade_transform_backwards-leave-active {
+ --transitionTime: 0.2s;
+ transition: opacity var(--transitionTime) var(--appleEase), transform var(--transitionTime) var(--appleEase);
+}
+
+.wpfade_transform_backwards-enter {
+ opacity: 0;
+ transform: translateX(-50%) translate3d(0,0,0);
+ will-change: opacity, transform;
+}
+.wpfade_transform_backwards-leave-to {
+ opacity: 0;
+ transform: translateX(50%) translate3d(0,0,0);
+ will-change: opacity, transform;
}
.fabfade-enter-active,
@@ -5470,18 +2819,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
right: -300px;
}
-/* Transitions End */
-
-// @media (prefers-color-scheme: light) {
-// :root {
-// /* */
-// --gfx-closeBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjY6MjgtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI2OjI4LTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjY6MjgtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PtPY89oAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEpJREFUGJWNkMENwDAIA1Gh3F7sP0Ty7xD5JgpU+OuTLVvMmQohhRTCnCEK8TpfBl9eBpcBu/HXcsAZ9FQjSrWqW2Pa95gzGofPBQZRG2fS0899AAAAAElFTkSuQmCC');
-// --gfx-maxBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjU6NTItMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI1OjUyLTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjU6NTItMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PntJ23wAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEhJREFUGJVjYGBgmMzAwPCXgYHhPw78l4GBYTIjlKHHwMDwlAE7EGFgYLjJANUlgEMRDPxnIqAADoaKwn8MkCDABaShaogLcACWZRl4ajKVtAAAAABJRU5ErkJggg==');
-// --gfx-restoreBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAIn2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgZGM6Zm9ybWF0PSJpbWFnZS9wbmciCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEyOjU1OjM3WiIKICAgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMTAtMDVUMTQ6MjY6NTMtMDc6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEwLTA1VDE0OjI2OjUzLTA3OjAwIgogICB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTk5OWM2NWYtNDhhOS0wNjQyLWI2MTktZmJlYTExMmUxOGZiIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5MzMyOWNhLWNkNjctMzY0Zi04MzU1LTY5N2ZmYzI0ZDdlZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjgyZjQwYmU3LTE0YzItZjc0Ni1hZmE1LWQxYmIxNzAyMjM4OCIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSI+CiAgIDxwaG90b3Nob3A6VGV4dExheWVycz4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qSiIgogICAgICBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKIiLz4KICAgIDwvcmRmOlNlcT4KICAgPC9waG90b3Nob3A6VGV4dExheWVycz4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0iY3JlYXRlZCIKICAgICAgeG1wTU06aW5zdGFuY2VJRD0ieG1wLmlpZDo4MmY0MGJlNy0xNGMyLWY3NDYtYWZhNS1kMWJiMTcwMjIzODgiCiAgICAgIHhtcE1NOnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIKICAgICAgeG1wTU06d2hlbj0iMjAyMC0wMi0xN1QxMjo1NTozN1oiLz4KICAgICA8cmRmOmxpCiAgICAgIHhtcE1NOmFjdGlvbj0ic2F2ZWQiCiAgICAgIHhtcE1NOmNoYW5nZWQ9Ii8iCiAgICAgIHhtcE1NOmluc3RhbmNlSUQ9InhtcC5paWQ6NjkzMzI5Y2EtY2Q2Ny0zNjRmLTgzNTUtNjk3ZmZjMjRkN2VkIgogICAgICB4bXBNTTpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiCiAgICAgIHhtcE1NOndoZW49IjIwMjAtMDItMTdUMTI6NTU6MzdaIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDVUMTQ6MjY6NTMtMDc6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PluKsJ0AAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRv0tCURTHP2lhmGFRQUODhDVZlELU0qD0C6pBDbJa9OWPQO3xnhHRGrQKBVFLv4b6C2oNmoOgKIJoC5qLWkpe56mgRJ7Luedzv/eew73ngiWcVjJ6/QBksjktOOF3zUcWXLZX7DTQQSu+qKKrM6HxMDXt64E6M971mbVqn/vXmpbjugJ1jcKjiqrlhCeFp9dzqsm7wu1KKrosfC7s0eSCwvemHivxm8nJEv+YrIWDAbC0CLuSVRyrYiWlZYTl5bgz6TWlfB/zJY54di4ksVu8C50gE/hxMcUYAYYYZETmIfrw0i8rauQPFPNnWZVcRWaVDTRWSJIih0fUNakel5gQPS4jzYbZ/7991RM+b6m6ww8NL4bx0QO2HSjkDeP72DAKJ2B9hqtsJX/1CIY/Rc9XNPchOLfg4rqixfbgchs6n9SoFi1KVnFLIgHvZ9AcgbZbsC+Welbe5/QRwpvyVTewfwC9ct659At2bGftHD0UJwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAGlJREFUGJWt0LEOgkAQhOFPShspSWyvMPFxKaDh0XgOq8tZuCqBIzRMMsXmn51slr9GlJVfmHC9LII3LGfoomCGHrnSloM9olnGE+3KKVgbi0oMNX1ZaXYCG50aLBj4HJwqgXuwn47eA95vgSGy6zr7OwAAAABJRU5ErkJggg==');
-// --gfx-minBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAaxaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPg0KICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDItMTdUMTM6MDA6MzJaIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wOk1vZGlmeURhdGU9IjIwMjAtMDItMTdUMTM6MDA6MzJaIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg1ZDBlZGIwLWZkMDAtYjY0Zi05ZWZiLWEyYjQ1ODcwNWE4YSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmEzMDAxZTFhLTI5MTktZTQ0OS1iOTRjLWMyMTIyNDhhOWY4YSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjc4N2Y3OTljLTRiMTEtZTU0YS1iMjBkLTY4NjE3ZWQ5YzVlMiIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciPg0KICAgICAgPHhtcE1NOkhpc3Rvcnk+DQogICAgICAgIDxyZGY6U2VxPg0KICAgICAgICAgIDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc4N2Y3OTljLTRiMTEtZTU0YS1iMjBkLTY4NjE3ZWQ5YzVlMiIgc3RFdnQ6d2hlbj0iMjAyMC0wMi0xN1QxMzowMDozMloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgLz4NCiAgICAgICAgICA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODVkMGVkYjAtZmQwMC1iNjRmLTllZmItYTJiNDU4NzA1YThhIiBzdEV2dDp3aGVuPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIiAvPg0KICAgICAgICA8L3JkZjpTZXE+DQogICAgICA8L3htcE1NOkhpc3Rvcnk+DQogICAgICA8cGhvdG9zaG9wOlRleHRMYXllcnM+DQogICAgICAgIDxyZGY6QmFnPg0KICAgICAgICAgIDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0i7qShIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSLupKEiIC8+DQogICAgICAgIDwvcmRmOkJhZz4NCiAgICAgIDwvcGhvdG9zaG9wOlRleHRMYXllcnM+DQogICAgPC9yZGY6RGVzY3JpcHRpb24+DQogIDwvcmRmOlJERj4NCjwveDp4bXBtZXRhPg0KPD94cGFja2V0IGVuZD0iciI/PmeGdrgAAAAVSURBVChTYxhOgBGI/0OYQx0wMAAAyp4BAZ26NiYAAAAASUVORK5CYII=');
-// }
-// }
-
@media (prefers-color-scheme: dark) {
}
@@ -5493,7 +2830,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
--gfx-minBtn: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGOmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wMi0xN1QxMzowMDozMloiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAyLTE3VDEzOjAwOjMyWiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NWQwZWRiMC1mZDAwLWI2NGYtOWVmYi1hMmI0NTg3MDVhOGEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDphMzAwMWUxYS0yOTE5LWU0NDktYjk0Yy1jMjEyMjQ4YTlmOGEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ODdmNzk5Yy00YjExLWU1NGEtYjIwZC02ODYxN2VkOWM1ZTIiIHN0RXZ0OndoZW49IjIwMjAtMDItMTdUMTM6MDA6MzJaIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1ZDBlZGIwLWZkMDAtYjY0Zi05ZWZiLWEyYjQ1ODcwNWE4YSIgc3RFdnQ6d2hlbj0iMjAyMC0wMi0xN1QxMzowMDozMloiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cmRmOkJhZz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSLupKEiIHBob3Rvc2hvcDpMYXllclRleHQ9Iu6koSIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FwvRXAAAABdJREFUGNNj/P//PwMxgHGIKPw/XDwDAOr1HuzlELLnAAAAAElFTkSuQmCC');
}
-
#apple-music-video-container {
background: black;
position: absolute;
@@ -5505,6 +2841,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
z-index: 100000;
}
+
+
#apple-music-video-player {
position: absolute;
top: 50%;
@@ -5513,6 +2851,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
height: 100%;
}
+#app.twopanel #apple-music-video-container {
+ top: var(--chromeHeight1);
+ bottom: unset;
+}
+
#apple-music-video-player-controls {
position: absolute;
z-index: 100001;
@@ -5614,78 +2957,6 @@ div#captions {
font-weight: 500;
}
-/* Switch Checkbox */
-input[type=checkbox][switch] {
- width: 38px;
- appearance: none;
- border-radius: 32px;
- height: 24px;
- zoom: 1;
- top: 0;
- cursor: pointer;
- left: 0;
- position: relative;
- transform: scale(1);
- background: rgb(142 142 147 / 100%);
- padding: 0;
- margin: 0;
-}
-
-input[type=checkbox][switch]:focus,
-input[type=checkbox][switch]:active {
- outline: none;
-}
-
-input[type=checkbox][switch]:checked {
- background: var(--keyColor);
- border: 0 solid var(--keyColor);
- mix-blend-mode: unset;
-
- &:hover {
- background: var(--keyColor-rollover);
- }
-
- &:active {
- background: var(--keyColor-pressed);
- }
-}
-
-input[type=checkbox][switch]::before {
- background: white;
- width: 26px;
- height: 26px;
- top: -1px;
- left: -1px;
- position: absolute;
- content: ' ';
- border-radius: 32px;
- transition: .10s left var(--appleEase);
- transform: scale(.75);
-}
-
-
-input[type=checkbox][switch]:checked::before {
- background: white;
- top: -1px;
- left: 13px;
- transition: .10s left var(--appleEase);
- transform: scale(.75);
-}
-
-input[type=checkbox][switch]:disabled::before {
- opacity: .5;
-}
-
-input[type=checkbox][switch]:active::before {
- left: 13px;
-}
-
-input[type=checkbox][switch]:checked:active::before {
- left: -1px;
-}
-
-/* End Switch Checkbox */
-
.madeforyou-body {
margin-top: 15px;
}
@@ -5701,6 +2972,10 @@ body.no-gpu {
.bg-artwork-container {
display: none;
+ animation: none !important;
+ .bg-artwork{
+ animation: none !important;
+ }
}
#navigation-bar {
@@ -5741,6 +3016,10 @@ body.no-gpu {
.drawertransition-leave-to {
right: -300px;
}
+
+ .lyric-line:hover::after {
+ display: none;
+ }
}
.qrimg {
@@ -5755,7 +3034,7 @@ body.no-gpu {
.modal-window {
height: 330px;
max-height: 330px;
- width: 800px;
+ width: 740px;
max-width: 800px;
overflow: hidden;
@@ -5770,7 +3049,7 @@ body.no-gpu {
overflow: hidden;
}
-
+
.modal-header {
padding: 16px;
position: relative;
@@ -5799,43 +3078,49 @@ body.no-gpu {
}
}
}
- .modal-content{
+
+ .modal-content {
display: block;
-
- .inputs-container{
+
+ .inputs-container {
margin-left: 8px;
}
- .input-container{
+ .input-container {
display: inline-grid;
width: 54px;
justify-items: center;
font-size: 0.7em;
}
- .input-container.mini{
+
+ .input-container.mini {
display: inline-grid;
width: 43px;
justify-items: center;
font-size: 0.7em;
}
- .freq-header{
+
+ .freq-header {
margin-bottom: 2px;
}
-
- .reset-button{
+
+ .reset-button {
width: 50%;
margin-left: 25%;
text-align: center;
}
+
input.eq-slider {
-webkit-appearance: slider-vertical;
width: 5%;
}
- input[type="number"]{
+
+ input[type="number"] {
padding: unset;
width: 55px;
}
- .header input.eq-slider {
+
+ .header input.eq-slider {
-webkit-appearance: slider-vertical;
width: 5%;
opacity: 0;
@@ -5849,5 +3134,57 @@ body.no-gpu {
}
}
+body[platform='darwin'] {
+ #window-controls-container {
+ display: none;
+ }
+ .app-chrome .app-chrome-item > .app-mainmenu {
+ opacity: 0;
+ pointer-events: none;
+ -webkit-app-region: drag;
+ }
+}
+
+.percent {
+ display: inline-block;
+ position: relative;
+}
+
+.percent::after {
+ position: relative;
+ right: 2em;
+ transition: all .05s ease-in-out;
+}
+
+.percent:hover::after,
+.percent:focus-within::after {
+ right: 3.5em;
+}
+
+.percent::after {
+ content: '%';
+}
+
+.spatialproperties-panel.modal-fullscreen{
+ flex-direction: column;
+}
+
+.cursor {
+ background: rgb(255 255 255 / 50%);
+ width: 16px;
+ height: 16px;
+ position: fixed;
+ z-index: 9999999999;
+ pointer-events: none;
+ border-radius: 100%;
+ box-shadow: 0px 0px 0px 2px rgb(200 200 200 / 100%);
+ top: 0;
+ left: 0;
+ display: none;
+}
+
+@import url("less/macos.less");
+@import url("less/linux.less");
@import url("less/compact.less");
+@import url("less/directives.less");
\ No newline at end of file
diff --git a/src/renderer/themes/groovy/index.less b/src/renderer/themes/groovy/index.less
new file mode 100644
index 00000000..ab0c0141
--- /dev/null
+++ b/src/renderer/themes/groovy/index.less
@@ -0,0 +1 @@
+//
\ No newline at end of file
diff --git a/src/renderer/themes/groovy/theme.json b/src/renderer/themes/groovy/theme.json
new file mode 100644
index 00000000..db9f5469
--- /dev/null
+++ b/src/renderer/themes/groovy/theme.json
@@ -0,0 +1,15 @@
+{
+ "name": "Groovy",
+ "description": "Inspired by Groove Music and Media Player found on Windows",
+ "version": "1.0.0",
+ "author": "ciderapp",
+ "github_repo": "ciderapp/Groovy",
+ "directives": {
+ "windowLayout": {
+ "value": "twopanel"
+ },
+ "lcdArtworkSize": {
+ "value": 70
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/renderer/themes/sweetener.css b/src/renderer/themes/sweetener.css
new file mode 100644
index 00000000..51e9f4e3
--- /dev/null
+++ b/src/renderer/themes/sweetener.css
@@ -0,0 +1,40 @@
+.menu-panel .menu-panel-body {
+ background-color: rgba(30, 30, 30, 0.45);
+ backdrop-filter: blur(32px) saturate(180%);
+ animation: menuIn 0.1s var(--appleEase);
+}
+@keyframes menuIn {
+ 0% {
+ opacity: 0;
+ transform: translateY(-10px) translate3d(0, 0, 0);
+ background: #1e1e1e;
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ background: rgba(30, 30, 30, 0.45);
+ }
+}
+.cd-mediaitem-square:not(.mediaitem-card) {
+ transition: transform 0.2s var(--appleEase);
+ transition-delay: 0.1s;
+ padding: 12px;
+ height: 250px;
+}
+.cd-mediaitem-square:not(.mediaitem-card) .artwork-container,
+.cd-mediaitem-square:not(.mediaitem-card) .info-rect {
+ transition: transform 0.22s var(--appleEase);
+ transition-delay: 0.05s;
+}
+.cd-mediaitem-square:not(.mediaitem-card):hover .artwork-container {
+ transform: scale(1.1);
+ transition: transform 0.1s var(--appleEase);
+ transition-delay: 0s;
+ transform-origin: center;
+}
+.cd-mediaitem-square:not(.mediaitem-card):hover .info-rect {
+ z-index: 1;
+ transition: transform 0.1s var(--appleEase);
+ transition-delay: 0s;
+ transform: translateY(8px) translate3d(0, 0, 0);
+}
diff --git a/src/renderer/themes/sweetener.less b/src/renderer/themes/sweetener.less
new file mode 100644
index 00000000..681f41d3
--- /dev/null
+++ b/src/renderer/themes/sweetener.less
@@ -0,0 +1,68 @@
+@panelColorsFallback: rgb(30 30 30);
+@panelColors : rgb(30 30 30 / 45%);
+
+.menu-panel {
+ .menu-panel-body {
+ background-color: @panelColors;
+ backdrop-filter : blur(32px) saturate(180%);
+ animation: menuIn .10s var(--appleEase);
+ }
+
+
+ @keyframes menuIn {
+ 0% {
+ opacity : 0;
+ transform : translateY(-10px) translate3d(0,0,0);
+ background: @panelColorsFallback;
+ }
+
+ 100% {
+ opacity : 1;
+ transform : translateY(0);
+ background: @panelColors;
+ }
+ }
+
+}
+
+
+.cd-mediaitem-square:not(.mediaitem-card) {
+ transition : transform .2s var(--appleEase);
+ transition-delay: .1s;
+ padding : 12px;
+
+ // background-color: red;
+ height: 250px;
+
+
+ .artwork-container {}
+
+ .info-rect {}
+
+ .artwork-container,
+ .info-rect {
+ transition : transform .22s var(--appleEase);
+ transition-delay: .05s;
+ }
+
+ &:hover {
+ .artwork-container {
+ transform : scale(1.1);
+ transition : transform .1s var(--appleEase);
+ transition-delay: 0s;
+ transform-origin: center;
+ }
+
+
+ .info-rect {
+ z-index : 1;
+ transition : transform .1s var(--appleEase);
+ transition-delay: 0s;
+ transform : translateY(8px) translate3d(0,0,0);
+ }
+ }
+
+ &:active {
+
+ }
+}
\ No newline at end of file
diff --git a/src/renderer/views/app/app-content.ejs b/src/renderer/views/app/app-content.ejs
new file mode 100644
index 00000000..38549d75
--- /dev/null
+++ b/src/renderer/views/app/app-content.ejs
@@ -0,0 +1,56 @@
+
+
+
+ <%- include('../svg/chevron-left.svg') %>
+
+
+ <%- include('../svg/chevron-right.svg') %>
+
+
+
+
+ <% for(var i=0; i < Object.keys(env.appRoutes).length ; i++) {%>
+
+ v-on:enter="<%- env.appRoutes[i].onEnter %>"
+ <%
+ }
+ %>
+ :name="chrome.desiredPageTransition">
+
+ <%- env.appRoutes[i].component %>
+
+
+ <% } %>
+
+
+
+
+
+
{{$root.getLz('term.recentStations')}}
+
+
+
+
+
+
+ <%- include('../pages/library-recentlyadded') %>');
+
+
+
+
+ <%- include('../pages/madeforyou') %>');
+ %>
+
+
+
+
+
+ <%- include('../pages/library-artists') %>');
+ %>
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/views/app/app-navigation.ejs b/src/renderer/views/app/app-navigation.ejs
new file mode 100644
index 00000000..58833a1c
--- /dev/null
+++ b/src/renderer/views/app/app-navigation.ejs
@@ -0,0 +1,28 @@
+
+ <%- include("sidebar") %>
+ <%- include("app-content") %>
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/views/app/chrome-bottom.ejs b/src/renderer/views/app/chrome-bottom.ejs
new file mode 100644
index 00000000..1fbe6a59
--- /dev/null
+++ b/src/renderer/views/app/chrome-bottom.ejs
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+ {{ mk.nowPlayingItem["attributes"]["name"] }}
+
+
+
+
+
+
+ {{ mk.nowPlayingItem["attributes"]["artistName"] }}
+
+
+
{{"â"}}
+ {{(mk.nowPlayingItem["attributes"]["albumName"]) ?
+ (mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ convertTime(getSongProgress()) }}
+
{{ convertTime(mk.currentPlaybackDuration) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs
new file mode 100644
index 00000000..7493fd9e
--- /dev/null
+++ b/src/renderer/views/app/chrome-top.ejs
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ mk.nowPlayingItem["attributes"]["name"] }}
+
+
+
+
+
+
+ {{ mk.nowPlayingItem["attributes"]["artistName"] }}
+
+
+
{{"â"}}
+ {{(mk.nowPlayingItem["attributes"]["albumName"]) ?
+ (mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
+
+
+
+
+
+
+
{{ convertTime(getSongProgress()) }}
+
{{ convertTime(mk.currentPlaybackDuration) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/views/app/panels.ejs b/src/renderer/views/app/panels.ejs
new file mode 100644
index 00000000..78751e87
--- /dev/null
+++ b/src/renderer/views/app/panels.ejs
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{((lyricon) ? ((lyrics.length > 0 && lyrics[currentLyricsLine] &&
+ lyrics[currentLyricsLine].line ) ?
+ lyrics[currentLyricsLine].line.replace('lrcInstrumental','') : "") : '') + ((lyricon) ?
+ ((lyrics.length
+ > 0 && lyrics[currentLyricsLine] && lyrics[currentLyricsLine].line ) ?
+ (lyrics[currentLyricsLine].translation ? ('\n\r' + lyrics[currentLyricsLine].translation) : ""): "")
+ :
+ '')}}
+
+
+ <%- include("../svg/pip.svg") %>
+
+
+ <%- include("../svg/fullscreen.svg") %>
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/views/app/sidebar.ejs b/src/renderer/views/app/sidebar.ejs
new file mode 100644
index 00000000..102ab15c
--- /dev/null
+++ b/src/renderer/views/app/sidebar.ejs
@@ -0,0 +1,186 @@
+
diff --git a/src/renderer/views/components/add-to-playlist.ejs b/src/renderer/views/components/add-to-playlist.ejs
index ee093413..f209f5b8 100644
--- a/src/renderer/views/components/add-to-playlist.ejs
+++ b/src/renderer/views/components/add-to-playlist.ejs
@@ -12,7 +12,7 @@
<%- include("../svg/plus.svg") %>
{{app.getLz('action.createPlaylist')}}
-
+
@@ -42,6 +42,7 @@
searchQuery: "",
focused: "",
app: this.$root,
+ relateItems: []
}
},
props: {
@@ -51,6 +52,7 @@
}
},
mounted() {
+ this.relateItems = [this.$root.selectedMediaItems[0].id]
this.search()
this.$refs.searchInput.focus()
this.$refs.searchInput.addEventListener('keydown', (e) => {
diff --git a/src/renderer/views/components/animatedartwork-view.ejs b/src/renderer/views/components/animatedartwork-view.ejs
index b6cae3cd..ef091ee3 100644
--- a/src/renderer/views/components/animatedartwork-view.ejs
+++ b/src/renderer/views/components/animatedartwork-view.ejs
@@ -57,9 +57,32 @@
platformInfo: {requiresCDMAttachOnStart: !0, maxSecurityLevel: d, keySystemConfig: h},
appData: {serviceName: "Apple Music"}
}
+
this.hls.attachMedia(this.$refs.video);
this.hls.loadSource(this.video);
- this.hls.loadLevel = parseInt(app.cfg.visual.animated_artwork_qualityLevel || 1);
+ let u = this.hls;
+ var quality = app.cfg.visual.animated_artwork_qualityLevel;
+ setTimeout(() => {
+ let levelsnum = u.levels.map((level)=>{return level.width})
+ if (levelsnum.length > 0) {
+ let qualities = []
+ let qualities2 = []
+ for (let i = 0; i < levelsnum.length; i++) {
+ if (qualities2.indexOf(levelsnum[i]) == -1) {
+ qualities.push({level: i, quality: levelsnum[i]})
+ qualities2.push(levelsnum[i])
+ }
+ }
+ let actualnum = Math.floor(qualities[qualities.length -1 ].level * (quality / 4))
+ if (quality != 0 ){
+ quality = qualities[Math.min(actualnum,qualities.length -1 )].level
+ }
+ if (quality == 4 ){
+ quality = qualities[qualities.length - 1].level
+ }
+ }
+ try{
+ this.hls.loadLevel = parseInt( quality || 1);} catch(e){}},200)
}
})
}
diff --git a/src/renderer/views/components/artist-chip.ejs b/src/renderer/views/components/artist-chip.ejs
new file mode 100644
index 00000000..d0be7f95
--- /dev/null
+++ b/src/renderer/views/components/artist-chip.ejs
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/src/renderer/views/components/audio-controls.ejs b/src/renderer/views/components/audio-controls.ejs
new file mode 100644
index 00000000..57a174e6
--- /dev/null
+++ b/src/renderer/views/components/audio-controls.ejs
@@ -0,0 +1,87 @@
+
+
+
\ No newline at end of file
diff --git a/src/renderer/views/components/audio-settings.ejs b/src/renderer/views/components/audio-settings.ejs
index 379cf9ae..a26ae1b3 100644
--- a/src/renderer/views/components/audio-settings.ejs
+++ b/src/renderer/views/components/audio-settings.ejs
@@ -13,10 +13,20 @@
{{app.getLz('term.equalizer')}}
+ @click="openSpatialAudio()" style="width:100%;">
<%- include("../svg/speaker.svg") %>
{{app.getLz('settings.option.audio.enableAdvancedFunctionality.audioSpatialization')}}
+
+ <%- include("../svg/speaker.svg") %>
+ {{app.getLz('term.audioControls')}}
+
+
+ <%- include("../svg/speaker.svg") %>
+ {{app.getLz('settings.option.audio.audioLab')}}
+
@@ -38,14 +48,19 @@
app.modals.equalizer = true
app.modals.audioSettings = false
},
- openSpacialAudio() {
- if(app.cfg.audio.spatial) {
+ openSpatialAudio() {
+ if(app.cfg.audio.spatial === true && app.cfg.audio.maikiwiAudio.spatial === false) {
app.modals.spatialProperties = true
app.modals.audioSettings = false
} else {
notyf.error(app.getLz('spatial.notTurnedOn'))
}
},
+ openAudioControls() {
+ app.modals.audioControls = true
+ app.modals.audioSettings = false
+ },
+ },
}
- });
+ );
\ No newline at end of file
diff --git a/src/renderer/views/components/castmenu.ejs b/src/renderer/views/components/castmenu.ejs
new file mode 100644
index 00000000..ce3c554d
--- /dev/null
+++ b/src/renderer/views/components/castmenu.ejs
@@ -0,0 +1,107 @@
+
+
\ No newline at end of file
diff --git a/src/renderer/views/components/equalizer.ejs b/src/renderer/views/components/equalizer.ejs
index f5086eca..3ddfff5f 100644
--- a/src/renderer/views/components/equalizer.ejs
+++ b/src/renderer/views/components/equalizer.ejs
@@ -5,11 +5,11 @@
{{$root.getLz('term.equalizer')}}
-
-
+
+
{{preset.name}}
-
+
{{preset.name}}
@@ -23,11 +23,6 @@
Vibrant Bass
-
-
-
- Preamp
-
{{$root.cfg.audio.equalizer.mix}}
@@ -128,7 +123,6 @@
this.frequencies = []
this.gain = []
this.Q = []
- this.preamp = 0
this.mix = 1
this.vibrantBass = 0
this.userGenerated = true
@@ -140,27 +134,15 @@
'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],
'gain': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'Q': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
- 'preamp': 0,
- 'mix': 1,
- 'vibrantBass': 0,
- 'userGenerated': false
- },{
- 'preset': 'warmth',
- 'name': 'Warmth',
- 'frequencies': [32, 75, 125, 197, 500, 1000, 2000, 3040, 8000, 16000],
- 'gain': [0, 2.1, 0, 0.8, 0, 0, 0, -1.5, 0, 0],
- 'Q': [1, 0.7, 1, 1.5, 1, 1, 1, 2, 1, 1],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
}, {
- 'preset': 'boostBrightness',
- 'name': 'Boost Brightness',
- 'frequencies': [32, 63, 125, 250, 466, 1000, 2000, 4000, 8000, 20000],
- 'gain': [0, 0, 0, 0, -2, 0, 0, 0, 0, 10],
- 'Q': [1, 1, 1, 1, 0.6, 1, 1, 1, 1, 0.1],
- 'preamp': 0,
+ 'preset': 'boostAiriness',
+ 'name': 'Boost Airiness',
+ 'frequencies': [1169, 1733, 5962, 8688, 14125, 18628, 18628, 19000, 19500, 20000],
+ 'gain': [-1.41, 0.25, 3.33, 0.22, -0.53, 0.2, 3.64, 0, 0, 0],
+ 'Q': [0.405, 2.102, 0.025, 2.5, 7.071, 1.768, 1.146, 1, 1, 1],
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
@@ -170,7 +152,6 @@
'frequencies': [32, 75, 125, 220, 700, 1000, 2000, 4000, 10000, 16000],
'gain': [0, -8, 0, -0.1, -3, 0, 0, 0, 4, 0],
'Q': [1, 0.2, 1, 2.0, 1.4, 1, 1, 1, 0.1, 1],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
@@ -180,7 +161,6 @@
'frequencies': [20, 63, 125, 250, 400, 1000, 2000, 4000, 8000, 20000],
'gain': [-22, 0, 0, 0, -3, 0, 1.8, 0, 0, 3.5],
'Q': [0.3, 1, 1, 1, 2.0, 1, 0.7, 1, 1, 0.8],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
@@ -190,7 +170,6 @@
'frequencies': [20, 63, 155, 250, 500, 1000, 2000, 5000, 11000, 16000],
'gain': [-15, 0, -3, 0, 0, 0, 0, 3.1, 0, 0],
'Q': [0.5, 1, 2, 1, 1, 1, 1, 1.5, 0.1, 1],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
@@ -200,7 +179,6 @@
'frequencies': [32, 63, 125, 250, 500, 1128, 2000, 4057, 8000, 16000],
'gain': [0, 0, 0, 0, 0, 2, 0, -6.4, 0, 0],
'Q': [1, 1, 1, 1, 1, 2, 1, 1, 1, 1],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
@@ -210,29 +188,16 @@
'frequencies': [35, 63, 125, 250, 500, 800, 2000, 4000, 8000, 20000],
'gain': [5, 0, 0, 0, 0, -5, 0, 0, 0, 5],
'Q': [0.1, 1, 1, 1, 1, 0.6, 1, 1, 1, 0.2],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
},
- {
- 'preset': 'bassBoostGentle',
- 'name': 'Gentle Bass Boost',
- 'frequencies': [45.53,88.06,116.18,161.3,247.05,295.6,365.79,495.13,716.85,960.76],
- 'gain': [-0.36,4.07,-1.3,1.92,0.77,-0.53,-1.33,0.44,0.46,-0.5],
- 'Q': [1.768,0.625,5,8.409,10,16.82,5.946,7.071,20,10],
- 'preamp': -2,
- 'mix': 1,
- 'vibrantBass': 0,
- 'userGenerated': false
- },
{
'preset': 'bassBoostSurgical',
'name': 'Surgical Bass Boost',
'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],
'gain': [2.7, 2.2, 1.6, 1.4, 0.6, 0, 0, 0, 0, 0],
'Q': [1.4, 1.4, 1.4, 1.4, 1.4, 1, 1, 1, 1, 1],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
@@ -242,7 +207,6 @@
'frequencies': [32, 63, 160, 250, 500, 1000, 2000, 3500, 8000, 20000],
'gain': [2.7, 2.2, 1.6, 1.4, 0.6, 0, 0, 0, 0, 0],
'Q': [0.7, 0.7, 0.7, 0.7, 0.7, 1, 1, 1, 1, 1],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
'userGenerated': false
@@ -273,15 +237,15 @@
"import": {
"icon": "./assets/feather/share.svg",
"name": app.getLz('action.import'),
- "action": function () {
- this.importPreset()
+ action: () => {
+ notyf.error("Not implemented yet")
}
},
"export": {
"icon": "./assets/feather/share.svg",
"name": app.getLz('action.export'),
- "action": function () {
- this.exportPreset()
+ action: () => {
+ notyf.error("Not implemented yet")
}
},
}
@@ -330,13 +294,20 @@
app.resetState()
},
changeVibrantBass() {
- app.cfg.audio.vibrantBass.multiplier = app.cfg.audio.equalizer.vibrantBass / 10
- for (var i = 0; i < 21; i++) {
- CiderAudio.audioNodes.vibrantbassNode[i].gain.value = app.cfg.audio.vibrantBass.gain[i] * (app.cfg.audio.equalizer.vibrantBass / 10);
- }
- },
- changePreamp() {
- CiderAudio.audioNodes.preampNode.gain.value = app.cfg.audio.equalizer.preamp;
+ app.cfg.audio.maikiwiAudio.vibrantBass.multiplier = app.cfg.audio.equalizer.vibrantBass / 10
+ if (app.cfg.audio.equalizer.vibrantBass !== '0') {
+ try {
+ for (var i = 0; i < 21; i++) {
+ CiderAudio.audioNodes.vibrantbassNode[i].gain.value = app.cfg.audio.maikiwiAudio.vibrantBass.gain[i] * (app.cfg.audio.equalizer.vibrantBass / 10);
+ }}
+ catch(e) {
+ CiderAudio.hierarchical_loading();
+ }
+ }
+
+ else {
+ CiderAudio.hierarchical_loading();
+ }
},
changeMix() {
for (var i = 0; i < 10; i++) {
@@ -357,7 +328,6 @@
'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],
'gain': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'Q': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
- 'preamp': 0,
'mix': 1,
'vibrantBass': 0,
})
@@ -375,7 +345,6 @@
newPreset.frequencies = eqSettings.frequencies
newPreset.gain = eqSettings.gain
newPreset.Q = eqSettings.Q
- newPreset.preamp = eqSettings.preamp
newPreset.mix = eqSettings.mix
newPreset.vibrantBass = eqSettings.vibrantBass
app.cfg.audio.equalizer.presets.push(newPreset)
@@ -393,14 +362,13 @@
preset.frequencies = app.cfg.audio.equalizer.frequencies
preset.gain = app.cfg.audio.equalizer.gain
preset.Q = app.cfg.audio.equalizer.Q
- preset.preamp = app.cfg.audio.equalizer.preamp
preset.mix = app.cfg.audio.equalizer.mix
preset.vibrantBass = app.cfg.audio.equalizer.vibrantBass
notyf.success("Saved Preset")
},
exportPreset() {
const preset = app.cfg.audio.equalizer.presets.find(p => p.preset == app.cfg.audio.equalizer.preset)
- const jsonObj = {"name": preset.name, "author": app.chrome.userinfo.attributes.name, "frequency": preset.frequencies, "gain": preset.gain, "q": preset.Q, "preamp": preset.preamp, "mix": preset.mix, "vibrantBass": preset.vibrantBass};
+ const jsonObj = {"name": preset.name, "author": app.chrome.userinfo.attributes.name, "frequency": preset.frequencies, "gain": preset.gain, "q": preset.Q, "mix": preset.mix, "vibrantBass": preset.vibrantBass};
ipcRenderer.send("export-eq", jsonObj)
},
importPreset() {
@@ -411,7 +379,6 @@
newPreset.frequencies = result.frequency
newPreset.gain = result.gain
newPreset.Q = result.q
- newPreset.preamp = result.preamp
newPreset.mix = result.mix
newPreset.vibrantBass = result.vibrantBass
app.cfg.audio.equalizer.presets.push(newPreset)
@@ -423,7 +390,6 @@
},
applyPreset(preset) {
Object.assign(this.$root.cfg.audio.equalizer, preset)
- this.changePreamp()
this.changeVibrantBass()
for (var i = 0; i < 10; i++) {
this.changeGain(i)
diff --git a/src/renderer/views/components/fullscreen.ejs b/src/renderer/views/components/fullscreen.ejs
index e35c760b..065863c6 100644
--- a/src/renderer/views/components/fullscreen.ejs
+++ b/src/renderer/views/components/fullscreen.ejs
@@ -3,9 +3,9 @@
@@ -14,7 +14,7 @@
@@ -41,8 +41,8 @@
-
{{ app.convertToMins(app.getSongProgress()) }}
-
{{ app.convertToMins(app.mk.currentPlaybackDuration) }}
+
{{ app.convertTime(app.getSongProgress()) }}
+
{{ app.convertTime(app.mk.currentPlaybackDuration) }}
-
+
diff --git a/src/renderer/views/components/hello-world.ejs b/src/renderer/views/components/hello-world.ejs
index 6fa4e1f7..acbac471 100644
--- a/src/renderer/views/components/hello-world.ejs
+++ b/src/renderer/views/components/hello-world.ejs
@@ -3,7 +3,7 @@
+
+
\ No newline at end of file
diff --git a/src/renderer/views/components/mediaitem-artwork.ejs b/src/renderer/views/components/mediaitem-artwork.ejs
index e39a621b..16a79210 100644
--- a/src/renderer/views/components/mediaitem-artwork.ejs
+++ b/src/renderer/views/components/mediaitem-artwork.ejs
@@ -1,5 +1,5 @@
@@ -90,17 +99,17 @@
}
},
props: {
- 'item': {type: Object, required: true},
- 'parent': {type: String, required: false},
- 'index': {type: Number, required: false, default: -1},
- 'show-artwork': {type: Boolean, default: true},
- 'show-library-status': {type: Boolean, default: true},
- 'show-meta-data': {type: Boolean, default: false},
- 'show-duration': {type: Boolean, default: true},
- 'showIndex': {type: Boolean, required: false},
- 'showIndexPlaylist': {type: Boolean, required: false},
- 'contextExt': {type: Object, required: false},
- 'class-list': {type: String, required: false, default: ""},
+ 'item': { type: Object, required: true },
+ 'parent': { type: String, required: false },
+ 'index': { type: Number, required: false, default: -1 },
+ 'show-artwork': { type: Boolean, default: true },
+ 'show-library-status': { type: Boolean, default: true },
+ 'show-meta-data': { type: Boolean, default: false },
+ 'show-duration': { type: Boolean, default: true },
+ 'showIndex': { type: Boolean, required: false },
+ 'showIndexPlaylist': { type: Boolean, required: false },
+ 'contextExt': { type: Object, required: false },
+ 'class-list': { type: String, required: false, default: "" },
},
mounted() {
let duration = this.item.attributes.durationInMillis ?? 0
@@ -115,21 +124,21 @@
return color
},
async checkLibrary() {
- if(this.addedToLibrary) {return this.addedToLibrary}
- if(this.item.type.includes("library-playlists") || this.item.type.includes("station")) {
+ if (this.addedToLibrary) { return this.addedToLibrary }
+ if (this.item.type.includes("library-playlists") || this.item.type.includes("station")) {
this.addedToLibrary = true
return
}
this.$root.inLibrary([this.item]).then(res => {
- this.addedToLibrary = res[0].attributes.inLibrary
+ this.addedToLibrary = res[0]?.attributes?.inLibrary ?? false
})
return this.addedToLibrary
},
getClasses() {
- if(this.classList) {
+ if (this.classList) {
this.addClasses = {}
let classList = this.classList.split(' ')
- for(let i = 0; i < classList.length; i++) {
+ for (let i = 0; i < classList.length; i++) {
this.addClasses[classList[i]] = true
}
}
@@ -259,7 +268,7 @@
for (let kind in itemsToPlay) {
let ids = itemsToPlay[kind]
if (ids.length > 0) {
- app.mk.playNext({[kind + "s"]: itemsToPlay[kind]})
+ app.mk.playNext({ [kind + "s"]: itemsToPlay[kind] })
}
}
console.log(itemsToPlay)
@@ -281,7 +290,7 @@
for (let kind in itemsToPlay) {
let ids = itemsToPlay[kind]
if (ids.length > 0) {
- app.mk.playLater({[kind + "s"]: itemsToPlay[kind]})
+ app.mk.playLater({ [kind + "s"]: itemsToPlay[kind] })
}
}
app.selectedMediaItems = []
@@ -363,7 +372,7 @@
"name": app.getLz('action.playNext'),
"icon": "./assets/arrow-bend-up.svg",
"action": function () {
- app.mk.playNext({[self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id})
+ app.mk.playNext({ [self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id })
app.mk.queue._reindex()
app.selectedMediaItems = []
}
@@ -372,7 +381,7 @@
"name": app.getLz('action.playLater'),
"icon": "./assets/arrow-bend-down.svg",
"action": function () {
- app.mk.playLater({[self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id})
+ app.mk.playLater({ [self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id })
app.mk.queue._reindex()
app.selectedMediaItems = []
}
@@ -381,7 +390,7 @@
"icon": "./assets/feather/radio.svg",
"name": app.getLz('action.startRadio'),
"action": function () {
- app.mk.setStationQueue({song: self.item.attributes.playParams.id ?? self.item.id}).then(() => {
+ app.mk.setStationQueue({ song: self.item.attributes.playParams.id ?? self.item.id }).then(() => {
app.mk.play()
app.selectedMediaItems = []
})
@@ -405,12 +414,26 @@
"icon": "./assets/feather/share.svg",
"name": app.getLz('action.share'),
"action": function () {
- if (!self.item.attributes.url && self.item.relationships){
- if (self.item.relationships.catalog){
- app.mkapi(self.item.attributes.playParams.kind, false, self.item.relationships.catalog.data[0].id).then(u => {self.app.copyToClipboard((u.data.data.length && u.data.data.length > 0)? u.data.data[0].attributes.url : u.data.data.attributes.url)})
+ if (!self.item.attributes.url && self.item.relationships) {
+ if (self.item.relationships.catalog) {
+ app.mkapi(self.item.attributes.playParams.kind, false, self.item.relationships.catalog.data[0].id).then(u => { self.app.copyToClipboard((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url) })
}
- }else {
- self.app.copyToClipboard(self.item.attributes.url)}
+ } else {
+ self.app.copyToClipboard(self.item.attributes.url)
+ }
+ }
+ },
+ {
+ "icon": "./assets/feather/share.svg",
+ "name": `${app.getLz('action.share')} (song.link)`,
+ "action": function () {
+ if (!self.item.attributes.url && self.item.relationships) {
+ if (self.item.relationships.catalog) {
+ app.mkapi(self.item.attributes.playParams.kind, false, self.item.relationships.catalog.data[0].id).then(u => { self.app.songLinkShare((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url) })
+ }
+ } else {
+ self.app.songLinkShare(self.item.attributes.url)
+ }
}
}
]
@@ -430,31 +453,31 @@
try {
await this.checkLibrary().then(res => {
console.log(res)
- if(res) {
+ if (res) {
menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true
menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false
- }else{
+ } else {
menus.normal.items.find(x => x.id == 'addToLibrary').disabled = false
}
})
- }catch(e) {
+ } catch (e) {
}
- try{
- let rating = await app.getRating(self.item)
- if (rating == 0) {
- menus.normal.headerItems.find(x => x.id == 'love').disabled = false
- menus.normal.headerItems.find(x => x.id == 'dislike').disabled = false
- } else if (rating == 1) {
- menus.normal.headerItems.find(x => x.id == 'unlove').hidden = false
- menus.normal.headerItems.find(x => x.id == 'love').hidden = true
- } else if (rating == -1) {
- menus.normal.headerItems.find(x => x.id == 'undo_dislike').hidden = false
- menus.normal.headerItems.find(x => x.id == 'dislike').hidden = true
- }
- } catch(err) {
-
+ try {
+ let rating = await app.getRating(self.item)
+ if (rating == 0) {
+ menus.normal.headerItems.find(x => x.id == 'love').disabled = false
+ menus.normal.headerItems.find(x => x.id == 'dislike').disabled = false
+ } else if (rating == 1) {
+ menus.normal.headerItems.find(x => x.id == 'unlove').hidden = false
+ menus.normal.headerItems.find(x => x.id == 'love').hidden = true
+ } else if (rating == -1) {
+ menus.normal.headerItems.find(x => x.id == 'undo_dislike').hidden = false
+ menus.normal.headerItems.find(x => x.id == 'dislike').hidden = true
+ }
+ } catch (err) {
+ console.log(err)
}
},
visibilityChanged: function (isVisible, entry) {
@@ -474,7 +497,7 @@
},
async removeFromLibrary() {
let item = this.item
- let params = {"fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library"}
+ let params = { "fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library" }
let id = item.id ?? item.attributes.playParams.id
let res = await app.mkapi(item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.playParams.id ?? item.id, params);
if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) {
@@ -502,10 +525,10 @@
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
console.log(item, parent, childIndex, kind, id, isLibrary, kind == "playlists", id.startsWith("p.") || id.startsWith("pl.u"))
app.mk.stop().then(() => {
- if (parent != null && childIndex != null) {
- app.queueParentandplayChild(parent, childIndex, item);
- }
- else if (kind.includes("playlist") && (id.startsWith("p.") || id.startsWith("pl."))){
+ if (parent != null && childIndex != null) {
+ app.queueParentandplayChild(parent, childIndex, item);
+ }
+ else if (kind.includes("playlist") && (id.startsWith("p.") || id.startsWith("pl."))) {
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
@@ -514,58 +537,59 @@
array[j] = temp;
}
}
- app.mk.setQueue({[truekind]: [item.attributes.playParams.id ?? item.id]}).then(function () {
- app.mk.play().then(function (){
- var playlistId = id
- function getPlaylist(id, isLibrary){
- if (isLibrary){
- return this.app.mk.api.v3.music(`/v1/me/library/playlists/${id}`)
- } else { return this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`)}
+ app.mk.setQueue({ [truekind]: [item.attributes.playParams.id ?? item.id] , parameters : {l : this.app.mklang} }).then(function () {
+ app.mk.play().then(function () {
+ var playlistId = id
+ function getPlaylist(id, isLibrary) {
+ if (isLibrary) {
+ return this.app.mk.api.v3.music(`/v1/me/library/playlists/${id}`)
+ } else { return this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`) }
+ }
+ try {
+ getPlaylist(id, isLibrary).then(res => {
+ //let query = res.relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
+ //if (app.mk.shuffleMode == 1){shuffleArray(query); }
+ // console.log(query)
+ // app.mk.queue.append(query)
+ if (!res.data.relationships.tracks.next) {
+ return
+ } else {
+ getPlaylistTracks(res.data.relationships.tracks.next)
}
- try {
- getPlaylist(id, isLibrary).then(res => {
- //let query = res.relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
- //if (app.mk.shuffleMode == 1){shuffleArray(query); }
- // console.log(query)
- // app.mk.queue.append(query)
- if (!res.data.relationships.tracks.next) {
- return
- } else {
- getPlaylistTracks(res.data.relationships.tracks.next)
- }
- function getPlaylistTracks(next) {
- app.apiCall(app.musicBaseUrl + next, res => {
- // if (res.id != playlistId || next.includes(playlistId)) {
- // return
- // }
- console.log('nextres', res)
- let query = res.data.map(item => new MusicKit.MediaItem(item))
- if (app.mk.shuffleMode == 1){shuffleArray(query); console.log('shf')}
- app.mk.queue.append(query)
+ function getPlaylistTracks(next) {
+ app.apiCall(app.musicBaseUrl + next, res => {
+ // if (res.id != playlistId || next.includes(playlistId)) {
+ // return
+ // }
+ console.log('nextres', res)
+ let query = res.data.map(item => new MusicKit.MediaItem(item))
+ if (app.mk.shuffleMode == 1) { shuffleArray(query); console.log('shf') }
+ app.mk.queue.append(query)
- if (res.next) {
- getPlaylistTracks(res.next)
- }
- })
+ if (res.next) {
+ getPlaylistTracks(res.next)
}
})
- } catch (e) {}
+ }
+ })
+ } catch (e) { }
- })
- })
+ })
+ })
- }
- else {
- app.playMediaItemById(item.attributes.playParams.id ?? item.id, item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.url)
- }})
+ }
+ else {
+ app.playMediaItemById(item.attributes.playParams.id ?? item.id, item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.url)
+ }
+ })
},
- route(){
+ route() {
let kind = (this.item.attributes.playParams ? (this.item.attributes.playParams.kind ?? (this.item.type ?? '')) : (this.item.type ?? ''));
- if (kind.toLowerCase().includes('album') || kind.toLowerCase().includes('playlist')){
+ if (kind.toLowerCase().includes('album') || kind.toLowerCase().includes('playlist')) {
app.routeView(this.item)
} else {
this.playTrack()
diff --git a/src/renderer/views/components/mediaitem-scroller-horizontal-large.ejs b/src/renderer/views/components/mediaitem-scroller-horizontal-large.ejs
index a8c709f6..0c26d60d 100644
--- a/src/renderer/views/components/mediaitem-scroller-horizontal-large.ejs
+++ b/src/renderer/views/components/mediaitem-scroller-horizontal-large.ejs
@@ -1,10 +1,8 @@
diff --git a/src/renderer/views/components/mediaitem-scroller-horizontal-mvview.ejs b/src/renderer/views/components/mediaitem-scroller-horizontal-mvview.ejs
index a9c3a036..da292a71 100644
--- a/src/renderer/views/components/mediaitem-scroller-horizontal-mvview.ejs
+++ b/src/renderer/views/components/mediaitem-scroller-horizontal-mvview.ejs
@@ -1,18 +1,18 @@
@@ -43,6 +43,8 @@
app: this.$root,
}
},
- methods: {}
+ // mounted(){
+ // console.log('hes',this.items)
+ // }
});
\ No newline at end of file
diff --git a/src/renderer/views/components/mediaitem-scroller-horizontal-sp.ejs b/src/renderer/views/components/mediaitem-scroller-horizontal-sp.ejs
index f7a5e4b3..d83cd68e 100644
--- a/src/renderer/views/components/mediaitem-scroller-horizontal-sp.ejs
+++ b/src/renderer/views/components/mediaitem-scroller-horizontal-sp.ejs
@@ -1,9 +1,11 @@
diff --git a/src/renderer/views/components/mediaitem-scroller-horizontal.ejs b/src/renderer/views/components/mediaitem-scroller-horizontal.ejs
index e1413c7c..dfda58e4 100644
--- a/src/renderer/views/components/mediaitem-scroller-horizontal.ejs
+++ b/src/renderer/views/components/mediaitem-scroller-horizontal.ejs
@@ -1,11 +1,8 @@
-
-
\ No newline at end of file
diff --git a/src/renderer/views/components/mediaitem-square-sp.ejs b/src/renderer/views/components/mediaitem-square-sp.ejs
deleted file mode 100644
index 89859695..00000000
--- a/src/renderer/views/components/mediaitem-square-sp.ejs
+++ /dev/null
@@ -1,293 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs
index bdb39c17..296d1780 100644
--- a/src/renderer/views/components/mediaitem-square.ejs
+++ b/src/renderer/views/components/mediaitem-square.ejs
@@ -1,10 +1,17 @@
+
+
\ No newline at end of file
diff --git a/src/renderer/views/components/queue-item.ejs b/src/renderer/views/components/queue-item.ejs
deleted file mode 100644
index 0dd56c64..00000000
--- a/src/renderer/views/components/queue-item.ejs
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/src/renderer/views/components/queue.ejs b/src/renderer/views/components/queue.ejs
index 6e8d657c..b08bdebf 100644
--- a/src/renderer/views/components/queue.ejs
+++ b/src/renderer/views/components/queue.ejs
@@ -8,7 +8,10 @@
-
+
+
+
+
{{ position }}
@@ -33,7 +36,11 @@
@@ -49,6 +56,8 @@
queueItems: [],
selected: -1,
selectedItems: [],
+ history: [],
+ page: "queue",
app: this.$root
}
},
@@ -56,6 +65,10 @@
this.updateQueue()
},
methods: {
+ async getHistory() {
+ let history = await app.mk.api.v3.music(`/v1/me/recent/played/tracks`, { l : this.$root.mklang})
+ this.history = history.data.data
+ },
select(e, position) {
if(e.ctrlKey || e.shiftKey) {
if(this.selectedItems.indexOf(position) == -1) {
@@ -81,8 +94,8 @@
self.queueItems.splice(position, 1)
app.mk.queue._queueItems = self.queueItems;
app.mk.queue._reindex()
- }
- },
+ }
+ },
{
"name": app.getLz('action.startRadio'),
"action": function () {
@@ -93,6 +106,18 @@
})
}
},
+ {
+ "name": app.getLz('action.goToArtist'),
+ "action": function () {
+ app.searchAndNavigate(item,'artist')
+ }
+ },
+ {
+ "name": app.getLz('action.goToAlbum'),
+ "action": function () {
+ app.searchAndNavigate(item,'album')
+ }
+ },
]
},
multiple: {
diff --git a/src/renderer/views/components/share-sheet.ejs b/src/renderer/views/components/share-sheet.ejs
new file mode 100644
index 00000000..ee093413
--- /dev/null
+++ b/src/renderer/views/components/share-sheet.ejs
@@ -0,0 +1,88 @@
+
+
+
\ No newline at end of file
diff --git a/src/renderer/views/components/sidebar-playlist.ejs b/src/renderer/views/components/sidebar-playlist.ejs
index 83df7072..2b1b9070 100644
--- a/src/renderer/views/components/sidebar-playlist.ejs
+++ b/src/renderer/views/components/sidebar-playlist.ejs
@@ -9,13 +9,14 @@
:href="item.href"
@click='clickEvent()'>
- {{ item.attributes.name }}
+ {{ item.attributes.name }}
+ (Track present)
-
+
@@ -35,6 +36,13 @@
playlistSelect: {
type: Function,
required: false
+ },
+ relateMediaItems: {
+ type: Array,
+ required: false,
+ default () {
+ return []
+ }
}
},
data: function () {
@@ -43,7 +51,8 @@
children: [],
playlistRoot: "p.playlistsroot",
renaming: false,
- icon: ""
+ icon: "",
+ hasRelatedMediaItems: false
}
},
async mounted() {
@@ -52,6 +61,12 @@
} else {
this.icon = await this.$root.getSvgIcon("./assets/feather/folder.svg")
}
+ let playlistMap = this.$root.playlists.trackMapping
+ if(this.relateMediaItems.length != 0) {
+ if(playlistMap[this.relateMediaItems[0]].includes(this.item.id)) {
+ this.hasRelatedMediaItems = true
+ }
+ }
},
methods: {
clickEvent() {
@@ -189,7 +204,7 @@
openPlaylist(item) {
this.$root.appRoute(`playlist_` + item.id);
this.$root.showingPlaylist = [];
- this.$root.getPlaylistFromID(this.$root.page.substring(9))
+ this.$root.getPlaylistFromID(this.$root.page.substring(9), true)
},
getPlaylistChildren(item) {
let self = this
diff --git a/src/renderer/views/main.ejs b/src/renderer/views/main.ejs
index ebfa0ac0..78def301 100644
--- a/src/renderer/views/main.ejs
+++ b/src/renderer/views/main.ejs
@@ -2,710 +2,106 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Cider
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ mk.nowPlayingItem["attributes"]["name"] }}
-
-
-
-
-
- {{ mk.nowPlayingItem["attributes"]["artistName"] }}
-
-
-
{{"â"}}
- {{(mk.nowPlayingItem["attributes"]["albumName"]) ?
- (mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
-
-
-
-
-
-
-
{{ convertToMins(getSongProgress()) }}
-
{{ convertToMins(mk.currentPlaybackDuration) }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%- include("svg/cast.svg") %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%- include('svg/chevron-left.svg') %>
-
-
- <%- include('svg/chevron-right.svg') %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%- include('pages/zoo') %>
-
-
- <%- include('pages/webview') %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{$root.getLz('term.recentStations')}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%- include('pages/library-recentlyadded') %>');
-
-
-
-
-
-
-
-
-
- <%- include('pages/library-albums') %>');
- %>
-
-
-
-
- <%- include('pages/madeforyou') %>');
- %>
-
-
-
-
-
- <%- include('pages/library-artists') %>');
- %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{((lyricon) ? ((lyrics.length > 0 && lyrics[currentLyricsLine] &&
- lyrics[currentLyricsLine].line ) ?
- lyrics[currentLyricsLine].line.replace('lrcInstrumental','') : "") : '') + ((lyricon) ?
- ((lyrics.length
- > 0 && lyrics[currentLyricsLine] && lyrics[currentLyricsLine].line ) ?
- (lyrics[currentLyricsLine].translation ? ('\n\r' + lyrics[currentLyricsLine].translation) : ""): "")
- :
- '')}}
-
-
- <%- include("svg/pip.svg") %>
-
-
- <%- include("svg/fullscreen.svg") %>
-
-
-
+
+ <%- include("../assets/cider-round.svg") %>
-
+
+
+
+ <%- include('app/chrome-top'); %>
+ <%- include('app/app-navigation'); %>
+ <%- include('app/chrome-bottom'); %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%- include('app/panels'); %>
+
+
+
+ <% for(var i=0; i < Object.keys(env.components).length ; i++) {%>
+ <%- include(env.components[i]); %>
+ <% } %>
-
-<%- include('pages/podcasts') %>
-
-<%- include('pages/apple-account-settings') %>
-
-<%- include('pages/library-songs') %>
+
+
-
-<%- include("components/mediaitem-artwork"); %>
-
-<%- include('pages/browse') %>
-
-
-<%- include('pages/settings') %>
-
-
-<%- include('pages/listen_now') %>
-
-
-<%- include('pages/home') %>
-
-
-<%- include('pages/artist-feed') %>
-
-
-<%- include('pages/cider-playlist') %>
-
-
-<%- include('pages/recordLabel') %>
-
-
-<%- include('pages/collection-list') %>
-
-
-<%- include('pages/apple-curator') %>
-
-
-<%- include('pages/artist') %>
-
-
-<%- include('pages/search') %>
-
-
-<%- include('pages/about') %>
-
-
-<%- include('pages/library-videos') %>
-
-
-
-
-
-<%- include('components/artwork-material') %>
-
-<%- include('components/menu-panel') %>
-
-<%- include('components/sidebar-playlist')
-%>
-
-<%- include('components/spatial-properties')
-%>
-
-<%- include('components/audio-settings')
-%>
-
-<%- include('components/qrcode-modal')
-%>
-
-<%- include('components/equalizer')
-%>
-
-<%- include('components/add-to-playlist')
-%>
-
-<%- include('components/queue')
-%>
-
-<%- include('components/queue-item')
-%>
-
-<%- include('components/mediaitem-scroller-horizontal')
-%>
-
-<%- include('components/mediaitem-scroller-horizontal-large')
-%>
-
-<%- include('components/mediaitem-scroller-horizontal-sp')
-%>
-
-<%- include('components/mediaitem-scroller-horizontal-mvview')
-%>
-
-<%- include('components/mediaitem-list-item')
-%>
-
-<%- include('components/mediaitem-hrect')
-%>
-
-<%- include('components/mediaitem-square')
-%>
-
-<%- include('components/mediaitem-square-sp')
-%>
-
-<%- include('components/mediaitem-mvview')
-%>
-
-<%- include('components/libraryartist-item')
-%>
-<%- include('components/listennow-child')
-%>
-
-<%- include('components/mediaitem-mvview-sp')
-%>
-
-<%- include('components/animatedartwork-view')
-%>
-
-<%- include('components/lyrics-view')
-%>
-
-<%- include('components/fullscreen')
-%>
-
-
-<%- include('components/miniplayer')
-%>
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/src/renderer/views/pages/about.ejs b/src/renderer/views/pages/about.ejs
index c6ec7cdf..23b40f09 100644
--- a/src/renderer/views/pages/about.ejs
+++ b/src/renderer/views/pages/about.ejs
@@ -3,6 +3,7 @@
+
{{ $root.getLz("term.version") }} {{ $root.version }}
{{$root.getLz('about.thanks')}}
"{{$root.getLz('term.appleMusic')}}" - {{$root.getLz('term.copyright')}} Š 2022
@@ -55,6 +58,7 @@
data: function () {
return {
window: window,
+ version: app.version,
team: [
{
name: 'cryptofyre',
@@ -85,6 +89,18 @@
link: 'https://github.com/vapormusic',
role: app.getLz('term.developer'),
avatar: 'https://avatars.githubusercontent.com/u/27716185?v=4'
+ },
+ {
+ name: 'crypticplank',
+ link: 'https://github.com/crypticplank',
+ role: app.getLz('term.developer'),
+ avatar: 'https://avatars.githubusercontent.com/u/52553007?v=4'
+ },
+ {
+ name: 'Maikiwi',
+ link: 'https://github.com/maikirakiwi',
+ role: app.getLz('term.developer'),
+ avatar: 'https://avatars.githubusercontent.com/u/74925636?v=4'
},
{
name: 'Void',
diff --git a/src/renderer/views/pages/artist-feed.ejs b/src/renderer/views/pages/artist-feed.ejs
index 2a354bd8..e2af0b51 100644
--- a/src/renderer/views/pages/artist-feed.ejs
+++ b/src/renderer/views/pages/artist-feed.ejs
@@ -8,18 +8,16 @@
{{app.getLz('home.followedArtists')}}
-
-
-
-
-
- {{app.getLz('action.unfollow')}}
-
-
-
-
+
+
+
+
+ {{app.getLz('action.unfollow')}}
+
+
+
@@ -80,21 +78,30 @@
let self = this
this.artists = []
this.artistFeed = []
- this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${artists.toString()}&views=latest-release&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=2&art[url]=f`).then(artistData => {
- artistData.data.data.forEach(item => {
- self.artists.push(item)
- if (item.views["latest-release"].data.length != 0) {
- self.artistFeed.push(item.views["latest-release"].data[0])
- }
- })
+
+ // Apple limits the number of IDs we can provide in a single API call to 50.
+ // Divide it into groups of 50 and send parallel requests
+ let chunks = []
+ for (let artistIdx = 0; artistIdx < artists.length; artistIdx += 50) {
+ chunks.push(artists.slice(artistIdx, artistIdx + 50))
+ }
+ try {
+ const chunkArtistData = await Promise.all(chunks.map(chunk =>
+ this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${chunk.toString()}&views=latest-release&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=2&art[url]=f`)))
+ chunkArtistData.forEach(chunkResult =>
+ chunkResult.data.data.forEach(item => {
+ self.artists.push(item)
+ if (item.views["latest-release"].data.length != 0) {
+ self.artistFeed.push(item.views["latest-release"].data[0])
+ }
+ }))
// sort artistFeed by attributes.releaseDate descending, date is formatted as "YYYY-MM-DD"
this.artistFeed.sort((a, b) => {
let dateA = new Date(a.attributes.releaseDate)
let dateB = new Date(b.attributes.releaseDate)
return dateB - dateA
})
- })
-
+ } catch (err) { }
}
}
});
diff --git a/src/renderer/views/pages/artist.ejs b/src/renderer/views/pages/artist.ejs
index d6c69394..b7bcab37 100644
--- a/src/renderer/views/pages/artist.ejs
+++ b/src/renderer/views/pages/artist.ejs
@@ -57,35 +57,32 @@
-
+
+
{{app.getLz('term.latestReleases')}}
+
+
+
+
+
+
-
-
{{app.getLz('term.latestReleases')}}
-
-
-
-
+
+
{{app.getLz('term.topSongs')}}
-
-
-
-
{{app.getLz('term.topSongs')}}
-
-
- {{app.getLz('term.seeAll')}}
-
-
-
+
+ {{app.getLz('term.seeAll')}}
+
+
diff --git a/src/renderer/views/pages/audiolabs.ejs b/src/renderer/views/pages/audiolabs.ejs
new file mode 100644
index 00000000..21b2a6c1
--- /dev/null
+++ b/src/renderer/views/pages/audiolabs.ejs
@@ -0,0 +1,222 @@
+
+
+
\ No newline at end of file
diff --git a/src/renderer/views/pages/cider-playlist.ejs b/src/renderer/views/pages/cider-playlist.ejs
index a34b3f94..c49d03f4 100644
--- a/src/renderer/views/pages/cider-playlist.ejs
+++ b/src/renderer/views/pages/cider-playlist.ejs
@@ -21,7 +21,7 @@
:video-priority="true"
:url="(data.attributes != null && data.attributes.artwork != null) ? data.attributes.artwork.url : ((data.relationships != null && data.relationships.tracks.data.length > 0 && data.relationships.tracks.data[0].attributes != null) ? ((data.relationships.tracks.data[0].attributes.artwork != null)? data.relationships.tracks.data[0].attributes.artwork.url : ''):'')"
:video="(data.attributes != null && data.attributes.editorialVideo != null) ? (data.attributes.editorialVideo.motionDetailSquare ? data.attributes.editorialVideo.motionDetailSquare.video : (data.attributes.editorialVideo.motionSquareVideo1x1 ? data.attributes.editorialVideo.motionSquareVideo1x1.video : '')) : '' "
- size="260"
+ size="500"
>
@@ -32,23 +32,32 @@
{{data.attributes ? (data.attributes.name ??
(data.attributes.title ?? '') ?? '') : ''}}
-
+ @keydown.enter="editPlaylist"/>
+
{{getArtistName(data)}}
-
-
-
+
+
+
+
+
+
- {{app.getLz('term.showMore')}}
+ {{app.getLz('term.showMore')}}
@@ -57,26 +66,31 @@
-
{{app.getLz('term.showLess')}}
+
+ {{app.getLz('term.showLess')}}
-