From cf25e28c28fff56938e3312c748a94dda0dc2213 Mon Sep 17 00:00:00 2001 From: wt Date: Wed, 28 Oct 2026 15:59:54 +0700 Subject: [PATCH] initial commit --- .dockerignore | 6 + .github/workflows/rust.yml | 19 + .gitignore | 4 + Cargo.lock | 4128 +++++++++++++++++ Cargo.toml | 65 + Dockerfile | 22 + LICENSE | 661 +++ NOTICE | 7 + README.md | 63 + README.ru.md | 102 + compatibility/CURRENT.md | 44 + compatibility/README.md | 116 + compatibility/VERIFICATION-0.2.0.md | 40 + compatibility/VERIFICATION.md | 43 + compatibility/cases.admin-sharing.json | 715 +++ compatibility/cases.device.json | 185 + compatibility/cases.example.json | 8 + compatibility/cases.extended.json | 238 + compatibility/cases.oauth.json | 764 +++ compatibility/cases.stateful.json | 130 + compatibility/database-portability.md | 47 + compatibility/database.json | 547 +++ compatibility/device-interop.json | 16 + compatibility/environment.json | 582 +++ compatibility/frontend-assets.json | 269 ++ compatibility/interop-results.json | 55 + compatibility/oauth-device-php-reference.json | 298 ++ .../oauth-php-body-edge-reference.json | 202 + compatibility/oauth-php-body-reference.json | 188 + compatibility/oauth-php-reference.json | 502 ++ compatibility/passport-interop-results.json | 23 + compatibility/reference-results.json | 562 +++ compatibility/reference-results.laravel.json | 1898 ++++++++ compatibility/reference-results.native.json | 1898 ++++++++ compatibility/requirements.json | 100 + compatibility/routes.json | 1218 +++++ compatibility/source-sha256.json | 61 + compatibility/sqlite-reference-schema.sql | 115 + compose.yaml | 23 + public/UPSTREAM-LICENSE | 661 +++ public/UPSTREAM-NOTICE.txt | 4 + public/build/assets/About-DlWJhNxo.js | 1 + public/build/assets/Access-BQVm4alb.js | 1 + .../build/assets/AccessLogViewer-D5ke4CwJ.js | 1 + public/build/assets/Account-CvhJGfLO.js | 1 + .../build/assets/AccountSharing-kU7yk02h.js | 1 + public/build/assets/Accounts-znshhaJC.js | 1 + public/build/assets/AppSetup-9GPB7B-I.js | 1 + public/build/assets/Auth-DslSg1a9.js | 1 + public/build/assets/Capture-BG6QMHLW.js | 3 + public/build/assets/CopyButton-CgxgBp0c.js | 1 + public/build/assets/Create-Vv-BwDWf.js | 1 + public/build/assets/CreateUpdate-CbOB1O7q.js | 1 + public/build/assets/CreateUpdate-tvLQ26rU.js | 1 + public/build/assets/Edit-Ba84j7PP.js | 1 + public/build/assets/Error-DG0pgQA2.js | 1 + public/build/assets/Form-ZbAUhXmz.js | 1 + public/build/assets/Groups-Ccrpwp-O.js | 1 + public/build/assets/Import-C0sC5CLD.js | 1 + public/build/assets/Login-XfEMUKl8.js | 1 + public/build/assets/Manage-B1CTWqgo.js | 1 + public/build/assets/OAuth-aXCqlLPs.js | 1 + public/build/assets/Options-Bun4hDR8.js | 1 + public/build/assets/OtpLogs-CAP6rwu6.js | 1 + public/build/assets/QRcode-Da_iUmWo.js | 1 + .../build/assets/QrContentDisplay-DiIjf7a_.js | 1 + public/build/assets/Recover-CEob990V.js | 1 + public/build/assets/Register-DffuLlzx.js | 1 + public/build/assets/RequestReset-w8-YSMaH.js | 1 + public/build/assets/Reset-RiTuOlH9.js | 1 + public/build/assets/Share-DkTnn1jz.js | 1 + public/build/assets/Start-Dnu4qWlC.js | 1 + .../assets/TransferOwnership-BsVNwpBY.js | 1 + .../build/assets/TwofaccountMedia-DzLyeBxh.js | 1 + public/build/assets/Users-DyNCDMUg.js | 1 + public/build/assets/WebAuthn-C_HU0Xj8.js | 1 + public/build/assets/app-C6trQ8-_.css | 1 + public/build/assets/app-dvJP63FL.js | 20 + .../assets/appSettingsUpdater-D1Bq_3WB.js | 1 + public/build/assets/breakpoints-CyLcIEOu.js | 1 + public/build/assets/bus-ChE1sp8V.js | 1 + public/build/assets/check-CPGWPXZa.js | 1 + public/build/assets/circle-plus-BM92Iipr.js | 1 + public/build/assets/circle-x-AvUNZzwX.js | 1 + .../build/assets/createLucideIcon-DsaEAGzP.js | 1 + public/build/assets/external-link-CqpXNovN.js | 1 + public/build/assets/helpers-B2oe4lHy.js | 1 + public/build/assets/iconService-rm6LRV4U.js | 1 + public/build/assets/index-BJsmINgd.js | 1 + public/build/assets/qr-code-eSL1bq0j.js | 1 + public/build/assets/shareService-BU7jlLil.js | 1 + public/build/assets/tablet-DYUfDfjC.js | 1 + public/build/assets/tabs-BVx9tg1F.js | 1 + public/build/assets/tabs-Btun2NN0.js | 1 + public/build/assets/useSortable-6hRbxhTj.js | 1 + public/build/assets/users-CLZI37iw.js | 1 + .../build/assets/webauthnService-D363et0U.js | 1 + public/build/assets/x-DQVIq0xP.js | 1 + public/build/manifest.json | 620 +++ public/favicon.ico | Bin 0 -> 1150 bytes public/favicon.png | Bin 0 -> 443 bytes public/favicon_lg.png | Bin 0 -> 2410 bytes public/healthcheck.css | 2 + public/logo.svg | 77 + public/robots.txt | 2 + src/accounts.rs | 1009 ++++ src/api_limits.rs | 616 +++ src/auth.rs | 1574 +++++++ src/auth_audit.rs | 214 + src/cors.rs | 139 + src/crypto.rs | 308 ++ src/db.rs | 47 + src/frontend.rs | 550 +++ src/groups.rs | 227 + src/health.html | 32 + src/icons.rs | 1261 +++++ src/imports.rs | 567 +++ src/laravel_sessions.rs | 838 ++++ src/lib.rs | 198 + src/mail.rs | 493 ++ src/mail_messages.json | 794 ++++ src/main.rs | 163 + src/oauth_device.rs | 488 ++ src/oauth_management.rs | 1238 +++++ src/oauth_server.rs | 1084 +++++ src/otp.rs | 368 ++ src/passport.rs | 715 +++ src/preference_env.json | 41 + src/preferences.json | 43 + src/profile.rs | 755 +++ src/proxy_auth.rs | 385 ++ src/schema_validation.rs | 327 ++ src/settings.json | 17 + src/settings.rs | 664 +++ src/sharing.rs | 1065 +++++ src/sso.rs | 897 ++++ src/subdirectory.rs | 181 + src/system.rs | 224 + src/users.rs | 983 ++++ src/webauthn.rs | 1200 +++++ tests/crypto_interop.py | 69 + tests/device_interop.py | 160 + tests/differential_harness.py | 125 + tests/fixtures/generate_laravel_sessions.php | 49 + tests/fixtures/laravel_cbc.json | 38 + tests/fixtures/laravel_sessions.json | 66 + tests/fixtures/webauthn-php-encrypted.txt | 1 + tests/fixtures/webauthn-private.pem | 5 + tests/http_smoke.py | 110 + tests/laravel_session_http.py | 174 + tests/oauth_interop.py | 89 + tools/differential_http.py | 225 + tools/inventory.py | 68 + tools/passport_interop.py | 146 + tools/run_reference.py | 163 + tools/semantic_http.py | 68 + 156 files changed, 38669 insertions(+) create mode 100644 .dockerignore create mode 100644 .github/workflows/rust.yml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README.md create mode 100644 README.ru.md create mode 100644 compatibility/CURRENT.md create mode 100644 compatibility/README.md create mode 100644 compatibility/VERIFICATION-0.2.0.md create mode 100644 compatibility/VERIFICATION.md create mode 100644 compatibility/cases.admin-sharing.json create mode 100644 compatibility/cases.device.json create mode 100644 compatibility/cases.example.json create mode 100644 compatibility/cases.extended.json create mode 100644 compatibility/cases.oauth.json create mode 100644 compatibility/cases.stateful.json create mode 100644 compatibility/database-portability.md create mode 100644 compatibility/database.json create mode 100644 compatibility/device-interop.json create mode 100644 compatibility/environment.json create mode 100644 compatibility/frontend-assets.json create mode 100644 compatibility/interop-results.json create mode 100644 compatibility/oauth-device-php-reference.json create mode 100644 compatibility/oauth-php-body-edge-reference.json create mode 100644 compatibility/oauth-php-body-reference.json create mode 100644 compatibility/oauth-php-reference.json create mode 100644 compatibility/passport-interop-results.json create mode 100644 compatibility/reference-results.json create mode 100644 compatibility/reference-results.laravel.json create mode 100644 compatibility/reference-results.native.json create mode 100644 compatibility/requirements.json create mode 100644 compatibility/routes.json create mode 100644 compatibility/source-sha256.json create mode 100644 compatibility/sqlite-reference-schema.sql create mode 100644 compose.yaml create mode 100644 public/UPSTREAM-LICENSE create mode 100644 public/UPSTREAM-NOTICE.txt create mode 100644 public/build/assets/About-DlWJhNxo.js create mode 100644 public/build/assets/Access-BQVm4alb.js create mode 100644 public/build/assets/AccessLogViewer-D5ke4CwJ.js create mode 100644 public/build/assets/Account-CvhJGfLO.js create mode 100644 public/build/assets/AccountSharing-kU7yk02h.js create mode 100644 public/build/assets/Accounts-znshhaJC.js create mode 100644 public/build/assets/AppSetup-9GPB7B-I.js create mode 100644 public/build/assets/Auth-DslSg1a9.js create mode 100644 public/build/assets/Capture-BG6QMHLW.js create mode 100644 public/build/assets/CopyButton-CgxgBp0c.js create mode 100644 public/build/assets/Create-Vv-BwDWf.js create mode 100644 public/build/assets/CreateUpdate-CbOB1O7q.js create mode 100644 public/build/assets/CreateUpdate-tvLQ26rU.js create mode 100644 public/build/assets/Edit-Ba84j7PP.js create mode 100644 public/build/assets/Error-DG0pgQA2.js create mode 100644 public/build/assets/Form-ZbAUhXmz.js create mode 100644 public/build/assets/Groups-Ccrpwp-O.js create mode 100644 public/build/assets/Import-C0sC5CLD.js create mode 100644 public/build/assets/Login-XfEMUKl8.js create mode 100644 public/build/assets/Manage-B1CTWqgo.js create mode 100644 public/build/assets/OAuth-aXCqlLPs.js create mode 100644 public/build/assets/Options-Bun4hDR8.js create mode 100644 public/build/assets/OtpLogs-CAP6rwu6.js create mode 100644 public/build/assets/QRcode-Da_iUmWo.js create mode 100644 public/build/assets/QrContentDisplay-DiIjf7a_.js create mode 100644 public/build/assets/Recover-CEob990V.js create mode 100644 public/build/assets/Register-DffuLlzx.js create mode 100644 public/build/assets/RequestReset-w8-YSMaH.js create mode 100644 public/build/assets/Reset-RiTuOlH9.js create mode 100644 public/build/assets/Share-DkTnn1jz.js create mode 100644 public/build/assets/Start-Dnu4qWlC.js create mode 100644 public/build/assets/TransferOwnership-BsVNwpBY.js create mode 100644 public/build/assets/TwofaccountMedia-DzLyeBxh.js create mode 100644 public/build/assets/Users-DyNCDMUg.js create mode 100644 public/build/assets/WebAuthn-C_HU0Xj8.js create mode 100644 public/build/assets/app-C6trQ8-_.css create mode 100644 public/build/assets/app-dvJP63FL.js create mode 100644 public/build/assets/appSettingsUpdater-D1Bq_3WB.js create mode 100644 public/build/assets/breakpoints-CyLcIEOu.js create mode 100644 public/build/assets/bus-ChE1sp8V.js create mode 100644 public/build/assets/check-CPGWPXZa.js create mode 100644 public/build/assets/circle-plus-BM92Iipr.js create mode 100644 public/build/assets/circle-x-AvUNZzwX.js create mode 100644 public/build/assets/createLucideIcon-DsaEAGzP.js create mode 100644 public/build/assets/external-link-CqpXNovN.js create mode 100644 public/build/assets/helpers-B2oe4lHy.js create mode 100644 public/build/assets/iconService-rm6LRV4U.js create mode 100644 public/build/assets/index-BJsmINgd.js create mode 100644 public/build/assets/qr-code-eSL1bq0j.js create mode 100644 public/build/assets/shareService-BU7jlLil.js create mode 100644 public/build/assets/tablet-DYUfDfjC.js create mode 100644 public/build/assets/tabs-BVx9tg1F.js create mode 100644 public/build/assets/tabs-Btun2NN0.js create mode 100644 public/build/assets/useSortable-6hRbxhTj.js create mode 100644 public/build/assets/users-CLZI37iw.js create mode 100644 public/build/assets/webauthnService-D363et0U.js create mode 100644 public/build/assets/x-DQVIq0xP.js create mode 100644 public/build/manifest.json create mode 100644 public/favicon.ico create mode 100644 public/favicon.png create mode 100644 public/favicon_lg.png create mode 100644 public/healthcheck.css create mode 100644 public/logo.svg create mode 100644 public/robots.txt create mode 100644 src/accounts.rs create mode 100644 src/api_limits.rs create mode 100644 src/auth.rs create mode 100644 src/auth_audit.rs create mode 100644 src/cors.rs create mode 100644 src/crypto.rs create mode 100644 src/db.rs create mode 100644 src/frontend.rs create mode 100644 src/groups.rs create mode 100644 src/health.html create mode 100644 src/icons.rs create mode 100644 src/imports.rs create mode 100644 src/laravel_sessions.rs create mode 100644 src/lib.rs create mode 100644 src/mail.rs create mode 100644 src/mail_messages.json create mode 100644 src/main.rs create mode 100644 src/oauth_device.rs create mode 100644 src/oauth_management.rs create mode 100644 src/oauth_server.rs create mode 100644 src/otp.rs create mode 100644 src/passport.rs create mode 100644 src/preference_env.json create mode 100644 src/preferences.json create mode 100644 src/profile.rs create mode 100644 src/proxy_auth.rs create mode 100644 src/schema_validation.rs create mode 100644 src/settings.json create mode 100644 src/settings.rs create mode 100644 src/sharing.rs create mode 100644 src/sso.rs create mode 100644 src/subdirectory.rs create mode 100644 src/system.rs create mode 100644 src/users.rs create mode 100644 src/webauthn.rs create mode 100644 tests/crypto_interop.py create mode 100644 tests/device_interop.py create mode 100644 tests/differential_harness.py create mode 100644 tests/fixtures/generate_laravel_sessions.php create mode 100644 tests/fixtures/laravel_cbc.json create mode 100644 tests/fixtures/laravel_sessions.json create mode 100644 tests/fixtures/webauthn-php-encrypted.txt create mode 100644 tests/fixtures/webauthn-private.pem create mode 100644 tests/http_smoke.py create mode 100644 tests/laravel_session_http.py create mode 100644 tests/oauth_interop.py create mode 100644 tools/differential_http.py create mode 100644 tools/inventory.py create mode 100644 tools/passport_interop.py create mode 100644 tools/run_reference.py create mode 100644 tools/semantic_http.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6aea75b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +target +.git +data +.env +*.sqlite* +bin diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..72f3a4f --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,19 @@ +name: Rust verification +on: [push, pull_request] +permissions: + contents: read +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + - run: cargo fmt --all -- --check + - run: cargo clippy --locked --all-targets -- -D warnings + - run: cargo test --locked + - run: cargo build --locked --release + - run: python3 tests/http_smoke.py target/release/twofauth-rs + - run: python3 -m py_compile tools/inventory.py tools/differential_http.py + - run: docker build -t twofauth-rs:test . diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..033a777 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target/ +/data/ +.env +*.sqlite* diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c805a18 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4128 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures 0.2.17", + "password-hash", +] + +[[package]] +name = "asn1-rs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom 7.1.3", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure 0.13.2", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener 5.4.2", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel 2.5.0", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.2", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-std" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "axum-macros", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "multer", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "base64urlsafedata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f7f6be94fa637132933fd0a68b9140bcb60e3d46164cb68e82a2bb8d102b3a" +dependencies = [ + "base64 0.21.7", + "pastey", + "serde", +] + +[[package]] +name = "bcrypt" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abaf6da45c74385272ddf00e1ac074c7d8a6c1a1dda376902bd6a427522a8b2c" +dependencies = [ + "base64 0.22.1", + "blowfish", + "getrandom 0.3.4", + "subtle", + "zeroize", +] + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +dependencies = [ + "serde_core", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "blowfish" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" +dependencies = [ + "byteorder", + "cipher", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e055fa6e3e40ad6187ba25b6855eeb635d5271f8e0f0e1e9a5826b8d75bea0" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba106e844045ddc02c20768ac4b0b7cb45f2cc2ecbd833ac9f5dacb183c2055" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom 7.1.3", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" +dependencies = [ + "serde", +] + +[[package]] +name = "email-encoding" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420b9da095f052ea597503e39073b5b3c522f7db933fbac202d91d24492693fd" +dependencies = [ + "base64 0.23.1", + "memchr", +] + +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" + +[[package]] +name = "encoding_rs" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679" +dependencies = [ + "cfg-if", + "core_detect", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", +] + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.2", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "g2gen" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a7e0eb46f83a20260b850117d204366674e85d3a908d90865c78df9a6b1dfc" +dependencies = [ + "g2poly", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "g2p" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "539e2644c030d3bf4cd208cb842d2ce2f80e82e6e8472390bcef83ceba0d80ad" +dependencies = [ + "g2gen", + "g2poly", +] + +[[package]] +name = "g2poly" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312d2295c7302019c395cfb90dacd00a82a2eabd700429bba9c7a3f38dbbe11b" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" +dependencies = [ + "atomic-waker", + "bytes", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" + +[[package]] +name = "icu_properties" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" + +[[package]] +name = "icu_provider" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64 0.22.1", + "js-sys", + "ring", + "serde", + "serde_json", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" +dependencies = [ + "spin", +] + +[[package]] +name = "lettre" +version = "0.11.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c646bd5cc763b1087b15493e29a64be6147ba8f19342004fa52048ee596eae" +dependencies = [ + "async-std", + "async-trait", + "base64 0.23.1", + "email-encoding", + "email_address", + "fastrand", + "futures-io", + "futures-util", + "httpdate", + "idna", + "mime", + "nom 8.0.0", + "percent-encoding", + "quoted_printable", + "rustls", + "socket2", + "tokio", + "tokio-rustls", + "url", + "webpki-roots", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "bitflags", + "libc", + "plain", + "redox_syscall 0.9.5", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" +dependencies = [ + "value-bag", +] + +[[package]] +name = "lru" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "lru-slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", +] + +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.8", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "openssl-src" +version = "300.6.1+3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eb8fb9fb3b61ce1c0f8a026c4c1a0714d3a9e138e7fbde78753ce2babc3846" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pcre2" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e970b0fcce0c7ee6ef662744ff711f21ccd6f11b7cf03cd187a80e89797fc67" +dependencies = [ + "libc", + "log", + "pcre2-sys", +] + +[[package]] +name = "pcre2-sys" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18b9073c1a2549bd409bf4a32c94d903bb1a09bf845bc306ae148897fa0760a4" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13bee6c73da26345c729282832b60b0363cf3dd9f4bfd81d8551b7a1c889a113" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "qrcode" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68782463e408eb1e668cf6152704bd856c78c5b6417adaee3203d8f4c1fc9ec" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quinn" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.21", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.3", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.21", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quoted_printable" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "580c875845b41ecb1564ad1ae4703044cef774145e3d7a94dc2b3fa7c97868fd" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rqrr" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe87d9e8db95652c25ded2418150e00b08c2fde09e23ec15896d2c470c6631" +dependencies = [ + "g2p", + "image", + "lru", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_cbor_2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aec2709de9078e077090abd848e967abab63c9fb3fdb5d4799ad359d8d482c" +dependencies = [ + "half", + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "foldhash 0.2.0", + "indexmap", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64 0.22.1", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener 5.4.2", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.21", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.119", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.119", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.8", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.21", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.8", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.21", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.21", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "tokio" +version = "1.54.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "tracing", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "twofauth-rs" +version = "0.3.0" +dependencies = [ + "aes", + "anyhow", + "argon2", + "axum", + "base64 0.22.1", + "bcrypt", + "cbc", + "chrono", + "chrono-tz", + "clap", + "data-encoding", + "dotenvy", + "hex", + "hmac", + "http-body-util", + "image", + "jsonwebtoken", + "lettre", + "md-5", + "openssl", + "pcre2", + "percent-encoding", + "qrcode", + "rand 0.8.8", + "regex", + "reqwest", + "roxmltree", + "rqrr", + "rsa", + "serde", + "serde_cbor_2", + "serde_json", + "serde_urlencoded", + "sha1", + "sha2", + "sqlx", + "subtle", + "tempfile", + "thiserror 2.0.21", + "tokio", + "tower", + "tower-http", + "tracing", + "tracing-subscriber", + "url", + "webauthn-rs", + "webauthn-rs-core", + "zeroize", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicase" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357cc3acc6a036009fd6c973ed009037c732d60d0b4f6c673e9041497482a28f" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "unicode-normalization" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75cd3fb03d5288b3ba9a1ee103ac7e9cbb59f0b03d64f8ddfcc04dd42758a85d" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-bag" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2799ffb329a792ecfd902b71306c8a815a6ef1c0470fa9953a6aa4d4cecbe511" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.9", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webauthn-attestation-ca" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fafcf13f7dc1fb292ed4aea22cdd3757c285d7559e9748950ee390249da4da6b" +dependencies = [ + "base64urlsafedata", + "openssl", + "openssl-sys", + "serde", + "tracing", + "uuid", +] + +[[package]] +name = "webauthn-rs" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b24d082d3360258fefb6ffe56123beef7d6868c765c779f97b7a2fcf06727f8" +dependencies = [ + "base64urlsafedata", + "serde", + "tracing", + "url", + "uuid", + "webauthn-rs-core", +] + +[[package]] +name = "webauthn-rs-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15784340a24c170ce60567282fb956a0938742dbfbf9eff5df793a686a009b8b" +dependencies = [ + "base64 0.21.7", + "base64urlsafedata", + "der-parser", + "hex", + "nom 7.1.3", + "openssl", + "openssl-sys", + "rand 0.9.5", + "rand_chacha 0.9.0", + "serde", + "serde_cbor_2", + "serde_json", + "thiserror 1.0.69", + "tracing", + "url", + "uuid", + "webauthn-attestation-ca", + "webauthn-rs-proto", + "x509-parser", +] + +[[package]] +name = "webauthn-rs-proto" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a1fb2580ce73baa42d3011a24de2ceab0d428de1879ece06e02e8c416e497c" +dependencies = [ + "base64 0.21.7", + "base64urlsafedata", + "serde", + "serde_json", + "url", +] + +[[package]] +name = "webpki-roots" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom 7.1.3", + "oid-registry", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "yoke" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure 0.14.0", +] + +[[package]] +name = "zerocopy" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure 0.14.0", +] + +[[package]] +name = "zeroize" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..4e3c4b6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,65 @@ +[package] +name = "twofauth-rs" +version = "0.3.0" +edition = "2024" +license = "AGPL-3.0-only" +description = "Rust compatibility implementation targeting 2FAuth 8.0.3" + +[dependencies] +axum = { version = "0.8", features = ["macros", "multipart"] } +tokio = { version = "1", features = ["full"] } +sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "sqlite", "chrono"] } +serde = { version = "1", features = ["derive"] } +serde_json = { version = "1", features = ["preserve_order"] } +serde_urlencoded = "0.7" +anyhow = "1" +thiserror = "2" +chrono = { version = "0.4", features = ["serde"] } +tower = { version = "0.5", features = ["util"] } +tower-http = { version = "0.6", features = ["trace", "limit", "set-header", "fs"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +dotenvy = "0.15" +clap = { version = "4", features = ["derive", "env"] } +hmac = "0.12" +sha1 = "0.10" +sha2 = { version = "0.10", features = ["oid"] } +rsa = "0.9" +md-5 = "0.10" +data-encoding = "2" +url = "2" +percent-encoding = "2" +aes = "0.8" +cbc = { version = "0.1", features = ["alloc", "block-padding"] } +base64 = "0.22" +rand = "0.8" +hex = "0.4" +bcrypt = "0.17" +argon2 = "0.5" +subtle = "2" +zeroize = "1" +qrcode = { version = "0.14", default-features = false, features = ["svg"] } +image = { version = "0.25", default-features = false, features = ["png", "jpeg", "gif", "bmp", "webp", "ico"] } +rqrr = "0.10" +reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json"] } +roxmltree = "0.20" +regex = "1" +pcre2 = "0.2" +chrono-tz = "0.10" + +webauthn-rs-core = "=0.5.4" +webauthn-rs = { version = "=0.5.4", default-features = false, features = ["danger-credential-internals", "danger-allow-state-serialisation", "danger-user-presence-only-security-keys"] } +openssl = { version = "0.10", features = ["vendored"] } +serde_cbor_2 = "0.13" + +lettre = { version = "0.11", default-features = false, features = ["builder", "smtp-transport", "sendmail-transport", "tokio1-rustls-tls"] } + +jsonwebtoken = { version = "9", default-features = false } + +[dev-dependencies] +tempfile = "3" +http-body-util = "0.1" + +[profile.release] +lto = false +strip = true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7ae1db6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +FROM rust:1-bookworm AS build +RUN apt-get update && apt-get install -y --no-install-recommends build-essential perl pkg-config && rm -rf /var/lib/apt/lists/* +WORKDIR /src +COPY Cargo.toml Cargo.lock ./ +COPY src ./src +COPY public ./public +COPY tests ./tests +COPY compatibility ./compatibility +RUN cargo build --locked --release + +FROM debian:bookworm-slim +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* +RUN groupadd --gid 10001 twofauth && useradd --uid 10001 --gid twofauth --no-create-home twofauth && mkdir /data && chown twofauth:twofauth /data +WORKDIR /app +COPY --from=build /src/target/release/twofauth-rs /usr/local/bin/twofauth-rs +COPY public ./public +COPY LICENSE NOTICE ./ +USER 10001:10001 +ENV DATABASE_URL=sqlite:///data/2fauth.sqlite LISTEN_ADDR=0.0.0.0:8080 RUST_PUBLIC_DIR=/app/public STORAGE_PATH=/data/storage PASSPORT_KEY_PATH=/data/storage +EXPOSE 8080 +ENTRYPOINT ["twofauth-rs"] +CMD ["serve"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bae94e1 --- /dev/null +++ b/LICENSE @@ -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 +. \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..6d667a8 --- /dev/null +++ b/NOTICE @@ -0,0 +1,7 @@ +This experimental Rust backend targets Bubka/2FAuth 8.0.3. +Reference source: https://github.com/Bubka/2FAuth +Pinned commit: 3516c776a1fcbd83d234efc007e3a49807d6ed91 +Original 2FAuth source and frontend assets remain copyright their respective authors +and are supplied under their original license (see LICENSE and upstream reference source). +This is an independent, incomplete port; it is not an official 2FAuth release. +Do not interpret a passing Rust test suite as proof of replacement compatibility. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d5d0cc --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# 2FAuth Rust compatibility implementation — 0.3.0 + +Targets 2FAuth **8.0.3**, upstream commit `3516c776a1fcbd83d234efc007e3a49807d6ed91`. AGPL-3.0-only; upstream source and frontend provenance are retained. See [README.ru.md](README.ru.md) for deployment/configuration instructions in Russian. + +**This is not a certified complete PHP replacement.** Current evidence and remaining gaps are in [compatibility/CURRENT.md](compatibility/CURRENT.md). Never infer total coverage from test counts or from displaying the original Vue frontend. + +Implemented areas include OTP/URI/export, Laravel encryption and rotation, account/group CRUD, per-user orders/groups, sharing and ownership, registration/profile/password recovery, Passport RSA bearer/PAT and PHP browser cookie interoperability, migrated WebAuthn credentials, SSO/proxy authentication, imports/icons/QR, preferences/settings, SMTP notifications and authentication/OTP auditing. The original Vue build is served, including subdirectory mounting. + +## Build and test + +A current stable Rust toolchain, C compiler, make and Perl are required. OpenSSL is vendored for WebAuthn; no external OpenSSL development package is required. + +```sh +cargo fmt --all -- --check +cargo clippy --locked --all-targets -- -D warnings +cargo test --locked --all-targets +cargo build --locked --release +python3 tests/http_smoke.py target/release/twofauth-rs +python3 tests/differential_harness.py +python3 tests/laravel_session_http.py target/release/twofauth-rs +PHP_BINARY=/path/to/php python3 tests/oauth_interop.py target/release/twofauth-rs +PHP_BINARY=/path/to/php python3 tests/device_interop.py target/release/twofauth-rs --output compatibility/device-interop.json +python3 tests/crypto_interop.py --check-php +``` + +The PHP crypto check requires PHP/OpenSSL. Full reference runs additionally require PHP 8.4+, locked Composer dependencies and the PHP extensions required by the pinned upstream. + +```sh +python3 tools/run_reference.py --php /path/to/php \ + --source ../upstream --candidate-binary target/release/twofauth-rs \ + --candidate-db native --semantic-checks --passport-interop \ + --extra-cases compatibility/cases.oauth.json --extra-cases compatibility/cases.device.json --output compatibility/reference-results.native.json +python3 tools/run_reference.py --php /path/to/php \ + --source ../upstream --candidate-binary target/release/twofauth-rs \ + --candidate-db laravel-copy --semantic-checks --passport-interop \ + --extra-cases compatibility/cases.oauth.json --extra-cases compatibility/cases.device.json --output compatibility/reference-results.laravel.json +``` + +Each run uses disposable databases, credentials, application state and isolated server ports. Semantic login/QR checks precede the extra OAuth error burst because the PHP unnamed OAuth throttle shares its bucket with password login. The Laravel-copy mode runs real PHP migrations, seeds a synthetic user, copies the database through SQLite backup, and invokes `prepare-sqlite`. Do not point differential tests at live services. + +`tools/passport_interop.py --help` documents the separate bidirectional Passport and PHP-browser-session upgrade test. It creates disposable fixture material rather than shipping deployment keys. + +## Local development + +```sh +mkdir -p data +cargo run -- init +RUST_COOKIE_SECURE=false cargo run -- serve +``` + +Open `http://127.0.0.1:8080`; the first self-registered user becomes administrator. `init` refuses an existing users table. `prepare-sqlite` validates an already migrated Laravel SQLite schema and adds Rust-only session/ceremony metadata. `serve` also creates this metadata if absent after validation; it never runs application migrations or resets user tables. + +Preserve original `APP_KEY`, `APP_PREVIOUS_KEYS`, Passport key files and storage. `DATABASE_URL` overrides Laravel `DB_DATABASE`; only SQLite is implemented. `DB_CONNECTION` selecting another driver fails explicitly. All switching exercises must use a backup/copy until complete compatibility is established. + +The included Dockerfile/Compose were updated for static assets, vendored cryptography and writable storage. Docker itself was unavailable in the development environment, so image build/run is not claimed verified. + +## Laravel sessions and OAuth additions + +File and SQLite database Laravel sessions can be imported using the original APP_KEY, SESSION_COOKIE, SESSION_DRIVER, SESSION_TABLE, SESSION_ENCRYPT and STORAGE_PATH. JSON and scalar/array PHP serialization are supported; PHP objects and references are rejected. Both store encryption and remember-me recallers are checked with real pinned PHP fixtures. Native session rotation destroys the imported store; logout rotates remember tokens. Redis, cookie and other session drivers remain outside this implementation. + +Standard `/oauth/token` supports authorization-code/PKCE, refresh rotation, client credentials and device authorization/polling using the actual Defuse PHP encrypted wire format and Passport RSA keys. The pinned application registers Passport JSON management routes too late and lacks an authorization view binding. Defaults preserve the observed disabled/broken management and consent behavior. `PASSPORT_JSON_API_ROUTES=true` and `RUST_OAUTH_CONSENT_ENABLED=true` explicitly enable repaired management and consent. These optional routes are extensions, not an assertion that the original defects were absent. + +SQLite startup now checks used application columns, primary/unique keys and foreign-key delete actions against the real migrated schema before adding Rust metadata. See compatibility/database-portability.md for the remaining engine-specific work. diff --git a/README.ru.md b/README.ru.md new file mode 100644 index 0000000..3169a27 --- /dev/null +++ b/README.ru.md @@ -0,0 +1,102 @@ +# 2FAuth на Rust — 0.3.0 + +Целевая версия: **2FAuth 8.0.3**, коммит `3516c776a1fcbd83d234efc007e3a49807d6ed91`. + +Это развиваемая реализация совместимости, **пока не подтверждённая как полная замена PHP**. Рабочий сервер пользователя не изменялся. Все сравнения выполняются на отдельных синтетических базах, включая копию БД, созданной настоящими Laravel-миграциями. + +## Что реализовано + +- HOTP, TOTP и Steam; SHA-1/256/512 и MD5; атомарный HOTP-счётчик; URI и экспорт. +- Шифрование Laravel AES-CBC, `APP_KEY`, предыдущие ключи; транзакционное включение/выключение шифрования данных и иконок. +- Аккаунты, группы, порядок и назначения отдельно для каждого пользователя; общие аккаунты, всеобщие ссылки доступа, передача владельца с подтверждением пароля; запрет выдачи секретов получателям. +- Регистрация, вход, CSRF, профиль, смена/восстановление пароля, ограничения регистрации, последний администратор, управление пользователями. +- Passport 13: настоящие RSA JWT, создание/отзыв PAT, существующие PHP bearer-токены и зашифрованные браузерные `laravel_token`. Действующая PHP-cookie может быть преобразована в Rust-сессию при загрузке интерфейса. +- OAuth: authorization code с PKCE, client credentials, Device Code Flow, ротация refresh-токенов и запрет повторного обмена; формат шифрования Defuse PHP совместим с эталоном. +- Перенос Laravel-сессий из файлов и SQLite: JSON/PHP-сериализация, SESSION_ENCRYPT, проверка cookie/CSRF, remember-me и отзыв при выходе. +- WebAuthn: регистрация, вход, список/переименование/удаление устройств, восстановление; импорт существующих зашифрованных PEM-ключей Laragear P-256/RSA/Ed25519. Проверки используют подписанные данные аутентификатора. +- GitHub/OpenID SSO, PKCE, одноразовый state, проверка OIDC JWT при настройке issuer; reverse-proxy-вход только от доверенного сетевого адреса. +- Импорт 2FAuth, Aegis, 2FAS, Bitwarden, текстовых URI и Google Authenticator; вложенные иконки; QR; официальные и локальные наборы иконок. +- Настройки, предпочтения, журналы входа/OTP, уведомления, SMTP/STARTTLS/TLS/sendmail/log; исходный собранный Vue-интерфейс и размещение в подкаталоге. + +Подробные доказательства и ограничения: [compatibility/CURRENT.md](compatibility/CURRENT.md), [compatibility/VERIFICATION.md](compatibility/VERIFICATION.md). Старые разделы аудита в `compatibility/README.md` относятся к исходной версии 0.1.0. + +## Готовый бинарный файл + +В архиве есть `bin/twofauth-rs` для Linux x86_64 GNU. Он проверен в этой среде; для запуска нужны glibc 2.39 или новее и libgcc_s. Контрольная сумма приведена в `bin/BUILD.txt`. Если система старее или имеет другую архитектуру, соберите проект из исходников либо через Docker. + +Запускайте бинарный файл из каталога `rust-server`; соседний каталог `public` определяется автоматически. Для новой установки сначала задайте и сохраните `APP_KEY`, затем используйте команды ниже, заменив `./target/release/twofauth-rs` на `./bin/twofauth-rs`. Для имеющейся установки ключи должны остаться прежними. + +## Сборка и отдельная тестовая установка + +Нужны современный stable Rust, C-компилятор, make и Perl: OpenSSL собирается из исходников для WebAuthn. Сборка Docker в этой среде не запускалась. + +```sh +cargo build --locked --release +mkdir -p data +./target/release/twofauth-rs init +RUST_COOKIE_SECURE=false ./target/release/twofauth-rs serve +``` + +Откройте `http://127.0.0.1:8080`. На пустой БД доступна регистрация; первый пользователь становится администратором. Отключать Secure-cookie следует только для локального HTTP. Для HTTPS оставьте значение по умолчанию. + +Можно создать отдельного тестового пользователя через файл пароля: + +```sh +./target/release/twofauth-rs create-user --name Test --email test@example.invalid --password-file /path/password.txt +``` + +`init` отказывается создавать схему поверх существующих пользователей. `create-user` создаёт обычного пользователя. Файл пароля должен быть доступен только владельцу; для этой CLI-команды требуется 12–72 байта. + +## Проверка копии существующей SQLite + +Сначала сделайте согласованную копию БД и каталога `storage` средствами SQLite/вашего резервного копирования. Не копируйте только основной файл SQLite при незавершённом WAL. + +Настройте окружение на **копию**: + +```sh +export DB_CONNECTION=sqlite +export DB_DATABASE=/absolute/path/to/copied/database.sqlite +export APP_URL=https://test.example.invalid +export STORAGE_PATH=/absolute/path/to/copied/storage +export PASSPORT_KEY_PATH=/absolute/path/to/copied/storage +# APP_KEY и APP_PREVIOUS_KEYS должны сохранять исходные значения. +./target/release/twofauth-rs prepare-sqlite +./target/release/twofauth-rs serve +``` + +`prepare-sqlite` проверяет используемые поля таблиц и добавляет только служебные таблицы Rust. Он не выполняет Laravel-миграции и не меняет историю миграций. Если эти служебные таблицы отсутствуют при запуске, `serve` также проверит схему и создаст их. Исходная БД должна уже быть обновлена до целевого PHP-коммита. Поддержка PostgreSQL/MySQL/SQL Server в этой реализации **ещё отсутствует**. + +Сохраняйте исходные ключи Passport `oauth-private.key`/`oauth-public.key`, `APP_KEY`, предыдущие ключи и содержимое хранилища. Не генерируйте новые ключи вместо существующих. Для encrypted WebAuthn-ключей `APP_KEY` нужен даже при выключенном шифровании OTP. + +## Конфигурация + +`DATABASE_URL=sqlite:///absolute/file.sqlite` имеет приоритет над `DB_DATABASE`. По умолчанию используется `sqlite://data/2fauth.sqlite`. Адрес прослушивания: `LISTEN_ADDR`, по умолчанию `127.0.0.1:8080`. + +Применяются исходные `APP_URL`, `APP_NAME`, `APP_KEY`, `APP_PREVIOUS_KEYS`, настройки SMTP `MAIL_*`, параметры `GITHUB_*`, `OPENID_*`, `WEBAUTHN_*`, `AUTH_GUARD`/`AUTHENTICATION_GUARD`, `AUTH_PROXY_HEADER_FOR_*`, `TRUSTED_PROXIES`, предпочтения `USERPREF_DEFAULT__*`/`USERPREF_LOCKED__*`. + +Дополнительно: + +| Параметр | Назначение | +|---|---| +| `STORAGE_PATH` | Каталог Laravel storage; по умолчанию `storage` | +| `PASSPORT_KEY_PATH` | Каталог ключей Passport; по умолчанию `storage` | +| `RUST_PUBLIC_DIR` | Каталог собранного интерфейса; по умолчанию `public` рядом с исходниками | +| `RUST_COOKIE_SECURE` | `false` только для локального HTTP; по умолчанию Secure | +| `APP_SUBDIRECTORY` | Например `/tools/2fa`; `APP_URL` должен содержать тот же путь | +| `SESSION_DRIVER`, `SESSION_TABLE`, `SESSION_COOKIE`, `SESSION_ENCRYPT` | Чтение исходных Laravel-сессий: `file` или `database`; сохраняйте исходные параметры и `STORAGE_PATH` | +| `PASSPORT_JSON_API_ROUTES` | `true` включает исправленные маршруты управления OAuth-клиентами и токенами; по умолчанию выключено, как в закреплённом PHP-эталоне | +| `RUST_OAUTH_CONSENT_ENABLED` | `true` включает исправленный экран согласия OAuth; это явное расширение относительно дефектного маршрута эталона | +| `OPENID_ISSUER` | Включает discovery и проверку подписанного ID token; без него сохранён upstream-flow с явными URL | +| `OPENID_DISCOVERY_URL`, `OPENID_JWKS_URL` | Необязательные переопределения OIDC endpoints | + +В Docker каталог `/data` должен быть доступен UID 10001. В образе `STORAGE_PATH` и `PASSPORT_KEY_PATH` указывают на `/data/storage`. Команды и проверки для разработчиков приведены в английском README. + +## Что ещё препятствует полной замене + +Другие СУБД; остальные Laravel session-хранилища (Redis, cookie и другие); все варианты конфигурации и переводы ошибок; полное сравнение всех маршрутов и middleware; браузерная проверка всех экранов и реальных SSO/WebAuthn-провайдеров. Некоторые диагностические ответы сознательно описывают Rust, а не PHP. QR-код может иметь другое SVG-представление при том же URI. Отдельные ограничения удалённых иконок и почтовых драйверов описаны в `compatibility/CURRENT.md`. + +Прохождение ограниченного набора тестов не означает полной совместимости. Боевой PHP-сервер пока не следует выключать на основании этого архива. + +## Особенности закреплённого OAuth-эталона + +В исходном PHP-файле AppServiceProvider флаг регистрации JSON-маршрутов Passport устанавливается после загрузки пакета. Поэтому `/oauth/clients` и `/oauth/tokens` по умолчанию возвращают SPA для GET и 405 для изменений. Стандартный GET `/oauth/authorize` также неработоспособен: отсутствует реализация AuthorizationViewResponse. По умолчанию сохранено наблюдаемое поведение. Два явных параметра выше включают рабочее управление и согласие для authorization code; экран подтверждения Device Flow в этой версии сохраняет исходную ошибку привязки представления. Эти расширения не считаются точным воспроизведением дефектов эталона. diff --git a/compatibility/CURRENT.md b/compatibility/CURRENT.md new file mode 100644 index 0000000..ee0798e --- /dev/null +++ b/compatibility/CURRENT.md @@ -0,0 +1,44 @@ +# Current compatibility status — 0.3.0 + +Target: 2FAuth 8.0.3, source commit `3516c776a1fcbd83d234efc007e3a49807d6ed91`. + +This supersedes the implementation-status statements in the original 0.1.0 audit. The static PHP source inventories remain valid. This project is still **not a verified complete replacement**. + +## Evidence + +The reference really runs PHP 8.4.27 and locked Laravel 13.29.0 dependencies. All 42 PHP migrations succeeded on disposable SQLite. `sqlite-reference-schema.sql` records the resulting application DDL, without fixture rows or deployment secrets. + +The differential runner exercises separate synthetic instances with both a native Rust database and a copy of the real migrated PHP database. The fixtures preserve the ordinary user at id 1 and add an administrator and recipient. It raises the generic API fixture throttle to 1000 on both sides to fit the expanded sequence; ordinary deployment defaults are covered separately by limiter tests. No production configuration or database was accessed. + +The core raw suites comprise 99 HTTP comparisons: 4 public probes, 12 account/authentication calls, 23 extended account/group/validation calls, and 60 administration/sharing/role-switch calls. Three additional CORS probes bring the core total to 102. Version 0.3.0 adds 29 OAuth and 9 device/default-web probes: 140 comparisons per database mode, of which 129 are exact. Count is not route or configuration coverage. Additional checks assert absent borrowed secrets, RFC HOTP output and counter state, per-user group independence, share counts, encryption transitions and denied operations. + +Exact comparisons retain random CSRF values, health-render milliseconds and SVG QR bytes as differences. Supplemental checks require plain CSRF tokens followed by successful login; compare the health page excluding only its numeric rendering time; and render both SVGs and decode them using the PHP QR reader, requiring the same expected otpauth URI. These are explicit semantic checks, not indiscriminate exclusions. + +`tools/passport_interop.py` additionally tests actual PHP-created RSA bearer tokens and encrypted browser cookies against Rust, Rust-created PATs against PHP's League ResourceServer, expiry/signature/revocation/CSRF rejection, PHP-browser upgrade at the HTML bootstrap, cookie clearing and logout. Test keys are generated for disposable fixtures. + +Rust tests exercise actual WebAuthn signatures and credential migration, not acceptance stubs: PHP-encrypted P-256 PEM, RSA/Ed25519 PEM imports, fresh P-256/Ed25519 registration, origin/handle/signature checks, expiry, replay, device management and password/token recovery. Local fake SSO providers exercise PKCE/state/OIDC verification. Local SMTP tests cover delivery and TLS downgrade rejection. + +See `VERIFICATION.md` and the final `reference-results.*.json` files for executed results and binary/case hashes. The earlier `reference-results.json` is retained as a baseline from the old binary. + +## Additions in 0.3.0 + +Real PHP session fixtures cover eight process-level combinations: file/database × JSON/PHP serialization × encrypted/plain storage. They exercise original session CSRF, Passport refresh, HTML bootstrap import, native API use, source-store destruction, logout token rotation and replay through the actual HTML import path. + +The device grant uses the pinned `oauth_device_codes` schema, 10-minute device codes, 8-character user codes and the original 5-second polling interval. Its default browser view remains broken like the source binding. + +The OAuth wire test uses a PHP-issued encrypted authorization code with S256 PKCE, verifies the Rust JWT signature in PHP, decrypts and re-encrypts Rust refresh tokens in PHP, and checks exchange/replay plus client-credential wildcard scopes. OAuth error contracts are compared separately rather than inferred from successful exchanges. Optional consent stores approval challenges server-side and binds them to one browser session; prompt=login markers are single-use and expire. + +Existing SQLite databases are checked read-only for required columns/types, primary and non-partial unique keys, and foreign-key delete actions against the pinned migration DDL. Laravel sessions are required only when the database session driver is configured. Other engine support requires the driver/value/SQL work documented in database-portability.md. + +## Remaining gaps before a complete-replacement claim + +- **Database engines:** only SQLite is implemented. PostgreSQL, MySQL and SQL Server remain unsupported. `prepare-sqlite` validates an already migrated pinned schema; it does not reproduce all historic Laravel migration paths. +- **Other Laravel session modes:** file and SQLite database stores, JSON/PHP scalar-array serialization, SESSION_ENCRYPT and remember-me import/revocation are implemented and tested. Redis, cookie, Memcached and other backends remain unsupported. Non-ASCII APP_NAME slug defaults, separate session connections and every cookie/multi-process configuration are not certified. +- **OAuth surface:** authorization-code/PKCE, refresh rotation, client credentials, device authorization/polling and the Defuse encrypted format are implemented alongside bearer/PAT/cookies. The pinned source has disabled JSON management routes and a broken consent view binding. Defaults preserve those observed defects; explicit opt-ins enable repaired management and authorization-code consent. Device browser consent retains the original broken view binding; this build does not add a repaired device UI. Other package grant modes and every authorization/configuration edge case are not certified. +- **Validation/localization/configuration:** selected error/status contracts have been compared and corrected. All request validation combinations, translations, guard ordering, proxy chains, cookie settings and the complete environment matrix have not been exhaustively compared. Some date and user-agent formatting is approximate. OAuth/device limiting is checked at 60/minute; all interactions with the PHP unnamed login quota and authenticated-user key switching are not certified. +- **Icons/QR:** SVG encoding differs by QR library while decoded content is checked. SVG sanitization intentionally strips unsupported/executable content; uncommon safe SVG features may change. Remote fetching, proxies, retries, DNS edge cases and checksum-specific QR error messages are not fully identical. +- **Mail:** SMTP, TLS/STARTTLS, sendmail and log are implemented. Every Laravel cloud transport and exact HTML mail layout is not reproduced. Notifications are localized but were not checked through real production mail/providers. +- **Operational surface:** Rust diagnostics identify the actual native runtime; Laravel cache/optimization commands have native equivalents because no PHP template/config cache exists. The complete Artisan command/scheduler/queue operational interface is not reproduced. +- **Acceptance:** no full real-browser UI acceptance, production cutover, physical authenticator matrix or actual GitHub/OpenID provider acceptance was performed. Docker/hosted CI were not executed here. + +Keep the PHP deployment available until the remaining requirements relevant to that deployment are implemented and tested. Successful limited fixtures are not a certification of all original functionality. diff --git a/compatibility/README.md b/compatibility/README.md new file mode 100644 index 0000000..59b2d32 --- /dev/null +++ b/compatibility/README.md @@ -0,0 +1,116 @@ +> Historical 0.1.0 implementation audit. For current implementation status and real PHP reference results, read [CURRENT.md](CURRENT.md) and [VERIFICATION.md](VERIFICATION.md). The source inventories below remain pinned to the same upstream commit. + +# Compatibility audit + +Source pinned to **3516c776a1fcbd83d234efc007e3a49807d6ed91** (2FAuth upstream). All source paths below are relative to `upstream/`. + +`routes.json` inventories 91 application method/path declarations, including expanded apiResource methods, inherited route middleware, constraints and source lines. GET also accepts HEAD. Kernel global/group/alias/priority declarations are included verbatim. This is static source evidence, not Laravel's effective route list: alias expansion, priority sorting, duplicate removal, package routes, CORS preflight and framework fallback behavior still require a booted reference. The API prefix is `/api/v1`; `settingName` is globally `[a-zA-Z]+` (`app/Providers/RouteServiceProvider.php`). API unknown-route text is literally `unknowkn endpoint`. + +`database.json` records all 42 ordered migration sources and hashes, including data backfills. It deliberately does not claim to be a materialized SQL schema. `environment.json` maps 170 literal configuration environment names to source locations without reading deployment values; dynamic preference names are listed separately. Regenerate from the repository root: + +```sh +python rust-server/tools/inventory.py +``` + +## Drop-in requirements and blockers + +| Area | Required behavior and evidence | Unverified work before a drop-in claim | +|---|---|---| +| Existing databases | SQLite, MySQL, PostgreSQL and SQL Server configured in `config/database.php`. Users, options, accounts, groups, icons, sharing, per-user assignment/order, authentication/OTP logs, sessions/cache, OAuth and WebAuthn tables are migration-backed. | Apply real migrations against fixture databases for each supported driver, compare types/defaults/nullability/indices/foreign keys and preserve migration history. Static declarations are not sufficient. | +| Schema evolution | 2026 group assignment/order migrations backfill legacy values then drop `twofaccounts.group_id` and `order_column`. Passport 13 migration changes clients to owner morphs/redirect_uris/grant_types and drops oauth_personal_access_clients. WebAuthn 2022 migration uses a helper defined after `down()`. | Inspect full helper source and data transformations, exercise upgrades and use current table shapes. Do not recreate the original 2019 account schema as the current schema. | +| Encryption | `config/app.php` selects AES-256-CBC, APP_KEY and APP_PREVIOUS_KEYS. `app/Models/Traits/CanEncryptField.php` invokes Laravel Crypt encryptString/decryptString conditionally on `useEncryption`; account model applies it to fields and pads secrets as Base32. | Implement and test Laravel ciphertext envelope/MAC, key parsing/rotation and actual encrypted fixtures. Returning stored ciphertext as an OTP secret is not compatible. Preserve key and option state. | +| Authentication | `config/auth.php`: web-guard session, api-guard Passport, reverse-proxy-guard custom remote-user provider. `CustomCreateFreshApiToken` mints the first-party `laravel_token` for authenticated responses. `PreventRequestForgery` enables XSRF cookie with no exclusions. | Verify encrypted/signed cookies, session persistence, CSRF exchange (419), JWT/PAT validation/revocation/scopes, password hashing, reset and recovery brokers and remember-me flows. An arbitrary bearer-token lookup is not Passport compatibility. | +| Authorization and sharing | `app/Policies/{TwoFAccount,Group,User}Policy.php`, sharing middleware and model scoping enforce owner/shared recipient/admin rules. New shares/assignments/orders are per-user. | Exercise cross-user negative tests, ownership transfer, all-user scope, admin-only paths, disabling sharing, SSO-only/demo/proxy modes and settings gates. | +| Middleware | `Kernel.php`, middleware sources and RouteServiceProvider implement trim/empty-to-null, forced JSON Accept, throttling, bindings, language, maintenance/CORS/proxy handling and priority. KickOutInactiveUser returns 418 and updates last_seen_at; bearer/proxy users bypass its inactivity tracking. | Verify actual ordering/status/envelopes/cookies. Preserve `rejectIfReverseProxy`, `rejectIfSsoOnlyAndNotForAdmin`, forceLogout and admin policy behaviors. | +| Frontend | `resources/views/landing.blade.php` injects appSettings/appConfig/urls/defaultPreferences/lockedPreferences/appVersion/isDemoApp/isTestingApp/appLocales, CSRF meta and optional CSP nonce. `SinglePageController` computes visitor-safe settings and subdirectory paths. Existing `public/build/manifest.json` and assets are present. | Reuse existing build plus public assets and reproduce bootstrap shape/CSP/base URLs; an unrelated minimal page is not the existing UI. Source rebuild needs sibling `../2FAuth-Components/packages/{formcontrols,stores,styles,ui}` referenced by package.json. | +| Frontend HTTP contract | `resources/js/services/httpClientFactory.js` uses credentials, JSON, X-Requested-With, web root vs `/api/v1`, retries 419 via refresh-csrf, handles 418/407/401/422/404 distinctly. | Browser login, refresh, page reload, account/group/share/icon workflows and translated validation payloads must be tested. | +| OTP and imports | `app/Models/TwoFAccount.php` supports HOTP/TOTP/Steam, next-password payloads, URI parsing/exports; API controllers/resources/requests and service classes define wire format and validation. | Verify SHA algorithms/digits/period, HOTP increment atomicity, Steam, QR image decode/encode, encrypted import/export variants and field/error envelopes against real source fixtures. | +| Integrations/operations | WebAuthn, Socialite OpenID/GitHub, proxy auth, mail notifications/reset, logo fetch, content policy, scheduled log cleanup, cache/optimization and CLI installation are upstream functionality. | A route that returns an explicit unsupported error is honest partial coverage, not parity. All enabled deployment features need implementation and integration tests. | + +## Differential HTTP harness + +The stdlib-only `tools/differential_http.py` compares two **separate disposable instances with equivalent fixture data**, reporting only case numbers, status codes, comparison booleans or sanitized exception class names. It never prints response bodies, header values, environment values or URLs. Redirect following and retries are disabled. Body limit is 4 MiB. TLS verification remains enabled. Credentials are supplied by environment variable names referenced by a case file, separately for each instance. Cookies are retained only with the explicit `--sessions --allow-side-effects` flags, in separate in-memory jars per instance; they are never written to disk. + +```sh +python rust-server/tools/differential_http.py \ + --reference http://127.0.0.1:8000 \ + --candidate http://127.0.0.1:8080 +``` + +The four original default probes are GET `/up`, `/manifest.json`, `/api/v1/user/name`, and an unknown API path. Three additional defaults check CORS preflight, a cross-origin unauthenticated GET and the same GET without an Origin header. They can create framework sessions/rate-limit counters; no live production instance should be used. `/up` may differ in the framework-rendered HTML even if status is equivalent; exact body comparison intentionally exposes that difference. + +All nondefault paths, authenticated requests and mutations outside the built-in safe probes are skipped unless `--allow-side-effects` is supplied. GET alone does not establish safety: upstream logout, optimize, clear-cache, HOTP and activity tracking can mutate state. The illustrative `cases.example.json` includes a public synthetic OTP secret and a real account-creation mutation. Use it only with disposable fixtures and explicit opt-in: + +```sh +python rust-server/tools/differential_http.py \ + --reference http://127.0.0.1:8000 \ + --candidate http://127.0.0.1:8080 \ + --cases rust-server/compatibility/cases.example.json --allow-side-effects +``` + +Cases support `json`, `headers_env.reference`/`headers_env.candidate`, `ignore_json_pointers` and `compare_headers`. Stateful sequences additionally support `capture_json` (capture name to JSON pointer), `{{capture_name}}` references in later paths/JSON, and `headers_from_cookies` (header name to cookie name, URL-decoded). Captures and cookie values remain separate per instance and are never printed. Missing captures/cookies fail the case. `expected_status` makes matching error responses fail when the scenario expected success. A whole JSON placeholder preserves its type; an embedded placeholder becomes text. Bodies are compared exactly after JSON parsing and replacing each configured base URL with ``; explicit JSON pointers can exclude nondeterministic fields. Raw OTPs, timestamps, IDs, localized messages and random HTML CSP/CSRF values can differ. Do not indiscriminately mask these differences. Establish a known clock and matched database IDs/fixtures. Selected headers compare exactly in memory; Set-Cookie parity and browser token exchanges need separate stateful tests. + +Exit code is 1 for any executed difference or transport failure, 0 when all executed comparisons match. Skips are reported and are never counted as evidence of coverage. A successful default run is seven transport/probe comparisons, not 91 route coverage and not a drop-in certification. + +## Verification performed + +The inventory generator and harness syntax/help were checked. The harness was exercised against local deterministic stub servers for matching responses, divergent statuses, redirects, skipped mutation cases and sanitized error reporting. A later isolated Laravel 13.29.0 / PHP 8.4.27 reference boot applied all 42 SQLite migrations and ran four default, twelve basic stateful and 23 extended comparisons against the preexisting release binary. See `reference-results.json` for exact sanitized comparisons, binary hash and limitations. This does not certify the current edited Rust source or production compatibility. + +## Pinned frontend reuse implemented + +`src/frontend.rs` now serves the unmodified upstream Vue build plus allowlisted public image/CSS/robots assets. `public/UPSTREAM-LICENSE` and `UPSTREAM-NOTICE.txt` retain the upstream provenance/license. `frontend-assets.json` records SHA-256 values for every copied public file. PHP is not copied or served. Three targeted frontend tests passed: malicious inline data escaping, visitor redaction, and actual session/cookie/CSP/static-file bootstrap. The module exposes `routes() -> Router` and includes the explicit SPA paths from the upstream Vue router, the root alias, static files and manifest. Unknown API paths do not become HTML. + +The HTML bootstrap uses the upstream global names and Vite manifest, default/locked user preferences, locales and visitor-safe settings (all nonvisitor option values become null). Inline JSON escapes HTML delimiters and Unicode line separators; title/theme/attribute values are separately HTML-escaped. A generated nonce protects both scripts under CSP. The HTML handler calls the actual native-session `auth::refresh_csrf`, includes its CSRF token in the meta tag and preserves its session/XSRF cookies. It does not invent a separate frontend authentication token. The copied Axios client reads XSRF-TOKEN and submits its same-origin X-XSRF-TOKEN header; login returns the expected user payload and rotates cookies. The upstream authGuard restores current-user state from GET `/api/v1/user` and then fetches accounts/groups. + +`RUST_PUBLIC_DIR` can relocate the public asset directory; it defaults to the crate's `public` directory. `APP_NAME`, default/locked preference variables and `CONTENT_SECURITY_POLICY` affect the bootstrap. Native sessions default to Secure cookies; HTTP localhost development requires the explicit `RUST_COOKIE_SECURE=false` setting from the auth module. Nonempty APP_SUBDIRECTORY fails with 503 because mounting only the HTML subpath would leave auth/API/assets inconsistent. Proxy and SSO provider capabilities are not advertised by the experimental bootstrap because those authentication methods are unimplemented. Interface links can still reach unimplemented backend features; displaying the original UI does not establish drop-in backend compatibility. + + +## Stateful comparison sequence + +`cases.stateful.json` exercises CSRF cookie acquisition, password login, current user, HOTP creation, two OTP generations, counter readback, deletion/readback, logout and rejection after logout. Provision `compat@example.invalid` with the public synthetic password in that file on both **disposable** instances, with equivalent nonadministrator fixture users and matching options. Run with: + +```sh +python rust-server/tools/differential_http.py \ + --reference http://127.0.0.1:8000 --candidate http://127.0.0.1:8080 \ + --cases rust-server/compatibility/cases.stateful.json \ + --sessions --allow-side-effects +``` + +The sequence is a starting fixture, not recorded evidence of parity. Random CSRF response bodies and protocol differences intentionally remain visible; only explicitly listed account IDs are ignored in JSON comparisons while per-side IDs drive subsequent requests. It compares state effects through later API reads, not direct database snapshots. It does not establish database schema, cookie cryptography, token persistence, concurrency or browser parity. Timestamps remain unmasked; a clock control is still needed for time-sensitive responses. + +`python rust-server/tests/differential_harness.py` verifies typed/escaped JSON captures, separate cookies/IDs, URL-decoded CSRF header replay, mutation readback and expected-status failure against local deterministic stub servers. These are harness regression tests, not PHP-versus-Rust evidence. + +The recorded reference run matched 8/12 complete stateful responses. Both HOTP values and counter readback matched; CSRF/login/error bodies still differ. All 12 expected statuses matched. Default probes matched 0/4 complete responses, including PHP 200 versus Rust 404 on the deprecated-name route. These are limited case results, not route coverage percentages. + + +`cases.extended.json` adds group create/read/delete, administrator denial, disabled-sharing denial, QR encode and invalid decode, import/invalid-account validation and feature flags. The recorded baseline matched 11/23 complete responses; unimplemented routes and validation differences remain visible. + +For a reproducible local run, install the pinned `upstream/composer.lock` dependencies with PHP 8.4+ and all extensions in `composer.json`, then run: + +```sh +python tools/run_reference.py --php /path/to/php \ + --source ../upstream --candidate-binary target/release/twofauth-rs \ + --output compatibility/reference-results.local.json +``` + +The runner creates a new temporary reference application and two fresh SQLite databases, executes all upstream migrations, creates Passport fixture keys and public synthetic regular/admin/recipient users, then launches both servers and runs 99 core comparisons across the four suites plus three CORS transport probes (102 total). It destroys the fixture directory afterward. Source `vendor` must already contain Composer dependencies; it never installs software or changes the source database/configuration. Generated source config/route caches, environment files and existing session/cache state are excluded. Only PHP runtime environment variables are inherited, so deployment configuration/secrets are not reused. Export `PHPRC` if your PHP runtime needs a custom extension configuration, including for child PHP processes. The result includes the candidate binary SHA-256. Exit 1 means actual compatibility differences; exit 2 means setup failed. No production service is involved. + + +Use `--candidate-db laravel-copy` to test against a SQLite backup of the real migrated PHP fixture schema. In that mode the runner preserves the PHP user/password record and invokes `prepare-sqlite` to add the Rust authentication sidecars. Use `--candidate-db native` (the default) for the independent development schema. Both modes use new disposable databases; neither accepts a deployment database path. + +`sqlite-reference-schema.sql` records the actual SQLite DDL produced by all 42 migrations (22 application tables, 34 explicit indexes), without fixture rows. The DDL was replayed successfully into an empty SQLite database. It documents this driver only; MySQL, PostgreSQL and SQL Server still require real materialization and comparison. + + +`cases.admin-sharing.json` adds administrator settings/user mutations and multi-user sharing checks. The runner creates a regular user, an administrator and a recipient on both servers, preserving the original regular-user scenarios. It exercises custom setting CRUD, actual encryption on/off with account readback, last-administrator protections, user creation/promotion/demotion, empty PAT revocation, explicit/all-user sharing, secret suppression, export denial, deterministic HOTP, visible counts, independent per-user groups, revocation and self-transfer validation. Role switches explicitly refresh CSRF cookies before login. JSON assertions independently check missing secrets, RFC HOTP, counts and owner group independence. The fixture sets THROTTLE_API=1000 to accommodate the bulk sequence; default rate-limit equivalence is a separate test requirement. + +Add `--semantic-checks` to preserve every exact comparison and separately check three nondeterministic representations: health HTML equality after changing only the numeric render duration, textual CSRF token shape plus successful subsequent login, and both rendered QR payloads. QR checks require Node `sharp` and use the reference PHP `Zxing\QrReader` to decode each SVG after rasterization. Both decoded provisioning URIs must match each other and the known synthetic fixture. Render/decode failures are reported explicitly. Raw QR bytes, random CSRF strings and health render times remain visible as exact differences; semantic results never replace them. + +Static `headers` are supported for synthetic protocol probes; header values are never printed. `expected_headers`, `expected_json`, `absent_json_pointers` and `expect_text_token` add assertions independently of response equality. The three CORS probes compare status and allow-origin/method/header behavior, assert wildcard origins without credentials and assert the source wildcard header is retained even when Origin is absent. The original 99 core case count is retained separately from these three added transport checks. + +## Historical 0.2.0 reference evidence + +The 0.2.0 run, retained in `VERIFICATION-0.2.0.md`, used independent native and copied Laravel SQLite fixture schemas. It executed 102 comparisons per schema (99 core cases plus three CORS probes), with 91 exact responses each. The filenames `reference-results.native.json` and `reference-results.laravel.json` now hold the latest release results; see `VERIFICATION.md` for their current counts and hash. All statuses, content types, selected/expected headers and independent scenario assertions matched. CORS preflight, actual cross-origin requests and requests without Origin matched exactly. + +The eleven remaining exact body differences per schema are nine independently generated CSRF strings, one health render duration and one QR image encoding. Separate checks passed for health equality after changing only the render-duration number, valid textual CSRF tokens followed by successful login, and both rendered QR images decoding to the same expected synthetic provisioning URI. Raw differences remain recorded. No cases were skipped and no transport/capture errors occurred. These finite fixtures do not certify every route, integration, deployment configuration or supported database driver. + +`reference-results.json` preserves the earlier baseline and upstream-suite/DNS limitations; it is not the final release report. Both final reports carry the candidate SHA-256, harness/case hashes and explicit fixture configuration. diff --git a/compatibility/VERIFICATION-0.2.0.md b/compatibility/VERIFICATION-0.2.0.md new file mode 100644 index 0000000..3976327 --- /dev/null +++ b/compatibility/VERIFICATION-0.2.0.md @@ -0,0 +1,40 @@ +# Verification record — 2026-10-27, version 0.2.0 + +Target: upstream 2FAuth 8.0.3, commit `3516c776a1fcbd83d234efc007e3a49807d6ed91`. + +Tested included Linux x86_64 GNU executable SHA-256: + +`878d842c502f35dc1ec078a023dafe9dc23604fda0d01aa0703089bf116ba152` + +| Check | Executed result | Scope and limits | +|---|---|---| +| Rust tests, `cargo test --locked --all-targets` | **101 passed, 0 failed** | Includes actual WebAuthn crypto/recovery, sharing, imports, mail, OAuth/OIDC, authentication, settings/encryption, middleware and subdirectory tests. Count is not total route/configuration coverage. | +| Formatting | Passed | `cargo fmt --all -- --check`; source formatted after final changes. | +| Strict Clippy | Passed | `cargo clippy --locked --all-targets -- -D warnings`. | +| Release build | Passed | Linux x86_64 GNU; bundled binary requires glibc 2.39 and libgcc_s. Vendored OpenSSL, optimized non-LTO release. | +| Release HTTP/CLI smoke | Passed | Fresh DB, refusal to re-init, test-user provisioning, HTML/CSP/cookies, login/CSRF, CRUD/secrets, independent HOTP calculations, permissions, logout and process shutdown. | +| Relocated executable/assets | Passed | Copied binary/public to an unrelated folder, ran from a different CWD, HTML and PNG assets loaded without RUST_PUBLIC_DIR. | +| Direct startup of a copied Laravel DB | Passed | No prepare command required; original application DDL, migration rows and user/password rows unchanged; only rust_-prefixed metadata tables added. | +| Real PHP reference | Runs | PHP 8.4.27, locked Laravel 13.29.0; all 42 upstream migrations applied. DDL retained in sqlite-reference-schema.sql. | +| Native Rust database HTTP comparisons | **102 executed**, all statuses/checks match | 91 exact responses; 11 expected dynamic/encoding body differences as detailed below. | +| Copied Laravel database HTTP comparisons | **102 executed**, all statuses/checks match | Same results on real migrated tables and PHP password hashes. | +| Default CORS HTTP comparisons | 3 exact matches in each mode | Preflight, request with Origin, request without Origin; wildcard/default no-credentials policy. | +| Supplemental semantic checks | Passed on both modes | Health differs only by render milliseconds; plain CSRF token followed by successful login; both SVG QR codes rendered and decoded with PHP's reader into the exact same fixture URI. | +| Real Passport interoperability | **11 checks passed** | PHP bearer/cookie accepted by Rust; Rust PAT accepted by actual PHP League ResourceServer; CSRF, tampering and revocation rejected; PHP browser upgraded, legacy cookie cleared, logout prevents subsequent use. | +| Python harness regression tests | **5 passed** | Stateful cookies, headers, captures, normalization, mismatches and sanitized failures. | +| Independent crypto | 6 fixtures passed PHP OpenSSL and Laravel Encrypter | AES-128/256-CBC/HMAC, empty/ASCII/Unicode; both independent Python generation and actual PHP decryptString verification. | +| Upstream PHPUnit reference suite | 1,518 tests, 4,573 assertions; 5 errors, 2 failures | All seven remaining failures involve unavailable real DNS before mocked icon HTTP. This is a reference-environment result, not a claim Rust passed the PHP test suite. | +| Docker / hosted CI / real browser acceptance | Not executed | Files provided; Docker tool/daemon unavailable. No physical authenticator or real external SSO provider acceptance was performed. | +| Production migration/cutover | Not performed | Only disposable synthetic data and copied fixtures were used. | + +## Raw differential accounting + +Each database mode executes 7 default/CORS probes, 12 basic stateful calls, 23 extended calls and 60 admin/sharing calls. Native and copied-Laravel modes each produce **91/102 exact matches**. All 102 statuses, content types, selected headers, expected statuses, explicit JSON assertions and CSRF shape checks pass. There are no skipped probes, transport errors or unexpected rate-limit responses. + +The eleven remaining raw body differences are nine random CSRF tokens, one health render-time number and one SVG QR representation. They remain visible in the raw reports. Their relevant behavior is independently checked; QR pixels or random strings were not simply discarded to claim equality. + +The synthetic fixture API quota is raised to 1000 on both instances so the expanded sequence fits one run. Default/API/import limits, expiry, concurrency, trusted proxies and spoofing are separately tested. Raw comparisons and all provenance/case hashes are retained in `reference-results.native.json` and `reference-results.laravel.json`. The old `reference-results.json` is preserved as a baseline. + +## What this does not establish + +**Full replacement has not been reached.** Other database drivers, full package OAuth endpoints, every Laravel session/remember-me mode, historic migration paths, configuration/localization edge cases and complete browser/provider acceptance still remain. See `CURRENT.md` for precise remaining scope. diff --git a/compatibility/VERIFICATION.md b/compatibility/VERIFICATION.md new file mode 100644 index 0000000..49192c0 --- /dev/null +++ b/compatibility/VERIFICATION.md @@ -0,0 +1,43 @@ +# Verification record — 2026-10-28, version 0.3.0 + +Target: upstream 2FAuth 8.0.3, commit `3516c776a1fcbd83d234efc007e3a49807d6ed91`. + +Historical 0.2.0 results, including its upstream PHPUnit run, are retained in `VERIFICATION-0.2.0.md`; they are not rerun claims for this binary. + +## Executed checks + +Included Linux x86_64 GNU executable SHA-256: `0e03e978721bf4fcfc65e18e4a98f47b26b71a151c792b380d18996ae467813d`. + +| Check | Executed result | +|---|---| +| Rust: cargo test --locked --all-targets | **137 passed, 0 failed** | +| Formatting and strict Clippy | Passed; cargo fmt --all -- --check; cargo clippy --locked --all-targets -- -D warnings | +| Optimized release and CLI/HTTP smoke | Passed; Linux x86_64 GNU, glibc >=2.39; libc/libm/libgcc_s runtime dependencies | +| Native SQLite HTTP comparison | **140 executed: 129 exact, 11 expected raw body differences** | +| Copied migrated Laravel SQLite comparison | **140 executed: 129 exact, 11 expected raw body differences** | +| Additional OAuth/device HTTP cases | **38 exact per database mode**; error/status/hint/cache/challenge and default web CSRF contracts | +| Semantic health, CSRF/login and rendered QR checks | Passed in both database modes | +| Actual PHP Passport interoperability | **11 checks passed in each database mode** | +| PHP authorization-code/refresh/RSA wire checks | **5 passed**; actual PHP Defuse decrypt/encrypt and OpenSSL verification | +| Laravel session process combinations | **8 passed**: file/database × JSON/PHP × plain/encrypted | +| Device grant interoperability | **8 passed**: PHP-issued code, PHP approval, Rust tokens checked by actual PHP ResourceServer; pending/backoff, deny, expiry and replay | +| Python comparison harness | **6 passed, 0 failed** | +| Independent Python/PHP OpenSSL CBC fixtures | **6 passed** | + +All 140 statuses, content types, selected headers, explicit JSON assertions and scenario checks match in both database modes. The 11 raw differences are confined to the original core sequence; all 38 new OAuth/device cases are exact. Both runs retain THROTTLE_API=1000 only for the large API fixture sequence. OAuth/default web quotas are not increased. Supplemental login/QR semantics run before the OAuth error burst so the PHP shared unnamed throttle does not invalidate their setup. + +Full reports and provenance are in reference-results.native.json, reference-results.laravel.json, interop-results.json, passport-interop-results.json and device-interop.json. Actual PHP protocol observations are retained separately in oauth-php-reference.json, oauth-php-body-reference.json and oauth-device-php-reference.json. + +## What this establishes + +The original 102-case HTTP sequence runs against both a native Rust SQLite database and an actual migrated PHP database copied with SQLite backup. Eleven raw response body differences are retained: nine random CSRF tokens, the health render duration and SVG QR representation. Supplemental checks verify login after CSRF, health apart from its numeric rendering time, and both rendered QR images decoded with PHP into the expected fixture URI. No random-value or QR exclusions are used to claim byte equality. + +Additional OAuth cases compare the actual errors, descriptions, hints, statuses and selected cache/challenge headers. The standard token endpoint accepts form and JSON payloads as Laravel does. Success, PKCE, cryptographic interoperability, refresh replay rejection and client-credential scopes are checked separately using actual PHP Defuse and OpenSSL. + +Laravel session HTTP tests cover file/database × JSON/PHP scalar-array serialization × encrypted/plain storage. They verify encrypted XSRF, Passport refresh, source store destruction on HTML bootstrap, native requests after refresh, remember-token rotation, and replay through HTML import after logout. Unit tests also require import to rotate an anonymous native SID and logout to revoke both identities when stale cookies name different users. + +## Limits + +Full replacement has not been reached. Only SQLite is supported. Redis/cookie/other session drivers, the complete configuration/localization/middleware matrix, historical migration paths and full real-browser/provider acceptance remain unverified or unimplemented. Fixed optional OAuth management/consent behavior is explicitly opt-in because the pinned PHP source has broken/disabled routes. See `CURRENT.md` and `database-portability.md`. + +Docker, physical authenticators, production cutover and live GitHub/OpenID providers were not tested in this pass. All process tests use disposable synthetic users, keys, databases and ports. diff --git a/compatibility/cases.admin-sharing.json b/compatibility/cases.admin-sharing.json new file mode 100644 index 0000000..3e8259f --- /dev/null +++ b/compatibility/cases.admin-sharing.json @@ -0,0 +1,715 @@ +[ + { + "id": "fresh-csrf", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login-admin", + "path": "/user/login", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "admin@example.invalid", + "password": "Synthetic-compat-password-4620" + }, + "capture_json": { + "admin_id": "/id" + } + }, + { + "id": "last-admin-demote-denied", + "path": "/api/v1/users/{{admin_id}}/promote", + "method": "PATCH", + "expected_status": 403, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "is_admin": false + } + }, + { + "id": "last-admin-delete-denied", + "path": "/api/v1/users/{{admin_id}}", + "method": "DELETE", + "expected_status": 403, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "recipient-admin-read", + "path": "/api/v1/users/3", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "capture_json": { + "recipient_id": "/info/id" + }, + "ignore_json_pointers": [ + "/info/id", + "/info/last_seen_at", + "/info/created_at" + ] + }, + { + "id": "admin-create-user", + "path": "/api/v1/users", + "method": "POST", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "name": "Managed", + "email": "managed@example.invalid", + "password": "Synthetic-managed-password-4620", + "password_confirmation": "Synthetic-managed-password-4620", + "is_admin": false + }, + "capture_json": { + "managed_id": "/info/id" + }, + "ignore_json_pointers": [ + "/info/id", + "/info/last_seen_at", + "/info/created_at" + ] + }, + { + "id": "promote-user", + "path": "/api/v1/users/{{managed_id}}/promote", + "method": "PATCH", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "is_admin": true + }, + "ignore_json_pointers": [ + "/info/id", + "/info/last_seen_at", + "/info/created_at" + ] + }, + { + "id": "demote-user", + "path": "/api/v1/users/{{managed_id}}/promote", + "method": "PATCH", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "is_admin": false + }, + "ignore_json_pointers": [ + "/info/id", + "/info/last_seen_at", + "/info/created_at" + ] + }, + { + "id": "revoke-empty-pats", + "path": "/api/v1/users/{{managed_id}}/pats", + "method": "DELETE", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "delete-managed-user", + "path": "/api/v1/users/{{managed_id}}", + "method": "DELETE", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "custom-setting-create", + "path": "/api/v1/settings", + "method": "POST", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "key": "compatCustom", + "value": "first" + } + }, + { + "id": "custom-setting-read", + "path": "/api/v1/settings/compatCustom", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "custom-setting-update", + "path": "/api/v1/settings/compatCustom", + "method": "PUT", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "value": "second" + } + }, + { + "id": "custom-setting-delete", + "path": "/api/v1/settings/compatCustom", + "method": "DELETE", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "custom-setting-deleted", + "path": "/api/v1/settings/compatCustom", + "method": "GET", + "expected_status": 404, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "owner-create-hotp", + "path": "/api/v1/twofaccounts", + "method": "POST", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "service": "compat-sharing", + "account": "fixture@example.invalid", + "otp_type": "hotp", + "secret": "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", + "digits": 6, + "algorithm": "sha1", + "counter": 0 + }, + "capture_json": { + "shared_id": "/id" + }, + "ignore_json_pointers": [ + "/id" + ] + }, + { + "id": "setting-useEncryption-True", + "path": "/api/v1/settings/useEncryption", + "method": "PUT", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "value": true + } + }, + { + "id": "encrypted-account-read", + "path": "/api/v1/twofaccounts/{{shared_id}}", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "ignore_json_pointers": [ + "/id" + ] + }, + { + "id": "setting-useEncryption-False", + "path": "/api/v1/settings/useEncryption", + "method": "PUT", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "value": false + } + }, + { + "id": "decrypted-account-read", + "path": "/api/v1/twofaccounts/{{shared_id}}", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "ignore_json_pointers": [ + "/id" + ] + }, + { + "id": "setting-enableSharing-True", + "path": "/api/v1/settings/enableSharing", + "method": "PUT", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "value": true + } + }, + { + "id": "setting-enableAllUsersSharingScope-True", + "path": "/api/v1/settings/enableAllUsersSharingScope", + "method": "PUT", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "value": true + } + }, + { + "id": "share-explicit-recipient", + "path": "/api/v1/twofaccounts/{{shared_id}}/shares", + "method": "POST", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "user_ids": [ + "{{recipient_id}}" + ] + }, + "ignore_json_pointers": [ + "/twofaccount_id" + ] + }, + { + "id": "logout-owner", + "path": "/user/logout", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "refresh-before-recipient", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login-recipient", + "path": "/user/login", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "recipient@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "recipient-read-secret-hidden", + "path": "/api/v1/twofaccounts/{{shared_id}}", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "ignore_json_pointers": [ + "/id" + ], + "absent_json_pointers": [ + "/secret" + ] + }, + { + "id": "recipient-export-denied", + "path": "/api/v1/twofaccounts/export?ids={{shared_id}}", + "method": "GET", + "expected_status": 403, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "recipient-hotp", + "path": "/api/v1/twofaccounts/{{shared_id}}/otp", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "expected_json": { + "/password": "755224" + } + }, + { + "id": "recipient-visible-count", + "path": "/api/v1/twofaccounts/count", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "expected_json": { + "/owned": 0, + "/shared": 1, + "/total": 1 + } + }, + { + "id": "recipient-group-create", + "path": "/api/v1/groups", + "method": "POST", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "name": "Borrowed group", + "show_in_chips": true + }, + "capture_json": { + "recipient_group": "/id" + }, + "ignore_json_pointers": [ + "/id" + ] + }, + { + "id": "recipient-group-assign", + "path": "/api/v1/groups/{{recipient_group}}/assign", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "ids": [ + "{{shared_id}}" + ] + }, + "ignore_json_pointers": [ + "/id" + ], + "expected_json": { + "/twofaccounts_count": 1 + } + }, + { + "id": "recipient-group-read", + "path": "/api/v1/groups/{{recipient_group}}", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "ignore_json_pointers": [ + "/id" + ], + "expected_json": { + "/twofaccounts_count": 0 + } + }, + { + "id": "recipient-group-index-count", + "path": "/api/v1/groups", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "ignore_json_pointers": [ + "/1/id" + ], + "expected_json": { + "/1/twofaccounts_count": 1 + } + }, + { + "id": "logout-recipient", + "path": "/user/logout", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "refresh-before-admin", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login-admin", + "path": "/user/login", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "admin@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "owner-group-independence", + "path": "/api/v1/twofaccounts/{{shared_id}}", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "ignore_json_pointers": [ + "/id" + ], + "expected_json": { + "/group_id": null + } + }, + { + "id": "owner-transfer-self-validation", + "path": "/api/v1/twofaccounts/{{shared_id}}/owner", + "method": "PATCH", + "expected_status": 422, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "new_owner_id": "{{admin_id}}", + "confirm_password": "Synthetic-compat-password-4620" + } + }, + { + "id": "revoke-explicit-share", + "path": "/api/v1/twofaccounts/{{shared_id}}/shares/{{recipient_id}}", + "method": "DELETE", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "logout-owner", + "path": "/user/logout", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "refresh-before-recipient", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login-recipient", + "path": "/user/login", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "recipient@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "recipient-after-revocation", + "path": "/api/v1/twofaccounts/{{shared_id}}", + "method": "GET", + "expected_status": 403, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "logout-recipient", + "path": "/user/logout", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "refresh-before-admin", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login-admin", + "path": "/user/login", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "admin@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "share-all-scope", + "path": "/api/v1/twofaccounts/{{shared_id}}/shares/all", + "method": "POST", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": {}, + "ignore_json_pointers": [ + "/twofaccount_id" + ] + }, + { + "id": "logout-owner", + "path": "/user/logout", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "refresh-before-recipient", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login-recipient", + "path": "/user/login", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "recipient@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "recipient-all-scope-read", + "path": "/api/v1/twofaccounts/{{shared_id}}", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "ignore_json_pointers": [ + "/id" + ], + "absent_json_pointers": [ + "/secret" + ] + }, + { + "id": "logout-recipient", + "path": "/user/logout", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "refresh-before-admin", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login-admin", + "path": "/user/login", + "method": "POST", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "admin@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "revoke-all-shares", + "path": "/api/v1/twofaccounts/{{shared_id}}/shares", + "method": "DELETE", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "delete-shared-account", + "path": "/api/v1/twofaccounts/{{shared_id}}", + "method": "DELETE", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "setting-enableSharing-False", + "path": "/api/v1/settings/enableSharing", + "method": "PUT", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "value": false + } + }, + { + "id": "setting-enableAllUsersSharingScope-False", + "path": "/api/v1/settings/enableAllUsersSharingScope", + "method": "PUT", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "value": false + } + }, + { + "id": "logout-admin", + "path": "/user/logout", + "method": "GET", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + } +] diff --git a/compatibility/cases.device.json b/compatibility/cases.device.json new file mode 100644 index 0000000..01f9045 --- /dev/null +++ b/compatibility/cases.device.json @@ -0,0 +1,185 @@ +[ + { + "id": "issuer-missing-client", + "path": "/oauth/device/code", + "method": "POST", + "expected_status": 400, + "expected_json": { + "/error": "invalid_request", + "/error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "/hint": "Check the `client_id` parameter" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + }, + "form": {} + }, + { + "id": "issuer-unknown-client", + "path": "/oauth/device/code", + "method": "POST", + "expected_status": 401, + "expected_json": { + "/error": "invalid_client", + "/error_description": "Client authentication failed" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + }, + "form": { + "client_id": "unknown-device-client" + } + }, + { + "id": "GET /oauth/device", + "path": "/oauth/device", + "method": "GET", + "expected_status": 500, + "expected_json": { + "/message": "Server Error" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + } + }, + { + "id": "GET /oauth/device/authorize", + "path": "/oauth/device/authorize", + "method": "GET", + "expected_status": 401, + "expected_json": { + "/message": "Unauthenticated." + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + } + }, + { + "id": "POST /oauth/device/authorize", + "path": "/oauth/device/authorize", + "method": "POST", + "expected_status": 419, + "expected_json": { + "/message": "CSRF token mismatch." + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + }, + "json": {} + }, + { + "id": "DELETE /oauth/device/authorize", + "path": "/oauth/device/authorize", + "method": "DELETE", + "expected_status": 419, + "expected_json": { + "/message": "CSRF token mismatch." + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + }, + "json": {} + }, + { + "id": "POST /oauth/authorize", + "path": "/oauth/authorize", + "method": "POST", + "expected_status": 419, + "expected_json": { + "/message": "CSRF token mismatch." + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + }, + "json": {} + }, + { + "id": "DELETE /oauth/authorize", + "path": "/oauth/authorize", + "method": "DELETE", + "expected_status": 419, + "expected_json": { + "/message": "CSRF token mismatch." + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + }, + "json": {} + }, + { + "id": "POST /oauth/token/refresh", + "path": "/oauth/token/refresh", + "method": "POST", + "expected_status": 419, + "expected_json": { + "/message": "CSRF token mismatch." + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null + }, + "json": {} + } +] diff --git a/compatibility/cases.example.json b/compatibility/cases.example.json new file mode 100644 index 0000000..75d3fe9 --- /dev/null +++ b/compatibility/cases.example.json @@ -0,0 +1,8 @@ +[ + {"id":"health", "method":"GET", "path":"/up"}, + {"id":"authenticated-user", "method":"GET", "path":"/api/v1/user", "side_effects":true, + "headers_env":{"reference":{"Authorization":"COMPAT_REFERENCE_AUTH"},"candidate":{"Authorization":"COMPAT_CANDIDATE_AUTH"}}}, + {"id":"create-account-fixture", "method":"POST", "path":"/api/v1/twofaccounts", "side_effects":true, + "headers_env":{"reference":{"Authorization":"COMPAT_REFERENCE_AUTH"},"candidate":{"Authorization":"COMPAT_CANDIDATE_AUTH"}}, + "json":{"service":"compat-fixture","account":"fixture@example.invalid","otp_type":"totp","secret":"JBSWY3DPEHPK3PXP","digits":6,"algorithm":"sha1","period":30}} +] diff --git a/compatibility/cases.extended.json b/compatibility/cases.extended.json new file mode 100644 index 0000000..c445883 --- /dev/null +++ b/compatibility/cases.extended.json @@ -0,0 +1,238 @@ +[ + { + "id": "fresh-csrf", + "method": "GET", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login", + "method": "POST", + "path": "/user/login", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "compat@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "current-user", + "method": "GET", + "path": "/api/v1/user", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "create-hotp", + "method": "POST", + "path": "/api/v1/twofaccounts", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "service": "compat-fixture", + "account": "fixture@example.invalid", + "otp_type": "hotp", + "secret": "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", + "digits": 6, + "algorithm": "sha1", + "counter": 0 + }, + "capture_json": { + "account_id": "/id" + }, + "ignore_json_pointers": [ + "/id" + ] + }, + { + "id": "read-created", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 200, + "ignore_json_pointers": [ + "/id" + ], + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "hotp-counter-zero", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}/otp", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "hotp-counter-one", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}/otp", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "read-counter-effect", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 200, + "ignore_json_pointers": [ + "/id" + ], + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "group-create", + "method": "POST", + "path": "/api/v1/groups", + "json": { + "name": "Compat group" + }, + "expected_status": 201, + "capture_json": { + "group_id": "/id" + }, + "ignore_json_pointers": [ + "/id" + ], + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "group-read", + "path": "/api/v1/groups/{{group_id}}", + "expected_status": 200, + "ignore_json_pointers": [ + "/id" + ], + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "group-delete", + "method": "DELETE", + "path": "/api/v1/groups/{{group_id}}", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "settings-admin-denial", + "path": "/api/v1/settings", + "expected_status": 403, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "users-admin-denial", + "path": "/api/v1/users", + "expected_status": 403, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "sharing-disabled-denial", + "path": "/api/v1/twofaccounts/{{account_id}}/shares", + "expected_status": 403, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "qr-encode-account", + "path": "/api/v1/twofaccounts/{{account_id}}/qrcode", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "qr-decode-invalid", + "method": "POST", + "path": "/api/v1/qrcode/decode", + "json": {}, + "expected_status": 422, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "migration-empty-validation", + "method": "POST", + "path": "/api/v1/twofaccounts/migration", + "json": {}, + "expected_status": 422, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "invalid-account-validation", + "method": "POST", + "path": "/api/v1/twofaccounts", + "json": {}, + "expected_status": 422, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "feature-flags", + "path": "/api/v1/features", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "delete-created", + "method": "DELETE", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "read-deletion-effect", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 404, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "logout", + "method": "GET", + "path": "/user/logout", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "read-logout-effect", + "method": "GET", + "path": "/api/v1/user", + "expected_status": 401 + } +] diff --git a/compatibility/cases.oauth.json b/compatibility/cases.oauth.json new file mode 100644 index 0000000..f1cf654 --- /dev/null +++ b/compatibility/cases.oauth.json @@ -0,0 +1,764 @@ +[ + { + "id": "missing-grant-type", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": {}, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "unsupported-grant-empty", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "unsupported-grant-bogus", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "bogus" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "unsupported-grant-password", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "password" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "unsupported-grant-implicit", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "implicit" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "unsupported-grant-personal_access", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "personal_access" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "device-grant-missing-client", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "urn:ietf:params:oauth:grant-type:device_code" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_request", + "/error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "/hint": "Check the `client_id` parameter" + } + }, + { + "id": "missing-client-client_credentials", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "client_credentials" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_request", + "/error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "/hint": "Check the `client_id` parameter" + } + }, + { + "id": "unknown-client-client_credentials", + "path": "/oauth/token", + "method": "POST", + "expected_status": 401, + "form": { + "grant_type": "client_credentials", + "client_id": "999999", + "client_secret": "synthetic-invalid-secret" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_client", + "/error_description": "Client authentication failed" + } + }, + { + "id": "missing-client-authorization_code", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "authorization_code" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_request", + "/error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "/hint": "Check the `client_id` parameter" + } + }, + { + "id": "unknown-client-authorization_code", + "path": "/oauth/token", + "method": "POST", + "expected_status": 401, + "form": { + "grant_type": "authorization_code", + "client_id": "999999", + "client_secret": "synthetic-invalid-secret" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_client", + "/error_description": "Client authentication failed" + } + }, + { + "id": "missing-client-refresh_token", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "refresh_token" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_request", + "/error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "/hint": "Check the `client_id` parameter" + } + }, + { + "id": "unknown-client-refresh_token", + "path": "/oauth/token", + "method": "POST", + "expected_status": 401, + "form": { + "grant_type": "refresh_token", + "client_id": "999999", + "client_secret": "synthetic-invalid-secret" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_client", + "/error_description": "Client authentication failed" + } + }, + { + "id": "json-unsupported", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "json": { + "grant_type": "bogus" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "json-null-grant", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "json": { + "grant_type": null + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "json-array-grant", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "json": { + "grant_type": [ + "client_credentials" + ] + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + } + }, + { + "id": "json-unknown-client", + "path": "/oauth/token", + "method": "POST", + "expected_status": 401, + "json": { + "grant_type": "client_credentials", + "client_id": 999999, + "client_secret": "synthetic-invalid-secret" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_client", + "/error_description": "Client authentication failed" + } + }, + { + "id": "malformed-basic-missing-client", + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "form": { + "grant_type": "client_credentials" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_request", + "/error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "/hint": "Check the `client_id` parameter" + }, + "headers": { + "Authorization": "Basic not-base64" + } + }, + { + "id": "basic-unknown-client", + "path": "/oauth/token", + "method": "POST", + "expected_status": 401, + "form": { + "grant_type": "client_credentials" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": "Basic realm=\"OAuth\"", + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_client", + "/error_description": "Client authentication failed" + }, + "headers": { + "Authorization": "Basic OTk5OTk5OnN5bnRoZXRpYy1pbnZhbGlkLXNlY3JldA==" + } + }, + { + "id": "bearer-header-unknown-client", + "path": "/oauth/token", + "method": "POST", + "expected_status": 401, + "form": { + "grant_type": "client_credentials", + "client_id": "999999" + }, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": "Bearer realm=\"OAuth\"", + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_client", + "/error_description": "Client authentication failed" + }, + "headers": { + "Authorization": "Bearer synthetic-invalid" + } + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + }, + "id": "json-top-array", + "json": [] + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + }, + "id": "json-top-number", + "json": 42 + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + }, + "id": "json-top-nonempty-array", + "json": [ + "bogus" + ] + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/message": "Bad request." + }, + "id": "json-malformed", + "raw": "{", + "headers": { + "Content-Type": "application/json" + } + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/message": "Bad request." + }, + "id": "json-top-null", + "raw": "null", + "headers": { + "Content-Type": "application/json" + } + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + }, + "id": "json-empty-body", + "raw": "", + "headers": { + "Content-Type": "application/json" + } + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + }, + "id": "form-scalar-then-array", + "raw": "grant_type=bogus&grant_type[]=client_credentials", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "unsupported_grant_type", + "/error_description": "The authorization grant type is not supported by the authorization server.", + "/hint": "Check that all required parameters have been provided" + }, + "id": "form-array-then-scalar", + "raw": "grant_type[]=client_credentials&grant_type=bogus", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + } + }, + { + "path": "/oauth/token", + "method": "POST", + "expected_status": 400, + "compare_headers": [ + "Cache-Control", + "Pragma", + "WWW-Authenticate", + "X-RateLimit-Limit" + ], + "expected_headers": { + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60" + }, + "expected_json": { + "/error": "invalid_request", + "/hint": "Check the `client_id` parameter" + }, + "id": "unicode-trimmed-grant", + "json": { + "grant_type": " client_credentials" + } + } +] diff --git a/compatibility/cases.stateful.json b/compatibility/cases.stateful.json new file mode 100644 index 0000000..795c2e0 --- /dev/null +++ b/compatibility/cases.stateful.json @@ -0,0 +1,130 @@ +[ + { + "id": "fresh-csrf", + "method": "GET", + "path": "/refresh-csrf", + "expected_status": 200, + "expect_text_token": true + }, + { + "id": "login", + "method": "POST", + "path": "/user/login", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "email": "compat@example.invalid", + "password": "Synthetic-compat-password-4620" + } + }, + { + "id": "current-user", + "method": "GET", + "path": "/api/v1/user", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "create-hotp", + "method": "POST", + "path": "/api/v1/twofaccounts", + "expected_status": 201, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + }, + "json": { + "service": "compat-fixture", + "account": "fixture@example.invalid", + "otp_type": "hotp", + "secret": "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", + "digits": 6, + "algorithm": "sha1", + "counter": 0 + }, + "capture_json": { + "account_id": "/id" + }, + "ignore_json_pointers": [ + "/id" + ] + }, + { + "id": "read-created", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 200, + "ignore_json_pointers": [ + "/id" + ], + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "hotp-counter-zero", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}/otp", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "hotp-counter-one", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}/otp", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "read-counter-effect", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 200, + "ignore_json_pointers": [ + "/id" + ], + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "delete-created", + "method": "DELETE", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 204, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "read-deletion-effect", + "method": "GET", + "path": "/api/v1/twofaccounts/{{account_id}}", + "expected_status": 404, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "logout", + "method": "GET", + "path": "/user/logout", + "expected_status": 200, + "headers_from_cookies": { + "X-XSRF-TOKEN": "XSRF-TOKEN" + } + }, + { + "id": "read-logout-effect", + "method": "GET", + "path": "/api/v1/user", + "expected_status": 401 + } +] diff --git a/compatibility/database-portability.md b/compatibility/database-portability.md new file mode 100644 index 0000000..ec20d5c --- /dev/null +++ b/compatibility/database-portability.md @@ -0,0 +1,47 @@ +# Database portability audit + +The current runtime supports SQLite. PostgreSQL, MySQL/MariaDB and SQL Server are upstream deployment options, but are not implemented by this Rust backend. Changing the connection URL or enabling SQLx features does not establish compatibility. + +## Implementation boundary + +`AppState` stores `SqlitePool`; handlers expose `SqliteConnection` and `SqliteRow`, and use direct SQLx queries throughout. Introduce a backend-neutral pool/transaction/query boundary with typed bound values and normalized results. Keep native SQLx SQLite/PostgreSQL/MySQL drivers; SQLx 0.8 has no SQL Server driver, so SQL Server needs a separate driver such as Tiberius. Cargo.lock contains SQLx PostgreSQL and MySQL 0.8.6 packages; Cargo.toml currently enables only SQLite. A lockfile entry does not mean a driver is enabled or tested. + +Use explicit backend implementations for insert-and-return-ID, upsert, atomic consume-once records and rate-limit increments. Generic placeholder replacement cannot translate these semantics or normalize returned native types. Preserve transaction affinity when retrieving generated IDs. + +| Current form | PostgreSQL | MySQL/MariaDB | SQL Server | +| --- | --- | --- | --- | +| `?` binds | `$1`, `$2`, etc. | `?` | `@P1`, `@P2`, etc. | +| `last_insert_rowid()` | `INSERT ... RETURNING id` | insert result ID | `OUTPUT INSERTED.id` | +| `ON CONFLICT ...` | supported with compatible targets | explicit duplicate-key update | transactional update/insert with appropriate locking | +| `DELETE ... RETURNING` | supported | locked read/delete transaction as needed by server/version | `DELETE ... OUTPUT DELETED...` | +| `datetime('now', ...)` | typed UTC timestamp comparisons | typed UTC timestamp comparisons | typed UTC timestamp comparisons | +| `json_each(grant_types)` | native JSON conversion or application decoding | JSON expression or application decoding | JSON expression or application decoding | +| `INSERT OR IGNORE` | conflict-targeted `DO NOTHING` | conflict-specific handling; avoid suppressing unrelated errors | constraint-aware transaction | +| nullable `ip_address IS ?` | `IS NOT DISTINCT FROM` | `<=>` | equality plus explicit both-null condition | +| `LIMIT` | supported | supported | `TOP` or ordered `OFFSET/FETCH` | +| `CAST(id AS TEXT)` | supported | compatible character cast | compatible character cast | + +Quote identifiers consistently: `key`, `groups` and `window` can collide with dialect keywords. SQLite `PRAGMA` introspection must become PostgreSQL/MySQL information-schema and SQL Server catalog queries. Rust metadata DDL also needs per-backend generated IDs, bounded indexed strings, timestamp representations and index-existence checks; SQLite `TEXT PRIMARY KEY` and `CREATE INDEX IF NOT EXISTS` are not portable. + +## Schema and value normalization + +Keep pinned PHP migrations authoritative for application tables. Validate an offline migrated database before creating only Rust-owned metadata tables. Do not attempt to recreate production schemas from the simplified development DDL. + +Laravel columns are not uniformly signed 64-bit integers. Users use big IDs; account IDs originate as unsigned integer; digits use unsigned small integer; periods use unsigned integer; counters may be unsigned big integer. PostgreSQL `smallint`/`integer` cannot simply be decoded with SQLx's `i64` implementation. MySQL unsigned-bigint counters can exceed `i64::MAX`; reject unsupported ranges explicitly or retain `u64` through the data path. SQL Server uses its own numeric and bit representations. Real PostgreSQL booleans also require boolean predicates instead of `=0` and `=1`. + +Timestamps are native database timestamp columns, although SQLite handlers currently decode them as strings. WebAuthn additionally contains UUID and JSON fields on databases that support those types. Normalize timestamps to UTC, booleans to Rust `bool`, integer widths explicitly, and UUID/JSON values without losing nullability. Do not convert arbitrary database errors into conflict success. + +`schema_validation.rs` checks required SQLite application columns, primary keys, non-partial uniqueness and delete actions against the materialized pinned migration DDL. Obsolete `twofaccounts.group_id`/`order_column` and framework cache/migration tables are excluded. Laravel sessions are required only with the database session driver. This validator is a structural prerequisite, not proof of cross-database behavior. + +## Required interoperability evidence + +For each supported engine, run pinned PHP migrations in a disposable database and seed identical synthetic fixtures. Run the differential HTTP suite against Rust, then reopen records written by Rust with PHP. Include: + +- encrypted accounts and key rotation; nullable strings, booleans, timestamps and numeric boundary values; +- Passport clients, tokens and revocation; Laravel session payloads; WebAuthn UUID/JSON/key fields; +- unique usernames, group assignments, per-user account ordering and share targets; +- account/user deletion and foreign-key cascade/set-null behavior; +- simultaneous consume-once challenges, rate-limit increments, registration and HOTP generation; +- failed statements, transaction rollback and connection reuse. + +A successful connection or compilation does not demonstrate migrated-schema compatibility. Each engine needs a recorded migrated schema, driver/server versions, HTTP comparison results and PHP read-back results before its support claim can change. diff --git a/compatibility/database.json b/compatibility/database.json new file mode 100644 index 0000000..10adf6c --- /dev/null +++ b/compatibility/database.json @@ -0,0 +1,547 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "kind": "ordered migration evidence; not a materialized SQL schema", + "drivers": [ + "sqlite", + "mysql", + "pgsql", + "sqlsrv" + ], + "migrations": [ + { + "file": "database/migrations/2014_10_12_000000_create_users_table.php", + "sha256": "9a54cf93367bc7c19790a5c0f8182f733c48692f559a2fc3bc6285caedcc9f2c", + "schema_operations": [ + [ + "create", + "users" + ] + ], + "up_source": "bigIncrements('id');\n $table->string('name');\n $table->string('email')->unique();\n $table->timestamp('email_verified_at')->nullable();\n $table->string('password');\n $table->rememberToken();\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2014_10_12_100000_create_password_resets_table.php", + "sha256": "42824028ead8eb9813f0d568f830def27145d5ac52288021cb7a6337d3810c41", + "schema_operations": [ + [ + "create", + "password_resets" + ] + ], + "up_source": "string('email')->index();\n $table->string('token');\n $table->timestamp('created_at')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php", + "sha256": "90ab218a2616ba5e7320fbfe57fd0f8cf39a85542300634fecf691a85a6bf6bb", + "schema_operations": [ + [ + "create", + "oauth_auth_codes" + ] + ], + "up_source": "string('id', 100)->primary();\n $table->unsignedBigInteger('user_id')->index();\n $table->unsignedBigInteger('client_id');\n $table->text('scopes')->nullable();\n $table->boolean('revoked');\n $table->dateTime('expires_at')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php", + "sha256": "acbeb29866718be6bb0ebf0bf85d4d76f9a34d62b682ca248e82c085a001f2b0", + "schema_operations": [ + [ + "create", + "oauth_access_tokens" + ] + ], + "up_source": "string('id', 100)->primary();\n $table->unsignedBigInteger('user_id')->nullable()->index();\n $table->unsignedBigInteger('client_id');\n $table->string('name')->nullable();\n $table->text('scopes')->nullable();\n $table->boolean('revoked');\n $table->timestamps();\n $table->dateTime('expires_at')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php", + "sha256": "09a2853433a722f175bb35564576ff1717fc8c54cc6a1e9e7589884098e9a071", + "schema_operations": [ + [ + "create", + "oauth_refresh_tokens" + ] + ], + "up_source": "string('id', 100)->primary();\n $table->string('access_token_id', 100)->index();\n $table->boolean('revoked');\n $table->dateTime('expires_at')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2016_06_01_000004_create_oauth_clients_table.php", + "sha256": "728b8744edd184b00ed89dfd1e7eca17091819b05a8cb5b5c89b79fde5459b14", + "schema_operations": [ + [ + "create", + "oauth_clients" + ] + ], + "up_source": "bigIncrements('id');\n $table->unsignedBigInteger('user_id')->nullable()->index();\n $table->string('name');\n $table->string('secret', 100)->nullable();\n $table->string('provider')->nullable();\n $table->text('redirect');\n $table->boolean('personal_access_client');\n $table->boolean('password_client');\n $table->boolean('revoked');\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php", + "sha256": "37b718559569e3278bfa6e2f8c6079b68e21bad0a5b7f233f9ef313e357e3318", + "schema_operations": [ + [ + "create", + "oauth_personal_access_clients" + ] + ], + "up_source": "bigIncrements('id');\n $table->unsignedBigInteger('client_id');\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2017_03_03_100000_create_options_table.php", + "sha256": "1afffe540e1bfe170e1aa6193ffe9b7174445ebfbb81f08315af60bf106918e8", + "schema_operations": [ + [ + "create", + "options" + ] + ], + "up_source": "increments('id');\n $table->string('key')->unique();\n $table->text('value');\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2019_05_16_162730_create_twofaccounts_table.php", + "sha256": "9bae015ba5bbf15559929034c3ec24b3fee876f8ca77f2b22391601441c77baa", + "schema_operations": [ + [ + "create", + "twofaccounts" + ] + ], + "up_source": "increments('id');\n $table->string('service');\n $table->string('uri');\n $table->string('account')->nullable();\n $table->string('icon')->nullable();\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_03_25_095517_add_order_column_to_twofaccounts_table.php", + "sha256": "edb194adbc45fc94b81f6884b5673cf3445a4ce7a9f6d98e17b4496f93b7529d", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "integer('order_column')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_10_05_210557_add_last_seen_to_users_table.php", + "sha256": "9db541b7e488c32e8e8a2029b46e88dcbdf065ea1cbd56515c1bee51be7f5baa", + "schema_operations": [ + [ + "table", + "users" + ] + ], + "up_source": "timestamp('last_seen_at')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_10_11_202302_add_provider_column_to_oauth_clients_table.php", + "sha256": "2e5693204137ded1fd9bf4816861dde0098468a21a08303339213d6c5a3ac701", + "schema_operations": [ + [ + "table", + "oauth_clients" + ] + ], + "up_source": "string('provider')->after('secret')->nullable();\n } \n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_10_20_210129_create_groups_table.php", + "sha256": "cba276718ffc803b04798837635d871e0869ed26dc851c3703b8a399de8ac5f2", + "schema_operations": [ + [ + "create", + "groups" + ] + ], + "up_source": "increments('id');\n $table->string('name');\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_10_20_211115_add_group_id_column_to_twofaccounts_table.php", + "sha256": "5c9e50dfc4a879daaaf2014f1f649477095f615601b1b6190ec7ef76e334688b", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "unsignedInteger('group_id')\n ->after('id')\n ->nullable();\n\n $table->foreign('group_id')->references('id')->on('groups')->onDelete('set null');\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_12_04_073604_alter_encrypted_columns_to_text.php", + "sha256": "6d8135b35bce5c1ecce23b202f4ce1d4a46b1e37ec9c4f6c66d697cf4f3db311", + "schema_operations": [ + [ + "table", + "twofaccounts" + ], + [ + "table", + "twofaccounts" + ] + ], + "up_source": "getConnection())->getConnection()->getDriverName();\n\n if ('sqlite' !== $driver) {\n \n Schema::table('twofaccounts', function (Blueprint $table) {\n $table->text('account')->nullable()->change();\n });\n\n Schema::table('twofaccounts', function (Blueprint $table) {\n $table->text('uri')->change();\n });\n }\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_12_04_073605_alter_encrypted_columns_to_text_for_sqlite.php", + "sha256": "74a70bcced630cd0fdf47c8953d9f6c9a1f095ef13a71e5864b30c05468a0a67", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "getConnection())->getConnection()->getDriverName();\n\n if ('sqlite' === $driver) {\n \n Schema::table('twofaccounts', function (Blueprint $table) {\n $table->text('account')->nullable()->change();\n });\n }\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2020_12_04_073606_alter_encrypted_columns_to_text_for_sqlite_bis.php", + "sha256": "2b0f52bf20b8a2c76f07d42b7ad34c7d61607cc1d134970e2516055abae6eac1", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "getConnection())->getConnection()->getDriverName();\n\n if ('sqlite' === $driver) {\n \n Schema::table('twofaccounts', function (Blueprint $table) {\n $table->text('uri')->change();\n });\n }\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2021_09_08_191139_split_twofaccounts_uri_in_multiple_columns.php", + "sha256": "e947fd2f184dbe47fcd6ad63ca27ee3ae86a08fa227150e3d6c7115f0ea13609", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "string('otp_type', 10)->nullable();\n $table->text('secret')->nullable();\n $table->string('algorithm', 20)->nullable();\n $table->unsignedSmallInteger('digits')->nullable();\n $table->unsignedInteger('period')->nullable();\n $table->unsignedBigInteger('counter')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2021_09_08_191140_rename_uri_to_legacy_uri.php", + "sha256": "3c019abddcec98c3f3acebca764b44a9215e1d8e4b05997be27f52eb1d4f5fad", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "renameColumn('uri', 'legacy_uri');\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2021_09_14_195451_change_nullable_in_twofaccounts_table.php", + "sha256": "f82b9dd27fb6853c3735d7a650a527ca542096ba4ace8d256c723e1af213559a", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "select('id', 'legacy_uri')->get();\n\n foreach ($twofaccounts as $twofaccount) {\n try {\n $legacy_uri = $settingService->get('useEncryption') ? Crypt::decryptString($twofaccount->legacy_uri) : $twofaccount->legacy_uri;\n $token = \\OTPHP\\Factory::loadFromProvisioningUri($legacy_uri);\n\n $affected = DB::table('twofaccounts')\n ->where('id', $twofaccount->id)\n ->update([\n 'otp_type' => get_class($token) === 'OTPHP\\TOTP' ? 'totp' : 'hotp',\n 'secret' => $settingService->get('useEncryption') ? Crypt::encryptString($token->getSecret()) : $token->getSecret(),\n 'algorithm' => $token->getDigest(),\n 'digits' => $token->getDigits(),\n 'period' => $token->hasParameter('period') ? $token->getParameter('period') : null,\n 'counter' => $token->hasParameter('counter') ? $token->getParameter('counter') : null\n ]);\n }\n catch(Exception $ex)\n {\n Log::error($ex->getMessage());\n Log::error(\"TwoFAccount with id #\" . $twofaccount->id . \" could not be splited\");\n }\n }\n\n $twofaccounts = DB::table('twofaccounts')\n ->whereNull('account')\n ->orWhereNull('otp_type')\n ->orWhereNull('secret')\n ->orWhereNull('algorithm')\n ->orWhereNull('digits')\n ->get();\n\n foreach ($twofaccounts as $twofaccount) {\n\n $affected = DB::table('twofaccounts')\n ->where('id', $twofaccount->id)\n ->update([\n 'account' => $twofaccount->account === null ? 'account (invalid)' : $twofaccount->account + ' (invalid)',\n 'otp_type' => $twofaccount->otp_type === null ? 'totp' : $twofaccount->otp_type,\n 'secret' => $twofaccount->secret === null ? 'secret' : $twofaccount->secret,\n 'algorithm' => $twofaccount->algorithm === null ? 'sha1' : $twofaccount->algorithm,\n 'digits' => $twofaccount->digits === null ? 6 : $twofaccount->digits,\n ]);\n }\n\n Schema::table('twofaccounts', function (Blueprint $table) {\n $table->text('account')->nullable(false)->change();\n $table->string('service')->nullable()->change();\n $table->string('otp_type', 10)->nullable(false)->change();\n $table->text('secret')->nullable(false)->change();\n $table->string('algorithm', 20)->nullable(false)->change();\n $table->unsignedSmallInteger('digits')->nullable(false)->change();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2021_12_03_220140_create_web_authn_tables.php", + "sha256": "8f0263cc66f1104be3687cfe76e1d15e9d353e8fa13c0993d4b9bb3aa2c40d4f", + "schema_operations": [ + [ + "create", + "web_authn_credentials" + ], + [ + "create", + "web_authn_recoveries" + ] + ], + "up_source": "string('id', 191);\n\n // Change accordingly for your users table if you need to.\n $table->unsignedBigInteger('user_id');\n\n $table->string('name')->nullable();\n $table->string('type', 16);\n $table->json('transports');\n $table->string('attestation_type');\n $table->json('trust_path');\n $table->uuid('aaguid');\n $table->binary('public_key');\n $table->unsignedInteger('counter')->default(0);\n\n // This saves the external \"ID\" that identifies the user. We use UUID default\n // since it's very straightforward. You can change this for a plain string.\n // It must be nullable because those old U2F keys do not use user handle.\n $table->uuid('user_handle')->nullable();\n\n $table->timestamps();\n $table->softDeletes('disabled_at');\n\n $table->primary(['id', 'user_id']);\n });\n\n Schema::create('web_authn_recoveries', function (Blueprint $table) {\n $table->string('email')->index();\n $table->string('token');\n $table->timestamp('created_at')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2022_10_20_122032_create_webauthn_credentials.php", + "sha256": "efbc545fef44d08e60864c13747813e6ec3c7e187526905aec46cbd1dc0a00f6", + "schema_operations": [ + [ + "create", + "webauthn_credentials" + ], + [ + "dropIfExists", + "web_authn_credentials" + ], + [ + "rename", + "web_authn_recoveries" + ] + ], + "up_source": "where('key', 'useWebauthnOnly')->delete();\n\n Schema::create('webauthn_credentials', static function (Blueprint $table): void {\n static::defaultBlueprint($table);\n });\n\n Schema::dropIfExists('web_authn_credentials');\n Schema::rename('web_authn_recoveries', 'webauthn_recoveries');\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2023_02_10_145413_add_is_admin_and_preferences_to_users_table.php", + "sha256": "ac99520222b19b6fb6eb1fee3b9e4fb27f70a1131adf63fe5abe49f6253eb442", + "schema_operations": [ + [ + "table", + "users" + ] + ], + "up_source": "boolean('is_admin')\n ->after('password')\n ->default(0);\n $table->json('preferences')->nullable();\n });\n\n DB::table('users')->update(['is_admin' => 1]);\n\n // The 'useWebauthnAsDefault' option is replaced by a local storage record\n // so we delete it form the Options table to prevent its conversion to\n // a user preference\n DB::table('options')->where('key', 'useWebauthnAsDefault')->delete();\n\n // User options are converted as user preferences\n $options = DB::table('options')->get();\n $preferences = config('2fauth.preferences');\n\n foreach ($options as $option) {\n if (Arr::has($preferences, $option->key)) {\n DB::table('users')->update(['preferences->'.$option->key => static::restoreType($option->value)]);\n DB::table('options')->where('id', $option->id)->delete();\n }\n }\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2023_02_21_143845_bind_twofaccounts_and_groups_to_users.php", + "sha256": "a8aa4e17c978ded37228bc143bb043258cb122df240529e69d165e61f0c8f75b", + "schema_operations": [ + [ + "table", + "twofaccounts" + ], + [ + "table", + "groups" + ] + ], + "up_source": "unsignedBigInteger('user_id')\n ->after('id')\n ->nullable();\n\n $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();\n });\n\n Schema::table('groups', function (Blueprint $table) {\n $table->unsignedBigInteger('user_id')\n ->after('id')\n ->nullable();\n\n $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();\n });\n\n if ($legacySingleUser = DB::table('users')->first()) {\n DB::table('twofaccounts')->update(['user_id' => $legacySingleUser->id]);\n DB::table('groups')->update(['user_id' => $legacySingleUser->id]);\n }\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2023_03_13_114928_set_username_unique.php", + "sha256": "1fe7623bb6503d7d783a6fac526513f184dfd934951710c2fc370de5d5879bc2", + "schema_operations": [ + [ + "table", + "users" + ] + ], + "up_source": "unique('name');\n });\n }\n\n /**\n * Reverse the migrations.\n *\n * @return void\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2023_12_06_131842_add_oauth_columns_to_user.php", + "sha256": "d7f7996ffee6f499903607b3acbaf131913dcaecacb72ea61bf1f1bb95597f7a", + "schema_operations": [ + [ + "table", + "users" + ] + ], + "up_source": "string('oauth_provider', 100)\n ->after('id')\n ->nullable();\n $table->string('oauth_id', 200)\n ->after('id')\n ->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2024_04_14_082519_create_auth_logs_table.php", + "sha256": "bbc10e41c09a374c53a9206c5467b58cd6c8bdf4de57982cadb3f24d2315b06c", + "schema_operations": [ + [ + "create", + "auth_logs" + ] + ], + "up_source": "id();\n $table->morphs('authenticatable');\n $table->string('ip_address', 45)->nullable();\n $table->text('user_agent')->nullable();\n $table->timestamp('login_at')->nullable()->index();\n $table->boolean('login_successful')->default(false)->index();\n $table->timestamp('logout_at')->nullable()->index();\n $table->boolean('cleared_by_user')->default(false);\n $table->string('guard', 40)->nullable();\n $table->string('login_method', 40)->nullable();\n\n $table->foreign('authenticatable_id')->references('id')->on('users')->cascadeOnDelete();\n });\n }\n\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2024_06_01_000001_create_oauth_device_codes_table.php", + "sha256": "f58e7e0409628118d1808631d8270692e54fdb2f227020365bb30a18b0564336", + "schema_operations": [ + [ + "create", + "oauth_device_codes" + ] + ], + "up_source": "char('id', 80)->primary();\n $table->foreignId('user_id')->nullable()->index();\n $table->foreignUuid('client_id')->index();\n $table->char('user_code', 8)->unique();\n $table->text('scopes');\n $table->boolean('revoked');\n $table->dateTime('user_approved_at')->nullable();\n $table->dateTime('last_polled_at')->nullable();\n $table->dateTime('expires_at')->nullable();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2024_08_08_133135_alter_twofaccount_service_field_to_text.php", + "sha256": "b33cf9bb4347706c63f0d1df1eae27a6200349e268b007554108fc00850911b9", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "text('service')->nullable()->change();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2024_08_08_133136_encrypt_twofaccount_service_field.php", + "sha256": "396a7313b4713d7f6b00c411117746a86a6c1b8c02bdb2520c9b29fc818bf935", + "schema_operations": [], + "up_source": "dbIsEncrypted() && Schema::getColumnType('twofaccounts', 'service') === 'text') {\n $this->encryptServiceField();\n }\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2024_09_12_151037_create_session_table.php", + "sha256": "293923a1544ca6a69c25c60c65c1e1fd75f14968820dea122977c0a2d33183ce", + "schema_operations": [ + [ + "create", + "sessions" + ] + ], + "up_source": "string('id')->primary();\n $table->foreignId('user_id')->nullable()->index();\n $table->string('ip_address', 45)->nullable();\n $table->text('user_agent')->nullable();\n $table->longText('payload');\n $table->integer('last_activity')->index();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2024_09_12_151132_create_cache_table.php", + "sha256": "fbb4665e5a977e71df4e74ec75b3c06ca4f17ad0de7138fe9786639189978e77", + "schema_operations": [ + [ + "create", + "cache" + ], + [ + "create", + "cache_locks" + ] + ], + "up_source": "string('key')->primary();\n $table->mediumText('value');\n $table->bigInteger('expiration')->index();\n });\n\n Schema::create('cache_locks', function (Blueprint $table) {\n $table->string('key')->primary();\n $table->string('owner');\n $table->bigInteger('expiration')->index();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2024_09_30_110610_create_icons_table.php", + "sha256": "83f1c5df8f1314f616d09fcf499dcbb9495ecfa95ceae092da877991ea5fc9f0", + "schema_operations": [ + [ + "create", + "icons" + ] + ], + "up_source": "string('name')->primary();\n $table->longText('content');\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2025_10_29_141837_add_order_column_to_groups_table.php", + "sha256": "88d015dcfde38a46bfab14fa9dfea2551893e9b08289b5ed39856c48e54e9952", + "schema_operations": [ + [ + "table", + "groups" + ] + ], + "up_source": "integer('order_column')->nullable();\n });\n\n // The primary index is used to set a default value for the newly\n // created order_column\n foreach (Group::get() as $group) {\n $group->order_column = $group->id;\n $group->save();\n }\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_03_15_000000_create_twofaccount_shares_table.php", + "sha256": "4771490844dc6b0c59a6cfe031de11dfdc0c55578d0f1f3495f849c05bc7d94e", + "schema_operations": [ + [ + "create", + "twofaccount_shares" + ] + ], + "up_source": "id();\n $table->unsignedInteger('twofaccount_id');\n $table->foreign('twofaccount_id')->references('id')->on('twofaccounts')->cascadeOnDelete();\n $table->foreignId('shared_with_user_id')->nullable()->constrained('users')->cascadeOnDelete();\n $table->string('scope', 24);\n $table->foreignId('created_by_user_id')->constrained('users')->cascadeOnDelete();\n $table->timestamps();\n\n $table->index(['twofaccount_id', 'scope']);\n $table->index('shared_with_user_id');\n $table->unique(['twofaccount_id', 'scope', 'shared_with_user_id'], 'twofaccount_shares_unique_target');\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_04_14_000000_create_twofaccount_group_assignments_table.php", + "sha256": "8deb3b22c6eb4f55b9f8e58d483da2922faff2f03ad890b3b10a8710273976d2", + "schema_operations": [ + [ + "create", + "twofaccount_group_assignments" + ] + ], + "up_source": "id();\n $table->unsignedInteger('twofaccount_id');\n $table->unsignedBigInteger('user_id');\n $table->unsignedInteger('group_id');\n $table->timestamps();\n\n $table->foreign('twofaccount_id')->references('id')->on('twofaccounts')->cascadeOnDelete();\n $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();\n $table->foreign('group_id')->references('id')->on('groups')->cascadeOnDelete();\n\n $table->unique(['twofaccount_id', 'user_id'], 'twofaccount_group_assignments_unique_scope');\n $table->index('group_id');\n $table->index('user_id');\n });\n\n $this->backfillLegacyAssignments();\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_04_14_010000_drop_group_id_from_twofaccounts_table.php", + "sha256": "75ca1423667f8b6cb825cd21841fccd296b9876b7edfabc2f4c8a88ad99dfaba", + "schema_operations": [ + [ + "table", + "twofaccounts" + ], + [ + "table", + "twofaccounts" + ] + ], + "up_source": "dropForeign(['group_id']);\n }\n });\n\n Schema::table('twofaccounts', function (Blueprint $table) {\n $table->dropColumn('group_id');\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_04_15_000000_create_twofaccount_user_orders_table.php", + "sha256": "c8acb8a9ab653f3887c00f9912ad4d137e467ba81957b925759382401ed5f7ef", + "schema_operations": [ + [ + "create", + "twofaccount_user_orders" + ] + ], + "up_source": "id();\n $table->unsignedBigInteger('user_id');\n $table->unsignedInteger('twofaccount_id');\n $table->unsignedInteger('position');\n $table->timestamps();\n\n $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();\n $table->foreign('twofaccount_id')->references('id')->on('twofaccounts')->cascadeOnDelete();\n\n $table->unique(['user_id', 'twofaccount_id'], 'twofaccount_user_orders_unique_scope');\n $table->index(['user_id', 'position']);\n $table->index('twofaccount_id');\n });\n\n $this->backfillLegacyOrderColumnValues();\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_04_15_010000_drop_order_column_from_twofaccounts_table.php", + "sha256": "ceebf07f020664a66531ab8d967b40b5c9e58383e9dbee2d156fe55f683ac5e9", + "schema_operations": [ + [ + "table", + "twofaccounts" + ] + ], + "up_source": "dropColumn('order_column');\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_05_16_074427_create_otp_logs_table.php", + "sha256": "19c230dc2ac7b97af06444430820c1afb552f059c08200e82c9c0349612423a3", + "schema_operations": [ + [ + "create", + "otp_logs" + ] + ], + "up_source": "id();\n $table->unsignedBigInteger('requester_id')->nullable();\n $table->string('requester_name');\n $table->string('requester_email');\n $table->unsignedBigInteger('owner_id')->nullable();\n $table->string('owner_name');\n $table->string('owner_email');\n $table->unsignedInteger('twofaccount_id');\n $table->string('ip_address', 45);\n $table->string('otp_type', 10);\n $table->unsignedMediumInteger('counter')->nullable();\n $table->timestamp('generated_at');\n\n $table->foreign('requester_id')->references('id')->on('users')->nullOnDelete();\n $table->foreign('owner_id')->references('id')->on('users')->nullOnDelete();\n $table->foreign('twofaccount_id')->references('id')->on('twofaccounts')->cascadeOnDelete();\n\n $table->index('requester_id');\n $table->index('twofaccount_id');\n $table->index('ip_address');\n $table->index('otp_type');\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_06_10_153224_add_show_in_chips_column_to_group.php", + "sha256": "fd4e2f61e2ddf4644a5d3ed0e3c76382745631a5e3d426d49d45733e94ae8c47", + "schema_operations": [ + [ + "table", + "groups" + ] + ], + "up_source": "boolean('show_in_chips')\n ->after('name')\n ->default(false);\n });\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + }, + { + "file": "database/migrations/2026_08_29_175933_update_oauth_clients_table_for_passport_13.php", + "sha256": "af7bc5f94d94be7ab8a1bd8d2622c8448f6a3e8f16edd40eb30a53b9a6028391", + "schema_operations": [ + [ + "table", + "oauth_clients" + ], + [ + "table", + "oauth_clients" + ], + [ + "dropIfExists", + "oauth_personal_access_clients" + ] + ], + "up_source": "nullableMorphs('owner', after: 'user_id');\n\n $table->after('provider', function (Blueprint $table) {\n $table->text('redirect_uris')->nullable();\n $table->text('grant_types')->nullable();\n });\n });\n\n foreach (Passport::client()->cursor() as $client) {\n Model::withoutTimestamps(fn () => $client->forceFill([\n 'owner_id' => $client->user_id,\n 'owner_type' => $client->user_id\n ? config('auth.providers.'.($client->provider ?: config('auth.guards.api-guard.provider')).'.model')\n : null,\n 'redirect_uris' => $client->redirect_uris,\n 'grant_types' => ['personal_access', 'refresh_token'],\n ])->save());\n }\n\n Schema::table('oauth_clients', function (Blueprint $table) {\n $table->dropIndex('oauth_clients_user_id_index');\n $table->dropColumn(['user_id', 'redirect', 'personal_access_client', 'password_client']);\n\n $table->text('redirect_uris')->nullable(false)->change();\n $table->text('grant_types')->nullable(false)->change();\n });\n\n Schema::dropIfExists('oauth_personal_access_clients');\n }\n\n /**\n * Reverse the migrations.\n */\n ", + "note": "Raw up source includes exact definitions and transformations. Helpers defined after down may need the full source; no SQL schema is inferred." + } + ] +} diff --git a/compatibility/device-interop.json b/compatibility/device-interop.json new file mode 100644 index 0000000..59ac85e --- /dev/null +++ b/compatibility/device-interop.json @@ -0,0 +1,16 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "candidate_sha256": "0e03e978721bf4fcfc65e18e4a98f47b26b71a151c792b380d18996ae467813d", + "php_version": "8.4.27", + "checks": { + "php_issued_device_pending_backoff": true, + "php_approval_rust_token_php_resource_server": true, + "device_code_revocation_replay": true, + "rust_issued_device_php_repository_readable": true, + "rust_device_php_approval_and_token_validation": true, + "php_denied_device_rejected": true, + "expired_device_rejected": true, + "source_database_unchanged": true + }, + "passed": true +} diff --git a/compatibility/environment.json b/compatibility/environment.json new file mode 100644 index 0000000..6df1fae --- /dev/null +++ b/compatibility/environment.json @@ -0,0 +1,582 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "kind": "configuration env names and source references only; no deployment values", + "variables": { + "IS_DEMO_APP": [ + "config/2fauth.php:81" + ], + "IS_TESTING_APP": [ + "config/2fauth.php:82" + ], + "TRUSTED_PROXIES": [ + "config/2fauth.php:83" + ], + "PROXY_FOR_OUTGOING_REQUESTS": [ + "config/2fauth.php:84", + "config/services.php:33", + "config/services.php:42" + ], + "PROXY_LOGOUT_URL": [ + "config/2fauth.php:85" + ], + "APP_SUBDIRECTORY": [ + "config/2fauth.php:86", + "config/app.php:65" + ], + "PROXY_HEADER_FOR_IP": [ + "config/2fauth.php:102" + ], + "THROTTLE_API": [ + "config/2fauth.php:113" + ], + "THROTTLE_API_DURING_IMPORT": [ + "config/2fauth.php:114" + ], + "APP_URL": [ + "config/app.php:7", + "config/filesystems.php:44", + "config/filesystems.php:82", + "config/mail.php:50", + "config/services.php:30", + "config/services.php:40" + ], + "HEROKU_APP_NAME": [ + "config/app.php:7", + "config/app.php:7" + ], + "APP_NAME": [ + "config/app.php:22", + "config/cache.php:121", + "config/database.php:160", + "config/logging.php:79", + "config/mail.php:124", + "config/session.php:134" + ], + "APP_ENV": [ + "config/app.php:35" + ], + "APP_DEBUG": [ + "config/app.php:48" + ], + "ASSET_URL": [ + "config/app.php:65" + ], + "APP_TIMEZONE": [ + "config/app.php:78" + ], + "APP_LOCALE": [ + "config/app.php:91" + ], + "APP_FALLBACK_LOCALE": [ + "config/app.php:93" + ], + "APP_FAKER_LOCALE": [ + "config/app.php:95" + ], + "APP_KEY": [ + "config/app.php:110" + ], + "APP_PREVIOUS_KEYS": [ + "config/app.php:114" + ], + "APP_MAINTENANCE_DRIVER": [ + "config/app.php:132" + ], + "APP_MAINTENANCE_STORE": [ + "config/app.php:133" + ], + "LOGIN_THROTTLE": [ + "config/auth.php:6" + ], + "AUTH_GUARD": [ + "config/auth.php:21" + ], + "AUTHENTICATION_GUARD": [ + "config/auth.php:21" + ], + "AUTH_PROXY_HEADER_FOR_USER": [ + "config/auth.php:37" + ], + "AUTH_PROXY_HEADER_FOR_EMAIL": [ + "config/auth.php:38" + ], + "AUTH_PASSWORD_TIMEOUT": [ + "config/auth.php:154" + ], + "BROADCAST_CONNECTION": [ + "config/broadcasting.php:18" + ], + "REVERB_APP_KEY": [ + "config/broadcasting.php:35" + ], + "REVERB_APP_SECRET": [ + "config/broadcasting.php:36" + ], + "REVERB_APP_ID": [ + "config/broadcasting.php:37" + ], + "REVERB_HOST": [ + "config/broadcasting.php:39" + ], + "REVERB_PORT": [ + "config/broadcasting.php:40" + ], + "REVERB_SCHEME": [ + "config/broadcasting.php:41", + "config/broadcasting.php:42" + ], + "PUSHER_APP_KEY": [ + "config/broadcasting.php:51" + ], + "PUSHER_APP_SECRET": [ + "config/broadcasting.php:52" + ], + "PUSHER_APP_ID": [ + "config/broadcasting.php:53" + ], + "PUSHER_APP_CLUSTER": [ + "config/broadcasting.php:55", + "config/broadcasting.php:56" + ], + "PUSHER_HOST": [ + "config/broadcasting.php:56" + ], + "PUSHER_PORT": [ + "config/broadcasting.php:57" + ], + "PUSHER_SCHEME": [ + "config/broadcasting.php:58", + "config/broadcasting.php:60" + ], + "ABLY_KEY": [ + "config/broadcasting.php:69" + ], + "CACHE_STORE": [ + "config/cache.php:18" + ], + "CACHE_DRIVER": [ + "config/cache.php:18" + ], + "DB_CACHE_CONNECTION": [ + "config/cache.php:44" + ], + "DB_CACHE_TABLE": [ + "config/cache.php:45" + ], + "DB_CACHE_LOCK_CONNECTION": [ + "config/cache.php:46" + ], + "DB_CACHE_LOCK_TABLE": [ + "config/cache.php:47" + ], + "CACHE_STORAGE_DISK": [ + "config/cache.php:58" + ], + "CACHE_STORAGE_PATH": [ + "config/cache.php:59" + ], + "MEMCACHED_PERSISTENT_ID": [ + "config/cache.php:64" + ], + "MEMCACHED_USERNAME": [ + "config/cache.php:66" + ], + "MEMCACHED_PASSWORD": [ + "config/cache.php:67" + ], + "MEMCACHED_HOST": [ + "config/cache.php:74" + ], + "MEMCACHED_PORT": [ + "config/cache.php:75" + ], + "REDIS_CACHE_CONNECTION": [ + "config/cache.php:83" + ], + "REDIS_CACHE_LOCK_CONNECTION": [ + "config/cache.php:84" + ], + "AWS_ACCESS_KEY_ID": [ + "config/cache.php:89", + "config/filesystems.php:90", + "config/queue.php:58", + "config/services.php:57" + ], + "AWS_SECRET_ACCESS_KEY": [ + "config/cache.php:90", + "config/filesystems.php:91", + "config/queue.php:59", + "config/services.php:58" + ], + "AWS_DEFAULT_REGION": [ + "config/cache.php:91", + "config/filesystems.php:92", + "config/queue.php:63", + "config/services.php:59" + ], + "DYNAMODB_CACHE_TABLE": [ + "config/cache.php:92" + ], + "DYNAMODB_ENDPOINT": [ + "config/cache.php:93" + ], + "CACHE_PREFIX": [ + "config/cache.php:121" + ], + "DB_URL": [ + "config/database.php:37", + "config/database.php:49", + "config/database.php:69", + "config/database.php:89", + "config/database.php:104" + ], + "DATABASE_URL": [ + "config/database.php:37", + "config/database.php:49", + "config/database.php:69", + "config/database.php:89", + "config/database.php:104" + ], + "DB_FOREIGN_KEYS": [ + "config/database.php:40", + "config/database.php:121" + ], + "DB_PASSWORD": [ + "config/database.php:54", + "config/database.php:74", + "config/database.php:94", + "config/database.php:109" + ], + "DB_SOCKET": [ + "config/database.php:55", + "config/database.php:75" + ], + "DB_CHARSET": [ + "config/database.php:56", + "config/database.php:76", + "config/database.php:95", + "config/database.php:110" + ], + "DB_COLLATION": [ + "config/database.php:57", + "config/database.php:77" + ], + "MYSQL_ATTR_SSL_CA": [ + "config/database.php:63", + "config/database.php:83" + ], + "DB_SSLMODE": [ + "config/database.php:99" + ], + "REDIS_CLIENT": [ + "config/database.php:156" + ], + "REDIS_CLUSTER": [ + "config/database.php:159" + ], + "REDIS_PREFIX": [ + "config/database.php:160" + ], + "REDIS_PERSISTENT": [ + "config/database.php:161" + ], + "REDIS_URL": [ + "config/database.php:165", + "config/database.php:178" + ], + "REDIS_HOST": [ + "config/database.php:166", + "config/database.php:179" + ], + "REDIS_USERNAME": [ + "config/database.php:167", + "config/database.php:180" + ], + "REDIS_PASSWORD": [ + "config/database.php:168", + "config/database.php:181" + ], + "REDIS_PORT": [ + "config/database.php:169", + "config/database.php:182" + ], + "REDIS_DB": [ + "config/database.php:170" + ], + "REDIS_MAX_RETRIES": [ + "config/database.php:171", + "config/database.php:184" + ], + "REDIS_BACKOFF_ALGORITHM": [ + "config/database.php:172", + "config/database.php:185" + ], + "REDIS_BACKOFF_BASE": [ + "config/database.php:173", + "config/database.php:186" + ], + "REDIS_BACKOFF_CAP": [ + "config/database.php:174", + "config/database.php:187" + ], + "REDIS_CACHE_DB": [ + "config/database.php:183" + ], + "FILESYSTEM_DISK": [ + "config/filesystems.php:16" + ], + "FILESYSTEM_DRIVER": [ + "config/filesystems.php:16" + ], + "AWS_BUCKET": [ + "config/filesystems.php:93" + ], + "AWS_URL": [ + "config/filesystems.php:94" + ], + "AWS_ENDPOINT": [ + "config/filesystems.php:95" + ], + "AWS_USE_PATH_STYLE_ENDPOINT": [ + "config/filesystems.php:96" + ], + "HASH_DRIVER": [ + "config/hashing.php:18" + ], + "BCRYPT_ROUNDS": [ + "config/hashing.php:32" + ], + "ARGON_MEMORY": [ + "config/hashing.php:50" + ], + "ARGON_THREADS": [ + "config/hashing.php:51" + ], + "ARGON_TIME": [ + "config/hashing.php:52" + ], + "LOG_CHANNEL": [ + "config/logging.php:21" + ], + "LOG_DEPRECATIONS_CHANNEL": [ + "config/logging.php:35" + ], + "LOG_DEPRECATIONS_TRACE": [ + "config/logging.php:36" + ], + "LOG_STACK": [ + "config/logging.php:57" + ], + "LOG_LEVEL": [ + "config/logging.php:64", + "config/logging.php:71", + "config/logging.php:81", + "config/logging.php:87", + "config/logging.php:99", + "config/logging.php:110", + "config/logging.php:117" + ], + "LOG_DAILY_DAYS": [ + "config/logging.php:72" + ], + "LOG_SLACK_WEBHOOK_URL": [ + "config/logging.php:78" + ], + "LOG_SLACK_USERNAME": [ + "config/logging.php:79" + ], + "LOG_SLACK_EMOJI": [ + "config/logging.php:80" + ], + "LOG_PAPERTRAIL_HANDLER": [ + "config/logging.php:88" + ], + "PAPERTRAIL_URL": [ + "config/logging.php:90", + "config/logging.php:92" + ], + "PAPERTRAIL_PORT": [ + "config/logging.php:91", + "config/logging.php:92" + ], + "LOG_STDERR_FORMATTER": [ + "config/logging.php:104" + ], + "LOG_SYSLOG_FACILITY": [ + "config/logging.php:111" + ], + "MAIL_MAILER": [ + "config/mail.php:17" + ], + "MAIL_DRIVER": [ + "config/mail.php:17" + ], + "MAIL_URL": [ + "config/mail.php:43" + ], + "MAIL_HOST": [ + "config/mail.php:44" + ], + "MAIL_PORT": [ + "config/mail.php:45" + ], + "MAIL_ENCRYPTION": [ + "config/mail.php:46" + ], + "MAIL_USERNAME": [ + "config/mail.php:47" + ], + "MAIL_PASSWORD": [ + "config/mail.php:48" + ], + "MAIL_EHLO_DOMAIN": [ + "config/mail.php:50" + ], + "MAIL_VERIFY_SSL_PEER": [ + "config/mail.php:51" + ], + "MAIL_SENDMAIL_PATH": [ + "config/mail.php:79" + ], + "MAIL_LOG_CHANNEL": [ + "config/mail.php:84" + ], + "MAIL_FROM_ADDRESS": [ + "config/mail.php:123" + ], + "MAIL_FROM_NAME": [ + "config/mail.php:124" + ], + "PASSPORT_PRIVATE_KEY": [ + "config/passport.php:31" + ], + "PASSPORT_PUBLIC_KEY": [ + "config/passport.php:33" + ], + "PASSPORT_CONNECTION": [ + "config/passport.php:46" + ], + "QUEUE_CONNECTION": [ + "config/queue.php:16" + ], + "DB_QUEUE_CONNECTION": [ + "config/queue.php:40" + ], + "DB_QUEUE_TABLE": [ + "config/queue.php:41" + ], + "DB_QUEUE": [ + "config/queue.php:42" + ], + "DB_QUEUE_RETRY_AFTER": [ + "config/queue.php:43" + ], + "BEANSTALKD_QUEUE_HOST": [ + "config/queue.php:49" + ], + "BEANSTALKD_QUEUE": [ + "config/queue.php:50" + ], + "BEANSTALKD_QUEUE_RETRY_AFTER": [ + "config/queue.php:51" + ], + "SQS_PREFIX": [ + "config/queue.php:60" + ], + "SQS_QUEUE": [ + "config/queue.php:61" + ], + "SQS_SUFFIX": [ + "config/queue.php:62" + ], + "REDIS_QUEUE_CONNECTION": [ + "config/queue.php:69" + ], + "REDIS_QUEUE": [ + "config/queue.php:70" + ], + "REDIS_QUEUE_RETRY_AFTER": [ + "config/queue.php:71" + ], + "DB_CONNECTION": [ + "config/queue.php:106", + "config/queue.php:125" + ], + "QUEUE_FAILED_DRIVER": [ + "config/queue.php:124" + ], + "MAILGUN_DOMAIN": [ + "config/services.php:18" + ], + "MAILGUN_SECRET": [ + "config/services.php:19" + ], + "MAILGUN_ENDPOINT": [ + "config/services.php:20" + ], + "OPENID_TOKEN_URL": [ + "config/services.php:25" + ], + "OPENID_AUTHORIZE_URL": [ + "config/services.php:26" + ], + "OPENID_USERINFO_URL": [ + "config/services.php:27" + ], + "OPENID_CLIENT_ID": [ + "config/services.php:28" + ], + "OPENID_CLIENT_SECRET": [ + "config/services.php:29" + ], + "GITHUB_CLIENT_ID": [ + "config/services.php:38" + ], + "GITHUB_CLIENT_SECRET": [ + "config/services.php:39" + ], + "POSTMARK_TOKEN": [ + "config/services.php:53" + ], + "RESEND_KEY": [ + "config/services.php:63" + ], + "SLACK_BOT_USER_OAUTH_TOKEN": [ + "config/services.php:68" + ], + "SLACK_BOT_USER_DEFAULT_CHANNEL": [ + "config/services.php:69" + ], + "SESSION_DRIVER": [ + "config/session.php:21" + ], + "SESSION_ENCRYPT": [ + "config/session.php:52" + ], + "SESSION_CONNECTION": [ + "config/session.php:78" + ], + "SESSION_TABLE": [ + "config/session.php:91" + ], + "SESSION_STORE": [ + "config/session.php:106" + ], + "SESSION_PATH": [ + "config/session.php:148" + ], + "SESSION_DOMAIN": [ + "config/session.php:161" + ], + "SESSION_SECURE_COOKIE": [ + "config/session.php:174" + ], + "WEBAUTHN_ORIGINS": [ + "config/webauthn.php:35" + ] + }, + "dynamic_names": [ + "USERPREF_DEFAULT__", + "USERPREF_LOCKED__" + ] +} diff --git a/compatibility/frontend-assets.json b/compatibility/frontend-assets.json new file mode 100644 index 0000000..9e9dd1d --- /dev/null +++ b/compatibility/frontend-assets.json @@ -0,0 +1,269 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "files": [ + { + "path": "UPSTREAM-LICENSE", + "sha256": "4df3c306dddaaf4baffdff5ca820cc679ac8cd6dc263c6a74517783e42fa7a3b" + }, + { + "path": "UPSTREAM-NOTICE.txt", + "sha256": "cb69c7c5779eb46c28f44146e63c66831eb17ff3af761fc1f09e9c6406c3fe4c" + }, + { + "path": "build/assets/About-DlWJhNxo.js", + "sha256": "f3169d1ab17f927108537166c262b5e4cbd60680007376d81b222196ca161c9b" + }, + { + "path": "build/assets/Access-BQVm4alb.js", + "sha256": "22b97a5fbc041312bda5a240a93e14a50e6c4d23fced34202f75c0cf1441f762" + }, + { + "path": "build/assets/AccessLogViewer-D5ke4CwJ.js", + "sha256": "cb9164252152b509f281ca1d14758ae200c76537bc51c687c28cefac7689c75e" + }, + { + "path": "build/assets/Account-CvhJGfLO.js", + "sha256": "d6cbabd0c90d314b39f25af40bc06fa6067b7a97266581b40113c837b13be140" + }, + { + "path": "build/assets/AccountSharing-kU7yk02h.js", + "sha256": "e99a6c300fb8c205fa1b6ed205daadf1e4e9c0ca46e6402a5c5c8b7a1f4fb8ff" + }, + { + "path": "build/assets/Accounts-znshhaJC.js", + "sha256": "a2d62c76f1760d22f69a05b19d2b455d7943fa873af854ddf3291d238c6ab4e1" + }, + { + "path": "build/assets/AppSetup-9GPB7B-I.js", + "sha256": "3fc8954eabf0857e275ea041f93b3c80ad14fff990ce880e80b64a506d2af083" + }, + { + "path": "build/assets/Auth-DslSg1a9.js", + "sha256": "19cde7fd5762e9cf47461ea4bb4bedd493d73e6a8ba5234c6d2a772e2e1381a5" + }, + { + "path": "build/assets/Capture-BG6QMHLW.js", + "sha256": "37055326ee5e5b9704b09c190550954d8c023b62db0fa56601a458665ff91c83" + }, + { + "path": "build/assets/CopyButton-CgxgBp0c.js", + "sha256": "de0d9210a45ca0dcfe42c9c3510e376d6138f46304287dac38dfd705b7fbc980" + }, + { + "path": "build/assets/Create-Vv-BwDWf.js", + "sha256": "d7298e06bbd88989a0aadcbcad6ce822f68143479fc7ac304aa0de1afd0bb1bb" + }, + { + "path": "build/assets/CreateUpdate-CbOB1O7q.js", + "sha256": "7722a5c1d5e2d54f59f831019dc60d70e254e6301af0d1d88539b900c9afe5a0" + }, + { + "path": "build/assets/CreateUpdate-tvLQ26rU.js", + "sha256": "f6080ad4cf80ce4a0d069c37db14cffb73e100d61c01b5d362d065671db938bb" + }, + { + "path": "build/assets/Edit-Ba84j7PP.js", + "sha256": "4e9473ca1dcdd023ab7e5971efb7c4037cc7b139f40d3c6d60ebbb188042a9be" + }, + { + "path": "build/assets/Error-DG0pgQA2.js", + "sha256": "b0f3daed5256ace1b0cfc107331ea72d83802c02a5b06fbadfd9e9bc93f096ab" + }, + { + "path": "build/assets/Form-ZbAUhXmz.js", + "sha256": "fd411a87ff941729cb37f83684348c07a18f36238611f46895f9c7058caeee39" + }, + { + "path": "build/assets/Groups-Ccrpwp-O.js", + "sha256": "fe6d8a2b4909a5a9703fb1b397e093920f10339f2397d94322e91cb4bd3455b0" + }, + { + "path": "build/assets/Import-C0sC5CLD.js", + "sha256": "3cf1c15584189a7ec24cc62205cf42bded2561ba6d8744b4d78939d639fb9045" + }, + { + "path": "build/assets/Login-XfEMUKl8.js", + "sha256": "a43048f07eb40139adc248ecae28d32c9f578a806390db9c92d872a9f52c2d18" + }, + { + "path": "build/assets/Manage-B1CTWqgo.js", + "sha256": "d19802c7c40feb225df8e44234c149d69932f02c23e2e130f83dd312c5b470d7" + }, + { + "path": "build/assets/OAuth-aXCqlLPs.js", + "sha256": "62945e0e479af1c53092bf8fccb97ed218b16a31516d9ca916215fe20477bbc9" + }, + { + "path": "build/assets/Options-Bun4hDR8.js", + "sha256": "4e03854ccd1cc756cb0b9a0bf21c514b1d2c16a9f44443b01c48825963db41f2" + }, + { + "path": "build/assets/OtpLogs-CAP6rwu6.js", + "sha256": "752b619ab9eec5433b20ec3d4ea2ebc20cfa44cd408841c65a7c22ecb7d80ecc" + }, + { + "path": "build/assets/QRcode-Da_iUmWo.js", + "sha256": "31cd01fbebe9be769dac7b572dcb1f4f058bbf5564c61c0326f16b2e48ca2b98" + }, + { + "path": "build/assets/QrContentDisplay-DiIjf7a_.js", + "sha256": "4bb56ee3a4532bc8f8ee5464bef16c1822e9ce40274f550e713fbc4590d3007f" + }, + { + "path": "build/assets/Recover-CEob990V.js", + "sha256": "81a968b80924d8771c13df267554975f893e4472c1e94685daa2540bc5258db9" + }, + { + "path": "build/assets/Register-DffuLlzx.js", + "sha256": "0143921eedbef6c3c93119cf8c99b1ae663f38107871ee1ad0b464578013627e" + }, + { + "path": "build/assets/RequestReset-w8-YSMaH.js", + "sha256": "26eedf6afd5f9fa0311b362e51837ac384d49583de1dba953b5d5ebc8a88d6fe" + }, + { + "path": "build/assets/Reset-RiTuOlH9.js", + "sha256": "efda00daaf3e1522870b1112185b220f427ba7c73a35da1dd19577a9328c8680" + }, + { + "path": "build/assets/Share-DkTnn1jz.js", + "sha256": "112dcfe57d40a155f642643cc33bd0b131084c37cecb73731d4d44488979f4c5" + }, + { + "path": "build/assets/Start-Dnu4qWlC.js", + "sha256": "71307d371a240ae2566646506ac1043c2d5044e4779d4cc0e600f6c4a5148fb9" + }, + { + "path": "build/assets/TransferOwnership-BsVNwpBY.js", + "sha256": "5d8d0457fde643dd492c2c8b4996b488a30073c5383a2910f83a571947128b83" + }, + { + "path": "build/assets/TwofaccountMedia-DzLyeBxh.js", + "sha256": "0dc08bad96017b22d1319219aee0810919776f61a4a98213b76fd636b22ab92c" + }, + { + "path": "build/assets/Users-DyNCDMUg.js", + "sha256": "f4843babe67785c7b490d1d635e9c6d53dbe56a36bc0283c74a49acc7742f4e8" + }, + { + "path": "build/assets/WebAuthn-C_HU0Xj8.js", + "sha256": "d4342ce1b35963255a6b4a7df346cd3d40ac75a6148c21258b92fbcd6b6a1dd9" + }, + { + "path": "build/assets/app-C6trQ8-_.css", + "sha256": "1c9e625b1b803a2a2b63a6339524de490060ad1e30a14076e7aa1893dd5f2472" + }, + { + "path": "build/assets/app-dvJP63FL.js", + "sha256": "535d717468bc495ac963ae84b52549d223c04213f5e5764b2762e463a00cb04e" + }, + { + "path": "build/assets/appSettingsUpdater-D1Bq_3WB.js", + "sha256": "2f4dc82c14b2518614612bf1c37f720d5e1899059423ed3bd593e7a83e6728ae" + }, + { + "path": "build/assets/breakpoints-CyLcIEOu.js", + "sha256": "43ecba0d19dea8ad828eae4fb460ce85fedfae700c09daa8fe9701214cd986d5" + }, + { + "path": "build/assets/bus-ChE1sp8V.js", + "sha256": "d84b9cf19fd6d82135d7bc185f5d200ac2abc2bd85f61c9ba0ff82b2c0d591fb" + }, + { + "path": "build/assets/check-CPGWPXZa.js", + "sha256": "3d743579c1e01d29248a6c4c2fa1c3b042aee3f2d97e29ea879a2d5dbf6c736b" + }, + { + "path": "build/assets/circle-plus-BM92Iipr.js", + "sha256": "2e5faf55982bf87bf1caf5b6abd2673127ef15b4f56bf3fa330b84457d984afc" + }, + { + "path": "build/assets/circle-x-AvUNZzwX.js", + "sha256": "942133c0ee96ec5b0eff01c4f2ff3a2ec76f00d8a126aaf4a29e25b0092e93dd" + }, + { + "path": "build/assets/createLucideIcon-DsaEAGzP.js", + "sha256": "67d36796d6e97cd30520b928d535103cd12df14d0ff9ccc0d0d9e39135288a9a" + }, + { + "path": "build/assets/external-link-CqpXNovN.js", + "sha256": "b0ea183dd73195135d6874336bfea357f0ef9853c2f815646eb685bc96930042" + }, + { + "path": "build/assets/helpers-B2oe4lHy.js", + "sha256": "9f2e0d92e5dcd5ca291a2201b86f07c629e6f66610c32087b5e7f8ef364e2177" + }, + { + "path": "build/assets/iconService-rm6LRV4U.js", + "sha256": "45473c427530a0a626666e25c6f22626dcf9ce066b0fbc3d113f1ee03c7bd60e" + }, + { + "path": "build/assets/index-BJsmINgd.js", + "sha256": "73c8fd5fe0cfa6e9f2b6813a26e13b5af522217a2a8bbaf71df66ffab21a9ae0" + }, + { + "path": "build/assets/qr-code-eSL1bq0j.js", + "sha256": "ef43fa83adaacb9ac9fbde3fb504d0d9723039aedb4c6d0b6cbe245d6e098644" + }, + { + "path": "build/assets/shareService-BU7jlLil.js", + "sha256": "5cf418bbe4ebd9e4c4df38ff56328022ab5d96512204c5f5e4a4b922ae87e675" + }, + { + "path": "build/assets/tablet-DYUfDfjC.js", + "sha256": "166e691d3fd9bf6c5a2d0d39fdaf878c276b41d22e886b8e2b82c8f0e5468750" + }, + { + "path": "build/assets/tabs-BVx9tg1F.js", + "sha256": "a0dc11f6f993d0758ffa532a818d332771403a256ff00a2aa072dcc211c9efe9" + }, + { + "path": "build/assets/tabs-Btun2NN0.js", + "sha256": "da0a8a06a9b615727d00cfa2313c35699c220f3691e59ac0732b5004c0585e47" + }, + { + "path": "build/assets/useSortable-6hRbxhTj.js", + "sha256": "6f3a264bb228826b5bc77c63452d141e5550c5e7e29cbd4dd0fc66fc8999e2c7" + }, + { + "path": "build/assets/users-CLZI37iw.js", + "sha256": "732d20d0eeca849e83a4d2affd0eb07c95ac0538266f93ee19a8a0da0809651f" + }, + { + "path": "build/assets/webauthnService-D363et0U.js", + "sha256": "7f98b80530bc3cefa019532e5570e1f4f4f9418ad5882dc9e06366ea9439a5dd" + }, + { + "path": "build/assets/x-DQVIq0xP.js", + "sha256": "fdb82d6b42e8ca89a1ac9bc037572e9d6c36b7c568b49cf7435b1a8d7cd6da17" + }, + { + "path": "build/manifest.json", + "sha256": "cbf4ab776d021f9fb4778970db9afc3d7b8d32b2edd21e7677dcf18ccf48f7ed" + }, + { + "path": "favicon.ico", + "sha256": "844e483a6fc4a33ff86fbf70a4e6321034f4d5d831a8401afed491ac2aa52957" + }, + { + "path": "favicon.png", + "sha256": "8dd74a355aa3d9355439b753872e40caf91b3692fedb4560da67c45b38d972ef" + }, + { + "path": "favicon_lg.png", + "sha256": "54be08dbaed6b51b78b1fd3e5918e4b071af54f1c8062fbbfb7c59f0970a336b" + }, + { + "path": "healthcheck.css", + "sha256": "f6444b55f2879b5d38b41be8562065dcbe190f179dd2306851408ac142ee8250" + }, + { + "path": "logo.svg", + "sha256": "11c3a3fb1a688e8cdfde36fb117fc90fc652664398f62e12ffb6a923f19a392d" + }, + { + "path": "robots.txt", + "sha256": "e5c4b84484ee4216e9373be99380320c25dd94805f99f0a805846f087636553f" + } + ] +} diff --git a/compatibility/interop-results.json b/compatibility/interop-results.json new file mode 100644 index 0000000..2ee9856 --- /dev/null +++ b/compatibility/interop-results.json @@ -0,0 +1,55 @@ +{ + "version": "0.3.0", + "date": "2026-10-28", + "candidate_sha256": "0e03e978721bf4fcfc65e18e4a98f47b26b71a151c792b380d18996ae467813d", + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "rust_tests": { + "passed": 137, + "failed": 0 + }, + "strict_clippy": "passed", + "formatting": "passed", + "python_harness_tests": { + "passed": 6, + "failed": 0 + }, + "php_openssl_fixtures": { + "passed": 6 + }, + "http_comparisons_per_database": { + "total": 140, + "exact": 129, + "expected_raw_dynamic_bodies": 11, + "unexpected_assertion_failures": 0 + }, + "process_checks": { + "oauth_wire": { + "php_authorization_code_pkce": "passed", + "rust_jwt_php_signature": "passed", + "rust_refresh_php_decryption": "passed", + "php_refresh_rotation_replay": "passed", + "client_credentials_wildcard": "passed" + }, + "laravel_session_http": { + "php_session_browser_migration": "passed", + "cases": [ + "file/json/encrypt=False", + "database/json/encrypt=False", + "file/json/encrypt=True", + "database/json/encrypt=True", + "file/php/encrypt=False", + "database/php/encrypt=False", + "file/php/encrypt=True", + "database/php/encrypt=True" + ] + }, + "cli_http_smoke": { + "cli_init": "passed", + "existing_db_refusal": "passed", + "test_user": "passed", + "http_login_crud_hotp_logout": "passed", + "php_differential": "not_run" + } + }, + "device_interop_report": "device-interop.json" +} diff --git a/compatibility/oauth-device-php-reference.json b/compatibility/oauth-device-php-reference.json new file mode 100644 index 0000000..db24d60 --- /dev/null +++ b/compatibility/oauth-device-php-reference.json @@ -0,0 +1,298 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "php": "8.4.27", + "results": [ + { + "case": "issuer-missing-client", + "method": "POST", + "path": "/oauth/device/code", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "59" + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `client_id` parameter" + } + }, + { + "case": "issuer-unknown-client", + "method": "POST", + "path": "/oauth/device/code", + "status": 401, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "58" + }, + "body": { + "error": "invalid_client", + "error_description": "Client authentication failed" + } + }, + { + "case": "issuer-unauthorized-client", + "method": "POST", + "path": "/oauth/device/code", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "57" + }, + "body": { + "error": "unauthorized_client", + "error_description": "The authenticated client is not authorized to use this authorization grant type." + } + }, + { + "case": "issuer-valid", + "method": "POST", + "path": "/oauth/device/code", + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Cache-Control": "no-store, private", + "Pragma": "no-cache", + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "56" + }, + "body": { + "verification_uri": "/oauth/device", + "expires_in": 599, + "verification_uri_complete": "/oauth/device?user_code=", + "interval": 5, + "device_code": "", + "user_code": "", + "device_code_length": 80, + "user_code_length": 8, + "device_code_hex": true, + "user_code_consonants": true + } + }, + { + "case": "poll-missing-device-code", + "method": "POST", + "path": "/oauth/token", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "55" + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `device_code` parameter" + } + }, + { + "case": "poll-unknown-device-code", + "method": "POST", + "path": "/oauth/token", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "54" + }, + "body": { + "error": "invalid_grant", + "error_description": "The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.", + "hint": "" + } + }, + { + "case": "poll-pending", + "method": "POST", + "path": "/oauth/token", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "53" + }, + "body": { + "error": "authorization_pending", + "error_description": "The authorization request is still pending as the end user hasn't yet completed the user interaction steps. The client SHOULD repeat the Access Token Request to the token endpoint", + "hint": "" + } + }, + { + "case": "poll-too-soon", + "method": "POST", + "path": "/oauth/token", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "52" + }, + "body": { + "error": "slow_down", + "error_description": "The authorization request is still pending and polling should continue, but the interval MUST be increased by 5 seconds for this and all subsequent requests.", + "hint": "" + } + }, + { + "case": "GET /oauth/device", + "method": "GET", + "path": "/oauth/device", + "status": 500, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": null, + "X-RateLimit-Remaining": null + }, + "body": { + "message": "Server Error" + } + }, + { + "case": "GET /oauth/device/authorize", + "method": "GET", + "path": "/oauth/device/authorize", + "status": 401, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": null, + "X-RateLimit-Remaining": null + }, + "body": { + "message": "Unauthenticated." + } + }, + { + "case": "POST /oauth/device/authorize", + "method": "POST", + "path": "/oauth/device/authorize", + "status": 419, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": null, + "X-RateLimit-Remaining": null + }, + "body": { + "message": "CSRF token mismatch." + } + }, + { + "case": "DELETE /oauth/device/authorize", + "method": "DELETE", + "path": "/oauth/device/authorize", + "status": 419, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": null, + "X-RateLimit-Remaining": null + }, + "body": { + "message": "CSRF token mismatch." + } + }, + { + "case": "POST /oauth/authorize", + "method": "POST", + "path": "/oauth/authorize", + "status": 419, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": null, + "X-RateLimit-Remaining": null + }, + "body": { + "message": "CSRF token mismatch." + } + }, + { + "case": "DELETE /oauth/authorize", + "method": "DELETE", + "path": "/oauth/authorize", + "status": 419, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": null, + "X-RateLimit-Remaining": null + }, + "body": { + "message": "CSRF token mismatch." + } + }, + { + "case": "POST /oauth/token/refresh", + "method": "POST", + "path": "/oauth/token/refresh", + "status": 419, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Location": null, + "X-RateLimit-Limit": null, + "X-RateLimit-Remaining": null + }, + "body": { + "message": "CSRF token mismatch." + } + } + ], + "composer_lock_sha256": "b1376d21c517d700bc48b196e9dc2b30257caf25774e315ff9d1bf8a2411241a" +} diff --git a/compatibility/oauth-php-body-edge-reference.json b/compatibility/oauth-php-body-edge-reference.json new file mode 100644 index 0000000..ee3c80c --- /dev/null +++ b/compatibility/oauth-php-body-edge-reference.json @@ -0,0 +1,202 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "php": "8.4.27", + "results": [ + { + "case": "malformed-json", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "59" + }, + "body": { + "message": "Bad request." + } + }, + { + "case": "top-json-array", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "58" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "top-json-null", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "57" + }, + "body": { + "message": "Bad request." + } + }, + { + "case": "empty-json-body", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "56" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "form-scalar-then-array", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "55" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "form-array-then-scalar", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "54" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "top-json-number", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "53" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "top-json-nonempty-array", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "52" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "body-client-id-u2003", + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Cache-Control": "no-store, private", + "Pragma": "no-cache", + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "51" + }, + "body": { + "token_type": "Bearer", + "expires_in": 31536000, + "access_token_present": true + } + }, + { + "case": "basic-client-id-u2003", + "status": 401, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": "Basic realm=\"OAuth\"", + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "50" + }, + "body": { + "error": "invalid_client", + "error_description": "Client authentication failed" + } + }, + { + "case": "body-client-secret-u2003", + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Cache-Control": "no-store, private", + "Pragma": "no-cache", + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "49" + }, + "body": { + "token_type": "Bearer", + "expires_in": 31536000, + "access_token_present": true + } + } + ], + "composer_lock_sha256": "b1376d21c517d700bc48b196e9dc2b30257caf25774e315ff9d1bf8a2411241a", + "request_notes": { + "malformed-json": "raw { with Content-Type application/json", + "top-json-array": "raw []", + "top-json-null": "raw null", + "empty-json-body": "zero bytes with Content-Type application/json", + "form-scalar-then-array": "grant_type=bogus&grant_type[]=client_credentials", + "form-array-then-scalar": "grant_type[]=client_credentials&grant_type=bogus", + "top-json-number": "raw 42", + "top-json-nonempty-array": "raw [\"bogus\"]", + "body-client-id-u2003": "valid fixture client ID surrounded by U+2003 in a form field", + "basic-client-id-u2003": "valid fixture client ID surrounded by U+2003 in HTTP Basic username", + "body-client-secret-u2003": "valid fixture client secret surrounded by U+2003 in a form field" + } +} diff --git a/compatibility/oauth-php-body-reference.json b/compatibility/oauth-php-body-reference.json new file mode 100644 index 0000000..847864c --- /dev/null +++ b/compatibility/oauth-php-body-reference.json @@ -0,0 +1,188 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "php": "8.4.27", + "results": [ + { + "case": "malformed-json", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "59" + }, + "body": { + "message": "Bad request." + } + }, + { + "case": "top-json-array", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "58" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "top-json-null", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "57" + }, + "body": { + "message": "Bad request." + } + }, + { + "case": "empty-json-body", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "56" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "form-scalar-then-array", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "55" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "form-array-then-scalar", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "54" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "top-json-number", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "53" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "top-json-nonempty-array", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "52" + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "body-client-id-u2003", + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Cache-Control": "no-store, private", + "Pragma": "no-cache", + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "51" + }, + "body": { + "token_type": "Bearer", + "expires_in": 31536000, + "access_token_present": true + } + }, + { + "case": "basic-client-id-u2003", + "status": 401, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": "Basic realm=\"OAuth\"", + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "50" + }, + "body": { + "error": "invalid_client", + "error_description": "Client authentication failed" + } + }, + { + "case": "body-client-secret-u2003", + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Cache-Control": "no-store, private", + "Pragma": "no-cache", + "WWW-Authenticate": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "49" + }, + "body": { + "token_type": "Bearer", + "expires_in": 31536000, + "access_token_present": true + } + } + ] +} diff --git a/compatibility/oauth-php-reference.json b/compatibility/oauth-php-reference.json new file mode 100644 index 0000000..a3cde7b --- /dev/null +++ b/compatibility/oauth-php-reference.json @@ -0,0 +1,502 @@ +{ + "php": "8.4.27", + "framework": "Laravel13.29.0/Passport13.7.6", + "request_format": "application/x-www-form-urlencoded", + "environment": "fresh disposable SQLite migrations and client-credentials fixture", + "results": [ + { + "case": "missing-grant-type", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "59", + "Retry-After": null + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "unsupported-grant", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "58", + "Retry-After": null + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "client-credentials-missing-client-id", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "57", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `client_id` parameter" + } + }, + { + "case": "unknown-client", + "status": 401, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "56", + "Retry-After": null + }, + "body": { + "error": "invalid_client", + "error_description": "Client authentication failed" + } + }, + { + "case": "wrong-client-secret", + "status": 401, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "55", + "Retry-After": null + }, + "body": { + "error": "invalid_client", + "error_description": "Client authentication failed" + } + }, + { + "case": "unknown-scope", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "54", + "Retry-After": null + }, + "body": { + "error": "invalid_scope", + "error_description": "The requested scope is invalid, unknown, or malformed", + "hint": "Check the `__compat_unknown_scope__` scope" + } + }, + { + "case": "valid-control", + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Cache-Control": "no-store, private", + "Pragma": "no-cache", + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "53", + "Retry-After": null + }, + "body": { + "token_type": "Bearer", + "expires_in": 31536000, + "access_token_present": true, + "refresh_token_present": false + } + }, + { + "case": "confidential-missing-secret", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "52", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `client_secret` parameter" + } + }, + { + "case": "unauthorized-grant-valid-client", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "51", + "Retry-After": null + }, + "body": { + "error": "unauthorized_client", + "error_description": "The authenticated client is not authorized to use this authorization grant type." + } + }, + { + "case": "auth-code-missing-code", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "50", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `code` parameter" + } + }, + { + "case": "refresh-missing-token", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "49", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `refresh_token` parameter" + } + }, + { + "case": "auth-code-invalid-ciphertext", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "48", + "Retry-After": null + }, + "body": { + "error": "invalid_grant", + "error_description": "The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.", + "hint": "Cannot validate the provided authorization code" + } + }, + { + "case": "refresh-invalid-ciphertext", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "47", + "Retry-After": null + }, + "body": { + "error": "invalid_grant", + "error_description": "The refresh token is invalid.", + "hint": "Cannot decrypt the refresh token" + } + }, + { + "case": "auth-code-malformed-payload", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "46", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Authorization code malformed" + } + }, + { + "case": "auth-code-expired", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "45", + "Retry-After": null + }, + "body": { + "error": "invalid_grant", + "error_description": "The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.", + "hint": "Authorization code has expired" + } + }, + { + "case": "auth-code-revoked", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "44", + "Retry-After": null + }, + "body": { + "error": "invalid_grant", + "error_description": "The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.", + "hint": "Authorization code has been revoked" + } + }, + { + "case": "auth-code-wrong-client", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "43", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Authorization code was not issued to this client" + } + }, + { + "case": "auth-code-missing-redirect", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "42", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `redirect_uri` parameter" + } + }, + { + "case": "auth-code-wrong-redirect", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "41", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Invalid redirect URI" + } + }, + { + "case": "pkce-missing-verifier", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "40", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Check the `code_verifier` parameter" + } + }, + { + "case": "pkce-invalid-syntax", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "39", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "Code Verifier must follow the specifications of RFC-7636." + } + }, + { + "case": "pkce-mismatch", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "38", + "Retry-After": null + }, + "body": { + "error": "invalid_grant", + "error_description": "The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.", + "hint": "Failed to verify `code_verifier`." + } + }, + { + "case": "pkce-downgrade", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "37", + "Retry-After": null + }, + "body": { + "error": "invalid_request", + "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + "hint": "code_verifier received when no code_challenge is present" + } + }, + { + "case": "wrong-basic-secret", + "status": 401, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": "Basic realm=\"OAuth\"", + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "36", + "Retry-After": null + }, + "body": { + "error": "invalid_client", + "error_description": "Client authentication failed" + } + }, + { + "case": "json-unsupported-grant", + "status": 400, + "headers": { + "Content-Type": "application/json", + "Cache-Control": "no-cache, private", + "Pragma": null, + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "35", + "Retry-After": null + }, + "body": { + "error": "unsupported_grant_type", + "error_description": "The authorization grant type is not supported by the authorization server.", + "hint": "Check that all required parameters have been provided" + } + }, + { + "case": "json-valid-control", + "status": 200, + "headers": { + "Content-Type": "application/json; charset=UTF-8", + "Cache-Control": "no-store, private", + "Pragma": "no-cache", + "WWW-Authenticate": null, + "Access-Control-Allow-Origin": null, + "X-RateLimit-Limit": "60", + "X-RateLimit-Remaining": "34", + "Retry-After": null + }, + "body": { + "token_type": "Bearer", + "expires_in": 31536000, + "access_token_present": true, + "refresh_token_present": false + } + } + ], + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "composer_lock_sha256": "b1376d21c517d700bc48b196e9dc2b30257caf25774e315ff9d1bf8a2411241a" +} diff --git a/compatibility/passport-interop-results.json b/compatibility/passport-interop-results.json new file mode 100644 index 0000000..2b7490c --- /dev/null +++ b/compatibility/passport-interop-results.json @@ -0,0 +1,23 @@ +{ + "version": "0.3.0", + "candidate_sha256": "0e03e978721bf4fcfc65e18e4a98f47b26b71a151c792b380d18996ae467813d", + "reference_php": "8.4.27", + "database_modes": [ + "native", + "laravel-copy" + ], + "checks": { + "php_bearer": 200, + "php_cookie": 200, + "cookie_missing_csrf": 401, + "tampered_bearer": 401, + "php_browser_bootstrap": 200, + "legacy_cookie_cleared": true, + "upgraded_browser_api": 200, + "upgraded_browser_logout": 200, + "browser_api_after_logout": 401, + "php_validated_rust_bearer": true, + "revoked_php_bearer": 401 + }, + "passed": true +} diff --git a/compatibility/reference-results.json b/compatibility/reference-results.json new file mode 100644 index 0000000..c54e1ba --- /dev/null +++ b/compatibility/reference-results.json @@ -0,0 +1,562 @@ +{ + "recorded_at_utc": "2026-10-27T02:52:00.131691+00:00", + "reference": { + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "php": "8.4.27", + "laravel": "13.29.0", + "composer_lock_sha256": "b1376d21c517d700bc48b196e9dc2b30257caf25774e315ff9d1bf8a2411241a", + "database": "fresh disposable SQLite, all 42 migrations completed; independent temporary application storage", + "production_dependencies": 110, + "required_extensions_loaded": true, + "composer_dependencies_total_with_dev": 153, + "materialized_sqlite_ddl": "sqlite-reference-schema.sql", + "tables": 22, + "explicit_indexes": 34 + }, + "candidate": { + "artifact": "preexisting target/release/twofauth-rs, predates current source changes", + "sha256": "e3d2f4435197bad611e2150c128b0edfcf97ce90d61156a430e948f1461438ba" + }, + "limits": [ + "This is a limited differential result, not replacement certification.", + "Random CSRF output and cookie protocols are not normalized.", + "Only synthetic fixture data was used.", + "Body IDs ignored only for account create/read as specified in cases.stateful.json.", + "State effects checked through API readback, not SQL table comparison.", + "New source changes must be rebuilt and compared again." + ], + "results": { + "default": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": false, + "body": false + } + }, + { + "case": 1, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false + } + }, + { + "case": 2, + "result": "different", + "reference_status": 200, + "candidate_status": 404, + "checks": { + "status": false, + "content_type": true, + "body": false + } + }, + { + "case": 3, + "result": "different", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": false + } + } + ] + }, + "stateful": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": false, + "body": false, + "expected_status": true + } + }, + { + "case": 1, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 9, + "result": "different", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "different", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + } + ] + }, + "extended": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": false, + "body": false, + "expected_status": true + } + }, + { + "case": 1, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "different", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "different", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 12, + "result": "different", + "reference_status": 403, + "candidate_status": 404, + "checks": { + "status": false, + "content_type": true, + "body": false, + "expected_status": false + } + }, + { + "case": 13, + "result": "different", + "reference_status": 403, + "candidate_status": 404, + "checks": { + "status": false, + "content_type": true, + "body": false, + "expected_status": false + } + }, + { + "case": 14, + "result": "different", + "reference_status": 200, + "candidate_status": 404, + "checks": { + "status": false, + "content_type": true, + "body": false, + "expected_status": false + } + }, + { + "case": 15, + "result": "different", + "reference_status": 422, + "candidate_status": 404, + "checks": { + "status": false, + "content_type": true, + "body": false, + "expected_status": false + } + }, + { + "case": 16, + "result": "different", + "reference_status": 422, + "candidate_status": 405, + "checks": { + "status": false, + "content_type": false, + "body": false, + "expected_status": false + } + }, + { + "case": 17, + "result": "different", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 18, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 19, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 20, + "result": "different", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 21, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 22, + "result": "different", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + } + ] + } + }, + "reproduction": "PHPRC= python tools/run_reference.py --php --source ../upstream --candidate-binary target/release/twofauth-rs --output ", + "upstream_suite": { + "command": "PHPRC= PATH=:$PATH php artisan config:clear; php vendor/bin/phpunit", + "tests": 1518, + "assertions": 4573, + "errors": 5, + "failures": 2, + "failure_details": [ + { + "test": "Tests.Feature.Models.TwoFAccountModelTest::test_fill_with_custom_totp_uri_returns_correct_value", + "kind": "failure", + "message": "Tests\\Feature\\Models\\TwoFAccountModelTest::test_fill_with_custom_totp_uri_returns_correct_value" + }, + { + "test": "Tests.Feature.Models.TwoFAccountModelTest::test_fill_with_custom_hotp_uri_returns_correct_value", + "kind": "failure", + "message": "Tests\\Feature\\Models\\TwoFAccountModelTest::test_fill_with_custom_hotp_uri_returns_correct_value" + }, + { + "test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"PNG\"", + "kind": "error", + "message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"PNG\"" + }, + { + "test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"JPEG\"", + "kind": "error", + "message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"JPEG\"" + }, + { + "test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"WEBP\"", + "kind": "error", + "message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"WEBP\"" + }, + { + "test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"BPM\"", + "kind": "error", + "message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"BPM\"" + }, + { + "test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"SVG\"", + "kind": "error", + "message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"SVG\"" + } + ], + "limitations": [ + "All seven remaining failing cases depend on real DNS resolution before mocked HTTP. dns_get_record returned false with a temporary server error for the image hosts.", + "No upstream source was patched to suppress those failures." + ] + }, + "crypto": { + "php_openssl": "6/6 fixtures passed", + "laravel_encrypter": "Laravel 13.29.0 Encrypter::decryptString accepted 6/6 independent Python envelopes" + } +} diff --git a/compatibility/reference-results.laravel.json b/compatibility/reference-results.laravel.json new file mode 100644 index 0000000..4ea0fb1 --- /dev/null +++ b/compatibility/reference-results.laravel.json @@ -0,0 +1,1898 @@ +{ + "candidate_source": "/tmp/twofauth-target/release/twofauth-rs", + "candidate_database_mode": "laravel-copy", + "reference_php": "8.4.27", + "candidate_sha256": "0e03e978721bf4fcfc65e18e4a98f47b26b71a151c792b380d18996ae467813d", + "database": "fresh disposable SQLite; upstream migrations applied", + "fixture_config": { + "THROTTLE_API": 1000, + "note": "bulk fixture sequence; does not establish default throttle equivalence" + }, + "composer_lock_sha256": "b1376d21c517d700bc48b196e9dc2b30257caf25774e315ff9d1bf8a2411241a", + "harness_sha256": "7d8ab01ebfac575777bf65c1738d6e1f4e4317b787903c7be797313568a188e6", + "results": { + "default": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + } + ] + }, + "stateful": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + } + ], + "cases_sha256": "1ed836e1f4cb76d97234065faf415aaba251a070a336977c2b8eaec5e5565e3b" + }, + "extended": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 12, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 13, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 14, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 15, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 16, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 17, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 18, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 19, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 20, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 21, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 22, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + } + ], + "cases_sha256": "3be56ecb6ecae8a05b781ebcfedb227f3be11f9e08ffc8262d3a9bce85a85dc0" + }, + "admin-sharing": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 12, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 13, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 14, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 15, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 16, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 17, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 18, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 19, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 20, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 21, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 22, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 23, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 24, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 25, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 26, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 27, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 28, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 29, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 30, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 31, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 32, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 33, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 34, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 35, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 36, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 37, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 38, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 39, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 40, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 41, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 42, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 43, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 44, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 45, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 46, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 47, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 48, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 49, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 50, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 51, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 52, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 53, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 54, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 55, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 56, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 57, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 58, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 59, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + } + ], + "cases_sha256": "5f39b08890a35639098d14d15f83c572540901a07f88878859f7ee1ebeea4f12" + }, + "extra-0": { + "exit_code": 0, + "cases": [ + { + "case": 0, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 12, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 13, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 14, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 15, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 16, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 17, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 18, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 19, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 20, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 21, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 22, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 23, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 24, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 25, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 26, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 27, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 28, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + } + ], + "cases_sha256": "c084069e46c12b87f78d0a190016e15db3504f1741c816bf97d98d8ff47b7c04" + }, + "extra-1": { + "exit_code": 0, + "cases": [ + { + "case": 0, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 500, + "candidate_status": 500, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + } + ], + "cases_sha256": "d8ce2b996783a392d7b9aaf6f974118f43c1bd020b7b9ee4315a86a0a0728ff2" + } + }, + "semantic_results": { + "health_render_timing": { + "content_types_match": true, + "timing_field_present_once": true, + "equal_except_render_ms": true, + "statuses_ok": true + }, + "csrf_token_flow": { + "text_token_shapes_valid": true, + "subsequent_login_succeeded": true + }, + "qr_payload": { + "result": "decoded", + "decoded_uri_equal": true, + "matches_fixture": true + } + }, + "semantic_pass": true, + "extra_cases_order": "after core suites and supplemental semantic checks", + "passport_interop": { + "exit_code": 0, + "checks": { + "php_bearer": 200, + "php_cookie": 200, + "cookie_missing_csrf": 401, + "tampered_bearer": 401, + "php_browser_bootstrap": 200, + "legacy_cookie_cleared": true, + "upgraded_browser_api": 200, + "upgraded_browser_logout": 200, + "browser_api_after_logout": 401, + "php_validated_rust_bearer": true, + "revoked_php_bearer": 401 + } + } +} diff --git a/compatibility/reference-results.native.json b/compatibility/reference-results.native.json new file mode 100644 index 0000000..20960be --- /dev/null +++ b/compatibility/reference-results.native.json @@ -0,0 +1,1898 @@ +{ + "candidate_source": "/tmp/twofauth-target/release/twofauth-rs", + "candidate_database_mode": "native", + "reference_php": "8.4.27", + "candidate_sha256": "0e03e978721bf4fcfc65e18e4a98f47b26b71a151c792b380d18996ae467813d", + "database": "fresh disposable SQLite; upstream migrations applied", + "fixture_config": { + "THROTTLE_API": 1000, + "note": "bulk fixture sequence; does not establish default throttle equivalence" + }, + "composer_lock_sha256": "b1376d21c517d700bc48b196e9dc2b30257caf25774e315ff9d1bf8a2411241a", + "harness_sha256": "7d8ab01ebfac575777bf65c1738d6e1f4e4317b787903c7be797313568a188e6", + "results": { + "default": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + } + ] + }, + "stateful": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + } + ], + "cases_sha256": "1ed836e1f4cb76d97234065faf415aaba251a070a336977c2b8eaec5e5565e3b" + }, + "extended": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 12, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 13, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 14, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "expected_status": true + } + }, + { + "case": 15, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 16, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 17, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 18, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 19, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 20, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 21, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 22, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + } + ], + "cases_sha256": "3be56ecb6ecae8a05b781ebcfedb227f3be11f9e08ffc8262d3a9bce85a85dc0" + }, + "admin-sharing": { + "exit_code": 1, + "cases": [ + { + "case": 0, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 12, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 13, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 14, + "result": "equal", + "reference_status": 404, + "candidate_status": 404, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 15, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 16, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 17, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 18, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 19, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 20, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 21, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 22, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 23, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 24, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 25, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 26, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 27, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 28, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 29, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 30, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 31, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 32, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 33, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 34, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 35, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 36, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 37, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 38, + "result": "equal", + "reference_status": 422, + "candidate_status": 422, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 39, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 40, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 41, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 42, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 43, + "result": "equal", + "reference_status": 403, + "candidate_status": 403, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 44, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 45, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 46, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 47, + "result": "equal", + "reference_status": 201, + "candidate_status": 201, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 48, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 49, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 50, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 51, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true + } + }, + { + "case": 52, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 53, + "result": "different", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": false, + "text_token_shape": true, + "expected_status": true + } + }, + { + "case": 54, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 55, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 56, + "result": "equal", + "reference_status": 204, + "candidate_status": 204, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 57, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 58, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + }, + { + "case": 59, + "result": "equal", + "reference_status": 200, + "candidate_status": 200, + "checks": { + "status": true, + "content_type": true, + "body": true, + "expected_status": true + } + } + ], + "cases_sha256": "5f39b08890a35639098d14d15f83c572540901a07f88878859f7ee1ebeea4f12" + }, + "extra-0": { + "exit_code": 0, + "cases": [ + { + "case": 0, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 9, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 10, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 11, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 12, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 13, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 14, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 15, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 16, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 17, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 18, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 19, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 20, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 21, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 22, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 23, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 24, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 25, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 26, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 27, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 28, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + } + ], + "cases_sha256": "c084069e46c12b87f78d0a190016e15db3504f1741c816bf97d98d8ff47b7c04" + }, + "extra-1": { + "exit_code": 0, + "cases": [ + { + "case": 0, + "result": "equal", + "reference_status": 400, + "candidate_status": 400, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 1, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 2, + "result": "equal", + "reference_status": 500, + "candidate_status": 500, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 3, + "result": "equal", + "reference_status": 401, + "candidate_status": 401, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 4, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 5, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 6, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 7, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + }, + { + "case": 8, + "result": "equal", + "reference_status": 419, + "candidate_status": 419, + "checks": { + "status": true, + "content_type": true, + "body": true, + "json_assertions": true, + "expected_status": true, + "expected_headers": true, + "selected_headers": true + } + } + ], + "cases_sha256": "d8ce2b996783a392d7b9aaf6f974118f43c1bd020b7b9ee4315a86a0a0728ff2" + } + }, + "semantic_results": { + "health_render_timing": { + "content_types_match": true, + "timing_field_present_once": true, + "equal_except_render_ms": true, + "statuses_ok": true + }, + "csrf_token_flow": { + "text_token_shapes_valid": true, + "subsequent_login_succeeded": true + }, + "qr_payload": { + "result": "decoded", + "decoded_uri_equal": true, + "matches_fixture": true + } + }, + "semantic_pass": true, + "extra_cases_order": "after core suites and supplemental semantic checks", + "passport_interop": { + "exit_code": 0, + "checks": { + "php_bearer": 200, + "php_cookie": 200, + "cookie_missing_csrf": 401, + "tampered_bearer": 401, + "php_browser_bootstrap": 200, + "legacy_cookie_cleared": true, + "upgraded_browser_api": 200, + "upgraded_browser_logout": 200, + "browser_api_after_logout": 401, + "php_validated_rust_bearer": true, + "revoked_php_bearer": 401 + } + } +} diff --git a/compatibility/requirements.json b/compatibility/requirements.json new file mode 100644 index 0000000..b0dab01 --- /dev/null +++ b/compatibility/requirements.json @@ -0,0 +1,100 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "coverage_kind": "source-derived requirements plus finite executed fixtures; exhaustive compatibility is not certified", + "frontend": { + "public_build_present": true, + "asset_manifest": "public/build/manifest.json", + "source_rebuild_dependencies": [ + "../2FAuth-Components/packages/formcontrols", + "../2FAuth-Components/packages/stores", + "../2FAuth-Components/packages/styles", + "../2FAuth-Components/packages/ui" + ], + "bootstrap_globals": [ + "appSettings", + "appConfig", + "urls", + "defaultPreferences", + "lockedPreferences", + "appVersion", + "isDemoApp", + "isTestingApp", + "appLocales" + ], + "http": { + "api_prefix": "/api/v1", + "web_prefix": "/", + "credentials": true, + "headers": [ + "X-Requested-With: XMLHttpRequest", + "Content-Type: application/json" + ], + "special_statuses": [ + 419, + 418, + 407, + 401, + 422, + 404 + ] + }, + "sources": [ + "package.json", + "resources/views/landing.blade.php", + "app/Http/Controllers/SinglePageController.php", + "resources/js/services/httpClientFactory.js" + ] + }, + "authentication": { + "guards": { + "web-guard": "session", + "api-guard": "passport", + "reverse-proxy-guard": "reverse-proxy" + }, + "first_party_cookie": "laravel_token", + "csrf_cookie": "XSRF-TOKEN", + "csrf_exclusions": [], + "password_reset_table": "password_resets", + "webauthn_recovery_table": "webauthn_recoveries", + "sources": [ + "config/auth.php", + "app/Http/Middleware/CustomCreateFreshApiToken.php", + "app/Http/Middleware/PreventRequestForgery.php", + "app/Providers/AuthServiceProvider.php" + ] + }, + "encryption": { + "cipher": "AES-256-CBC", + "key_environment": [ + "APP_KEY", + "APP_PREVIOUS_KEYS" + ], + "conditional_setting": "useEncryption", + "api": "Laravel Crypt::encryptString/decryptString", + "sources": [ + "config/app.php", + "app/Models/Traits/CanEncryptField.php", + "app/Models/TwoFAccount.php" + ] + }, + "database": { + "drivers": [ + "sqlite", + "mysql", + "pgsql", + "sqlsrv" + ], + "evidence": "database.json", + "materialized_schema_verified": true, + "verified_schema_scope": "pinned migrations on SQLite only" + }, + "differential_coverage": { + "real_upstream_requests_executed": 280, + "default_cases": 7, + "application_method_path_entries": 91, + "comparisons_per_database_mode": 140, + "exact_per_database_mode": 129, + "expected_raw_body_differences_per_mode": 11, + "harness_regression_tests_passed": 6 + } +} diff --git a/compatibility/routes.json b/compatibility/routes.json new file mode 100644 index 0000000..1751884 --- /dev/null +++ b/compatibility/routes.json @@ -0,0 +1,1218 @@ +{ + "upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91", + "kind": "static application declarations; not runtime package routes", + "notes": [ + "GET routes implicitly support HEAD. Ordering is source ordering.", + "Middleware declarations require alias/group expansion, deduplication and Laravel priority sorting.", + "Package-discovered routes and OPTIONS/CORS behavior require runtime route:list.", + "settingName has global constraint [a-zA-Z]+ from RouteServiceProvider." + ], + "middleware_source": "app/Http/Kernel.php", + "middleware_global_php": "// \\App\\Http\\Middleware\\TrustHosts::class,\n TrustProxies::class,\n HandleCors::class,\n PreventRequestsDuringMaintenance::class,\n ValidatePostSize::class,\n TrimStrings::class,\n ConvertEmptyStringsToNull::class,\n ForceJsonResponse::class,", + "middleware_groups_php": "'web' => [\n EncryptCookies::class,\n AddQueuedCookiesToResponse::class,\n StartSession::class,\n // \\Illuminate\\Session\\Middleware\\AuthenticateSession::class,\n PreventRequestForgery::class,\n SubstituteBindings::class,\n SetLanguage::class,\n CustomCreateFreshApiToken::class,\n ],\n\n 'behind-auth' => [\n EncryptCookies::class,\n AddQueuedCookiesToResponse::class,\n // \\Illuminate\\Session\\Middleware\\StartSession::class,\n PreventRequestForgery::class,\n SubstituteBindings::class,\n Authenticate::class,\n KickOutInactiveUser::class,\n LogUserLastSeen::class,\n SetLanguage::class,\n CustomCreateFreshApiToken::class,\n ],\n\n 'api.v1' => [\n ThrottleRequests::class . ':api',\n SubstituteBindings::class,\n KickOutInactiveUser::class,\n LogUserLastSeen::class,\n SetLanguage::class,\n ],", + "middleware_aliases_php": "'auth' => Authenticate::class,\n 'admin' => AdminOnly::class,\n 'rejectIfAuthenticated' => RejectIfAuthenticated::class,\n 'throttle' => ThrottleRequests::class,\n 'rejectIfDemoMode' => RejectIfDemoMode::class,\n 'rejectIfShareDisabled' => RejectIfShareDisabled::class,\n 'rejectIfAllUsersSharingScopeDisabled' => RejectIfAllUsersSharingScopeDisabled::class,\n 'rejectIfReverseProxy' => RejectIfReverseProxy::class,\n 'rejectIfSsoOnlyAndNotForAdmin' => RejectIfSsoOnlyAndNotForAdmin::class,\n 'cache.headers' => SetCacheHeaders::class,\n 'kickOutInactiveUser' => KickOutInactiveUser::class,\n 'forceLogout' => ForceLogout::class,\n 'setLanguage' => SetLanguage::class,\n // 'password.confirm' => \\Illuminate\\Auth\\Middleware\\RequirePassword::class,\n // 'signed' => \\App\\Http\\Middleware\\ValidateSignature::class,", + "middleware_priority_php": "StartSession::class,\n ShareErrorsFromSession::class,\n Authenticate::class,\n SetLanguage::class,\n AuthenticateSession::class,\n SubstituteBindings::class,\n Authorize::class,", + "routes": [ + { + "method": "POST", + "path": "/user", + "handler": "RegisterController@register", + "name": "user.register", + "middleware_declared": [ + "web", + "rejectIfDemoMode", + "rejectIfSsoOnlyAndNotForAdmin", + "forceLogout", + "setLanguage" + ], + "constraints": {}, + "source": "routes/web.php:37" + }, + { + "method": "POST", + "path": "/user/password/lost", + "handler": "ForgotPasswordController@sendResetLinkEmail", + "name": "user.password.lost", + "middleware_declared": [ + "web", + "rejectIfDemoMode", + "rejectIfSsoOnlyAndNotForAdmin", + "forceLogout", + "setLanguage" + ], + "constraints": {}, + "source": "routes/web.php:38" + }, + { + "method": "POST", + "path": "/user/password/reset", + "handler": "ResetPasswordController@reset", + "name": "password.reset", + "middleware_declared": [ + "web", + "rejectIfDemoMode", + "rejectIfSsoOnlyAndNotForAdmin", + "forceLogout", + "setLanguage" + ], + "constraints": {}, + "source": "routes/web.php:39" + }, + { + "method": "POST", + "path": "/webauthn/login/options", + "handler": "WebAuthnLoginController@options", + "name": "webauthn.login.options", + "middleware_declared": [ + "web", + "rejectIfDemoMode", + "rejectIfSsoOnlyAndNotForAdmin", + "forceLogout", + "setLanguage" + ], + "constraints": {}, + "source": "routes/web.php:40" + }, + { + "method": "POST", + "path": "/webauthn/lost", + "handler": "WebAuthnDeviceLostController@sendRecoveryEmail", + "name": "webauthn.lost", + "middleware_declared": [ + "web", + "rejectIfDemoMode", + "rejectIfSsoOnlyAndNotForAdmin", + "forceLogout", + "setLanguage" + ], + "constraints": {}, + "source": "routes/web.php:41" + }, + { + "method": "POST", + "path": "/webauthn/recover", + "handler": "WebAuthnRecoveryController@recover", + "name": "webauthn.recover", + "middleware_declared": [ + "web", + "rejectIfDemoMode", + "throttle:10,1", + "rejectIfSsoOnlyAndNotForAdmin", + "forceLogout" + ], + "constraints": {}, + "source": "routes/web.php:48" + }, + { + "method": "POST", + "path": "/user/login", + "handler": "LoginController@login", + "name": "user.login", + "middleware_declared": [ + "web", + "forceLogout", + "throttle:10,1", + "rejectIfSsoOnlyAndNotForAdmin" + ], + "constraints": {}, + "source": "routes/web.php:56" + }, + { + "method": "POST", + "path": "/webauthn/login", + "handler": "WebAuthnLoginController@login", + "name": "webauthn.login", + "middleware_declared": [ + "web", + "forceLogout", + "throttle:10,1", + "rejectIfSsoOnlyAndNotForAdmin" + ], + "constraints": {}, + "source": "routes/web.php:57" + }, + { + "method": "GET", + "path": "/socialite/redirect/{driver}", + "handler": "SocialiteController@redirect", + "name": "socialite.redirect", + "middleware_declared": [ + "web", + "forceLogout", + "throttle:10,1" + ], + "constraints": {}, + "source": "routes/web.php:59", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/socialite/callback/{driver}", + "handler": "SocialiteController@callback", + "name": "socialite.callback", + "middleware_declared": [ + "web", + "forceLogout", + "throttle:10,1" + ], + "constraints": {}, + "source": "routes/web.php:60", + "implicit_HEAD": true + }, + { + "method": "PUT", + "path": "/user", + "handler": "UserController@update", + "name": "user.update", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:68" + }, + { + "method": "PATCH", + "path": "/user/password", + "handler": "PasswordController@update", + "name": "user.password.update", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy", + "rejectIfDemoMode" + ], + "constraints": {}, + "source": "routes/web.php:69" + }, + { + "method": "GET", + "path": "/user/logout", + "handler": "LoginController@logout", + "name": "user.logout", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:70", + "implicit_HEAD": true + }, + { + "method": "DELETE", + "path": "/user", + "handler": "UserController@delete", + "name": "user.delete", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy", + "rejectIfDemoMode" + ], + "constraints": {}, + "source": "routes/web.php:71" + }, + { + "method": "GET", + "path": "/oauth/personal-access-tokens", + "handler": "PersonalAccessTokenController@forUser", + "name": "passport.personal.tokens.index", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:74", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/oauth/personal-access-tokens", + "handler": "PersonalAccessTokenController@store", + "name": "passport.personal.tokens.store", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:75" + }, + { + "method": "DELETE", + "path": "/oauth/personal-access-tokens/{token_id}", + "handler": "PersonalAccessTokenController@destroy", + "name": "passport.personal.tokens.destroy", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:76" + }, + { + "method": "POST", + "path": "/webauthn/register/options", + "handler": "WebAuthnRegisterController@options", + "name": "webauthn.register.options", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:78" + }, + { + "method": "POST", + "path": "/webauthn/register", + "handler": "WebAuthnRegisterController@register", + "name": "webauthn.register", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:79" + }, + { + "method": "GET", + "path": "/webauthn/credentials", + "handler": "WebAuthnManageController@index", + "name": "webauthn.credentials.index", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:80", + "implicit_HEAD": true + }, + { + "method": "PATCH", + "path": "/webauthn/credentials/{credential}/name", + "handler": "WebAuthnManageController@rename", + "name": "webauthn.credentials.rename", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:81" + }, + { + "method": "DELETE", + "path": "/webauthn/credentials/{credential}", + "handler": "WebAuthnManageController@delete", + "name": "webauthn.credentials.delete", + "middleware_declared": [ + "web", + "behind-auth", + "rejectIfReverseProxy" + ], + "constraints": {}, + "source": "routes/web.php:82" + }, + { + "method": "GET", + "path": "/system/infos", + "handler": "SystemController@infos", + "name": "system.infos", + "middleware_declared": [ + "web", + "behind-auth", + "admin" + ], + "constraints": {}, + "source": "routes/web.php:89", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/system/test-email", + "handler": "SystemController@testEmail", + "name": "system.testEmail", + "middleware_declared": [ + "web", + "behind-auth", + "admin" + ], + "constraints": {}, + "source": "routes/web.php:90" + }, + { + "method": "GET", + "path": "/system/latestRelease", + "handler": "SystemController@latestRelease", + "name": "system.latestRelease", + "middleware_declared": [ + "web", + "behind-auth", + "admin" + ], + "constraints": {}, + "source": "routes/web.php:91", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/system/optimize", + "handler": "SystemController@optimize", + "name": "system.optimize", + "middleware_declared": [ + "web", + "behind-auth", + "admin" + ], + "constraints": {}, + "source": "routes/web.php:92", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/system/clear-cache", + "handler": "SystemController@clear", + "name": "system.clear", + "middleware_declared": [ + "web", + "behind-auth", + "admin" + ], + "constraints": {}, + "source": "routes/web.php:93", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/refresh-csrf", + "handler": "closure", + "name": null, + "middleware_declared": [ + "web" + ], + "constraints": {}, + "source": "routes/web.php:96", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/manifest.json", + "handler": "closure", + "name": null, + "middleware_declared": [ + "web" + ], + "constraints": {}, + "source": "routes/web.php:100", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/up", + "handler": "closure", + "name": null, + "middleware_declared": [ + "web" + ], + "constraints": {}, + "source": "routes/web.php:135", + "excluded_middleware": [ + "StartSession", + "PreventRequestForgery", + "SubstituteBindings", + "SetLanguage", + "CustomCreateFreshApiToken" + ], + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/{any}", + "handler": "SinglePageController@index", + "name": "landing", + "middleware_declared": [ + "web" + ], + "constraints": { + "any": ".*" + }, + "source": "routes/web.php:157", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/user/name", + "handler": "closure", + "name": null, + "middleware_declared": [ + "api.v1" + ], + "constraints": {}, + "source": "routes/api/v1.php:24", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/user", + "handler": "UserController@show", + "name": "user.show", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:32", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/user/preferences/{preferenceName}", + "handler": "UserController@showPreference", + "name": "user.preferences.show", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:34", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/user/preferences", + "handler": "UserController@allPreferences", + "name": "user.preferences.all", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:35", + "implicit_HEAD": true + }, + { + "method": "PUT", + "path": "/api/v1/user/preferences/{preferenceName}", + "handler": "UserController@setPreference", + "name": "user.preferences.set", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:36" + }, + { + "method": "DELETE", + "path": "/api/v1/twofaccounts", + "handler": "TwoFAccountController@batchDestroy", + "name": "twofaccounts.batchDestroy", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:38" + }, + { + "method": "PATCH", + "path": "/api/v1/twofaccounts/withdraw", + "handler": "TwoFAccountController@withdraw", + "name": "twofaccounts.withdraw", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:39" + }, + { + "method": "POST", + "path": "/api/v1/twofaccounts/reorder", + "handler": "TwoFAccountController@reorder", + "name": "twofaccounts.reorder", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:40" + }, + { + "method": "POST", + "path": "/api/v1/twofaccounts/migration", + "handler": "TwoFAccountController@migrate", + "name": "twofaccounts.migrate", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:41" + }, + { + "method": "POST", + "path": "/api/v1/twofaccounts/preview", + "handler": "TwoFAccountController@preview", + "name": "twofaccounts.preview", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:42" + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/export", + "handler": "TwoFAccountController@export", + "name": "twofaccounts.export", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:43", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/{twofaccount}/qrcode", + "handler": "QrCodeController@show", + "name": "twofaccounts.show.qrcode", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:44", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/count", + "handler": "TwoFAccountController@count", + "name": "twofaccounts.count", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:45", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/{twofaccount}/otp-logs", + "handler": "TwoFAccountController@otpLogs", + "name": "twofaccounts.show.otpLogs", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:46", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/{id}/otp", + "handler": "TwoFAccountController@otp", + "name": "twofaccounts.show.otp", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": { + "id": "[0-9]+" + }, + "source": "routes/api/v1.php:47", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/twofaccounts/otp", + "handler": "TwoFAccountController@otp", + "name": "twofaccounts.otp", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:48" + }, + { + "method": "PATCH", + "path": "/api/v1/twofaccounts/{twofaccount}/owner", + "handler": "TwoFAccountController@transferOwnership", + "name": "twofaccounts.transferOwnership", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "rejectIfShareDisabled", + "throttle:6,1" + ], + "constraints": {}, + "source": "routes/api/v1.php:50" + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/{twofaccount}/shares", + "handler": "TwoFAccountShareController@index", + "name": "twofaccounts.shares.index", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "rejectIfShareDisabled" + ], + "constraints": {}, + "source": "routes/api/v1.php:51", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/twofaccounts/{twofaccount}/shares", + "handler": "TwoFAccountShareController@store", + "name": "twofaccounts.shares.store", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "rejectIfShareDisabled" + ], + "constraints": {}, + "source": "routes/api/v1.php:52" + }, + { + "method": "DELETE", + "path": "/api/v1/twofaccounts/{twofaccount}/shares", + "handler": "TwoFAccountShareController@destroyAll", + "name": "twofaccounts.shares.destroyAll", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "rejectIfShareDisabled" + ], + "constraints": {}, + "source": "routes/api/v1.php:53" + }, + { + "method": "POST", + "path": "/api/v1/twofaccounts/{twofaccount}/shares/all", + "handler": "TwoFAccountShareController@shareAll", + "name": "twofaccounts.shares.shareAll", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "rejectIfShareDisabled", + "rejectIfAllUsersSharingScopeDisabled" + ], + "constraints": {}, + "source": "routes/api/v1.php:54" + }, + { + "method": "DELETE", + "path": "/api/v1/twofaccounts/{twofaccount}/shares/{user}", + "handler": "TwoFAccountShareController@destroy", + "name": "twofaccounts.shares.destroy", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "rejectIfShareDisabled" + ], + "constraints": {}, + "source": "routes/api/v1.php:57" + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/{twofaccount}/recipients", + "handler": "TwoFAccountShareController@recipients", + "name": "twofaccounts.shares.recipients", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "rejectIfShareDisabled" + ], + "constraints": {}, + "source": "routes/api/v1.php:58", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts", + "handler": "TwoFAccountController@index", + "name": "twofaccounts.index", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:60", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/twofaccounts", + "handler": "TwoFAccountController@store", + "name": "twofaccounts.store", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:60" + }, + { + "method": "GET", + "path": "/api/v1/twofaccounts/{twofaccount}", + "handler": "TwoFAccountController@show", + "name": "twofaccounts.show", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:60", + "implicit_HEAD": true + }, + { + "method": "PUT", + "path": "/api/v1/twofaccounts/{twofaccount}", + "handler": "TwoFAccountController@update", + "name": "twofaccounts.update", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:60" + }, + { + "method": "PATCH", + "path": "/api/v1/twofaccounts/{twofaccount}", + "handler": "TwoFAccountController@update", + "name": "twofaccounts.update", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:60" + }, + { + "method": "DELETE", + "path": "/api/v1/twofaccounts/{twofaccount}", + "handler": "TwoFAccountController@destroy", + "name": "twofaccounts.destroy", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:60" + }, + { + "method": "GET", + "path": "/api/v1/groups/{group}/twofaccounts", + "handler": "GroupController@accounts", + "name": "groups.show.twofaccounts", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:62", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/groups/{group}/assign", + "handler": "GroupController@assignAccounts", + "name": "groups.assign.twofaccounts", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:63" + }, + { + "method": "POST", + "path": "/api/v1/groups/reorder", + "handler": "GroupController@reorder", + "name": "groups.reorder", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:64" + }, + { + "method": "GET", + "path": "/api/v1/groups", + "handler": "GroupController@index", + "name": "groups.index", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:65", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/groups", + "handler": "GroupController@store", + "name": "groups.store", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:65" + }, + { + "method": "GET", + "path": "/api/v1/groups/{group}", + "handler": "GroupController@show", + "name": "groups.show", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:65", + "implicit_HEAD": true + }, + { + "method": "PUT", + "path": "/api/v1/groups/{group}", + "handler": "GroupController@update", + "name": "groups.update", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:65" + }, + { + "method": "PATCH", + "path": "/api/v1/groups/{group}", + "handler": "GroupController@update", + "name": "groups.update", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:65" + }, + { + "method": "DELETE", + "path": "/api/v1/groups/{group}", + "handler": "GroupController@destroy", + "name": "groups.destroy", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:65" + }, + { + "method": "POST", + "path": "/api/v1/qrcode/decode", + "handler": "QrCodeController@decode", + "name": "qrcode.decode", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:67" + }, + { + "method": "GET", + "path": "/api/v1/icons/packs", + "handler": "IconController@iconPacks", + "name": "icons.iconPacks", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:69", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/icons/default", + "handler": "IconController@fetch", + "name": "icons.fetch", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:70" + }, + { + "method": "POST", + "path": "/api/v1/icons", + "handler": "IconController@upload", + "name": "icons.upload", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:71" + }, + { + "method": "DELETE", + "path": "/api/v1/icons/{icon}", + "handler": "IconController@delete", + "name": "icons.delete", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:72" + }, + { + "method": "GET", + "path": "/api/v1/features", + "handler": "FeatureFlagController@index", + "name": "features.index", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:75", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/features/{feature}", + "handler": "FeatureFlagController@show", + "name": "features.show", + "middleware_declared": [ + "api.v1", + "auth:api-guard" + ], + "constraints": {}, + "source": "routes/api/v1.php:76", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/users/{user}/authentications", + "handler": "UserManagerController@authentications", + "name": "users.authentications", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:83", + "implicit_HEAD": true + }, + { + "method": "PATCH", + "path": "/api/v1/users/{user}/password/reset", + "handler": "UserManagerController@resetPassword", + "name": "users.password.reset", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:84" + }, + { + "method": "PATCH", + "path": "/api/v1/users/{user}/promote", + "handler": "UserManagerController@promote", + "name": "users.promote", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:85" + }, + { + "method": "DELETE", + "path": "/api/v1/users/{user}/pats", + "handler": "UserManagerController@revokePATs", + "name": "users.revoke.pats", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:86" + }, + { + "method": "DELETE", + "path": "/api/v1/users/{user}/credentials", + "handler": "UserManagerController@revokeWebauthnCredentials", + "name": "users.revoke.credentials", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:87" + }, + { + "method": "GET", + "path": "/api/v1/users", + "handler": "UserManagerController@index", + "name": "users.index", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:88", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/users", + "handler": "UserManagerController@store", + "name": "users.store", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:88" + }, + { + "method": "GET", + "path": "/api/v1/users/{user}", + "handler": "UserManagerController@show", + "name": "users.show", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:88", + "implicit_HEAD": true + }, + { + "method": "DELETE", + "path": "/api/v1/users/{user}", + "handler": "UserManagerController@destroy", + "name": "users.destroy", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:88" + }, + { + "method": "GET", + "path": "/api/v1/settings/{settingName}", + "handler": "SettingController@show", + "name": "settings.show", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:90", + "implicit_HEAD": true + }, + { + "method": "GET", + "path": "/api/v1/settings", + "handler": "SettingController@index", + "name": "settings.index", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:91", + "implicit_HEAD": true + }, + { + "method": "POST", + "path": "/api/v1/settings", + "handler": "SettingController@store", + "name": "settings.store", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:92" + }, + { + "method": "PUT", + "path": "/api/v1/settings/{settingName}", + "handler": "SettingController@update", + "name": "settings.update", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:93" + }, + { + "method": "DELETE", + "path": "/api/v1/settings/{settingName}", + "handler": "SettingController@destroy", + "name": "settings.destroy", + "middleware_declared": [ + "api.v1", + "auth:api-guard", + "admin" + ], + "constraints": {}, + "source": "routes/api/v1.php:94" + }, + { + "method": "GET", + "path": "/api/v1/{any}", + "handler": "closure", + "name": null, + "middleware_declared": [ + "api.v1" + ], + "constraints": {}, + "source": "routes/api/v1.php:97", + "implicit_HEAD": true + } + ] +} diff --git a/compatibility/source-sha256.json b/compatibility/source-sha256.json new file mode 100644 index 0000000..db6b8eb --- /dev/null +++ b/compatibility/source-sha256.json @@ -0,0 +1,61 @@ +{ + "Cargo.lock": "eb74066a33403cef46a1df8ca01f3ddd31c7e76176afae9409f33f11fcc4fea3", + "Cargo.toml": "a3ae8d9be58d210b72c86493777c47add1963c5e07a132ddf9caf051a78fd893", + "compatibility/cases.admin-sharing.json": "5f39b08890a35639098d14d15f83c572540901a07f88878859f7ee1ebeea4f12", + "compatibility/cases.device.json": "d8ce2b996783a392d7b9aaf6f974118f43c1bd020b7b9ee4315a86a0a0728ff2", + "compatibility/cases.example.json": "4b4b3d09016d74110933b8b0cc315804887474942970b88d0828ede2c07c5d6c", + "compatibility/cases.extended.json": "3be56ecb6ecae8a05b781ebcfedb227f3be11f9e08ffc8262d3a9bce85a85dc0", + "compatibility/cases.oauth.json": "c084069e46c12b87f78d0a190016e15db3504f1741c816bf97d98d8ff47b7c04", + "compatibility/cases.stateful.json": "1ed836e1f4cb76d97234065faf415aaba251a070a336977c2b8eaec5e5565e3b", + "src/accounts.rs": "79960cd11029a11cc53e154bc488bc96496a9c8c1e1b85ef8cd1ebf1b1a1019d", + "src/api_limits.rs": "7c3decee88724155448ad54993701188abcc9747139d0e955f0ac399fa9700a0", + "src/auth.rs": "890b3b9adbe8afd52d21694a499bb85cacddf98bc192549be0b4218c967236d3", + "src/auth_audit.rs": "70dfde6ce82641eae24f044e4755af294051459521632a93e50d5d6ad9410f56", + "src/cors.rs": "0058858569b419e3a21c8a89d4aa58f2a0e3f4af499a5bcd42b6e09139508b0a", + "src/crypto.rs": "39bf321d76a4abb9c5bffe5b77993ef393a00628262a8a0a3fa1c88e7c7a0655", + "src/db.rs": "a049dc8069d8d86cb0c9283e1b2897f5c326a35ed6aef138eadcada893aac825", + "src/frontend.rs": "056a75fcfe6a62527535436a06cecdc7a0be4f96be8a56d69135e350dd655f90", + "src/groups.rs": "3cdb3cd1d9077e87099da7fdc291f20cdb15beebb92dcd9aaa3b53c772c2bfc9", + "src/health.html": "ada7ca3391f78faee6e64d23feb69b88cf9a93da9629805c15b96b4a7131869e", + "src/icons.rs": "e36e21a6d08629ab70e23803cb191cc2ff7350a9a11350e312984f35cfe5dcbc", + "src/imports.rs": "245cd921e3cd1c3cd9d99e809b3c677795de0776c67e2225e7036e56ca43cf28", + "src/laravel_sessions.rs": "9d66f36762da5c7107466730add09800346bdad1fc2a11c2580037c9faf10537", + "src/lib.rs": "ad07ecd9fc3fb34fcf8fb0a314d75a3b6a6cca000d9bb9d7f5f616b1d8716831", + "src/mail.rs": "4d9a0fecb0ad0653237a19e302f08055c5783fc2195ab1ba2aa7a911d42c9633", + "src/mail_messages.json": "2950864b85dce65149b3f6b6a237b8d227f4847d2b66e741710b220b1855ac85", + "src/main.rs": "4a90c73375964e9db6e4510ea0ccd2d52c26af200749266ae07282401c4bcdc8", + "src/oauth_device.rs": "e4dd21a3422e083934b68edd5a6b3eb950c0fe3463ce0ebc617851928b7ccd36", + "src/oauth_management.rs": "176cfaf6fc8895e52f8310239c380961508646f0e539be39edca8dab65b421cc", + "src/oauth_server.rs": "9ab85322d905bb11f33f6098f71d6d930fe9e16bc489eced7293b768e0f9c868", + "src/otp.rs": "659e1f61993824bc8c58dca064af5aca0022a1c93ab809b6aca819b54e010bbe", + "src/passport.rs": "fcc2d3a76610c0337d8319bdf2bf115e3e5c1fd027cd19e11f45f1e136c08f8f", + "src/preference_env.json": "acd88981c0bf1464cba7b2e7a88dc34b95b4e32c53845494bf47a48911847fca", + "src/preferences.json": "5582dfc4b9507752c58a75163913d0908415b7843bcbd3e92aa47929a20a84c2", + "src/profile.rs": "98055abf266e4f063c2821fb64aef7f0f65d823cb2799c2479c80087de257c8a", + "src/proxy_auth.rs": "87f0ba8f13e22d41faaa8098d2ebca2e2ab892673d446859274077138a33a0e2", + "src/schema_validation.rs": "8b76dd92d9788bae73b1ec2b8bfdc7a162412c0feab45433302e6de04653c2a7", + "src/settings.json": "733e680c3eb3efbddba11283b2d893fdaaab6c317bc133d285ab65a1ee8d0363", + "src/settings.rs": "42df151a0a0fca7df70be833170a95dd2d00516de483045c92e68cc30e8e510c", + "src/sharing.rs": "8c7436bc3ef7cdb6bdd41d5f21a08bfc0241be3c669ce65df2a235a4e1c1e377", + "src/sso.rs": "54bf97081d43141aecc56cf34f6565506e0ade54c4b4001ff34eec5ea4256ef2", + "src/subdirectory.rs": "eacd89b631a9c1265c8a5199229768cb10dfdf0d2cb309c400311eb6d9f743d1", + "src/system.rs": "e3afe95b83377153f139199e895f18add47517f3b2de254b38476ccd8c2726fb", + "src/users.rs": "d52f54a9e27093db162b50f4863cb48b0a7afa8dd53793d827b0abd545be99ae", + "src/webauthn.rs": "70b2520ff5fa043928a501915b47721bf75bc54bdbd69a8d326e56333aa60246", + "tests/crypto_interop.py": "b2287d8574d10d00693d0912530c1d4c70505dfaddab2aaf387fe0ed195bd5f2", + "tests/device_interop.py": "07d14355ba866b901b89e2792b5569212c3fd8b88c78d3206f1f2423df5059d2", + "tests/differential_harness.py": "3694acaf253935691e715bc38d8fd9bad02219b3ba17624427a38fb3534b6cdf", + "tests/fixtures/generate_laravel_sessions.php": "d82befcb2e6a49add0d4d1adbe826cb22153d5376979aceb7726de5c0a49941f", + "tests/fixtures/laravel_cbc.json": "d5a70db56eb7b3d3503bb51378e6d4bf48cc3f957fc562a2e38e6564292785a8", + "tests/fixtures/laravel_sessions.json": "993edffd9927a0e86854f5f3461890f20e6afeaee1a06a0271df9d6e68c85a1c", + "tests/fixtures/webauthn-php-encrypted.txt": "3d2de57aa15c909f03fb07b84dfa96e4875f8da9ccb323dab09f21e7a9a58d57", + "tests/fixtures/webauthn-private.pem": "a9f0231cb05b09c0d093468c2dc9c45782b776c4904302eefb5b925f71e4999b", + "tests/http_smoke.py": "ea6f98db907fbd865f91aa508a2ab5b14de3dc8d89f050c8b309e7a1632cbb24", + "tests/laravel_session_http.py": "df747bc0f2cb3777e57c525234279c6417b60d8c836c0becbeb2419705e5df6b", + "tests/oauth_interop.py": "07a8c994fb3c4e283bb35cbdead50d4165f9eb1c592063b83670b9ab84fd5a41", + "tools/differential_http.py": "7d8ab01ebfac575777bf65c1738d6e1f4e4317b787903c7be797313568a188e6", + "tools/inventory.py": "c5fecb07767032fa0bc6fdc427f11da6920c2f2c0e377d7b653a332293f2eaeb", + "tools/passport_interop.py": "3e2ccd732916ca0be0153011d233450364d939b28a5fcedb4040c797889ca7ff", + "tools/run_reference.py": "9441072d4b8ba56d55a709443d270ab19f789fb2a3a5200dcbdc7d6c8b924dc6", + "tools/semantic_http.py": "8e7e349d78391786a218a6b577991f6eb8aae5ef24e49119ca1955b6f39162cd" +} diff --git a/compatibility/sqlite-reference-schema.sql b/compatibility/sqlite-reference-schema.sql new file mode 100644 index 0000000..ad3b3ba --- /dev/null +++ b/compatibility/sqlite-reference-schema.sql @@ -0,0 +1,115 @@ +-- SQLite DDL materialized by pinned upstream Laravel migrations. +-- Upstream 3516c776a1fcbd83d234efc007e3a49807d6ed91; PHP 8.4.27; Laravel 13.29.0. +-- 42 migrations; no data, deployment configuration, keys or sessions included. + +CREATE TABLE "auth_logs" ("id" integer primary key autoincrement not null, "authenticatable_type" varchar not null, "authenticatable_id" integer not null, "ip_address" varchar, "user_agent" text, "login_at" datetime, "login_successful" tinyint(1) not null default '0', "logout_at" datetime, "cleared_by_user" tinyint(1) not null default '0', "guard" varchar, "login_method" varchar, foreign key("authenticatable_id") references "users"("id") on delete cascade); + +CREATE TABLE "cache" ("key" varchar not null, "value" text not null, "expiration" integer not null, primary key ("key")); + +CREATE TABLE "cache_locks" ("key" varchar not null, "owner" varchar not null, "expiration" integer not null, primary key ("key")); + +CREATE TABLE "groups" ("id" integer primary key autoincrement not null, "name" varchar not null, "created_at" datetime, "updated_at" datetime, "user_id" integer, "order_column" integer, "show_in_chips" tinyint(1) not null default '0', foreign key("user_id") references "users"("id") on delete cascade); + +CREATE TABLE "icons" ("name" varchar not null, "content" text not null, "created_at" datetime, "updated_at" datetime, primary key ("name")); + +CREATE TABLE "migrations" ("id" integer primary key autoincrement not null, "migration" varchar not null, "batch" integer not null); + +CREATE TABLE "oauth_access_tokens" ("id" varchar not null, "user_id" integer, "client_id" integer not null, "name" varchar, "scopes" text, "revoked" tinyint(1) not null, "created_at" datetime, "updated_at" datetime, "expires_at" datetime, primary key ("id")); + +CREATE TABLE "oauth_auth_codes" ("id" varchar not null, "user_id" integer not null, "client_id" integer not null, "scopes" text, "revoked" tinyint(1) not null, "expires_at" datetime, primary key ("id")); + +CREATE TABLE "oauth_clients" ("id" integer primary key autoincrement not null, "name" varchar not null, "secret" varchar, "provider" varchar, "revoked" tinyint(1) not null, "created_at" datetime, "updated_at" datetime, "owner_type" varchar, "owner_id" integer, "redirect_uris" text not null, "grant_types" text not null); + +CREATE TABLE "oauth_device_codes" ("id" varchar not null, "user_id" integer, "client_id" varchar not null, "user_code" varchar not null, "scopes" text not null, "revoked" tinyint(1) not null, "user_approved_at" datetime, "last_polled_at" datetime, "expires_at" datetime, primary key ("id")); + +CREATE TABLE "oauth_refresh_tokens" ("id" varchar not null, "access_token_id" varchar not null, "revoked" tinyint(1) not null, "expires_at" datetime, primary key ("id")); + +CREATE TABLE "options" ("id" integer primary key autoincrement not null, "key" varchar not null, "value" text not null); + +CREATE TABLE "otp_logs" ("id" integer primary key autoincrement not null, "requester_id" integer, "requester_name" varchar not null, "requester_email" varchar not null, "owner_id" integer, "owner_name" varchar not null, "owner_email" varchar not null, "twofaccount_id" integer not null, "ip_address" varchar not null, "otp_type" varchar not null, "counter" integer, "generated_at" datetime not null, foreign key("requester_id") references "users"("id") on delete set null, foreign key("owner_id") references "users"("id") on delete set null, foreign key("twofaccount_id") references "twofaccounts"("id") on delete cascade); + +CREATE TABLE "password_resets" ("email" varchar not null, "token" varchar not null, "created_at" datetime); + +CREATE TABLE "sessions" ("id" varchar not null, "user_id" integer, "ip_address" varchar, "user_agent" text, "payload" text not null, "last_activity" integer not null, primary key ("id")); + +CREATE TABLE "twofaccount_group_assignments" ("id" integer primary key autoincrement not null, "twofaccount_id" integer not null, "user_id" integer not null, "group_id" integer not null, "created_at" datetime, "updated_at" datetime, foreign key("twofaccount_id") references "twofaccounts"("id") on delete cascade, foreign key("user_id") references "users"("id") on delete cascade, foreign key("group_id") references "groups"("id") on delete cascade); + +CREATE TABLE "twofaccount_shares" ("id" integer primary key autoincrement not null, "twofaccount_id" integer not null, "shared_with_user_id" integer, "scope" varchar not null, "created_by_user_id" integer not null, "created_at" datetime, "updated_at" datetime, foreign key("twofaccount_id") references "twofaccounts"("id") on delete cascade, foreign key("shared_with_user_id") references "users"("id") on delete cascade, foreign key("created_by_user_id") references "users"("id") on delete cascade); + +CREATE TABLE "twofaccount_user_orders" ("id" integer primary key autoincrement not null, "user_id" integer not null, "twofaccount_id" integer not null, "position" integer not null, "created_at" datetime, "updated_at" datetime, foreign key("user_id") references "users"("id") on delete cascade, foreign key("twofaccount_id") references "twofaccounts"("id") on delete cascade); + +CREATE TABLE "twofaccounts" ("id" integer primary key autoincrement not null, "service" text, "legacy_uri" text not null, "account" text not null, "icon" varchar, "created_at" datetime, "updated_at" datetime, "order_column" integer, "group_id" integer, "otp_type" varchar not null, "secret" text not null, "algorithm" varchar not null, "digits" integer not null, "period" integer, "counter" integer, "user_id" integer, foreign key("user_id") references users("id") on delete cascade on update no action, foreign key("group_id") references groups("id") on delete set null on update no action); + +CREATE TABLE "users" ("id" integer primary key autoincrement not null, "name" varchar not null, "email" varchar not null, "email_verified_at" datetime, "password" varchar not null, "remember_token" varchar, "created_at" datetime, "updated_at" datetime, "last_seen_at" datetime, "is_admin" tinyint(1) not null default '0', "preferences" text, "oauth_provider" varchar, "oauth_id" varchar); + +CREATE TABLE "webauthn_credentials" ("id" varchar not null, "authenticatable_type" varchar not null, "authenticatable_id" integer not null, "user_id" varchar not null, "alias" varchar, "counter" integer, "rp_id" varchar not null, "origin" varchar not null, "transports" text, "aaguid" varchar, "public_key" text not null, "attestation_format" varchar not null default 'none', "certificates" text, "disabled_at" datetime, "created_at" datetime, "updated_at" datetime, primary key ("id")); + +CREATE TABLE "webauthn_recoveries" ("email" varchar not null, "token" varchar not null, "created_at" datetime); + +CREATE INDEX "auth_logs_authenticatable_type_authenticatable_id_index" on "auth_logs" ("authenticatable_type", "authenticatable_id"); + +CREATE INDEX "auth_logs_login_at_index" on "auth_logs" ("login_at"); + +CREATE INDEX "auth_logs_login_successful_index" on "auth_logs" ("login_successful"); + +CREATE INDEX "auth_logs_logout_at_index" on "auth_logs" ("logout_at"); + +CREATE INDEX "cache_expiration_index" on "cache" ("expiration"); + +CREATE INDEX "cache_locks_expiration_index" on "cache_locks" ("expiration"); + +CREATE INDEX "oauth_access_tokens_user_id_index" on "oauth_access_tokens" ("user_id"); + +CREATE INDEX "oauth_auth_codes_user_id_index" on "oauth_auth_codes" ("user_id"); + +CREATE INDEX "oauth_clients_owner_type_owner_id_index" on "oauth_clients" ("owner_type", "owner_id"); + +CREATE INDEX "oauth_device_codes_client_id_index" on "oauth_device_codes" ("client_id"); + +CREATE UNIQUE INDEX "oauth_device_codes_user_code_unique" on "oauth_device_codes" ("user_code"); + +CREATE INDEX "oauth_device_codes_user_id_index" on "oauth_device_codes" ("user_id"); + +CREATE INDEX "oauth_refresh_tokens_access_token_id_index" on "oauth_refresh_tokens" ("access_token_id"); + +CREATE UNIQUE INDEX "options_key_unique" on "options" ("key"); + +CREATE INDEX "otp_logs_ip_address_index" on "otp_logs" ("ip_address"); + +CREATE INDEX "otp_logs_otp_type_index" on "otp_logs" ("otp_type"); + +CREATE INDEX "otp_logs_requester_id_index" on "otp_logs" ("requester_id"); + +CREATE INDEX "otp_logs_twofaccount_id_index" on "otp_logs" ("twofaccount_id"); + +CREATE INDEX "password_resets_email_index" on "password_resets" ("email"); + +CREATE INDEX "sessions_last_activity_index" on "sessions" ("last_activity"); + +CREATE INDEX "sessions_user_id_index" on "sessions" ("user_id"); + +CREATE INDEX "twofaccount_group_assignments_group_id_index" on "twofaccount_group_assignments" ("group_id"); + +CREATE UNIQUE INDEX "twofaccount_group_assignments_unique_scope" on "twofaccount_group_assignments" ("twofaccount_id", "user_id"); + +CREATE INDEX "twofaccount_group_assignments_user_id_index" on "twofaccount_group_assignments" ("user_id"); + +CREATE INDEX "twofaccount_shares_shared_with_user_id_index" on "twofaccount_shares" ("shared_with_user_id"); + +CREATE INDEX "twofaccount_shares_twofaccount_id_scope_index" on "twofaccount_shares" ("twofaccount_id", "scope"); + +CREATE UNIQUE INDEX "twofaccount_shares_unique_target" on "twofaccount_shares" ("twofaccount_id", "scope", "shared_with_user_id"); + +CREATE INDEX "twofaccount_user_orders_twofaccount_id_index" on "twofaccount_user_orders" ("twofaccount_id"); + +CREATE UNIQUE INDEX "twofaccount_user_orders_unique_scope" on "twofaccount_user_orders" ("user_id", "twofaccount_id"); + +CREATE INDEX "twofaccount_user_orders_user_id_position_index" on "twofaccount_user_orders" ("user_id", "position"); + +CREATE UNIQUE INDEX "users_email_unique" on "users" ("email"); + +CREATE UNIQUE INDEX "users_name_unique" on "users" ("name"); + +CREATE INDEX "web_authn_recoveries_email_index" on "webauthn_recoveries" ("email"); + +CREATE INDEX "webauthn_user_index" on "webauthn_credentials" ("authenticatable_type", "authenticatable_id"); diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..777df8f --- /dev/null +++ b/compose.yaml @@ -0,0 +1,23 @@ +services: + rust: + build: . + ports: + - "127.0.0.1:8080:8080" + environment: + DATABASE_URL: sqlite:///data/2fauth.sqlite + LISTEN_ADDR: 0.0.0.0:8080 + # Only for the local HTTP development port. Use true behind HTTPS. + RUST_COOKIE_SECURE: "false" + RUST_LOG: twofauth_rs=info + volumes: + - rust-dev-data:/data + read_only: true + tmpfs: + - /tmp + cap_drop: + - ALL + security_opt: + - no-new-privileges:true + init: true +volumes: + rust-dev-data: diff --git a/public/UPSTREAM-LICENSE b/public/UPSTREAM-LICENSE new file mode 100644 index 0000000..bae94e1 --- /dev/null +++ b/public/UPSTREAM-LICENSE @@ -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 +. \ No newline at end of file diff --git a/public/UPSTREAM-NOTICE.txt b/public/UPSTREAM-NOTICE.txt new file mode 100644 index 0000000..8d4bbb4 --- /dev/null +++ b/public/UPSTREAM-NOTICE.txt @@ -0,0 +1,4 @@ +Frontend build and public images copied unchanged from Bubka/2FAuth commit 3516c776a1fcbd83d234efc007e3a49807d6ed91. +Upstream: https://github.com/Bubka/2FAuth +Copyright and license retained in UPSTREAM-LICENSE (AGPL-3.0). +The Rust HTTP service remains an incomplete implementation of the upstream API. diff --git a/public/build/assets/About-DlWJhNxo.js b/public/build/assets/About-DlWJhNxo.js new file mode 100644 index 0000000..3d21b7f --- /dev/null +++ b/public/build/assets/About-DlWJhNxo.js @@ -0,0 +1 @@ +import{U as _}from"./index-BJsmINgd.js";import{a as $,d as C,w as r,g as L,f as p,M as N,h as k,i as l,j as o,m as s,t as e,n as u,l as M,k as A,p as n}from"./app-dvJP63FL.js";import{c as d}from"./createLucideIcon-DsaEAGzP.js";const B=[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]],V=d("code-xml",B);const z=[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2",key:"18mbvz"}],["path",{d:"M6.453 15h11.094",key:"3shlmq"}],["path",{d:"M8.5 2h7",key:"csnxdl"}]],F=d("flask-conical",z);const S=[["path",{d:"M18 19a5 5 0 0 1-5-5v8",key:"sz5oeg"}],["path",{d:"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5",key:"1w6njk"}],["circle",{cx:"13",cy:"12",r:"2",key:"1j92g6"}],["circle",{cx:"20",cy:"19",r:"2",key:"1obnsp"}]],j=d("folder-git-2",S);const w=[["path",{d:"M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z",key:"j76jl0"}],["path",{d:"M22 10v6",key:"1lu8f3"}],["path",{d:"M6 12.5V16a6 3 0 0 0 12 0v-3.5",key:"1r8lef"}]],E=d("graduation-cap",w),G={class:"title"},I={class:"block"},W={key:0},H={class:"title is-5"},R={class:"buttons"},T={class:"icon is-small"},U={class:"icon is-small"},q={class:"icon is-small"},D={class:"icon is-small"},P={class:"title is-5"},Q={__name:"About",setup(X){const m=N("2fauth"),b=$(),c=L(),h=c.options.routes.find(a=>a.path==c.options.history.state.back).name;return(a,t)=>{const f=p("ResponsiveWidthWrapper"),g=p("NavigationButton"),y=p("VueFooter"),v=p("StackLayout");return k(),C(v,null,{content:r(()=>[l(f,null,{default:r(()=>[l(o(_),null,{default:r(({mode:i})=>[s("h1",G,e(a.$t("heading.about")),1),s("p",I,[s("span",{class:u(i=="dark"?"has-text-white":"has-text-black")},[t[1]||(t[1]=s("span",{class:"is-size-5"},"2FAuth",-1)),o(b).isAuthenticated?(k(),M("span",W," v"+e(o(m).version),1)):A("",!0)],2),t[2]||(t[2]=s("br",null,null,-1)),n(" "+e(a.$t("message.2fauth_teaser")),1)]),t[11]||(t[11]=s("img",{class:"about-logo",src:"logo.svg",alt:"2FAuth logo"},null,-1)),t[12]||(t[12]=s("p",{class:"block"},[n(" ©Bubka "),s("a",{class:"is-size-7 is-link",href:"https://github.com/Bubka/2FAuth/blob/master/LICENSE"},"AGPL-3.0 license")],-1)),s("h2",H,e(a.$t("heading.resources")),1),s("div",R,[s("a",{class:u(["button",{"is-dark":i=="dark"}]),href:"https://github.com/Bubka/2FAuth",target:"_blank"},[s("span",T,[l(o(j))]),t[3]||(t[3]=s("span",null,"Github",-1))],2),s("a",{class:u(["button",{"is-dark":i=="dark"}]),href:"https://docs.2fauth.app/",target:"_blank"},[s("span",U,[l(o(E))]),s("span",null,e(a.$t("label.docs")),1)],2),s("a",{class:u(["button",{"is-dark":i=="dark"}]),href:"https://demo.2fauth.app/",target:"_blank"},[s("span",q,[l(o(F))]),s("span",null,e(a.$t("label.demo")),1)],2),s("a",{class:u(["button",{"is-dark":i=="dark"}]),href:"https://docs.2fauth.app/resources/rapidoc.html",target:"_blank"},[s("span",D,[l(o(V))]),s("span",null,e(a.$t("label.api")),1)],2)]),s("h2",P,e(a.$t("heading.credits")),1),s("ul",null,[s("li",null,[n(e(a.$t("message.made_with"))+" ",1),t[4]||(t[4]=s("a",{class:"is-link",href:"https://docs.2fauth.app/credits/"},"Laravel, Bulma CSS, Vue.js and more",-1))]),s("li",null,[n(e(a.$t("message.ui_icons_by"))+" ",1),t[5]||(t[5]=s("a",{class:"is-link",href:"https://lucide.dev/"},"Lucide",-1)),t[6]||(t[6]=n(" ",-1)),t[7]||(t[7]=s("a",{class:"is-size-7 is-link",href:"https://lucide.dev/license"},"(ISC License)",-1))]),s("li",null,[n(e(a.$t("message.logos_by"))+" ",1),t[8]||(t[8]=s("a",{class:"is-link",href:"https://2fa.directory/"},"2FA Directory",-1)),t[9]||(t[9]=n(" ",-1)),t[10]||(t[10]=s("a",{class:"is-size-7 is-link",href:"https://github.com/2factorauth/twofactorauth/blob/master/LICENSE.md"},"(MIT License)",-1))])])]),_:1})]),_:1})]),footer:r(()=>[l(y,null,{default:r(()=>[l(g,{action:"back",onGoback:t[0]||(t[0]=i=>o(c).push({name:o(h)})),"previous-page-title":a.$t("title."+o(h))},null,8,["previous-page-title"])]),_:1})]),_:1})}}};export{Q as default}; diff --git a/public/build/assets/Access-BQVm4alb.js b/public/build/assets/Access-BQVm4alb.js new file mode 100644 index 0000000..fe3c484 --- /dev/null +++ b/public/build/assets/Access-BQVm4alb.js @@ -0,0 +1 @@ +import{_ as I}from"./AccessLogViewer-D5ke4CwJ.js";import{o as k,e as B,a1 as S,d as $,w as n,f as a,g as b,h as y,i as t,j as r,m as p,t as u}from"./app-dvJP63FL.js";import{u as N}from"./bus-ChE1sp8V.js";import"./index-BJsmINgd.js";import"./tablet-DYUfDfjC.js";import"./createLucideIcon-DsaEAGzP.js";import"./x-DQVIq0xP.js";import"./check-CPGWPXZa.js";const V={class:"title"},W={class:"block is-size-7-mobile"},A={__name:"Access",props:{userId:[Number,String]},setup(m){const d=N(),i=b();k(async()=>{_()});const s=m,c=B(d.username??"");function _(){S.getById(s.userId,{returnError:!0}).then(e=>{c.value=e.data.info.name})}return(e,o)=>{const g=a("ResponsiveWidthWrapper"),l=a("NavigationButton"),f=a("VueFooter"),v=a("StackLayout");return y(),$(v,null,{content:n(()=>[t(g,null,{default:n(()=>[p("h1",V,u(e.$t("heading.access_log")),1),p("div",W,u(e.$t("message.access_log_legend_for_user",{username:r(c)}))+" (#"+u(s.userId)+") ",1),t(I,{userId:s.userId,lastOnly:!1,showSearch:!0,period:1},null,8,["userId"])]),_:1})]),footer:n(()=>[t(f,null,{default:n(()=>[t(l,{action:"back",onGoback:o[0]||(o[0]=h=>r(i).push({name:"admin.manageUser",params:{userId:s.userId}})),"previous-page-title":e.$t("title.admin.manageUser")},null,8,["previous-page-title"]),t(l,{action:"close",onClosed:o[1]||(o[1]=h=>r(i).push({name:"accounts"})),"current-page-title":e.$t("title.admin.logs.access")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{A as default}; diff --git a/public/build/assets/AccessLogViewer-D5ke4CwJ.js b/public/build/assets/AccessLogViewer-D5ke4CwJ.js new file mode 100644 index 0000000..128547b --- /dev/null +++ b/public/build/assets/AccessLogViewer-D5ke4CwJ.js @@ -0,0 +1 @@ +import{C as j,M as z,e as p,o as P,a1 as X,f as A,h as l,l as h,d as r,D as H,j as e,X as J,k as B,m as s,n as i,t as a,i as v,F as N,E as R,w as y,p as w,B as q}from"./app-dvJP63FL.js";import{U as G}from"./index-BJsmINgd.js";import{C as K,a as Q,S as W,T as Z,M as tt}from"./tablet-DYUfDfjC.js";import{X as et}from"./x-DQVIq0xP.js";import{C as st}from"./check-CPGWPXZa.js";const ot={key:1,class:"level is-mobile mb-2"},nt={class:"level-item has-text-centered"},lt={class:"buttons"},at=["title"],rt=["title"],it=["title"],dt=["title"],ct=["title"],ht=["title"],ut={key:3,class:"mt-4"},gt={key:4},_t={class:"light-or-darker"},pt={class:"light-or-darker"},yt={class:"light-or-darker"},mt={class:"light-or-darker"},bt={class:"light-or-darker"},kt={class:"light-or-darker"},ft={class:"light-or-darker"},vt={class:"log-icon-wrapper"},wt={key:5,class:"mt-5 pl-3"},At={__name:"AccessLogViewer",props:{userId:[Number,String],lastOnly:Boolean,showSearch:Boolean,period:{type:[Number,String],default:12}},emits:["has-more-entries"],setup(D,{emit:Y}){const L=j(),O=z("2fauth"),u=D,d={aMonth:1,threeMonths:3,halfYear:6,aYear:12},c=p([]),f=p(!1),m=p(""),g=p(u.period),_=p(!0),V=Y,S=q(()=>c.value.filter(t=>JSON.stringify(t).toString().toLowerCase().includes(m.value)));P(()=>{M()});function b(t){g.value=t,M()}function E(){_.value=!1,$()}function $(){c.value.sort((t,n)=>t.id>n.id?1:-1)}function F(){_.value=!0,C()}function C(){c.value.sort((t,n)=>t.id{c.value=n.data,c.value.length>3&&u.lastOnly&&(V("has-more-entries"),c.value.pop()),_.value==!0?C():$()}).catch(n=>{L.show(n)}).finally(()=>{f.value=!1})}const I=t=>!t.login_at&&t.logout_at,x=t=>!t.login_successful&&!t.logout_at;return(t,n)=>{const T=A("Spinner"),k=A("i18n-t");return l(),h(N,null,[u.showSearch?(l(),r(e(J),{key:0,keyword:e(m),"onUpdate:keyword":n[0]||(n[0]=o=>H(m)?m.value=o:null),hasNoBackground:!0},null,8,["keyword"])):B("",!0),u.showSearch?(l(),h("nav",ot,[s("div",nt,[s("div",lt,[s("button",{id:"btnShowOneMonth",title:t.$t("tooltip.show_last_month_log"),onClick:n[1]||(n[1]=o=>b(d.aMonth)),class:i([{"has-text-grey":e(g)!==d.aMonth},"button is-ghost p-1"]),type:"button"},a(t.$t("label.one_month")),11,at),s("button",{id:"btnShowThreeMonths",title:t.$t("tooltip.show_three_months_log"),onClick:n[2]||(n[2]=o=>b(d.threeMonths)),class:i([{"has-text-grey":e(g)!==d.threeMonths},"button is-ghost p-1"]),type:"button"},a(t.$t("label.x_month",{x:"3"})),11,rt),s("button",{id:"btnShowSixMonths",title:t.$t("tooltip.show_six_months_log"),onClick:n[3]||(n[3]=o=>b(d.halfYear)),class:i([{"has-text-grey":e(g)!==d.halfYear},"button is-ghost p-1"]),type:"button"},a(t.$t("label.x_month",{x:"6"})),11,it),s("button",{id:"btnShowOneYear",title:t.$t("tooltip.show_one_year_log"),onClick:n[4]||(n[4]=o=>b(d.aYear)),class:i([{"has-text-grey":e(g)!==d.aYear},"button is-ghost p-1 mr-5"]),type:"button"},a(t.$t("label.one_year")),11,dt),s("button",{id:"btnSortLogDesc",onClick:F,title:t.$t("tooltip.sort_by_date_desc"),class:i([{"has-text-grey":!e(_)},"button p-1 is-ghost"]),type:"button"},[v(e(K))],10,ct),s("button",{id:"btnSortLogAsc",onClick:E,title:t.$t("tooltip.sort_by_date_asc"),class:i([{"has-text-grey":e(_)},"button p-1 is-ghost"]),type:"button"},[v(e(Q))],10,ht)])])])):B("",!0),e(f)?(l(),r(T,{key:2,isVisible:!0,type:"list-loading"})):e(c).length==0?(l(),h("div",ut,a(t.$t("message.no_entry_yet")),1)):e(S).length>0?(l(),h("div",gt,[(l(!0),h(N,null,R(e(S),o=>(l(),h("div",{key:o.id,class:"list-item is-size-6 is-size-7-mobile has-text-grey is-flex is-justify-content-space-between"},[v(e(G),null,{default:y(({mode:U})=>[s("div",null,[s("div",null,[x(o)?(l(),r(k,{key:0,keypath:"message.failed_login_on",tag:"span"},{login_at:y(()=>[s("span",_t,a(o.login_at),1)]),_:2},1024)):I(o)?(l(),r(k,{key:1,keypath:"message.successful_logout_on",tag:"span"},{logout_at:y(()=>[s("span",pt,a(o.logout_at),1)]),_:2},1024)):e(O).config.proxyAuth?(l(),r(k,{key:2,keypath:"message.viewed_on",tag:"span"},{login_at:y(()=>[s("span",yt,a(o.login_at),1)]),_:2},1024)):(l(),r(k,{key:3,keypath:"message.successful_login_on",tag:"span"},{login_at:y(()=>[s("span",mt,a(o.login_at),1)]),_:2},1024))]),s("div",null,[w(a(t.$t("label.IP"))+": ",1),s("span",bt,a(o.ip_address),1),w(" - "+a(t.$t("label.browser"))+": ",1),s("span",kt,a(o.browser),1),w(" - "+a(t.$t("label.operating_system_short"))+": ",1),s("span",ft,a(o.platform),1)])]),s("div",{class:i([U=="dark"?"has-text-grey-darker":"has-text-grey-lighter","is-align-self-center"])},[s("div",vt,[o.device=="phone"?(l(),r(e(W),{key:0,class:"log-icon-bg"})):o.device=="tablet"?(l(),r(e(Z),{key:1,class:"log-icon-bg"})):(l(),r(e(tt),{key:2,class:"log-icon-bg"})),x(o)?(l(),r(e(et),{key:3,"stroke-width":"3",class:i(["log-icon-mark","has-text-danger"])})):(l(),r(e(st),{key:4,"stroke-width":"3",class:i(["log-icon-mark","has-text-success-50"])}))])],2)]),_:2},1024)]))),128))])):(l(),h("div",wt,a(t.$t("message.no_result")),1))],64)}}};export{At as _}; diff --git a/public/build/assets/Account-CvhJGfLO.js b/public/build/assets/Account-CvhJGfLO.js new file mode 100644 index 0000000..7c86635 --- /dev/null +++ b/public/build/assets/Account-CvhJGfLO.js @@ -0,0 +1 @@ +import{C as E,u as I,a as j,a8 as H,r as B,af as z,d as Q,w,M as q,f as p,g as G,a7 as k,h as g,i as l,j as s,l as _,m as o,t as i,k as h,H as M,p as J,ak as O,$ as X}from"./app-dvJP63FL.js";import{t as Y}from"./tabs-Btun2NN0.js";import{F}from"./Form-ZbAUhXmz.js";import{u as Z}from"./breakpoints-CyLcIEOu.js";const ee={key:0,class:"pr-5 settings-menu"},se={class:"menu"},te={class:"menu-list"},oe={key:1,class:"notification is-info has-text-centered"},ae={key:0,class:"notification is-warning has-text-centered"},ne={ref:"heading-profile",class:"title is-4"},re={key:0,class:"tag is-warning ml-1"},le=["disabled"],ie=["value"],de=["value"],ue=["disabled"],pe=["value"],me=["value"],ce={class:"field is-size-7-mobile"},fe={class:"block"},we=["disabled"],ve={__name:"Account",setup(ge){const b=E(),{t:y}=I(),c=q("2fauth"),d=j(),u=X(),v=G(),x=H(c.prefix+"returnTo","accounts"),{isLaptop:N}=Z(),n=B(new F({name:d.name,email:d.email,password:""})),r=B(new F({currentPassword:"",password:"",password_confirmation:""})),m=B(new F({password:""}));function S(a){n.put("/user",{returnError:!0}).then(e=>{d.$patch({name:e.data.name,email:e.data.email,isAdmin:e.data.is_admin}),u.success({text:y("notification.profile_saved")})}).catch(e=>{e.response.status===400?u.alert({text:e.response.data.message}):e.response.status!==422&&b.show(e)})}function A(a){r.patch("/user/password",{returnError:!0}).then(e=>{r.password="",r.formPassword="",r.password_confirmation="",u.success({text:e.data.message})}).catch(e=>{e.response.status===400?u.alert({text:e.response.data.message}):e.response.status!==422&&b.show(e)})}function T(a){confirm(y("confirmation.delete_account"))&&m.delete("/user",{returnError:!0}).then(e=>{u.success({text:y("notification.user_account_successfully_deleted")}),v.push({name:"register"})}).catch(e=>{e.response.status===400?u.alert({text:e.response.data.message}):e.response.status!==422&&b.show(e)})}const C=k("heading-profile"),L=k("heading-changePassword"),R=k("heading-deleteAccount"),V=a=>{a&&a.scrollIntoView({behavior:"smooth"})};return z(a=>{!a.name.startsWith("settings.")&&a.name==="login"&&u.clear()}),(a,e)=>{const f=p("FormField"),$=p("FormButtons"),P=p("FormPasswordField"),U=p("ResponsiveWidthWrapper"),D=p("NavigationButton"),K=p("VueFooter"),W=p("StackLayout");return g(),Q(W,null,{header:w(()=>[l(s(O),{tabs:s(Y),"active-tab":"settings.account",onTabSelected:e[0]||(e[0]=t=>s(v).push({name:t}))},null,8,["tabs"])]),content:w(()=>[l(U,null,{default:w(()=>[s(N)&&s(d).preferences.showQuickNavMenus?(g(),_("div",ee,[o("aside",se,[o("ul",te,[o("li",null,[o("button",{onClick:e[1]||(e[1]=t=>V(s(C)))},i(a.$t("heading.profile")),1)]),o("li",null,[o("button",{onClick:e[2]||(e[2]=t=>V(s(L)))},i(a.$t("heading.change_password")),1)]),o("li",null,[o("button",{onClick:e[3]||(e[3]=t=>V(s(R)))},i(a.$t("heading.delete_account")),1)])])])])):h("",!0),s(d).oauth_provider?(g(),_("div",oe,i(a.$t("message.account_linked_to_sso_x_provider",{provider:s(d).oauth_provider})),1)):h("",!0),o("form",{onSubmit:M(S,["prevent"]),onKeydown:e[7]||(e[7]=t=>s(n).onKeydown(t))},[s(c).config.proxyAuth?(g(),_("div",ae,i(a.$t("message.user_account_controlled_by_proxy")+" "+a.$t("message.manage_account_at_proxy_level")),1)):h("",!0),o("h4",ne,[J(i(a.$t("heading.profile"))+" ",1),s(d).isAdmin?(g(),_("span",re,i(a.$t("label.administrator")),1)):h("",!0)],512),o("fieldset",{disabled:s(c).config.proxyAuth||s(d).oauth_provider},[l(f,{modelValue:s(n).name,"onUpdate:modelValue":e[4]||(e[4]=t=>s(n).name=t),fieldName:"name",errorMessage:s(n).errors.get("name"),label:"field.name",maxLength:255,autocomplete:"username",autofocus:""},null,8,["modelValue","errorMessage"]),l(f,{modelValue:s(n).email,"onUpdate:modelValue":e[5]||(e[5]=t=>s(n).email=t),fieldName:"email",errorMessage:s(n).errors.get("email"),inputType:"email",label:"field.email",autocomplete:"email",maxLength:255,autofocus:""},null,8,["modelValue","errorMessage"]),l(f,{modelValue:s(n).password,"onUpdate:modelValue":e[6]||(e[6]=t=>s(n).password=t),fieldName:"password",errorMessage:s(n).errors.get("password"),inputType:"password",label:"field.current_password",autocomplete:"current-password",help:"field.current_password.help"},null,8,["modelValue","errorMessage"]),l($,{isBusy:s(n).isBusy,submitLabel:"label.update"},null,8,["isBusy"])],8,le)],32),o("form",{onSubmit:M(A,["prevent"]),onKeydown:e[11]||(e[11]=t=>s(r).onKeydown(t))},[o("input",{hidden:"",type:"text",name:"name",value:s(n).name,autocomplete:"username"},null,8,ie),o("input",{hidden:"",type:"text",name:"email",value:s(n).email,autocomplete:"email"},null,8,de),o("h4",{ref:"heading-changePassword",class:"title is-4 pt-6"},i(a.$t("heading.change_password")),513),o("fieldset",{disabled:s(c).config.proxyAuth||s(d).oauth_provider},[l(P,{modelValue:s(r).password,"onUpdate:modelValue":e[8]||(e[8]=t=>s(r).password=t),fieldName:"password",errorMessage:s(r).errors.get("password"),idSuffix:"ForUpdate",autocomplete:"new-password",showRules:!0,label:"field.new_password"},null,8,["modelValue","errorMessage"]),l(P,{modelValue:s(r).password_confirmation,"onUpdate:modelValue":e[9]||(e[9]=t=>s(r).password_confirmation=t),showRules:!1,fieldName:"password_confirmation",errorMessage:s(r).errors.get("password_confirmation"),inputType:"password",autocomplete:"new-password",label:"field.confirm_new_password"},null,8,["modelValue","errorMessage"]),l(f,{modelValue:s(r).currentPassword,"onUpdate:modelValue":e[10]||(e[10]=t=>s(r).currentPassword=t),fieldName:"currentPassword",errorMessage:s(r).errors.get("currentPassword"),inputType:"password",label:"field.current_password",autocomplete:"current-password",help:"field.current_password.help"},null,8,["modelValue","errorMessage"]),l($,{isBusy:s(r).isBusy,submitId:"btnSubmitChangePwd",submitLabel:"label.change_password"},null,8,["isBusy"])],8,ue)],32),o("form",{id:"frmDeleteAccount",onSubmit:M(T,["prevent"]),onKeydown:e[13]||(e[13]=t=>s(m).onKeydown(t))},[o("input",{hidden:"",type:"text",name:"name",value:s(n).name,autocomplete:"username"},null,8,pe),o("input",{hidden:"",type:"text",name:"email",value:s(n).email,autocomplete:"email"},null,8,me),o("h4",{ref:"heading-deleteAccount",class:"title is-4 pt-6 has-text-danger"},i(a.$t("heading.delete_account")),513),o("div",ce,[o("p",fe,i(a.$t("message.delete_your_account_and_reset_all_data")),1),o("p",null,i(a.$t("message.reset_your_password_to_delete_your_account")),1),o("p",null,i(a.$t("message.deleting_2fauth_account_does_not_impact_provider")),1)]),o("fieldset",{disabled:s(c).config.proxyAuth},[l(f,{modelValue:s(m).password,"onUpdate:modelValue":e[12]||(e[12]=t=>s(m).password=t),fieldName:"password",errorMessage:s(m).errors.get("password"),inputType:"password",idSuffix:"ForDelete",autocomplete:"new-password",label:"field.current_password",help:"field.current_password.help"},null,8,["modelValue","errorMessage"]),l($,{isBusy:s(m).isBusy,submitLabel:"label.delete_your_account",submitId:"btnDeleteAccount",color:"is-danger"},null,8,["isBusy"])],8,we)],32)]),_:1})]),footer:w(()=>[l(K,null,{default:w(()=>[l(D,{action:"close",onClosed:e[14]||(e[14]=t=>s(v).push({name:s(x)})),"current-page-title":a.$t("title.settings.account")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{ve as default}; diff --git a/public/build/assets/AccountSharing-kU7yk02h.js b/public/build/assets/AccountSharing-kU7yk02h.js new file mode 100644 index 0000000..f4ae654 --- /dev/null +++ b/public/build/assets/AccountSharing-kU7yk02h.js @@ -0,0 +1 @@ +import{u as Q,b as Y,e as f,P as Z,o as x,I as ee,d as I,w as m,a7 as te,f as g,h as n,i as h,j as t,a4 as se,m as s,t as o,p as w,l,F as p,E as L,n as F,k as v,X as ae,D as oe,B as S,$ as ie}from"./app-dvJP63FL.js";import{s as b}from"./shareService-BU7jlLil.js";import{_ as ne}from"./TwofaccountMedia-DzLyeBxh.js";import{a as re}from"./helpers-B2oe4lHy.js";import{U as le}from"./index-BJsmINgd.js";import{C as ce}from"./circle-plus-BM92Iipr.js";import{U as ue}from"./users-CLZI37iw.js";import"./createLucideIcon-DsaEAGzP.js";const he={class:"title"},de={class:"block is-size-7-mobile"},_e={class:"columns is-mobile is-multiline"},fe={class:"column is-narrow"},me={class:"toggle-wrapper has-background-dark p-1"},ge={class:"toggle"},pe={class:"toggle-buttons"},ve=["id","onClick"],Se={class:"pt-2 mb-4"},be={key:0,class:"list-item is-size-6 is-size-7-mobile has-text-grey pt-2"},ke=["onClick","title"],ye={class:"is-block is-family-primary is-size-7 has-text-grey"},we={key:1,class:"list-item is-size-5 is-size-6-mobile"},$e={class:"icon-text"},We={class:"icon"},Ue={class:"is-size-6 is-size-7-mobile has-text-grey pt-2"},ze={key:2,class:"list-item pt-0"},Ne={key:0,class:"is-size-6 is-size-7-mobile has-text-grey pt-2"},Ae={class:"is-size-6 is-size-7-mobile has-text-grey pt-2"},Ce={class:"mt-2 is-size-7 is-pulled-right"},De={__name:"AccountSharing",props:{twofaccountId:[Number,String]},setup(V){const u=V,P=ie(),{t:$}=Q(),T=Y(),U=f(T.items.find(e=>e.id==u.twofaccountId)),k=Z(),W=te("activeScopeRef"),d=f(!1),c=f([]),y=f(""),z=f([]),N=[{id:"ShareWithAll",label:"label.share_with_all"},{id:"NotShared",label:"label.not_shared"},{id:"ShareWithUsers",label:"label.share_with_specific_users"}],i=f("NotShared"),D=S(()=>c.value.filter(e=>e.name.toLowerCase().includes(y.value.toLowerCase()))),A=S(()=>k.enableAllUsersSharingScope?N:N.filter(e=>e.id!="ShareWithAll")),E=S(()=>A.value.find(e=>e.id==i.value).label),M=S(()=>i.value=="ShareWithAll"),X=S(()=>i.value=="ShareWithUsers");x(()=>{d.value=!0,i.value="NotShared",ee.get(u.twofaccountId).then(e=>{U.value=e.data}),b.getShares(u.twofaccountId).then(e=>{k.enableAllUsersSharingScope&&e?.data?.is_shared_with_all?i.value="ShareWithAll":(c.value=re(e?.data?.specific_users),c.value.length>0?i.value="ShareWithUsers":i.value="NotShared")}).finally(()=>{d.value=!1,R(i.value)})});function j(e){confirm($("confirmation.are_you_sure"))===!0&&b.unshareWithUser(u.twofaccountId,e).then(a=>{c.value=c.value.filter(_=>_.id!=e)})}function q(e){(i.value=="NotShared"&&e=="ShareWithUsers"||e=="NotShared"&&i.value=="ShareWithUsers"&&c.value.length==0||confirm($("confirmation.toggle_sharing_setting"))===!0)&&C(e)}function C(e){d.value=!0;let a;switch(e){case"ShareWithAll":a=b.shareWithAll(u.twofaccountId);break;case"NotShared":a=b.unshare(u.twofaccountId);break;case"ShareWithUsers":i.value=="ShareWithAll"?a=b.unshare(u.twofaccountId):a=Promise.resolve(!0);break;default:P.alert({text:$("error.unsupported_sharing_scope")});return}a.then(_=>{i.value=e,e!="ShareWithUsers"&&(c.value=[]),R(e)}).finally(()=>{d.value=!1})}function R(e){const a=z.value.find(_=>_.id=="btn"+e);W.value.style.setProperty("transform",`translateX(${a.offsetLeft}px)`),W.value.textContent=a.textContent}return(e,a)=>{const _=g("RouterLink"),G=g("ResponsiveWidthWrapper"),H=g("NavigationButton"),J=g("VueFooter"),K=g("StackLayout");return n(),I(K,null,{content:m(()=>[h(t(le),null,{default:m(({mode:B})=>[h(G,null,{default:m(()=>[s("h1",he,o(e.$t("heading.sharing_setting")),1),s("div",de,[w(o(e.$t("message.share_account_with_other_users")),1),a[2]||(a[2]=s("br",null,null,-1)),w(" "+o(e.$t("message.shared_account_can_be_viewed_not_full_controlled")),1)]),h(ne,{twofaccount:t(U)},null,8,["twofaccount"]),s("div",_e,[s("div",fe,[s("div",me,[s("div",ge,[s("div",pe,[(n(!0),l(p,null,L(t(A),r=>(n(),l("button",{key:r.id,ref_for:!0,ref_key:"shareButtonRefs",ref:z,id:"btn"+r.id,onClick:O=>q(r.id),class:"button px-3 is-dark"},o(e.$t(r.label)),9,ve))),128))]),s("label",{ref_key:"activeScopeRef",ref:W,class:F([{"is-black":t(i)=="NotShared","is-link":t(i)!="NotShared","is-loading":t(d)},"toggle-active button px-3"])},o(e.$t(t(E))),3)])])])]),t(d)==!1?(n(),l(p,{key:0},[t(X)?(n(),l(p,{key:0},[s("div",Se,[h(_,{class:"is-link",to:{name:"shareAccount",params:{twofaccountId:u.twofaccountId}}},{default:m(()=>[h(t(ce),{class:"mr-2"}),w(" "+o(e.$t("link.add_users")),1)]),_:1},8,["to"])]),t(c).length==0?(n(),l("div",be,o(e.$t("message.add_your_first_user_to_share_this_account_with")),1)):v("",!0),t(c).length>0?(n(),l(p,{key:1},[t(c).length>5?(n(),I(t(ae),{key:0,keyword:t(y),"onUpdate:keyword":a[0]||(a[0]=r=>oe(y)?y.value=r:null),hasNoBackground:!0,isSmall:!0},null,8,["keyword"])):v("",!0),(n(!0),l(p,null,L(t(D),r=>(n(),l("div",{key:r.id,class:"list-item is-size-5 is-size-6-mobile"},[w(o(r.name)+" ",1),s("button",{type:"button",class:F(["button tag is-pulled-right",B=="dark"?"is-dark":"is-white"]),onClick:O=>j(r.id),title:e.$t("tooltip.revoke")},o(e.$t("label.revoke")),11,ke),s("span",ye,o(e.$t("message.shared_since_x",{date:r.is_shared_since})),1)]))),128))],64)):v("",!0)],64)):t(k).enableAllUsersSharingScope&&t(M)==!0?(n(),l("div",we,[s("span",$e,[s("span",We,[h(t(ue),{class:"icon-size-1"})]),s("span",null,o(e.$t("message.is_shared_with_all_users")),1)]),s("p",Ue,o(e.$t("message.is_shared_with_all_users_legend")),1)])):(n(),l("div",ze,[t(k).enableAllUsersSharingScope?(n(),l("p",Ne,o(e.$t("message.all_users_meaning")),1)):v("",!0),s("p",Ae,o(e.$t("message.selected_users_meaning")),1)])),s("div",Ce,o(e.$t("message.you_can_toggle_sharing_setting_at_any_time")),1)],64)):v("",!0)]),_:2},1024)]),_:1})]),footer:m(()=>[h(J,null,{default:m(()=>[h(H,{action:"close",onClosed:a[1]||(a[1]=B=>("router"in e?e.router:t(se)).push({name:"accounts"})),"current-page-title":e.$t("title.accountSharing")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{De as default}; diff --git a/public/build/assets/Accounts-znshhaJC.js b/public/build/assets/Accounts-znshhaJC.js new file mode 100644 index 0000000..914951a --- /dev/null +++ b/public/build/assets/Accounts-znshhaJC.js @@ -0,0 +1 @@ +import{f as N,h as a,d as M,w as u,i as l,m as i,t as c,j as e,l as d,F as q,E as ue,n as p,k as y,p as U,I as Z,J as qe,e as x,K as Ve,x as ce,L as ve,g as pe,a as Oe,M as De,C as Te,u as Le,N as Re,b as Fe,O as He,P as Ke,v as re,o as je,Q as J,$ as Qe,R as be,S as Xe,D as L,T as R,y as de,U as We,q as Y,H as F,z as we,V as $e,W as Ze,X as Je,Y as Ye,Z as et,_ as tt,a0 as st,a1 as ot,B as nt}from"./app-dvJP63FL.js";import{s as it}from"./shareService-BU7jlLil.js";import{U as ee}from"./index-BJsmINgd.js";import{c as A}from"./createLucideIcon-DsaEAGzP.js";import{T as Ue,M as Me,u as at,m as lt}from"./useSortable-6hRbxhTj.js";import{u as rt}from"./bus-ChE1sp8V.js";import{C as dt,a as ut}from"./circle-x-AvUNZzwX.js";import{U as ct}from"./users-CLZI37iw.js";import{Q as Se}from"./qr-code-eSL1bq0j.js";import{X as pt}from"./x-DQVIq0xP.js";const ht=[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"M20 8h-5",key:"1vsyxs"}],["path",{d:"M15 10V6.5a2.5 2.5 0 0 1 5 0V10",key:"ag13bf"}],["path",{d:"M15 14h5l-5 6h5",key:"ur5jdg"}]],ft=A("arrow-down-a-z",ht);const mt=[["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}],["path",{d:"M20 8h-5",key:"1vsyxs"}],["path",{d:"M15 10V6.5a2.5 2.5 0 0 1 5 0V10",key:"ag13bf"}],["path",{d:"M15 14h5l-5 6h5",key:"ur5jdg"}]],kt=A("arrow-up-a-z",mt);const yt=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M17 12h.01",key:"1m0b6t"}],["path",{d:"M12 12h.01",key:"1mp3jc"}],["path",{d:"M7 12h.01",key:"eqddd0"}]],gt=A("circle-ellipsis",yt);const _t=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],vt=A("eye-off",_t);const bt=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],wt=A("eye",bt);const $t=[["path",{d:"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1",key:"fm4g5t"}],["path",{d:"M2 13h10",key:"pgb2dq"}],["path",{d:"m9 16 3-3-3-3",key:"6m91ic"}]],Mt=A("folder-input",$t);const St=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],Ct=A("history",St);const xt=[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]],At=A("package",xt);const Ot=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],Dt=A("pencil",Ot);const Ut=[["path",{d:"M17 12v4a1 1 0 0 1-1 1h-4",key:"uk4fdo"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M17 8V7",key:"q2g9wo"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M7 17h.01",key:"19xn7k"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}],["rect",{x:"7",y:"7",width:"5",height:"5",rx:"1",key:"m9kyts"}]],It=A("scan-qr-code",Ut);const Gt=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],Et=A("square-check",Gt);const Nt=[["path",{d:"m16 11 2 2 4-4",key:"9rsbq5"}],["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],zt=A("user-check",Nt);const Bt=[["path",{d:"M11.5 15H7a4 4 0 0 0-4 4v2",key:"15lzij"}],["path",{d:"M21.378 16.626a1 1 0 0 0-3.004-3.004l-4.01 4.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z",key:"1817ys"}],["circle",{cx:"10",cy:"7",r:"4",key:"e45bow"}]],Ce=A("user-pen",Bt);const Pt=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]],xe=A("user-plus",Pt);const qt=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"17",x2:"22",y1:"8",y2:"13",key:"3nzzx3"}],["line",{x1:"22",x2:"17",y1:"8",y2:"13",key:"1swrse"}]],Vt=A("user-x",qt),Tt={class:"columns is-centered is-multiline m-0 mt-6"},Lt={class:"column is-full has-text-centered"},Rt={class:"column is-one-third-tablet is-one-quarter-desktop is-one-quarter-widescreen is-one-quarter-fullhd"},Ft={class:"columns is-multiline"},Ht={key:0,class:"column is-full"},Kt=["onClick"],jt={class:"column has-text-centered"},Qt={class:"column is-full"},Xt={class:"columns is-centered"},Wt={class:"column has-text-centered"},Zt={class:"control"},Jt={__name:"DestinationGroupSelector",props:{showDestinationGroupSelector:Boolean,selectedAccountsIds:Array,groups:Array},emits:["update:showDestinationGroupSelector","accounts-moved"],setup(m,{emit:V}){const $=m,k=x(null),O=V;async function f(){k.value===0?await Z.withdraw($.selectedAccountsIds):await qe.assign($.selectedAccountsIds,k.value,{returnError:!0}),O("accounts-moved")}return(n,h)=>{const z=N("RouterLink"),te=N("NavigationButton"),r=N("VueFooter"),B=N("StackLayout");return a(),M(B,null,{content:u(()=>[i("div",Tt,[i("div",Lt,c(n.$t("message.move_selected_to")),1),i("div",Rt,[i("div",Ft,[l(e(ee),null,{default:u(({mode:_})=>[(a(!0),d(q,null,ue(m.groups,C=>(a(),d(q,{key:C.id},[C.id>0?(a(),d("div",Ht,[i("button",{type:"button",class:p(["button is-fullwidth",{"is-link":e(k)===C.id,"is-dark has-text-light is-outlined":_=="dark"}]),onClick:j=>k.value=C.id},c(C.name),11,Kt)])):y("",!0)],64))),128)),i("div",jt,c(n.$t("message.or")),1),i("div",Qt,[i("button",{type:"button",class:p(["button is-fullwidth",{"is-link":e(k)===0,"is-dark has-text-light is-outlined":_=="dark"}]),onClick:h[0]||(h[0]=C=>k.value=0)},c(n.$t("label.remove_from_group")),3)])]),_:1})]),i("div",Xt,[i("div",Wt,[l(z,{to:{name:"groups"}},{default:u(()=>[U(c(n.$t("link.manage_groups")),1)]),_:1})])])])])]),footer:u(()=>[l(r,null,{default:u(()=>[i("p",Zt,[i("button",{type:"button",class:"button is-link is-rounded",onClick:f},c(n.$t("label.apply")),1)]),l(te,{action:"cancel",useLinkTag:!1,onCanceled:h[1]||(h[1]=_=>n.$emit("update:showDestinationGroupSelector",!1))})]),_:1})]),_:1})}}},Yt={class:"toolbar has-text-centered has-nowrap"},es={style:{"vertical-align":"sub"},class:"has-text-grey"},ts=["title"],ss=["title"],os=["title"],ns=["title"],is={__name:"Toolbar",props:ve({selectedCount:Number},{sortOrder:{},sortOrderModifiers:{}}),emits:ve(["sort-asc","sort-desc"],["update:sortOrder"]),setup(m,{emit:V}){const $=Ve(m,"sortOrder"),k=V;function O(f){$.value=f,k("sort-"+f)}return(f,n)=>(a(),d("div",Yt,[i("span",es,c(f.$t("message.x_selected",{count:m.selectedCount})),1),i("button",{style:ce([{"vertical-align":"middle"},{visibility:m.selectedCount>0?"visible":"hidden"}]),type:"button",id:"btnUnselectAll",onClick:n[0]||(n[0]=h=>f.$emit("clear-selected")),class:"clear-selection delete mr-4 ml-1",title:f.$t("tooltip.clear_selection")},null,12,ts),i("button",{type:"button",id:"btnSelectAll",onClick:n[1]||(n[1]=h=>f.$emit("select-all")),class:"button py-0 px-1 mr-5 has-line-height is-ghost has-text-grey pt-1",title:f.$t("tooltip.select_all")},[i("span",null,c(f.$t("label.check_all")),1),l(e(Et),{class:"ml-1"})],8,ss),i("button",{type:"button",id:"btnSortAscending",onClick:n[2]||(n[2]=h=>O("asc")),class:p([{"has-text-grey":$.value!="asc"},"button has-line-height p-0 is-ghost pt-1"]),title:f.$t("tooltip.sort_ascending")},[l(e(ft))],10,os),i("button",{type:"button",id:"btnSortDescending",onClick:n[3]||(n[3]=h=>O("desc")),class:p([{"has-text-grey":$.value!="desc"},"button has-line-height p-0 pl-2 is-ghost pt-1"]),title:f.$t("tooltip.sort_descending")},[l(e(kt))],10,ns)]))}},as={key:0,class:"control"},ls={class:"icon is-small"},rs={key:1,class:"control"},ds={key:2,class:"control"},us=["disabled","title"],cs={class:"is-hidden-desktop icon is-small mx-0"},ps={class:"is-hidden-touch"},hs={key:3,class:"control"},fs=["disabled","title"],ms={class:"is-hidden-desktop icon is-small mx-0"},ks={class:"is-hidden-touch"},ys={key:4,class:"control"},gs=["disabled","title"],_s={class:"is-hidden-desktop icon is-small mx-0"},vs={class:"is-hidden-touch"},bs={key:5,class:"control"},ws=["disabled","title"],$s={class:"is-hidden-desktop icon is-small mx-0"},Ms={class:"is-hidden-touch"},Ae={__name:"ActionButtons",props:{inManagementMode:{type:Boolean,default:!1},canMove:{type:Boolean,default:!0},showMove:{type:Boolean,default:!0},canDelete:{type:Boolean,default:!0},showDelete:{type:Boolean,default:!0},canUnshare:{type:Boolean,default:!0},showUnshare:{type:Boolean,default:!1},canExport:{type:Boolean,default:!0},showExport:{type:Boolean,default:!0},areDisabled:{type:Boolean,default:!1}},emits:["update:inManagementMode","move-button-clicked","delete-button-clicked","export-button-clicked","unshare-button-clicked"],setup(m,{emit:V}){const $=pe(),k=Oe();function O(){k.preferences.useDirectCapture&&k.preferences.defaultCaptureMode==="advancedForm"?$.push({name:"createAccount"}):k.preferences.useDirectCapture&&k.preferences.defaultCaptureMode==="livescan"?$.push({name:"capture"}):$.push({name:"start"})}return(f,n)=>(a(),M(e(ee),null,{default:u(({mode:h})=>[m.inManagementMode?y("",!0):(a(),d("p",as,[i("button",{type:"button",class:"button is-link is-rounded is-focus",onClick:O},[i("span",null,c(f.$t("label.new")),1),i("span",ls,[l(e(It))])])])),m.inManagementMode?y("",!0):(a(),d("p",rs,[i("button",{type:"button",id:"btnManage",class:p(["button is-rounded",{"is-dark":h=="dark"}]),onClick:n[0]||(n[0]=z=>f.$emit("update:inManagementMode",!0))},c(f.$t("label.manage")),3)])),m.inManagementMode&&m.showMove?(a(),d("p",ds,[i("button",{id:"btnMove",disabled:m.areDisabled||!m.canMove,class:p(["button is-rounded",[{"is-outlined":h=="dark"||m.areDisabled},m.areDisabled?"is-dark":"is-link"]]),onClick:n[1]||(n[1]=z=>f.$emit("move-button-clicked")),title:f.$t("tooltip.move_selected_to_group")},[i("span",cs,[l(e(Mt))]),i("span",ps,c(f.$t("label.move")),1)],10,us)])):y("",!0),m.inManagementMode&&m.showUnshare?(a(),d("p",hs,[i("button",{id:"btnShare",disabled:m.areDisabled||!m.canUnshare,class:p(["button is-rounded",[{"is-outlined":h=="dark"||m.areDisabled},m.areDisabled?"is-dark":"is-link"]]),onClick:n[2]||(n[2]=z=>f.$emit("unshare-button-clicked")),title:f.$t("tooltip.unshare_selected_accounts")},[i("span",ms,[l(e(Vt))]),i("span",ks,c(f.$t("label.unshare")),1)],10,fs)])):y("",!0),m.inManagementMode&&m.showDelete?(a(),d("p",ys,[i("button",{id:"btnDelete",disabled:m.areDisabled||!m.canDelete,class:p(["button is-rounded",[{"is-outlined":h=="dark"||m.areDisabled},m.areDisabled?"is-dark":"is-link"]]),onClick:n[3]||(n[3]=z=>f.$emit("delete-button-clicked")),title:f.$t("tooltip.delete_selected_accounts")},[i("span",_s,[l(e(Ue))]),i("span",vs,c(f.$t("label.delete")),1)],10,gs)])):y("",!0),m.inManagementMode&&m.showExport?(a(),d("p",bs,[i("button",{id:"btnExport",disabled:m.areDisabled||!m.canExport,class:p(["button is-rounded",[{"is-outlined":h=="dark"||m.areDisabled},m.areDisabled?"is-dark":"is-link"]]),onClick:n[4]||(n[4]=z=>f.$emit("export-button-clicked")),title:f.$t("tooltip.export_selected_accounts")},[i("span",$s,[l(e(At))]),i("span",Ms,c(f.$t("label.export")),1)],10,ws)])):y("",!0)]),_:1}))}},Ss={class:"block"},Cs={class:"has-text-weight-bold has-text-grey"},xs={class:"is-size-7-mobile"},As=["href"],Os=["title"],Ds={class:"block"},Us={class:"has-text-weight-bold has-text-grey"},Is={class:"is-size-7-mobile"},Gs=["title"],Es={__name:"ExportButtons",emits:["export-twofauth-format","export-otpauth-format"],setup(m,{emit:V}){pe();const $=De("2fauth");return(k,O)=>(a(),d(q,null,[i("div",Ss,[l(e(ee),null,{default:u(({mode:f})=>[i("p",Cs,c(k.$t("message.twofauth_export_format_sub")),1)]),_:1}),i("p",xs,[U(c(k.$t("message.twofauth_export_format_desc"))+" "+c(k.$t("message.twofauth_export_format_url"))+" ",1),i("a",{id:"lnkExportSchemaUrl",class:"is-link",tabindex:"0",href:e($).urls.exportSchemaUrl,target:"_blank"},c(k.$t("link.twofauth_export_schema")),9,As)]),i("button",{type:"button",id:"btnExport2FAuth",class:"button is-link is-rounded is-focus my-3",onClick:O[0]||(O[0]=f=>k.$emit("export-twofauth-format")),title:k.$t("tooltip.twofauth_export_format_sub")},c(k.$t("label.twofauth_export_format")),9,Os)]),i("div",Ds,[i("p",Us,c(k.$t("message.otpauth_export_format_sub")),1),i("p",Is,c(k.$t("message.otpauth_export_format_desc")),1),i("button",{type:"button",id:"btnExportOtpauth",class:"button is-link is-rounded is-focus my-3",onClick:O[1]||(O[1]=f=>k.$emit("export-otpauth-format")),title:k.$t("tooltip.otpauth_export_format_sub")},c(k.$t("label.otpauth_export_format")),9,Gs)])],64))}},Ns={key:0,class:"header"},zs={class:"columns is-gapless is-mobile is-centered"},Bs={class:"column is-three-quarters-mobile is-one-third-tablet is-one-quarter-desktop is-one-quarter-widescreen is-one-quarter-fullhd"},Ps={key:1,class:"has-text-centered"},qs={key:0},Vs=["title"],Ts={key:1},Ls={class:"my-5"},Rs={class:"accounts"},Fs={class:"tfa-container"},Hs={key:0,class:"tfa-cell tfa-checkbox"},Ks={class:"field"},js=["id","value","name"],Qs=["for","onKeypress"],Xs=["onClick","onKeyup"],Ws={class:"tfa-text has-ellipsis is-clickable"},Zs=["src"],Js=["src"],Ys={class:"is-block has-ellipsis is-family-primary is-size-6 is-size-7-mobile has-text-grey"},eo=["title"],to=["title"],so=["title"],oo={key:0,class:"py-1"},no={key:1,class:"py-1"},io={class:"has-text-right"},ao=["onClick"],lo=["onClick","onKeyup","title"],ro={key:1,class:"has-nowrap pt-1",style:{"line-height":".8rem"}},uo=["onClick","onKeyup","title"],co=["onClick","title"],po={key:0,class:"tfa-cell tfa-edit has-text-grey"},ho={key:1,class:"tfa-cell tfa-edit has-text-grey"},fo={key:0,class:"drag-handle tfa-cell tfa-dots has-text-grey"},mo=["onClick"],ko={class:"control"},yo={class:"control"},go={class:"ml-0 mt-1"},_o={key:0,class:"column"},vo={key:1,class:"column"},bo={class:"column"},wo={class:"column"},$o={class:"tags is-centered are-medium"},Mo=["title"],So={key:0,class:"has-text-grey"},Co={class:"mr-2 has-ellipsis"},xo={key:0},Po={__name:"Accounts",setup(m){const V=Te(),{t:$}=Le(),k=De("2fauth"),O=pe(),f=Qe(),n=Oe(),h=rt(),{copy:z,copied:te}=Re({legacy:!0}),r=Fe(),B=He(),_=Ke(),C=x(!1),j=x(!1),S=x(!1),G=x(!1),se=x(null),Q=x(null),he=x({}),P=x(!1),E=x(null),H=x(null),oe=x(null),X=x({otp_type:"",account:"",service:"",icon:"",secret:"",digits:null,algorithm:"",period:null,counter:null,image:""}),fe=x([]),ne=x([]);re(C,s=>{s==!1&&oe.value?.clearOTP()}),re(()=>r.items,s=>{h.inManagementMode&&ke()}),re(()=>h.inManagementMode,s=>{s&&ke()});const me=nt(()=>!r.isEmpty&&!S.value&&!G.value);je(async()=>{n.preferences.getOtpOnRequest?r.fetch().then(()=>{r.backendWasNewer&&f.info({text:$("notification.data_refreshed_to_reflect_server_changes"),duration:1e4})}):_e(),B.fetch()});function ke(){at("#dv",r.filtered,{animation:200,handle:".drag-handle",onUpdate:s=>{const o=r.filtered[s.oldIndex].id,g=r.items.findIndex(b=>b.id==o);lt(r.items,g,s.newIndex),J(()=>{r.saveOrder("free")})}})}function Ie(){r.fetch(),r.selectNone(),G.value=!1,f.success({text:$("notification.accounts_moved")})}function ye(s){X.value.otp_type=s.otp_type,X.value.service=s.service,X.value.account=s.account,X.value.icon=s.icon,E.value=s,J().then(()=>{C.value=!0,oe.value.show(s.id)})}function ge(s){h.inManagementMode?le(s):!n.preferences.getOtpOnRequest&&s.otp_type.includes("totp")?K(s.otp.password):ye(s)}function K(s){z(s),te&&(n.preferences.kickUserAfter==-1&&n.logout({kicked:!0}),n.preferences.clearSearchOnCopy&&(r.filter=""),n.preferences.viewDefaultGroupOnCopy&&(n.preferences.activeGroup=n.preferences.defaultGroup==-1?n.preferences.activeGroup:n.preferences.defaultGroup),f.success({text:$("notification.copied_to_clipboard")}))}async function Ge(s){Z.getOtpById(s.id).then(o=>{let g=o.data;if(K(g.password),g.otp_type=="hotp"){let b=r.items.find(D=>D.id==s.id);b!=null&&(b.counter=g.counter)}})}function ie(s,o){ne.value.filter(g=>g.props.period==s||s==null).forEach(g=>{g.turnOn(o)}),he.value[s]="is-opacity-"+o}function Ee(s){ne.value.filter(o=>o.props.period==s||s==null).forEach(o=>{o.turnOff()})}async function _e(s){let o;s==null?(se.value=-1,o=Z.getAll(!0)):(se.value=s,o=Z.getByIds(r.accountIdsWithPeriod(s).join(","),!0)),Ee(s);const g=r.items.filter(b=>b.otp_type.includes("totp")&&b.period==s&&b.otp.next_password);g.length>0&&(g.forEach(b=>{const D=r.items.findIndex(I=>I.id===b.id);r.items[D].otp.next_password&&(r.items[D].otp.password=r.items[D].otp.next_password)}),ie(s,0)),o.then(b=>{let D=0;b.data.forEach(I=>{if(I.otp_type.includes("totp")){const W=r.items.findIndex(T=>T.id===I.id);r.items[W]==null?r.items.push(I):r.items[W].otp=I.otp,D=I.otp.generated_at}}),fe.value.forEach(I=>{(I.props.period==s||s==null)&&J().then(()=>{I.startStepping(D)})})}).finally(()=>{se.value=null})}async function Ne(s){r.selectNone(),le(s),await r.deleteSelected(),r.isEmpty&&(h.inManagementMode=!1,O.push({name:"start"})),J().then(()=>{C.value=!1,P.value=!1})}async function ze(){await r.deleteSelected(),r.isEmpty&&(h.inManagementMode=!1,O.push({name:"start"}))}function Be(){h.inManagementMode=!1,r.selectNone()}function ae(s){n.preferences.activeGroup!=s&&(n.preferences.activeGroup=s),n.preferences.rememberActiveGroup&&ot.updatePreference("activeGroup",n.preferences.activeGroup)}function le(s){r.select(s.id)}async function Pe(){_.enableSharing&&confirm($("confirmation.bulk_unshare"))===!0&&r.selectedIds.forEach(s=>{const o=r.getById(s);o!=null&&(o.is_shared_with_all||o.is_shared)&&it.unshare(s).then(g=>{try{const b=r.items.findIndex(D=>D.id===s);delete r.items[b].is_shared,delete r.items[b].is_shared_with_all}catch(b){console.error(b)}})})}return(s,o)=>{const g=N("RouterLink"),b=N("NavigationButton"),D=N("VueFooter"),I=N("StackLayout"),W=N("Modal"),T=N("router-link");return a(),M(e(ee),null,{default:u(({mode:v})=>[i("div",null,[l(I,{shouldShrinkSubheader:e(n).preferences.useGroupChips},be({header:u(()=>[e(me)||e(S)?(a(),d("div",Ns,[i("div",zs,[i("div",Bs,[l(e(Je),{keyword:e(r).filter,"onUpdate:keyword":o[0]||(o[0]=t=>e(r).filter=t)},null,8,["keyword"])])])])):y("",!0)]),content:u(()=>[e(S)?(a(),M(e(Xe),{key:0,"is-visible":e(S),"onUpdate:isVisible":o[10]||(o[10]=t=>L(S)?S.value=t:null),"active-group":e(n).preferences.activeGroup,"onUpdate:activeGroup":o[11]||(o[11]=t=>e(n).preferences.activeGroup=t),groups:e(B).items,useShare:e(_).enableSharing,useShareAllScope:e(_).enableAllUsersSharingScope,onActiveGroupChanged:ae},{default:u(()=>[e(B).items.length<2?(a(),d(q,{key:0},[i("p",Ls,c(s.$t("message.no_group_yet")),1),l(g,{to:{name:"createGroup"}},{default:u(()=>[U(c(s.$t("link.create_your_first_group")),1)]),_:1})],64)):y("",!0)]),_:1},8,["is-visible","active-group","groups","useShare","useShareAllScope"])):y("",!0),e(G)?(a(),M(Jt,{key:1,showDestinationGroupSelector:e(G),"onUpdate:showDestinationGroupSelector":o[12]||(o[12]=t=>L(G)?G.value=t:null),selectedAccountsIds:e(r).selectedIds,"onUpdate:selectedAccountsIds":o[13]||(o[13]=t=>e(r).selectedIds=t),groups:e(B).items,onAccountsMoved:Ie},null,8,["showDestinationGroupSelector","selectedAccountsIds","groups"])):y("",!0),e(me)?(a(),d("div",{key:2,class:p(["accounts-container",e(h).inManagementMode?"is-edit-mode":""])},[i("div",Rs,[i("span",{id:"dv",class:p(["columns is-multiline m-0",{"is-centered":e(n).preferences.displayMode==="grid"}])},[(a(!0),d(q,null,ue(e(r).filtered,t=>(a(),d("div",{class:p([[e(n).preferences.displayMode==="grid"?"tfa-grid":"tfa-list"],"column is-narrow"]),key:t.id},[i("div",Fs,[l(R,{name:"slideCheckbox"},{default:u(()=>[e(h).inManagementMode?(a(),d("div",Hs,[i("div",Ks,[de(i("input",{class:p(["is-checkradio is-small",v=="dark"?"is-white":"is-info"]),id:"ckb_"+t.id,value:t.id,type:"checkbox",name:"ckb_"+t.id,"onUpdate:modelValue":o[14]||(o[14]=w=>e(r).selectedIds=w)},null,10,js),[[We,e(r).selectedIds]]),i("label",{tabindex:"0",for:"ckb_"+t.id,onKeypress:Y(F(w=>le(t),["prevent"]),["space"])},null,40,Qs)])])):y("",!0)]),_:2},1024),i("div",{tabindex:"0",class:"tfa-cell tfa-content is-size-3 is-size-4-mobile",onClick:[F(w=>ge(t),["exact"]),F(w=>Ge(t),["ctrl"])],onKeyup:Y(w=>ge(t),["enter"]),role:"button"},[i("div",Ws,[t.icon&&e(n).preferences.showAccountsIcons?(a(),d("img",{key:0,role:"presentation",class:"tfa-icon",src:e(k).config.subdirectory+"/storage/icons/"+t.icon,alt:""},null,8,Zs)):t.icon==null&&e(n).preferences.showAccountsIcons?(a(),d("img",{key:1,role:"presentation",class:"tfa-icon",src:e(k).config.subdirectory+"/storage/noicon.svg",alt:""},null,8,Js)):y("",!0),U(" "+c(t.service?t.service:s.$t("message.no_service")),1),t.account===s.$t("error.indecipherable")?(a(),M(e(dt),{key:2,class:"has-text-danger ml-2"})):y("",!0),i("span",Ys,[e(_).enableSharing&&t.is_borrowed?(a(),d("span",{key:0,title:s.$t("tooltip.this_account_is_shared_by_x_with_you",{username:t.borrowed_by}),class:p(["tag p-1 mr-1",v=="dark"?"is-black is-opacity-4":"is-light is-white"])}," @"+c(e(h).inManagementMode?t.borrowed_by:""),11,eo)):e(_).enableSharing&&t.is_shared?(a(),d("span",{key:1,title:s.$t("tooltip.this_account_is_shared_with_specific_users"),class:p(["tag p-1 mr-1",v=="dark"?"is-black is-opacity-4":"is-light is-white"])},[l(e(zt),{class:"icon-size-0-75"})],10,to)):e(_).enableSharing&&e(_).enableAllUsersSharingScope&&t.is_shared_with_all?(a(),d("span",{key:2,title:s.$t("tooltip.this_account_is_shared_with_all"),class:p(["tag p-1 mr-1",v=="dark"?"is-black is-opacity-4":"is-light is-white"])},[l(e(ct),{class:"icon-size-0-75"})],10,so)):y("",!0),U(" "+c(t.account),1)])])],40,Xs),e(_).enableSharing&&e(n).preferences.getOtpOnRequest==!1&&!e(h).inManagementMode&&e(H)===t.id?(a(),M(R,{key:0,name:"popLater"},{default:u(()=>[e(h).inManagementMode?y("",!0):(a(),d("div",{key:0,class:p(["has-text-grey action-container",{"mt-3":e(n).preferences.displayMode=="grid"}])},[t.is_shared||t.is_shared_with_all?(a(),d("div",oo,[t.is_shared?(a(),M(g,{key:0,to:{name:"shareAccount",params:{twofaccountId:t.id}},class:p(["tag is-rounded mr-1",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.share_with_new_users")},{default:u(()=>[l(e(xe),{class:"icon-size-1"})]),_:1},8,["to","class","title"])):y("",!0),l(g,{to:{name:"accountSharing",params:{twofaccountId:t.id}},class:p(["tag is-rounded",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.edit_sharing")},{default:u(()=>[l(e(Ce),{class:"icon-size-1"})]),_:1},8,["to","class","title"])])):(a(),d("div",no,[l(g,{to:{name:"accountSharing",params:{twofaccountId:t.id}},class:p(["tag is-rounded mr-1",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.share_this_account")},{default:u(()=>[U(c(s.$t("label.share")),1)]),_:1},8,["to","class","title"])])),i("div",null,[l(g,{id:"lnkTransferOwnership",to:{name:"transferOwnership",params:{twofaccountId:t.id}},class:p(["tag is-rounded",v=="dark"?"is-dark":"is-white"]),title:s.$t("link.transfer_ownership")},{default:u(()=>[U(c(s.$t("label.transfer_ownership")),1)]),_:1},8,["to","class","title"])])],2))]),_:2},1024)):(a(),d(q,{key:1},[t.otp_type.includes("totp")&&e(n).preferences.showOtpAsDot&&e(n).preferences.revealDottedOTP?(a(),M(R,{key:0,name:"popLater"},{default:u(()=>[de(i("div",io,[e(Q)==t.id?(a(),d("button",{key:0,type:"button",class:"pr-0 button is-ghost has-text-grey-dark",onClick:o[15]||(o[15]=F(w=>Q.value=null,["stop"]))},[l(e(wt))])):(a(),d("button",{key:1,type:"button",class:"pr-0 button is-ghost has-text-grey-dark",onClick:F(w=>Q.value=t.id,["stop"])},[l(e(vt))],8,ao))],512),[[we,e(n).preferences.getOtpOnRequest==!1&&!e(h).inManagementMode]])]),_:2},1024)):y("",!0),l(R,{name:"popLater"},{default:u(()=>[de(i("div",{class:p({"has-text-right":e(n).preferences.displayMode=="list"})},[t.otp!=null?(a(),d(q,{key:0},[i("div",{class:p(["always-on-otp is-clickable has-nowrap has-text-grey is-size-5",{"mt-4":e(n).preferences.displayMode=="grid","ml-4":e(n).preferences.displayMode!="grid","pt-2":e(n).preferences.showNextOtp}]),onClick:w=>K(t.otp.password),onKeyup:Y(w=>K(t.otp.password),["enter"]),style:ce({lineHeight:e(n).preferences.showNextOtp?"1rem":"inherit"}),title:s.$t("tooltip.copy_to_clipboard")},c(e($e)(t.otp.password,e(n).preferences.formatPassword,e(n).preferences.formatPasswordBy,e(n).preferences.showOtpAsDot,e(n).preferences.revealDottedOTP&&e(Q)==t.id)),47,lo),t.otp_type.includes("totp")?(a(),d("div",{key:0,class:"has-nowrap",style:ce({lineHeight:e(n).preferences.showNextOtp?"1rem":"inherit"})},[l(e(Ze),{ref_for:!0,ref_key:"dotsRefs",ref:ne,class:p("is-inline-block"),isCondensed:!0,period:t.period},null,8,["period"])],4)):y("",!0),e(n).preferences.showNextOtp?(a(),d("div",ro,[i("span",{class:p(["always-on-otp is-clickable has-nowrap has-text-grey is-size-7",e(he)[t.period]]),onClick:w=>K(t.otp.next_password),onKeyup:Y(w=>K(t.otp.next_password),["enter"]),title:s.$t("tooltip.copy_next_password")},c(e($e)(t.otp.next_password,e(n).preferences.formatPassword,e(n).preferences.formatPasswordBy,e(n).preferences.showOtpAsDot,e(n).preferences.revealDottedOTP&&e(Q)==t.id)),43,uo)])):y("",!0)],64)):(a(),d("div",{key:1,class:p({"mt-5":e(n).preferences.displayMode=="grid"})},[i("button",{type:"button",class:p(["button tag",v=="dark"?"is-dark":"is-white"]),onClick:w=>ye(t),title:s.$t("tooltip.import_this_account")},c(s.$t("label.generate")),11,co)],2))],2),[[we,e(n).preferences.getOtpOnRequest==!1&&!e(h).inManagementMode]])]),_:2},1024)],64)),l(R,{name:"fadeInOut"},{default:u(()=>[e(h).inManagementMode&&e(_).enableSharing&&e(n).preferences.activeGroup==-2?(a(),d("div",po,[t.is_shared?(a(),M(g,{key:0,to:{name:"shareAccount",params:{twofaccountId:t.id}},class:p(["tag is-rounded mr-1",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.share_with_new_users")},{default:u(()=>[l(e(xe),{class:"icon-size-1"})]),_:1},8,["to","class","title"])):y("",!0),l(g,{to:{name:"accountSharing",params:{twofaccountId:t.id}},class:p(["tag is-rounded",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.edit_sharing")},{default:u(()=>[l(e(Ce),{class:"icon-size-1"})]),_:1},8,["to","class","title"])])):e(h).inManagementMode&&!t.is_borrowed?(a(),d("div",ho,[l(g,{to:{name:"editAccount",params:{twofaccountId:t.id}},class:p(["tag is-rounded mr-1",v=="dark"?"is-dark":"is-white"])},{default:u(()=>[U(c(s.$t("link.edit")),1)]),_:1},8,["to","class"]),l(g,{to:{name:"showQRcode",params:{twofaccountId:t.id}},class:p(["tag is-rounded mr-1",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.show_qrcode")},{default:u(()=>[l(e(Se),{class:"icon-size-1"})]),_:1},8,["to","class","title"]),l(g,{to:{name:"otpLogs",params:{twofaccountId:t.id}},class:p(["tag is-rounded",v=="dark"?"is-dark":"is-white"]),title:s.$t("link.otp_generation_log")},{default:u(()=>[l(e(Ct),{class:"icon-size-1"})]),_:1},8,["to","class","title"])])):y("",!0)]),_:2},1024),l(R,{name:"fadeInOut"},{default:u(()=>[e(h).inManagementMode?(a(),d("div",fo,[l(e(Me))])):y("",!0)]),_:1}),l(R,{name:"popLater"},{default:u(()=>[e(_).enableSharing&&e(n).preferences.getOtpOnRequest==!1&&!e(h).inManagementMode&&!t.is_borrowed?(a(),d("div",{key:0,class:p(["tfa-cell has-text-grey-dark is-clickable",e(n).preferences.displayMode=="grid"?"mt-4":"ml-4"]),style:{"min-width":"20px"}},[e(H)==null||e(H)!=t.id?(a(),d("button",{key:0,onClick:w=>H.value=t.id,class:p(["button is-ghost p-0 has-text-grey-dark",v=="dark"?"has-text-grey-dark":"has-text-grey-light"])},[l(e(gt))],10,mo)):y("",!0),e(H)==t.id?(a(),d("button",{key:1,onClick:o[16]||(o[16]=w=>H.value=null),class:p(["button is-ghost p-0",v=="dark"?"has-text-grey-dark":"has-text-grey-light"])},[l(e(ut))],2)):y("",!0)],2)):y("",!0)]),_:2},1024)])],2))),128))],2)])],2)):y("",!0)]),_:2},[e(G)?void 0:{name:"subheader",fn:u(()=>[e(h).inManagementMode?(a(),M(is,{key:0,sortOrder:e(n).preferences.sortOrder,"onUpdate:sortOrder":o[1]||(o[1]=t=>e(n).preferences.sortOrder=t),selectedCount:e(r).selectedCount,onClearSelected:o[2]||(o[2]=t=>e(r).selectNone()),onSelectAll:o[3]||(o[3]=t=>e(r).selectAll()),onSortAsc:o[4]||(o[4]=t=>e(r).sortAsc()),onSortDesc:o[5]||(o[5]=t=>e(r).sortDesc())},null,8,["sortOrder","selectedCount"])):(a(),d("div",Ps,[e(S)?(a(),d("div",qs,[i("button",{type:"button",id:"btnHideGroupSwitch",title:s.$t("tooltip.hide_group_selector"),tabindex:"1",class:p(["button is-text is-like-text has-text-grey-dark",{"has-text-grey":v!="dark"}]),onClick:o[6]||(o[6]=F(t=>S.value=!e(S),["stop"]))},c(s.$t("label.select_accounts_to_show")),11,Vs)])):(a(),d("div",Ts,[e(n).preferences.useGroupChips?(a(),M(e(Ye),{key:0,"active-group":e(n).preferences.activeGroup,"onUpdate:activeGroup":o[7]||(o[7]=t=>e(n).preferences.activeGroup=t),"show-group-switch":e(S),"onUpdate:showGroupSwitch":o[8]||(o[8]=t=>L(S)?S.value=t:null),groups:e(B).items,filteredCount:e(r).filteredCount,useShare:e(_).enableSharing,useShareAllScope:e(_).enableAllUsersSharingScope,useVirtualChips:e(n).preferences.showVirtualChips,onActiveGroupChanged:ae},null,8,["active-group","show-group-switch","groups","filteredCount","useShare","useShareAllScope","useVirtualChips"])):(a(),M(e(et),{key:1,"show-group-switch":e(S),"onUpdate:showGroupSwitch":o[9]||(o[9]=t=>L(S)?S.value=t:null),activeGroup:e(n).preferences.activeGroup,currentGroup:e(B).current,filteredCount:e(r).filteredCount,useShare:e(_).enableSharing},null,8,["show-group-switch","activeGroup","currentGroup","filteredCount","useShare"]))]))]))]),key:"0"},e(S)?{name:"footer",fn:u(()=>[l(D,{"show-buttons":!0},{default:u(()=>[i("p",ko,[l(g,{class:"button is-link is-outlined is-rounded",to:{name:"createGroup"},title:s.$t("tooltip.create_new_group")},{default:u(()=>[U(c(s.$t("label.new")),1)]),_:1},8,["title"])]),i("p",yo,[l(g,{class:"button is-link is-outlined is-rounded",to:{name:"groups"},title:s.$t("tooltip.manage_your_groups")},{default:u(()=>[U(c(s.$t("link.manage")),1)]),_:1},8,["title"])]),l(b,{action:"close","use-link-tag":!1,onClosed:o[17]||(o[17]=t=>S.value=!1)})]),_:1})]),key:"1"}:e(G)?void 0:{name:"footer",fn:u(()=>[e(h).inManagementMode&&!e(G)?(a(),M(D,{key:0},{default:u(()=>[l(Ae,{inManagementMode:e(h).inManagementMode,"onUpdate:inManagementMode":o[18]||(o[18]=t=>e(h).inManagementMode=t),areDisabled:e(r).hasNoneSelected,canUnshare:e(r).hasOnlySharedSelected,showUnshare:e(_).enableSharing,canDelete:!e(r).hasBorrowedSelected,canExport:!e(r).hasBorrowedSelected,onMoveButtonClicked:o[19]||(o[19]=t=>G.value=!0),onDeleteButtonClicked:ze,onExportButtonClicked:o[20]||(o[20]=t=>j.value=!0),onUnshareButtonClicked:Pe},null,8,["inManagementMode","areDisabled","canUnshare","showUnshare","canDelete","canExport"])]),subpart:u(()=>[i("button",{type:"button",id:"lnkExitEdit",class:"button is-ghost is-like-text",onClick:F(Be,["stop"])},c(s.$t("label.done")),1)]),_:1})):(a(),M(D,{key:1},{default:u(()=>[l(Ae,{inManagementMode:e(h).inManagementMode,"onUpdate:inManagementMode":o[21]||(o[21]=t=>e(h).inManagementMode=t)},null,8,["inManagementMode"])]),_:1}))]),key:"2"}]),1032,["shouldShrinkSubheader"]),l(W,{"is-active":e(j),"onUpdate:isActive":o[24]||(o[24]=t=>L(j)?j.value=t:null)},{default:u(()=>[l(Es,{onExportTwofauthFormat:o[22]||(o[22]=t=>e(r).export()),onExportOtpauthFormat:o[23]||(o[23]=t=>e(r).export("otpauth"))})]),_:1},8,["is-active"]),l(W,{"is-active":e(C),"onUpdate:isActive":o[32]||(o[32]=t=>L(C)?C.value=t:null),"show-footer-menu":e(P),"onUpdate:showFooterMenu":o[33]||(o[33]=t=>L(P)?P.value=t:null)},be({default:u(()=>[l(e(tt),{ref_key:"otpDisplay",ref:oe,accountParams:e(X),preferences:e(n).preferences,twofaccountService:e(Z),iconPathPrefix:e(k).config.subdirectory,onPleaseCloseMe:o[25]||(o[25]=t=>{C.value=!1,P.value=!1}),onPleaseClearSearch:o[26]||(o[26]=t=>e(r).filter=""),onKickme:o[27]||(o[27]=t=>e(n).logout({kicked:!0})),onPleaseUpdateActiveGroup:ae,onOtpCopiedToClipboard:o[28]||(o[28]=t=>e(f).success({text:e($)("notification.copied_to_clipboard")})),onError:o[29]||(o[29]=t=>e(V).show(t))},null,8,["accountParams","preferences","twofaccountService","iconPathPrefix"])]),"footer-subpart":u(()=>[e(C)&&e(_).enableSharing&&e(E).is_borrowed?(a(),d("span",So,c(s.$t("message.shared_by_x",{username:e(E).borrowed_by})),1)):(a(),d("button",{key:1,type:"button",id:"btnActions",onClick:o[31]||(o[31]=t=>P.value=!e(P)),class:"button is-text is-like-text has-text-grey",style:{width:"100%"}},[i("span",Co,c(s.$t("label.actions")),1),e(P)?(a(),M(e(pt),{key:1})):(a(),M(e(Me),{key:0}))]))]),_:2},[e(C)&&!e(E).is_borrowed?{name:"footer-submenu",fn:u(()=>[i("ul",go,[e(_).enableSharing?(a(),d("li",_o,[l(T,{id:"lnkManageSharing",to:{name:"accountSharing",params:{twofaccountId:e(E).id}},class:"is-link"},{default:u(()=>[U(c(s.$t("link.manage_sharing")),1)]),_:1},8,["to"])])):y("",!0),e(_).enableSharing?(a(),d("li",vo,[l(T,{id:"lnkTransferOwnership",to:{name:"transferOwnership",params:{twofaccountId:e(E).id}},class:"is-link"},{default:u(()=>[U(c(s.$t("link.transfer_ownership")),1)]),_:1},8,["to"])])):y("",!0),i("li",bo,[l(T,{id:"lnkRead",to:{name:"otpLogs",params:{twofaccountId:e(E).id}},class:"is-link"},{default:u(()=>[U(c(s.$t("link.otp_generation_log")),1)]),_:1},8,["to"])]),i("li",wo,[i("div",$o,[l(T,{id:"lnkQrCode",to:{name:"showQRcode",params:{twofaccountId:e(E).id}},class:p(["tag is-rounded",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.show_qrcode")},{default:u(()=>[l(e(Se),{class:"icon-size-1"})]),_:1},8,["to","class","title"]),l(T,{id:"lnkEdit",to:{name:"editAccount",params:{twofaccountId:e(E).id}},class:p(["tag is-rounded mx-2",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.edit_account")},{default:u(()=>[l(e(Dt),{class:"icon-size-1"})]),_:1},8,["to","class","title"]),i("button",{id:"btnDelete",onClick:o[30]||(o[30]=t=>Ne(e(E))),class:p(["tag is-rounded",v=="dark"?"is-dark":"is-white"]),title:s.$t("tooltip.delete_account")},[l(e(Ue),{class:"icon-size-1"})],10,Mo)])])])]),key:"0"}:void 0]),1032,["is-active","show-footer-menu"]),e(n).preferences.getOtpOnRequest?y("",!0):(a(),d("span",xo,[(a(!0),d(q,null,ue(e(r).periods,t=>(a(),M(e(st),{ref_for:!0,ref_key:"dotsControllers",ref:fe,key:t.period,autostart:!1,period:t.period,generated_at:t.generated_at,onSteppingEnded:w=>_e(t.period),onSteppingStarted:w=>ie(t.period,w),onSteppedUp:w=>ie(t.period,w)},null,8,["period","generated_at","onSteppingEnded","onSteppingStarted","onSteppedUp"]))),128))]))])]),_:1})}}};export{Po as default}; diff --git a/public/build/assets/AppSetup-9GPB7B-I.js b/public/build/assets/AppSetup-9GPB7B-I.js new file mode 100644 index 0000000..2bffb03 --- /dev/null +++ b/public/build/assets/AppSetup-9GPB7B-I.js @@ -0,0 +1 @@ +import{ae as se,P as B,h as d,l as p,m as e,n as T,j as t,t as a,p as h,k as b,d as N,i as o,e as g,C as te,u as ne,a as ae,a8 as le,af as oe,o as ie,w as k,M as re,f as _,a7 as E,a4 as z,F as de,E as ue,ak as ce,$ as pe}from"./app-dvJP63FL.js";import{t as he}from"./tabs-BVx9tg1F.js";import{u as me}from"./appSettingsUpdater-D1Bq_3WB.js";import{C as fe}from"./check-CPGWPXZa.js";import{X as _e}from"./x-DQVIq0xP.js";import{_ as ge}from"./CopyButton-CgxgBp0c.js";import{u as be}from"./breakpoints-CyLcIEOu.js";import{c as ke}from"./createLucideIcon-DsaEAGzP.js";import{E as U}from"./external-link-CqpXNovN.js";const ve=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],ye=ke("send",ve),V=se("web"),I={getSystemInfos(u={}){return V.get("system/infos",{...u})},getLastRelease(u={}){return V.get("system/latestRelease",{...u})},sendTestEmail(u={}){return V.post("system/test-email",{},{...u})},clearCache(u={}){return V.get("system/clear-cache",{...u})},optimize(u={}){return V.get("system/optimize",{...u})}},$e={class:"columns is-mobile is-vcentered"},Se={class:"column is-narrow"},Ce={class:"column has-text-grey"},Ee={key:0,class:"mt-2 has-text-warning"},Ve={class:"is-size-7 is-link",href:"https://github.com/Bubka/2FAuth/releases"},we={key:1},Ie={key:2},Re={__name:"VersionChecker",setup(u){const v=B(),m=g(!1),c=g();async function w(){m.value=!0,c.value=void 0,await I.getLastRelease({returnError:!0}).then(r=>{v.latestRelease=r.data.newRelease,c.value=r.data.newRelease===null?null:r.data.newRelease===!1}).catch(()=>{c.value=null}),m.value=!1}return(r,i)=>(d(),p("div",$e,[e("div",Se,[e("button",{type:"button",class:T([t(m)?"is-loading":"","button is-link is-rounded is-small"]),onClick:w},a(r.$t("label.check_now")),3)]),e("div",Ce,[t(v).latestRelease?(d(),p("span",Ee,[i[0]||(i[0]=e("span",{class:"release-flag"},null,-1)),h(a(r.$t("message.x_is_available",{version:t(v).latestRelease}))+" ",1),e("a",Ve,a(r.$t("link.view_on_github")),1)])):b("",!0),t(c)?(d(),p("span",we,[t(c)?(d(),N(t(fe),{key:0,class:"mr-1 has-text-success inline"})):b("",!0),h(a(r.$t("message.you_are_up_to_date")),1)])):t(c)===null?(d(),p("span",Ie,[o(t(_e),{class:"mr-1 has-text-danger inline"}),h(a(r.$t("error.check_failed_try_later")),1)])):b("",!0)])]))}},Fe={key:0,class:"pr-5 settings-menu"},Ue={class:"menu"},Te={class:"menu-list"},Ne={class:"field"},De={class:"label",for:"btnTestEmail"},Le={class:"help"},ze={class:"help"},Be={class:"is-family-code has-text-info"},Ae={class:"columns is-mobile is-vcentered"},We={class:"column is-narrow"},Me={class:"icon is-small"},Pe={key:0,class:"about-debug box is-family-monospace is-size-7 is-shadowless"},je={class:"field"},He={class:"label",for:"lnkHealthCheck"},Qe={class:"help"},Xe={class:"field mb-5"},qe={class:"help ml-5"},Ge={class:"field mt-4"},Je={id:"lnkSharingDoc",class:"is-link",target:"_blank",href:"https://docs.2fauth.app/usage/2fa-sharing/"},Ke={class:"help"},Oe={class:"field mt-4"},Ye={id:"lnkIconsDoc",class:"is-link",target:"_blank",href:"https://docs.2fauth.app/usage/icons/"},Ze={class:"field"},xe={for:"btnClearCache",class:"label"},es={class:"help"},ss={class:"field mb-5 is-grouped"},ts={class:"control"},ns={class:"field"},as={for:"btnCopyEnvVars",class:"label"},ls={key:1,class:"about-debug box is-family-monospace is-size-7 is-shadowless"},os=["value"],is={class:"has-text-grey"},rs={key:2,class:"about-debug box is-family-monospace is-size-7 has-text-warning-dark is-shadowless"},bs={__name:"AppSetup",setup(u){const v=te(),{t:m}=ne(),c=re("2fauth"),w=ae(),r=pe(),i=B(),A=le(c.prefix+"returnTo","accounts"),{isLaptop:W}=be(),y=g(),D=g(null),R=g(!1),$=g(null),F=g(!1),M=c.config.subdirectory+"/up",P=location.hostname+c.config.subdirectory+"/up",j=E("heading-general"),H=E("heading-sharing"),Q=E("heading-storage"),X=E("heading-security"),q=E("heading-environment"),S=s=>{s&&s.scrollIntoView({behavior:"smooth"})};function G(){R.value=!0,$.value=null,I.sendTestEmail({returnError:!0}).then(s=>{r.success({text:m("notification.test_email_sent")})}).catch(s=>{s.response.status===424?$.value=s.response.data.details:v.show(s)}).finally(()=>{R.value=!1})}function J(){F.value=!0,I.clearCache().then(s=>{r.success({text:m("notification.cache_cleared")})}).finally(()=>{F.value=!1})}async function C(s,n){const{error:f}=await me(s,n);f==null&&r.success({text:m("notification.setting_saved")})}return oe(s=>{s.name.startsWith("admin.")||r.clear()}),ie(async()=>{await i.fetch(),I.getSystemInfos({returnError:!0}).then(s=>{y.value=s.data.common}).catch(()=>{y.value=null})}),(s,n)=>{const f=_("FormCheckbox"),K=_("i18n-t"),O=_("FormFieldError"),Y=_("ResponsiveWidthWrapper"),Z=_("NavigationButton"),x=_("VueFooter"),ee=_("StackLayout");return d(),N(ee,null,{header:k(()=>[o(t(ce),{tabs:t(he),"active-tab":"admin.appSetup",onTabSelected:n[0]||(n[0]=l=>("router"in s?s.router:t(z)).push({name:l}))},null,8,["tabs"])]),content:k(()=>[o(Y,null,{default:k(()=>[t(W)&&t(w).preferences.showQuickNavMenus?(d(),p("div",Fe,[e("aside",Ue,[e("ul",Te,[e("li",null,[e("button",{onClick:n[1]||(n[1]=l=>S(t(j)))},a(s.$t("heading.general")),1)]),e("li",null,[e("button",{onClick:n[2]||(n[2]=l=>S(t(H)))},a(s.$t("heading.sharing")),1)]),e("li",null,[e("button",{onClick:n[3]||(n[3]=l=>S(t(Q)))},a(s.$t("heading.storage")),1)]),e("li",null,[e("button",{onClick:n[4]||(n[4]=l=>S(t(X)))},a(s.$t("heading.security")),1)]),e("li",null,[e("button",{onClick:n[5]||(n[5]=l=>S(t(q)))},a(s.$t("heading.environment")),1)])])])])):b("",!0),e("form",null,[e("h4",{ref:"heading-general",class:"title is-4"},a(s.$t("heading.general")),513),o(f,{modelValue:t(i).checkForUpdate,"onUpdate:modelValue":[n[6]||(n[6]=l=>t(i).checkForUpdate=l),n[7]||(n[7]=l=>C("checkForUpdate",l))],fieldName:"checkForUpdate",label:"field.check_for_update",help:"field.check_for_update.help"},null,8,["modelValue"]),o(Re),e("div",Ne,[e("label",De,a(s.$t("field.test_email")),1),e("p",Le,a(s.$t("field.test_email.help")),1),e("p",ze,[o(K,{keypath:"message.email_will_be_send_to_x",tag:"span"},{email:k(()=>[e("span",Be,a(t(w).email),1)]),_:1})])]),e("div",Ae,[e("div",We,[e("button",{id:"btnTestEmail",type:"button",class:T([t(R)?"is-loading":"","button is-link is-rounded is-small"]),onClick:G},[e("span",Me,[o(t(ye),{class:"icon-size-1"})]),e("span",null,a(s.$t("label.send")),1)],2)])]),t($)?(d(),p("div",Pe,[t($)?(d(),N(O,{key:0,error:s.$t("error.email_sending_failed"),field:"testEmail"},null,8,["error"])):b("",!0),h(" "+a(t($)),1)])):b("",!0),e("div",je,[e("label",He,a(s.$t("field.health_endpoint")),1),e("p",Qe,a(s.$t("field.health_endpoint.help")),1)]),e("div",Xe,[e("a",{id:"lnkHealthCheck",class:"is-link",target:"_blank",href:M},[h(a(P)+" "),o(t(U))])]),e("h4",{ref:"heading-sharing",class:"title is-4 pt-5"},a(s.$t("heading.sharing")),513),o(f,{modelValue:t(i).enableSharing,"onUpdate:modelValue":[n[8]||(n[8]=l=>t(i).enableSharing=l),n[9]||(n[9]=l=>C("enableSharing",l))],fieldName:"enableSharing",label:"field.enable_sharing",help:"field.enable_sharing.help"},null,8,["modelValue"]),o(f,{modelValue:t(i).enableAllUsersSharingScope,"onUpdate:modelValue":[n[10]||(n[10]=l=>t(i).enableAllUsersSharingScope=l),n[11]||(n[11]=l=>C("enableAllUsersSharingScope",l))],fieldName:"enableAllUsersSharingScope",isDisabled:!t(i).enableSharing,isIndented:!0,label:"field.enable_all_users_sharing_scope",help:"field.enable_all_users_sharing_scope.help"},null,8,["modelValue","isDisabled"]),e("p",qe,a(s.$t("field.enable_all_users_sharing_scope.help_bis")),1),e("div",Ge,[e("a",Je,[h(a(s.$t("link.sharing_doc"))+" ",1),o(t(U))])]),e("h4",{ref:"heading-storage",class:"title is-4 pt-5"},a(s.$t("heading.storage")),513),o(f,{modelValue:t(i).storeIconsInDatabase,"onUpdate:modelValue":[n[12]||(n[12]=l=>t(i).storeIconsInDatabase=l),n[13]||(n[13]=l=>C("storeIconsInDatabase",l))],fieldName:"storeIconsInDatabase",label:"field.store_icon_to_database",help:"field.store_icon_to_database.help"},null,8,["modelValue"]),e("p",Ke,a(s.$t("field.store_icon_to_database.help_bis")),1),e("div",Oe,[e("a",Ye,[h(a(s.$t("link.icons_doc"))+" ",1),o(t(U))])]),e("h4",{ref:"heading-security",class:"title is-4 pt-5"},a(s.$t("heading.security")),513),o(f,{modelValue:t(i).useEncryption,"onUpdate:modelValue":[n[14]||(n[14]=l=>t(i).useEncryption=l),n[15]||(n[15]=l=>C("useEncryption",l))],fieldName:"useEncryption",label:"field.use_encryption",help:"field.use_encryption.help"},null,8,["modelValue"])]),e("h4",{ref:"heading-environment",class:"title is-4 pt-5"},a(s.$t("heading.environment")),513),e("div",Ze,[e("label",xe,a(s.$t("field.cache_management")),1),e("p",es,a(s.$t("field.cache_management.help")),1)]),e("div",ss,[e("p",ts,[e("button",{id:"btnClearCache",type:"button",class:T([t(F)?"is-loading":"","button is-link is-rounded is-small"]),onClick:J},a(s.$t("label.clear")),3)])]),e("div",ns,[e("label",as,a(s.$t("label.variables")),1)]),t(y)?(d(),p("div",ls,[o(ge,{id:"btnCopyEnvVars",token:t(D)?.innerText},null,8,["token"]),e("ul",{ref_key:"listInfos",ref:D,id:"listInfos"},[(d(!0),p(de,null,ue(t(y),(l,L)=>(d(),p("li",{value:l,key:L},[e("b",null,a(L),1),n[17]||(n[17]=h(": ",-1)),e("span",is,a(l),1)],8,os))),128))],512)])):t(y)===null?(d(),p("div",rs,a(s.$t("error.error_during_data_fetching")),1)):b("",!0)]),_:1})]),footer:k(()=>[o(x,null,{default:k(()=>[o(Z,{action:"close",onClosed:n[16]||(n[16]=l=>("router"in s?s.router:t(z)).push({name:t(A)})),"current-page-title":s.$t("title.admin.appSetup")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{bs as default}; diff --git a/public/build/assets/Auth-DslSg1a9.js b/public/build/assets/Auth-DslSg1a9.js new file mode 100644 index 0000000..582c8df --- /dev/null +++ b/public/build/assets/Auth-DslSg1a9.js @@ -0,0 +1 @@ +import{C as v,u as w,P as N,a8 as O,af as F,o as L,d as U,w as u,M as C,f as r,h as I,i as a,j as l,a4 as S,m,t as V,ak as W,e as $,al as B,$ as E}from"./app-dvJP63FL.js";import{t as M}from"./tabs-BVx9tg1F.js";import{u as P}from"./appSettingsUpdater-D1Bq_3WB.js";const j={class:"title is-4"},A={class:"title is-4 pt-4"},z={__name:"Auth",setup(T){const R=v(),{t:f}=w(),y=C("2fauth"),p=E(),s=N(),_=O(y.prefix+"returnTo","accounts"),d=$({restrictList:null,restrictRule:null});async function b(o,e){d.value[o]=null,e==""?B.delete(o,{returnError:!0}).then(i=>{s[o]="",p.success({type:"is-success",text:f("notification.setting_saved")})}).catch(i=>{i.response.status!==404&&R.show(i)}):n(o,e)}async function n(o,e){const{error:i}=await P(o,e,!0);i!=null&&Object.prototype.hasOwnProperty.call(d.value,o)?d.value[o]=i.response.data.message:p.success({text:f("notification.setting_saved")})}return F(o=>{o.name.startsWith("admin.")||p.clear()}),L(async()=>{await s.fetch()}),(o,e)=>{const i=r("FormCheckbox"),g=r("FormField"),c=r("FormWrapper"),h=r("NavigationButton"),D=r("VueFooter"),k=r("StackLayout");return I(),U(k,null,{header:u(()=>[a(l(W),{tabs:l(M),"active-tab":"admin.auth",onTabSelected:e[0]||(e[0]=t=>("router"in o?o.router:l(S)).push({name:t}))},null,8,["tabs"])]),content:u(()=>[a(c,null,{default:u(()=>[m("form",null,[m("h4",j,V(o.$t("heading.single_sign_on")),1),a(i,{modelValue:l(s).enableSso,"onUpdate:modelValue":[e[1]||(e[1]=t=>l(s).enableSso=t),e[2]||(e[2]=t=>n("enableSso",t))],fieldName:"enableSso",label:"field.enable_sso",help:"field.enable_sso.help"},null,8,["modelValue"]),a(i,{modelValue:l(s).useSsoOnly,"onUpdate:modelValue":[e[3]||(e[3]=t=>l(s).useSsoOnly=t),e[4]||(e[4]=t=>n("useSsoOnly",t))],fieldName:"useSsoOnly",label:"field.use_sso_only",help:"field.use_sso_only.help",isDisabled:!l(s).enableSso,isIndented:!0},null,8,["modelValue","isDisabled"]),a(i,{modelValue:l(s).allowPatWhileSsoOnly,"onUpdate:modelValue":[e[5]||(e[5]=t=>l(s).allowPatWhileSsoOnly=t),e[6]||(e[6]=t=>n("allowPatWhileSsoOnly",t))],fieldName:"allowPatWhileSsoOnly",label:"field.allow_pat_in_sso_only",help:"field.allow_pat_in_sso_only.help",isDisabled:!l(s).useSsoOnly,isIndented:!0},null,8,["modelValue","isDisabled"]),m("h4",A,V(o.$t("heading.registrations")),1),a(i,{modelValue:l(s).restrictRegistration,"onUpdate:modelValue":[e[7]||(e[7]=t=>l(s).restrictRegistration=t),e[8]||(e[8]=t=>n("restrictRegistration",t))],fieldName:"restrictRegistration",isDisabled:l(s).disableRegistration,label:"field.restrict_registration",help:"field.restrict_registration.help"},null,8,["modelValue","isDisabled"]),a(g,{modelValue:l(s).restrictList,"onUpdate:modelValue":e[9]||(e[9]=t=>l(s).restrictList=t),"onChange:modelValue":e[10]||(e[10]=t=>b("restrictList",t)),errorMessage:l(d).restrictList,fieldName:"restrictList",isDisabled:!l(s).restrictRegistration||l(s).disableRegistration,label:"field.restrict_list",help:"field.restrict_list.help",isIndented:!0},null,8,["modelValue","errorMessage","isDisabled"]),a(g,{modelValue:l(s).restrictRule,"onUpdate:modelValue":e[11]||(e[11]=t=>l(s).restrictRule=t),"onChange:modelValue":e[12]||(e[12]=t=>b("restrictRule",t)),errorMessage:l(d).restrictRule,fieldName:"restrictRule",isDisabled:!l(s).restrictRegistration||l(s).disableRegistration,label:"field.restrict_rule",help:"field.restrict_rule.help",isIndented:!0,leftIcon:"Slash",rightIcon:"Slash"},null,8,["modelValue","errorMessage","isDisabled"]),a(i,{modelValue:l(s).disableRegistration,"onUpdate:modelValue":[e[13]||(e[13]=t=>l(s).disableRegistration=t),e[14]||(e[14]=t=>n("disableRegistration",t))],fieldName:"disableRegistration",label:"field.disable_registration",help:"field.disable_registration.help"},null,8,["modelValue"]),a(i,{modelValue:l(s).keepSsoRegistrationEnabled,"onUpdate:modelValue":[e[15]||(e[15]=t=>l(s).keepSsoRegistrationEnabled=t),e[16]||(e[16]=t=>n("keepSsoRegistrationEnabled",t))],fieldName:"keepSsoRegistrationEnabled",isDisabled:!l(s).enableSso||!l(s).disableRegistration,label:"field.keep_sso_registration_enabled",help:"field.keep_sso_registration_enabled.help",isIndented:!0},null,8,["modelValue","isDisabled"])])]),_:1})]),footer:u(()=>[a(D,null,{default:u(()=>[a(h,{action:"close",onClosed:e[17]||(e[17]=t=>("router"in o?o.router:l(S)).push({name:l(_)})),"current-page-title":o.$t("title.admin.auth")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{z as default}; diff --git a/public/build/assets/Capture-BG6QMHLW.js b/public/build/assets/Capture-BG6QMHLW.js new file mode 100644 index 0000000..c626756 --- /dev/null +++ b/public/build/assets/Capture-BG6QMHLW.js @@ -0,0 +1,3 @@ +import{s as To,e as ae,v as Be,o as Rr,c as $o,l as ge,m as W,x as So,y as Vt,z as Fr,A as Po,B as Ht,h as he,C as Eo,u as Oo,r as Mo,i as de,w as Nt,j as K,D as _r,F as Ao,E as xo,G as ko,k as Tr,d as Do,f as lt,g as jo,t as Ee,n as $r,H as Ro,$ as Fo}from"./app-dvJP63FL.js";import{F as Io}from"./Form-ZbAUhXmz.js";import{_ as Wo}from"./QrContentDisplay-DiIjf7a_.js";import{u as Uo}from"./bus-ChE1sp8V.js";import{U as Lo}from"./index-BJsmINgd.js";import{c as vt}from"./createLucideIcon-DsaEAGzP.js";import"./external-link-CqpXNovN.js";const Ho=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",key:"18u6gg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]],No=vt("camera",Ho);const Vo=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],Bo=vt("lock",Vo);const zo=[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]],qo=vt("star",zo);const Go=[["path",{d:"M10.66 6H14a2 2 0 0 1 2 2v2.5l5.248-3.062A.5.5 0 0 1 22 7.87v8.196",key:"w8jjjt"}],["path",{d:"M16 16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2",key:"1xawa7"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Jo=vt("video-off",Go);var Ir=(r,i,a)=>{if(!i.has(r))throw TypeError("Cannot "+a)},Sr=(r,i,a)=>(Ir(r,i,"read from private field"),a?a.call(r):i.get(r)),Yo=(r,i,a)=>{if(i.has(r))throw TypeError("Cannot add the same private member more than once");i instanceof WeakSet?i.add(r):i.set(r,a)},Qo=(r,i,a,c)=>(Ir(r,i,"write to private field"),i.set(r,a),a);const Wr=[["aztec","Aztec"],["code_128","Code128"],["code_39","Code39"],["code_93","Code93"],["codabar","Codabar"],["databar","DataBar"],["databar_expanded","DataBarExpanded"],["data_matrix","DataMatrix"],["dx_film_edge","DXFilmEdge"],["ean_13","EAN-13"],["ean_8","EAN-8"],["itf","ITF"],["maxi_code","MaxiCode"],["micro_qr_code","MicroQRCode"],["pdf417","PDF417"],["qr_code","QRCode"],["rm_qr_code","rMQRCode"],["upc_a","UPC-A"],["upc_e","UPC-E"],["linear_codes","Linear-Codes"],["matrix_codes","Matrix-Codes"]],Xo=[...Wr,["unknown"]].map(r=>r[0]),ft=new Map(Wr);function Ko(r){for(const[i,a]of ft)if(r===a)return i;return"unknown"}function Zo(r){if(Ur(r))return{width:r.naturalWidth,height:r.naturalHeight};if(Lr(r))return{width:r.width.baseVal.value,height:r.height.baseVal.value};if(Hr(r))return{width:r.videoWidth,height:r.videoHeight};if(Vr(r))return{width:r.width,height:r.height};if(zr(r))return{width:r.displayWidth,height:r.displayHeight};if(Nr(r))return{width:r.width,height:r.height};if(Br(r))return{width:r.width,height:r.height};throw new TypeError("The provided value is not of type '(Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElement or VideoFrame)'.")}function Ur(r){try{return r instanceof HTMLImageElement}catch{return!1}}function Lr(r){try{return r instanceof SVGImageElement}catch{return!1}}function Hr(r){try{return r instanceof HTMLVideoElement}catch{return!1}}function Nr(r){try{return r instanceof HTMLCanvasElement}catch{return!1}}function Vr(r){try{return r instanceof ImageBitmap}catch{return!1}}function Br(r){try{return r instanceof OffscreenCanvas}catch{return!1}}function zr(r){try{return r instanceof VideoFrame}catch{return!1}}function qr(r){try{return r instanceof Blob}catch{return!1}}function ei(r){try{return r instanceof ImageData}catch{return!1}}function ti(r,i){try{const a=new OffscreenCanvas(r,i);if(a.getContext("2d")instanceof OffscreenCanvasRenderingContext2D)return a;throw void 0}catch{const c=document.createElement("canvas");return c.width=r,c.height=i,c}}async function Gr(r){if(Ur(r)&&!await oi(r))throw new DOMException("Failed to load or decode HTMLImageElement.","InvalidStateError");if(Lr(r)&&!await ii(r))throw new DOMException("Failed to load or decode SVGImageElement.","InvalidStateError");if(zr(r)&&si(r))throw new DOMException("VideoFrame is closed.","InvalidStateError");if(Hr(r)&&(r.readyState===0||r.readyState===1))throw new DOMException("Invalid element or state.","InvalidStateError");if(Vr(r)&&ui(r))throw new DOMException("The image source is detached.","InvalidStateError");const{width:i,height:a}=Zo(r);if(i===0||a===0)return null;const c=ti(i,a).getContext("2d");c.drawImage(r,0,0);try{return c.getImageData(0,0,i,a)}catch{throw new DOMException("Source would taint origin.","SecurityError")}}async function ri(r){let i;try{if(globalThis.createImageBitmap)i=await createImageBitmap(r);else if(globalThis.Image){i=new Image;let a="";try{a=URL.createObjectURL(r),i.src=a,await i.decode()}finally{URL.revokeObjectURL(a)}}else return r}catch{throw new DOMException("Failed to load or decode Blob.","InvalidStateError")}return await Gr(i)}function ni(r){const{width:i,height:a}=r;if(i===0||a===0)return null;const c=r.getContext("2d");try{return c.getImageData(0,0,i,a)}catch{throw new DOMException("Source would taint origin.","SecurityError")}}async function ai(r){if(qr(r))return await ri(r);if(ei(r)){if(ci(r))throw new DOMException("The image data has been detached.","InvalidStateError");return r}return Nr(r)||Br(r)?ni(r):await Gr(r)}async function oi(r){try{return await r.decode(),!0}catch{return!1}}async function ii(r){var i;try{return await((i=r.decode)==null?void 0:i.call(r)),!0}catch{return!1}}function si(r){return r.format===null}function ci(r){return r.data.buffer.byteLength===0}function ui(r){return r.width===0&&r.height===0}function Pr(r,i){return r instanceof DOMException?new DOMException(`${i}: ${r.message}`,r.name):r instanceof Error?new r.constructor(`${i}: ${r.message}`):new Error(`${i}: ${r}`)}const Er=["Aztec","Codabar","Code128","Code39","Code93","DataBar","DataBarExpanded","DataMatrix","DXFilmEdge","EAN-13","EAN-8","ITF","Linear-Codes","Matrix-Codes","MaxiCode","MicroQRCode","None","PDF417","QRCode","rMQRCode","UPC-A","UPC-E"];function li(r){return r.join("|")}function di(r){const i=Or(r);let a=0,c=Er.length-1;for(;a<=c;){const f=Math.floor((a+c)/2),p=Er[f],m=Or(p);if(m===i)return p;m{const a=r.match(/_(.+?)\.wasm$/);return a?`https://fastly.jsdelivr.net/npm/zxing-wasm@1.1.3/dist/${a[1]}/${r}`:i+r}};let Mr=new WeakMap;function Bt(r,i){var a;const c=Mr.get(r);if(c!=null&&c.modulePromise&&i===void 0)return c.modulePromise;const f=(a=c?.moduleOverrides)!=null?a:gi,p=r({...f});return Mr.set(r,{moduleOverrides:f,modulePromise:p}),p}async function wi(r,i,a=De){const c={...De,...a},f=await Bt(r),{size:p}=i,m=new Uint8Array(await i.arrayBuffer()),$=f._malloc(p);f.HEAPU8.set(m,$);const h=f.readBarcodesFromImage($,p,Jr(f,c));f._free($);const y=[];for(let C=0;C{var r=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return function(i={}){var a=i,c,f;a.ready=new Promise((e,t)=>{c=e,f=t});var p=Object.assign({},a),m="./this.program",$=typeof window=="object",h=typeof importScripts=="function";typeof process=="object"&&typeof process.versions=="object"&&process.versions.node;var y="";function C(e){return a.locateFile?a.locateFile(e,y):y+e}var b;($||h)&&(h?y=self.location.href:typeof document<"u"&&document.currentScript&&(y=document.currentScript.src),r&&(y=r),y.indexOf("blob:")!==0?y=y.substr(0,y.replace(/[?#].*/,"").lastIndexOf("/")+1):y="",h&&(b=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)})),a.print||console.log.bind(console);var x=a.printErr||console.error.bind(console);Object.assign(a,p),p=null,a.arguments&&a.arguments,a.thisProgram&&(m=a.thisProgram),a.quit&&a.quit;var D;a.wasmBinary&&(D=a.wasmBinary),typeof WebAssembly!="object"&&re("no native wasm support detected");var k,R=!1,I,U,ie,P,T,M,Z,te;function se(){var e=k.buffer;a.HEAP8=I=new Int8Array(e),a.HEAP16=ie=new Int16Array(e),a.HEAPU8=U=new Uint8Array(e),a.HEAPU16=P=new Uint16Array(e),a.HEAP32=T=new Int32Array(e),a.HEAPU32=M=new Uint32Array(e),a.HEAPF32=Z=new Float32Array(e),a.HEAPF64=te=new Float64Array(e)}var G=[],je=[],Re=[];function qe(){if(a.preRun)for(typeof a.preRun=="function"&&(a.preRun=[a.preRun]);a.preRun.length;)gt(a.preRun.shift());_t(G)}function mt(){_t(je)}function yt(){if(a.postRun)for(typeof a.postRun=="function"&&(a.postRun=[a.postRun]);a.postRun.length;)Fe(a.postRun.shift());_t(Re)}function gt(e){G.unshift(e)}function wt(e){je.unshift(e)}function Fe(e){Re.unshift(e)}var ce=0,$e=null;function Ge(e){var t;ce++,(t=a.monitorRunDependencies)===null||t===void 0||t.call(a,ce)}function we(e){var t;if(ce--,(t=a.monitorRunDependencies)===null||t===void 0||t.call(a,ce),ce==0&&$e){var n=$e;$e=null,n()}}function re(e){var t;(t=a.onAbort)===null||t===void 0||t.call(a,e),e="Aborted("+e+")",x(e),R=!0,e+=". Build with -sASSERTIONS for more info.";var n=new WebAssembly.RuntimeError(e);throw f(n),n}var bt="data:application/octet-stream;base64,",Je=e=>e.startsWith(bt),be;be="zxing_reader.wasm",Je(be)||(be=C(be));function Ye(e){if(e==be&&D)return new Uint8Array(D);if(b)return b(e);throw"both async and sync fetching of the wasm failed"}function Ct(e){return!D&&($||h)&&typeof fetch=="function"?fetch(e,{credentials:"same-origin"}).then(t=>{if(!t.ok)throw"failed to load wasm binary file at '"+e+"'";return t.arrayBuffer()}).catch(()=>Ye(e)):Promise.resolve().then(()=>Ye(e))}function Qe(e,t,n){return Ct(e).then(o=>WebAssembly.instantiate(o,t)).then(o=>o).then(n,o=>{x(`failed to asynchronously prepare wasm: ${o}`),re(o)})}function fn(e,t,n,o){return!e&&typeof WebAssembly.instantiateStreaming=="function"&&!Je(t)&&typeof fetch=="function"?fetch(t,{credentials:"same-origin"}).then(s=>{var u=WebAssembly.instantiateStreaming(s,n);return u.then(o,function(l){return x(`wasm streaming compile failed: ${l}`),x("falling back to ArrayBuffer instantiation"),Qe(t,n,o)})}):Qe(t,n,o)}function hn(){var e={a:eo};function t(o,s){return J=o.exports,k=J.ia,se(),tr=J.ma,wt(J.ja),we(),J}Ge();function n(o){t(o.instance)}if(a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(o){x(`Module.instantiateWasm callback failed with error: ${o}`),f(o)}return fn(D,be,e,n).catch(f),{}}var _t=e=>{for(;e.length>0;)e.shift()(a)};a.noExitRuntime;var Xe=[],Ke=0,pn=e=>{var t=new Tt(e);return t.get_caught()||(t.set_caught(!0),Ke--),t.set_rethrown(!1),Xe.push(t),vr(t.excPtr),t.get_exception_ptr()},ve=0,vn=()=>{L(0,0);var e=Xe.pop();pr(e.excPtr),ve=0};function Tt(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(t){M[this.ptr+4>>2]=t},this.get_type=function(){return M[this.ptr+4>>2]},this.set_destructor=function(t){M[this.ptr+8>>2]=t},this.get_destructor=function(){return M[this.ptr+8>>2]},this.set_caught=function(t){t=t?1:0,I[this.ptr+12>>0]=t},this.get_caught=function(){return I[this.ptr+12>>0]!=0},this.set_rethrown=function(t){t=t?1:0,I[this.ptr+13>>0]=t},this.get_rethrown=function(){return I[this.ptr+13>>0]!=0},this.init=function(t,n){this.set_adjusted_ptr(0),this.set_type(t),this.set_destructor(n)},this.set_adjusted_ptr=function(t){M[this.ptr+16>>2]=t},this.get_adjusted_ptr=function(){return M[this.ptr+16>>2]},this.get_exception_ptr=function(){var t=yr(this.get_type());if(t)return M[this.excPtr>>2];var n=this.get_adjusted_ptr();return n!==0?n:this.excPtr}}var mn=e=>{throw ve||(ve=e),ve},$t=e=>{var t=ve;if(!t)return Ve(0),0;var n=new Tt(t);n.set_adjusted_ptr(t);var o=n.get_type();if(!o)return Ve(0),t;for(var s in e){var u=e[s];if(u===0||u===o)break;var l=n.ptr+16;if(mr(u,o,l))return Ve(u),t}return Ve(o),t},yn=()=>$t([]),gn=e=>$t([e]),wn=(e,t)=>$t([e,t]),bn=()=>{var e=Xe.pop();e||re("no exception to throw");var t=e.excPtr;throw e.get_rethrown()||(Xe.push(e),e.set_rethrown(!0),e.set_caught(!1),Ke++),ve=t,ve},Cn=(e,t,n)=>{var o=new Tt(e);throw o.init(t,n),ve=e,Ke++,ve},_n=()=>Ke,Ze={},St=e=>{for(;e.length;){var t=e.pop(),n=e.pop();n(t)}};function Pt(e){return this.fromWireType(T[e>>2])}var Oe={},Se={},et={},qt,tt=e=>{throw new qt(e)},Pe=(e,t,n)=>{e.forEach(function(d){et[d]=t});function o(d){var v=n(d);v.length!==e.length&&tt("Mismatched type converter count");for(var w=0;w{Se.hasOwnProperty(d)?s[v]=Se[d]:(u.push(d),Oe.hasOwnProperty(d)||(Oe[d]=[]),Oe[d].push(()=>{s[v]=Se[d],++l,l===u.length&&o(s)}))}),u.length===0&&o(s)},Tn=e=>{var t=Ze[e];delete Ze[e];var n=t.rawConstructor,o=t.rawDestructor,s=t.fields,u=s.map(l=>l.getterReturnType).concat(s.map(l=>l.setterArgumentType));Pe([e],u,l=>{var d={};return s.forEach((v,w)=>{var _=v.fieldName,E=l[w],O=v.getter,A=v.getterContext,H=l[w+s.length],z=v.setter,F=v.setterContext;d[_]={read:X=>E.fromWireType(O(A,X)),write:(X,g)=>{var S=[];z(F,X,H.toWireType(S,g)),St(S)}}}),[{name:t.name,fromWireType:v=>{var w={};for(var _ in d)w[_]=d[_].read(v);return o(v),w},toWireType:(v,w)=>{for(var _ in d)if(!(_ in w))throw new TypeError(`Missing field: "${_}"`);var E=n();for(_ in d)d[_].write(E,w[_]);return v!==null&&v.push(o,E),E},argPackAdvance:le,readValueFromPointer:Pt,destructorFunction:o}]})},$n=(e,t,n,o,s)=>{},Sn=()=>{for(var e=new Array(256),t=0;t<256;++t)e[t]=String.fromCharCode(t);Gt=e},Gt,Q=e=>{for(var t="",n=e;U[n];)t+=Gt[U[n++]];return t},Me,j=e=>{throw new Me(e)};function Pn(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};var o=t.name;if(e||j(`type "${o}" must have a positive integer typeid pointer`),Se.hasOwnProperty(e)){if(n.ignoreDuplicateRegistrations)return;j(`Cannot register type '${o}' twice`)}if(Se[e]=t,delete et[e],Oe.hasOwnProperty(e)){var s=Oe[e];delete Oe[e],s.forEach(u=>u())}}function ue(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(!("argPackAdvance"in t))throw new TypeError("registerType registeredInstance requires argPackAdvance");return Pn(e,t,n)}var le=8,En=(e,t,n,o)=>{t=Q(t),ue(e,{name:t,fromWireType:function(s){return!!s},toWireType:function(s,u){return u?n:o},argPackAdvance:le,readValueFromPointer:function(s){return this.fromWireType(U[s])},destructorFunction:null})},On=e=>({count:e.count,deleteScheduled:e.deleteScheduled,preservePointerOnDelete:e.preservePointerOnDelete,ptr:e.ptr,ptrType:e.ptrType,smartPtr:e.smartPtr,smartPtrType:e.smartPtrType}),Et=e=>{function t(n){return n.$$.ptrType.registeredClass.name}j(t(e)+" instance already deleted")},Ot=!1,Jt=e=>{},Mn=e=>{e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)},Yt=e=>{e.count.value-=1;var t=e.count.value===0;t&&Mn(e)},Qt=(e,t,n)=>{if(t===n)return e;if(n.baseClass===void 0)return null;var o=Qt(e,t,n.baseClass);return o===null?null:n.downcast(o)},Xt={},An=()=>Object.keys(Ue).length,xn=()=>{var e=[];for(var t in Ue)Ue.hasOwnProperty(t)&&e.push(Ue[t]);return e},Ie=[],Mt=()=>{for(;Ie.length;){var e=Ie.pop();e.$$.deleteScheduled=!1,e.delete()}},We,kn=e=>{We=e,Ie.length&&We&&We(Mt)},Dn=()=>{a.getInheritedInstanceCount=An,a.getLiveInheritedInstances=xn,a.flushPendingDeletes=Mt,a.setDelayFunction=kn},Ue={},jn=(e,t)=>{for(t===void 0&&j("ptr should not be undefined");e.baseClass;)t=e.upcast(t),e=e.baseClass;return t},Rn=(e,t)=>(t=jn(e,t),Ue[t]),rt=(e,t)=>{(!t.ptrType||!t.ptr)&&tt("makeClassHandle requires ptr and ptrType");var n=!!t.smartPtrType,o=!!t.smartPtr;return n!==o&&tt("Both smartPtrType and smartPtr must be specified"),t.count={value:1},Le(Object.create(e,{$$:{value:t,writable:!0}}))};function Fn(e){var t=this.getPointee(e);if(!t)return this.destructor(e),null;var n=Rn(this.registeredClass,t);if(n!==void 0){if(n.$$.count.value===0)return n.$$.ptr=t,n.$$.smartPtr=e,n.clone();var o=n.clone();return this.destructor(e),o}function s(){return this.isSmartPointer?rt(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:e}):rt(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var u=this.registeredClass.getActualType(t),l=Xt[u];if(!l)return s.call(this);var d;this.isConst?d=l.constPointerType:d=l.pointerType;var v=Qt(t,this.registeredClass,d.registeredClass);return v===null?s.call(this):this.isSmartPointer?rt(d.registeredClass.instancePrototype,{ptrType:d,ptr:v,smartPtrType:this,smartPtr:e}):rt(d.registeredClass.instancePrototype,{ptrType:d,ptr:v})}var Le=e=>typeof FinalizationRegistry>"u"?(Le=t=>t,e):(Ot=new FinalizationRegistry(t=>{Yt(t.$$)}),Le=t=>{var n=t.$$,o=!!n.smartPtr;if(o){var s={$$:n};Ot.register(t,s,t)}return t},Jt=t=>Ot.unregister(t),Le(e)),In=()=>{Object.assign(nt.prototype,{isAliasOf(e){if(!(this instanceof nt)||!(e instanceof nt))return!1;var t=this.$$.ptrType.registeredClass,n=this.$$.ptr;e.$$=e.$$;for(var o=e.$$.ptrType.registeredClass,s=e.$$.ptr;t.baseClass;)n=t.upcast(n),t=t.baseClass;for(;o.baseClass;)s=o.upcast(s),o=o.baseClass;return t===o&&n===s},clone(){if(this.$$.ptr||Et(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var e=Le(Object.create(Object.getPrototypeOf(this),{$$:{value:On(this.$$)}}));return e.$$.count.value+=1,e.$$.deleteScheduled=!1,e},delete(){this.$$.ptr||Et(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&j("Object already scheduled for deletion"),Jt(this),Yt(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||Et(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&j("Object already scheduled for deletion"),Ie.push(this),Ie.length===1&&We&&We(Mt),this.$$.deleteScheduled=!0,this}})};function nt(){}var He=(e,t)=>Object.defineProperty(t,"name",{value:e}),Kt=(e,t,n)=>{if(e[t].overloadTable===void 0){var o=e[t];e[t]=function(){return e[t].overloadTable.hasOwnProperty(arguments.length)||j(`Function '${n}' called with an invalid number of arguments (${arguments.length}) - expects one of (${e[t].overloadTable})!`),e[t].overloadTable[arguments.length].apply(this,arguments)},e[t].overloadTable=[],e[t].overloadTable[o.argCount]=o}},At=(e,t,n)=>{a.hasOwnProperty(e)?((n===void 0||a[e].overloadTable!==void 0&&a[e].overloadTable[n]!==void 0)&&j(`Cannot register public name '${e}' twice`),Kt(a,e,e),a.hasOwnProperty(n)&&j(`Cannot register multiple overloads of a function with the same number of arguments (${n})!`),a[e].overloadTable[n]=t):(a[e]=t,n!==void 0&&(a[e].numArguments=n))},Wn=48,Un=57,Ln=e=>{if(e===void 0)return"_unknown";e=e.replace(/[^a-zA-Z0-9_]/g,"$");var t=e.charCodeAt(0);return t>=Wn&&t<=Un?`_${e}`:e};function Hn(e,t,n,o,s,u,l,d){this.name=e,this.constructor=t,this.instancePrototype=n,this.rawDestructor=o,this.baseClass=s,this.getActualType=u,this.upcast=l,this.downcast=d,this.pureVirtualFunctions=[]}var xt=(e,t,n)=>{for(;t!==n;)t.upcast||j(`Expected null or instance of ${n.name}, got an instance of ${t.name}`),e=t.upcast(e),t=t.baseClass;return e};function Nn(e,t){if(t===null)return this.isReference&&j(`null is not a valid ${this.name}`),0;t.$$||j(`Cannot pass "${Ft(t)}" as a ${this.name}`),t.$$.ptr||j(`Cannot pass deleted object as a pointer of type ${this.name}`);var n=t.$$.ptrType.registeredClass,o=xt(t.$$.ptr,n,this.registeredClass);return o}function Vn(e,t){var n;if(t===null)return this.isReference&&j(`null is not a valid ${this.name}`),this.isSmartPointer?(n=this.rawConstructor(),e!==null&&e.push(this.rawDestructor,n),n):0;(!t||!t.$$)&&j(`Cannot pass "${Ft(t)}" as a ${this.name}`),t.$$.ptr||j(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&j(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var o=t.$$.ptrType.registeredClass;if(n=xt(t.$$.ptr,o,this.registeredClass),this.isSmartPointer)switch(t.$$.smartPtr===void 0&&j("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?n=t.$$.smartPtr:j(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:n=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)n=t.$$.smartPtr;else{var s=t.clone();n=this.rawShare(n,me.toHandle(()=>s.delete())),e!==null&&e.push(this.rawDestructor,n)}break;default:j("Unsupporting sharing policy")}return n}function Bn(e,t){if(t===null)return this.isReference&&j(`null is not a valid ${this.name}`),0;t.$$||j(`Cannot pass "${Ft(t)}" as a ${this.name}`),t.$$.ptr||j(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&j(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var n=t.$$.ptrType.registeredClass,o=xt(t.$$.ptr,n,this.registeredClass);return o}function Zt(e){return this.fromWireType(M[e>>2])}var zn=()=>{Object.assign(at.prototype,{getPointee(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e},destructor(e){var t;(t=this.rawDestructor)===null||t===void 0||t.call(this,e)},argPackAdvance:le,readValueFromPointer:Zt,deleteObject(e){e!==null&&e.delete()},fromWireType:Fn})};function at(e,t,n,o,s,u,l,d,v,w,_){this.name=e,this.registeredClass=t,this.isReference=n,this.isConst=o,this.isSmartPointer=s,this.pointeeType=u,this.sharingPolicy=l,this.rawGetPointee=d,this.rawConstructor=v,this.rawShare=w,this.rawDestructor=_,!s&&t.baseClass===void 0?o?(this.toWireType=Nn,this.destructorFunction=null):(this.toWireType=Bn,this.destructorFunction=null):this.toWireType=Vn}var er=(e,t,n)=>{a.hasOwnProperty(e)||tt("Replacing nonexistant public symbol"),a[e].overloadTable!==void 0&&n!==void 0?a[e].overloadTable[n]=t:(a[e]=t,a[e].argCount=n)},qn=(e,t,n)=>{var o=a["dynCall_"+e];return n&&n.length?o.apply(null,[t].concat(n)):o.call(null,t)},ot=[],tr,N=e=>{var t=ot[e];return t||(e>=ot.length&&(ot.length=e+1),ot[e]=t=tr.get(e)),t},Gn=(e,t,n)=>{if(e.includes("j"))return qn(e,t,n);var o=N(t).apply(null,n);return o},Jn=(e,t)=>{var n=[];return function(){return n.length=0,Object.assign(n,arguments),Gn(e,t,n)}},oe=(e,t)=>{e=Q(e);function n(){return e.includes("j")?Jn(e,t):N(t)}var o=n();return typeof o!="function"&&j(`unknown function pointer with signature ${e}: ${t}`),o},Yn=(e,t)=>{var n=He(t,function(o){this.name=t,this.message=o;var s=new Error(o).stack;s!==void 0&&(this.stack=this.toString()+` +`+s.replace(/^Error(:[^\n]*)?\n/,""))});return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.prototype.toString=function(){return this.message===void 0?this.name:`${this.name}: ${this.message}`},n},rr,nr=e=>{var t=hr(e),n=Q(t);return ye(t),n},it=(e,t)=>{var n=[],o={};function s(u){if(!o[u]&&!Se[u]){if(et[u]){et[u].forEach(s);return}n.push(u),o[u]=!0}}throw t.forEach(s),new rr(`${e}: `+n.map(nr).join([", "]))},Qn=(e,t,n,o,s,u,l,d,v,w,_,E,O)=>{_=Q(_),u=oe(s,u),d&&(d=oe(l,d)),w&&(w=oe(v,w)),O=oe(E,O);var A=Ln(_);At(A,function(){it(`Cannot construct ${_} due to unbound types`,[o])}),Pe([e,t,n],o?[o]:[],function(H){H=H[0];var z,F;o?(z=H.registeredClass,F=z.instancePrototype):F=nt.prototype;var X=He(_,function(){if(Object.getPrototypeOf(this)!==g)throw new Me("Use 'new' to construct "+_);if(S.constructor_body===void 0)throw new Me(_+" has no accessible constructor");var Cr=S.constructor_body[arguments.length];if(Cr===void 0)throw new Me(`Tried to invoke ctor of ${_} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(S.constructor_body).toString()}) parameters instead!`);return Cr.apply(this,arguments)}),g=Object.create(F,{constructor:{value:X}});X.prototype=g;var S=new Hn(_,X,g,O,z,u,d,w);if(S.baseClass){var q,Y;(Y=(q=S.baseClass).__derivedClasses)!==null&&Y!==void 0||(q.__derivedClasses=[]),S.baseClass.__derivedClasses.push(S)}var Ae=new at(_,S,!0,!1,!1),ut=new at(_+"*",S,!1,!1,!1),br=new at(_+" const*",S,!1,!0,!1);return Xt[e]={pointerType:ut,constPointerType:br},er(A,X),[Ae,ut,br]})},kt=(e,t)=>{for(var n=[],o=0;o>2]);return n};function Xn(e){for(var t=1;t{var l=kt(t,n);s=oe(o,s),Pe([],[e],function(d){d=d[0];var v=`constructor ${d.name}`;if(d.registeredClass.constructor_body===void 0&&(d.registeredClass.constructor_body=[]),d.registeredClass.constructor_body[t-1]!==void 0)throw new Me(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${d.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return d.registeredClass.constructor_body[t-1]=()=>{it(`Cannot construct ${d.name} due to unbound types`,l)},Pe([],l,w=>(w.splice(1,0,null),d.registeredClass.constructor_body[t-1]=Dt(v,w,null,s,u),[])),[]})},ar=e=>{e=e.trim();const t=e.indexOf("(");return t!==-1?e.substr(0,t):e},Zn=(e,t,n,o,s,u,l,d,v)=>{var w=kt(n,o);t=Q(t),t=ar(t),u=oe(s,u),Pe([],[e],function(_){_=_[0];var E=`${_.name}.${t}`;t.startsWith("@@")&&(t=Symbol[t.substring(2)]),d&&_.registeredClass.pureVirtualFunctions.push(t);function O(){it(`Cannot call ${E} due to unbound types`,w)}var A=_.registeredClass.instancePrototype,H=A[t];return H===void 0||H.overloadTable===void 0&&H.className!==_.name&&H.argCount===n-2?(O.argCount=n-2,O.className=_.name,A[t]=O):(Kt(A,t,E),A[t].overloadTable[n-2]=O),Pe([],w,function(z){var F=Dt(E,z,_,u,l);return A[t].overloadTable===void 0?(F.argCount=n-2,A[t]=F):A[t].overloadTable[n-2]=F,[]}),[]})};function ea(){Object.assign(or.prototype,{get(e){return this.allocated[e]},has(e){return this.allocated[e]!==void 0},allocate(e){var t=this.freelist.pop()||this.allocated.length;return this.allocated[t]=e,t},free(e){this.allocated[e]=void 0,this.freelist.push(e)}})}function or(){this.allocated=[void 0],this.freelist=[]}var ne=new or,jt=e=>{e>=ne.reserved&&--ne.get(e).refcount===0&&ne.free(e)},ta=()=>{for(var e=0,t=ne.reserved;t{ne.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),ne.reserved=ne.allocated.length,a.count_emval_handles=ta},me={toValue:e=>(e||j("Cannot use deleted val. handle = "+e),ne.get(e).value),toHandle:e=>{switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return ne.allocate({refcount:1,value:e})}}},na=(e,t)=>{t=Q(t),ue(e,{name:t,fromWireType:n=>{var o=me.toValue(n);return jt(n),o},toWireType:(n,o)=>me.toHandle(o),argPackAdvance:le,readValueFromPointer:Pt,destructorFunction:null})},aa=(e,t,n)=>{switch(t){case 1:return n?function(o){return this.fromWireType(I[o>>0])}:function(o){return this.fromWireType(U[o>>0])};case 2:return n?function(o){return this.fromWireType(ie[o>>1])}:function(o){return this.fromWireType(P[o>>1])};case 4:return n?function(o){return this.fromWireType(T[o>>2])}:function(o){return this.fromWireType(M[o>>2])};default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},oa=(e,t,n,o)=>{t=Q(t);function s(){}s.values={},ue(e,{name:t,constructor:s,fromWireType:function(u){return this.constructor.values[u]},toWireType:(u,l)=>l.value,argPackAdvance:le,readValueFromPointer:aa(t,n,o),destructorFunction:null}),At(t,s)},Rt=(e,t)=>{var n=Se[e];return n===void 0&&j(t+" has unknown type "+nr(e)),n},ia=(e,t,n)=>{var o=Rt(e,"enum");t=Q(t);var s=o.constructor,u=Object.create(o.constructor.prototype,{value:{value:n},constructor:{value:He(`${o.name}_${t}`,function(){})}});s.values[n]=u,s[t]=u},Ft=e=>{if(e===null)return"null";var t=typeof e;return t==="object"||t==="array"||t==="function"?e.toString():""+e},sa=(e,t)=>{switch(t){case 4:return function(n){return this.fromWireType(Z[n>>2])};case 8:return function(n){return this.fromWireType(te[n>>3])};default:throw new TypeError(`invalid float width (${t}): ${e}`)}},ca=(e,t,n)=>{t=Q(t),ue(e,{name:t,fromWireType:o=>o,toWireType:(o,s)=>s,argPackAdvance:le,readValueFromPointer:sa(t,n),destructorFunction:null})},ua=(e,t,n,o,s,u,l)=>{var d=kt(t,n);e=Q(e),e=ar(e),s=oe(o,s),At(e,function(){it(`Cannot call ${e} due to unbound types`,d)},t-1),Pe([],d,function(v){var w=[v[0],null].concat(v.slice(1));return er(e,Dt(e,w,null,s,u),t-1),[]})},la=(e,t,n)=>{switch(t){case 1:return n?o=>I[o>>0]:o=>U[o>>0];case 2:return n?o=>ie[o>>1]:o=>P[o>>1];case 4:return n?o=>T[o>>2]:o=>M[o>>2];default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},da=(e,t,n,o,s)=>{t=Q(t);var u=_=>_;if(o===0){var l=32-8*n;u=_=>_<>>l}var d=t.includes("unsigned"),v=(_,E)=>{},w;d?w=function(_,E){return v(E,this.name),E>>>0}:w=function(_,E){return v(E,this.name),E},ue(e,{name:t,fromWireType:u,toWireType:w,argPackAdvance:le,readValueFromPointer:la(t,n,o!==0),destructorFunction:null})},fa=(e,t,n)=>{var o=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],s=o[t];function u(l){var d=M[l>>2],v=M[l+4>>2];return new s(I.buffer,v,d)}n=Q(n),ue(e,{name:n,fromWireType:u,argPackAdvance:le,readValueFromPointer:u},{ignoreDuplicateRegistrations:!0})},ir=(e,t,n,o)=>{if(!(o>0))return 0;for(var s=n,u=n+o-1,l=0;l=55296&&d<=57343){var v=e.charCodeAt(++l);d=65536+((d&1023)<<10)|v&1023}if(d<=127){if(n>=u)break;t[n++]=d}else if(d<=2047){if(n+1>=u)break;t[n++]=192|d>>6,t[n++]=128|d&63}else if(d<=65535){if(n+2>=u)break;t[n++]=224|d>>12,t[n++]=128|d>>6&63,t[n++]=128|d&63}else{if(n+3>=u)break;t[n++]=240|d>>18,t[n++]=128|d>>12&63,t[n++]=128|d>>6&63,t[n++]=128|d&63}}return t[n]=0,n-s},ha=(e,t,n)=>ir(e,U,t,n),sr=e=>{for(var t=0,n=0;n=55296&&o<=57343?(t+=4,++n):t+=3}return t},cr=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,pa=(e,t,n)=>{for(var o=t+n,s=t;e[s]&&!(s>=o);)++s;if(s-t>16&&e.buffer&&cr)return cr.decode(e.subarray(t,s));for(var u="";t>10,56320|w&1023)}}return u},It=(e,t)=>e?pa(U,e,t):"",va=(e,t)=>{t=Q(t);var n=t==="std::string";ue(e,{name:t,fromWireType(o){var s=M[o>>2],u=o+4,l;if(n)for(var d=u,v=0;v<=s;++v){var w=u+v;if(v==s||U[w]==0){var _=w-d,E=It(d,_);l===void 0?l=E:(l+="\0",l+=E),d=w+1}}else{for(var O=new Array(s),v=0;v>2]=u,n&&l)ha(s,v,u+1);else if(l)for(var w=0;w255&&(ye(v),j("String has UTF-16 code units that do not fit in 8 bits")),U[v+w]=_}else for(var w=0;w{for(var n=e,o=n>>1,s=o+t/2;!(o>=s)&&P[o];)++o;if(n=o<<1,n-e>32&&ur)return ur.decode(U.subarray(e,n));for(var u="",l=0;!(l>=t/2);++l){var d=ie[e+l*2>>1];if(d==0)break;u+=String.fromCharCode(d)}return u},ya=(e,t,n)=>{var o;if((o=n)!==null&&o!==void 0||(n=2147483647),n<2)return 0;n-=2;for(var s=t,u=n>1]=d,t+=2}return ie[t>>1]=0,t-s},ga=e=>e.length*2,wa=(e,t)=>{for(var n=0,o="";!(n>=t/4);){var s=T[e+n*4>>2];if(s==0)break;if(++n,s>=65536){var u=s-65536;o+=String.fromCharCode(55296|u>>10,56320|u&1023)}else o+=String.fromCharCode(s)}return o},ba=(e,t,n)=>{var o;if((o=n)!==null&&o!==void 0||(n=2147483647),n<4)return 0;for(var s=t,u=s+n-4,l=0;l=55296&&d<=57343){var v=e.charCodeAt(++l);d=65536+((d&1023)<<10)|v&1023}if(T[t>>2]=d,t+=4,t+4>u)break}return T[t>>2]=0,t-s},Ca=e=>{for(var t=0,n=0;n=55296&&o<=57343&&++n,t+=4}return t},_a=(e,t,n)=>{n=Q(n);var o,s,u,l,d;t===2?(o=ma,s=ya,l=ga,u=()=>P,d=1):t===4&&(o=wa,s=ba,l=Ca,u=()=>M,d=2),ue(e,{name:n,fromWireType:v=>{for(var w=M[v>>2],_=u(),E,O=v+4,A=0;A<=w;++A){var H=v+4+A*t;if(A==w||_[H>>d]==0){var z=H-O,F=o(O,z);E===void 0?E=F:(E+="\0",E+=F),O=H+t}}return ye(v),E},toWireType:(v,w)=>{typeof w!="string"&&j(`Cannot pass non-string to C++ string type ${n}`);var _=l(w),E=Lt(4+_+t);return M[E>>2]=_>>d,s(w,E+4,_+t),v!==null&&v.push(ye,E),E},argPackAdvance:le,readValueFromPointer:Pt,destructorFunction(v){ye(v)}})},Ta=(e,t,n,o,s,u)=>{Ze[e]={name:Q(t),rawConstructor:oe(n,o),rawDestructor:oe(s,u),fields:[]}},$a=(e,t,n,o,s,u,l,d,v,w)=>{Ze[e].fields.push({fieldName:Q(t),getterReturnType:n,getter:oe(o,s),getterContext:u,setterArgumentType:l,setter:oe(d,v),setterContext:w})},Sa=(e,t)=>{t=Q(t),ue(e,{isVoid:!0,name:t,argPackAdvance:0,fromWireType:()=>{},toWireType:(n,o)=>{}})},Wt=[],Pa=(e,t,n,o)=>(e=Wt[e],t=me.toValue(t),e(null,t,n,o)),Ea={},Oa=e=>{var t=Ea[e];return t===void 0?Q(e):t},lr=()=>{if(typeof globalThis=="object")return globalThis;function e(t){t.$$$embind_global$$$=t;var n=typeof $$$embind_global$$$=="object"&&t.$$$embind_global$$$==t;return n||delete t.$$$embind_global$$$,n}if(typeof $$$embind_global$$$=="object"||(typeof global=="object"&&e(global)?$$$embind_global$$$=global:typeof self=="object"&&e(self)&&($$$embind_global$$$=self),typeof $$$embind_global$$$=="object"))return $$$embind_global$$$;throw Error("unable to get global object.")},Ma=e=>e===0?me.toHandle(lr()):(e=Oa(e),me.toHandle(lr()[e])),Aa=e=>{var t=Wt.length;return Wt.push(e),t},xa=(e,t)=>{for(var n=new Array(e),o=0;o>2],"parameter "+o);return n},ka=Reflect.construct,Da=(e,t,n)=>{var o=[],s=e.toWireType(o,n);return o.length&&(M[t>>2]=me.toHandle(o)),s},ja=(e,t,n)=>{var o=xa(e,t),s=o.shift();e--;var u=new Array(e),l=(v,w,_,E)=>{for(var O=0,A=0;Av.name).join(", ")}) => ${s.name}>`;return Aa(He(d,l))},Ra=e=>{e>4&&(ne.get(e).refcount+=1)},Fa=e=>{var t=me.toValue(e);St(t),jt(e)},Ia=(e,t)=>{e=Rt(e,"_emval_take_value");var n=e.readValueFromPointer(t);return me.toHandle(n)},Wa=()=>{re("")},Ua=(e,t,n)=>U.copyWithin(e,t,t+n),La=()=>2147483648,Ha=e=>{var t=k.buffer,n=(e-t.byteLength+65535)/65536;try{return k.grow(n),se(),1}catch{}},Na=e=>{var t=U.length;e>>>=0;var n=La();if(e>n)return!1;for(var o=(v,w)=>v+(w-v%w)%w,s=1;s<=4;s*=2){var u=t*(1+.2/s);u=Math.min(u,e+100663296);var l=Math.min(n,o(Math.max(e,u),65536)),d=Ha(l);if(d)return!0}return!1},Ut={},Va=()=>m||"./this.program",Ne=()=>{if(!Ne.strings){var e=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:e,_:Va()};for(var n in Ut)Ut[n]===void 0?delete t[n]:t[n]=Ut[n];var o=[];for(var n in t)o.push(`${n}=${t[n]}`);Ne.strings=o}return Ne.strings},Ba=(e,t)=>{for(var n=0;n>0]=e.charCodeAt(n);I[t>>0]=0},za=(e,t)=>{var n=0;return Ne().forEach((o,s)=>{var u=t+n;M[e+s*4>>2]=u,Ba(o,u),n+=o.length+1}),0},qa=(e,t)=>{var n=Ne();M[e>>2]=n.length;var o=0;return n.forEach(s=>o+=s.length+1),M[t>>2]=o,0},Ga=e=>e,st=e=>e%4===0&&(e%100!==0||e%400===0),Ja=(e,t)=>{for(var n=0,o=0;o<=t;n+=e[o++]);return n},dr=[31,29,31,30,31,30,31,31,30,31,30,31],fr=[31,28,31,30,31,30,31,31,30,31,30,31],Ya=(e,t)=>{for(var n=new Date(e.getTime());t>0;){var o=st(n.getFullYear()),s=n.getMonth(),u=(o?dr:fr)[s];if(t>u-n.getDate())t-=u-n.getDate()+1,n.setDate(1),s<11?n.setMonth(s+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1));else return n.setDate(n.getDate()+t),n}return n};function Qa(e,t,n){var o=sr(e)+1,s=new Array(o);return ir(e,s,0,s.length),s}var Xa=(e,t)=>{I.set(e,t)},Ka=(e,t,n,o)=>{var s=M[o+40>>2],u={tm_sec:T[o>>2],tm_min:T[o+4>>2],tm_hour:T[o+8>>2],tm_mday:T[o+12>>2],tm_mon:T[o+16>>2],tm_year:T[o+20>>2],tm_wday:T[o+24>>2],tm_yday:T[o+28>>2],tm_isdst:T[o+32>>2],tm_gmtoff:T[o+36>>2],tm_zone:s?It(s):""},l=It(n),d={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var v in d)l=l.replace(new RegExp(v,"g"),d[v]);var w=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],_=["January","February","March","April","May","June","July","August","September","October","November","December"];function E(g,S,q){for(var Y=typeof g=="number"?g.toString():g||"";Y.length0?1:0}var Y;return(Y=q(g.getFullYear()-S.getFullYear()))===0&&(Y=q(g.getMonth()-S.getMonth()))===0&&(Y=q(g.getDate()-S.getDate())),Y}function H(g){switch(g.getDay()){case 0:return new Date(g.getFullYear()-1,11,29);case 1:return g;case 2:return new Date(g.getFullYear(),0,3);case 3:return new Date(g.getFullYear(),0,2);case 4:return new Date(g.getFullYear(),0,1);case 5:return new Date(g.getFullYear()-1,11,31);case 6:return new Date(g.getFullYear()-1,11,30)}}function z(g){var S=Ya(new Date(g.tm_year+1900,0,1),g.tm_yday),q=new Date(S.getFullYear(),0,4),Y=new Date(S.getFullYear()+1,0,4),Ae=H(q),ut=H(Y);return A(Ae,S)<=0?A(ut,S)<=0?S.getFullYear()+1:S.getFullYear():S.getFullYear()-1}var F={"%a":g=>w[g.tm_wday].substring(0,3),"%A":g=>w[g.tm_wday],"%b":g=>_[g.tm_mon].substring(0,3),"%B":g=>_[g.tm_mon],"%C":g=>{var S=g.tm_year+1900;return O(S/100|0,2)},"%d":g=>O(g.tm_mday,2),"%e":g=>E(g.tm_mday,2," "),"%g":g=>z(g).toString().substring(2),"%G":g=>z(g),"%H":g=>O(g.tm_hour,2),"%I":g=>{var S=g.tm_hour;return S==0?S=12:S>12&&(S-=12),O(S,2)},"%j":g=>O(g.tm_mday+Ja(st(g.tm_year+1900)?dr:fr,g.tm_mon-1),3),"%m":g=>O(g.tm_mon+1,2),"%M":g=>O(g.tm_min,2),"%n":()=>` +`,"%p":g=>g.tm_hour>=0&&g.tm_hour<12?"AM":"PM","%S":g=>O(g.tm_sec,2),"%t":()=>" ","%u":g=>g.tm_wday||7,"%U":g=>{var S=g.tm_yday+7-g.tm_wday;return O(Math.floor(S/7),2)},"%V":g=>{var S=Math.floor((g.tm_yday+7-(g.tm_wday+6)%7)/7);if((g.tm_wday+371-g.tm_yday-2)%7<=2&&S++,S){if(S==53){var q=(g.tm_wday+371-g.tm_yday)%7;q!=4&&(q!=3||!st(g.tm_year))&&(S=1)}}else{S=52;var Y=(g.tm_wday+7-g.tm_yday-1)%7;(Y==4||Y==5&&st(g.tm_year%400-1))&&S++}return O(S,2)},"%w":g=>g.tm_wday,"%W":g=>{var S=g.tm_yday+7-(g.tm_wday+6)%7;return O(Math.floor(S/7),2)},"%y":g=>(g.tm_year+1900).toString().substring(2),"%Y":g=>g.tm_year+1900,"%z":g=>{var S=g.tm_gmtoff,q=S>=0;return S=Math.abs(S)/60,S=S/60*100+S%60,(q?"+":"-")+("0000"+S).slice(-4)},"%Z":g=>g.tm_zone,"%%":()=>"%"};l=l.replace(/%%/g,"\0\0");for(var v in F)l.includes(v)&&(l=l.replace(new RegExp(v,"g"),F[v](u)));l=l.replace(/\0\0/g,"%");var X=Qa(l);return X.length>t?0:(Xa(X,e),X.length-1)},Za=(e,t,n,o,s)=>Ka(e,t,n,o);qt=a.InternalError=class extends Error{constructor(e){super(e),this.name="InternalError"}},Sn(),Me=a.BindingError=class extends Error{constructor(e){super(e),this.name="BindingError"}},In(),Dn(),zn(),rr=a.UnboundTypeError=Yn(Error,"UnboundTypeError"),ea(),ra();var eo={s:pn,u:vn,b:yn,g:gn,q:wn,J:bn,f:Cn,V:_n,d:mn,da:Tn,Q:$n,_:En,ca:Qn,ba:Kn,w:Zn,Y:na,x:oa,h:ia,L:ca,M:ua,t:da,o:fa,K:va,C:_a,A:Ta,ea:$a,$:Sa,R:Pa,ha:jt,fa:Ma,Z:ja,N:Ra,O:Fa,aa:Ia,B:Wa,X:Ua,W:Na,T:za,U:qa,E:yo,D:oo,F:mo,n:go,a:to,e:so,m:ao,k:uo,H:po,v:fo,G:vo,z:bo,P:_o,l:co,j:io,c:no,p:ro,I:ho,r:wo,i:lo,y:Co,ga:Ga,S:Za},J=hn(),ye=a._free=e=>(ye=a._free=J.ka)(e),Lt=a._malloc=e=>(Lt=a._malloc=J.la)(e),hr=e=>(hr=J.na)(e),L=(e,t)=>(L=J.oa)(e,t),Ve=e=>(Ve=J.pa)(e),V=()=>(V=J.qa)(),B=e=>(B=J.ra)(e),pr=e=>(pr=J.sa)(e),vr=e=>(vr=J.ta)(e),mr=(e,t,n)=>(mr=J.ua)(e,t,n),yr=e=>(yr=J.va)(e);a.dynCall_viijii=(e,t,n,o,s,u,l)=>(a.dynCall_viijii=J.wa)(e,t,n,o,s,u,l);var gr=a.dynCall_jiiii=(e,t,n,o,s)=>(gr=a.dynCall_jiiii=J.xa)(e,t,n,o,s);a.dynCall_iiiiij=(e,t,n,o,s,u,l)=>(a.dynCall_iiiiij=J.ya)(e,t,n,o,s,u,l),a.dynCall_iiiiijj=(e,t,n,o,s,u,l,d,v)=>(a.dynCall_iiiiijj=J.za)(e,t,n,o,s,u,l,d,v),a.dynCall_iiiiiijj=(e,t,n,o,s,u,l,d,v,w)=>(a.dynCall_iiiiiijj=J.Aa)(e,t,n,o,s,u,l,d,v,w);function to(e,t){var n=V();try{return N(e)(t)}catch(o){if(B(n),o!==o+0)throw o;L(1,0)}}function ro(e,t,n,o){var s=V();try{N(e)(t,n,o)}catch(u){if(B(s),u!==u+0)throw u;L(1,0)}}function no(e,t,n){var o=V();try{N(e)(t,n)}catch(s){if(B(o),s!==s+0)throw s;L(1,0)}}function ao(e,t,n,o){var s=V();try{return N(e)(t,n,o)}catch(u){if(B(s),u!==u+0)throw u;L(1,0)}}function oo(e,t,n,o,s){var u=V();try{return N(e)(t,n,o,s)}catch(l){if(B(u),l!==l+0)throw l;L(1,0)}}function io(e,t){var n=V();try{N(e)(t)}catch(o){if(B(n),o!==o+0)throw o;L(1,0)}}function so(e,t,n){var o=V();try{return N(e)(t,n)}catch(s){if(B(o),s!==s+0)throw s;L(1,0)}}function co(e){var t=V();try{N(e)()}catch(n){if(B(t),n!==n+0)throw n;L(1,0)}}function uo(e,t,n,o,s){var u=V();try{return N(e)(t,n,o,s)}catch(l){if(B(u),l!==l+0)throw l;L(1,0)}}function lo(e,t,n,o,s,u,l,d,v,w,_){var E=V();try{N(e)(t,n,o,s,u,l,d,v,w,_)}catch(O){if(B(E),O!==O+0)throw O;L(1,0)}}function fo(e,t,n,o,s,u,l){var d=V();try{return N(e)(t,n,o,s,u,l)}catch(v){if(B(d),v!==v+0)throw v;L(1,0)}}function ho(e,t,n,o,s){var u=V();try{N(e)(t,n,o,s)}catch(l){if(B(u),l!==l+0)throw l;L(1,0)}}function po(e,t,n,o,s,u){var l=V();try{return N(e)(t,n,o,s,u)}catch(d){if(B(l),d!==d+0)throw d;L(1,0)}}function vo(e,t,n,o,s,u,l,d){var v=V();try{return N(e)(t,n,o,s,u,l,d)}catch(w){if(B(v),w!==w+0)throw w;L(1,0)}}function mo(e,t,n,o){var s=V();try{return N(e)(t,n,o)}catch(u){if(B(s),u!==u+0)throw u;L(1,0)}}function yo(e,t,n,o){var s=V();try{return N(e)(t,n,o)}catch(u){if(B(s),u!==u+0)throw u;L(1,0)}}function go(e){var t=V();try{return N(e)()}catch(n){if(B(t),n!==n+0)throw n;L(1,0)}}function wo(e,t,n,o,s,u,l,d){var v=V();try{N(e)(t,n,o,s,u,l,d)}catch(w){if(B(v),w!==w+0)throw w;L(1,0)}}function bo(e,t,n,o,s,u,l,d,v,w,_,E){var O=V();try{return N(e)(t,n,o,s,u,l,d,v,w,_,E)}catch(A){if(B(O),A!==A+0)throw A;L(1,0)}}function Co(e,t,n,o,s,u,l,d,v,w,_,E,O,A,H,z){var F=V();try{N(e)(t,n,o,s,u,l,d,v,w,_,E,O,A,H,z)}catch(X){if(B(F),X!==X+0)throw X;L(1,0)}}function _o(e,t,n,o,s){var u=V();try{return gr(e,t,n,o,s)}catch(l){if(B(u),l!==l+0)throw l;L(1,0)}}var ct;$e=function e(){ct||wr(),ct||($e=e)};function wr(){if(ce>0||(qe(),ce>0))return;function e(){ct||(ct=!0,a.calledRun=!0,!R&&(mt(),c(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),yt()))}a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1),e()},1)):e()}if(a.preInit)for(typeof a.preInit=="function"&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return wr(),i.ready}})();function Ci(r){return Bt(zt,r)}async function _i(r,i){return wi(zt,r,i)}async function Ti(r,i){return bi(zt,r,i)}var ze;class $i extends EventTarget{constructor(i={}){var a;super(),Yo(this,ze,void 0);try{const c=(a=i?.formats)==null?void 0:a.filter(f=>f!=="unknown");if(c?.length===0)throw new TypeError("Hint option provided, but is empty.");c?.forEach(f=>{if(!ft.has(f))throw new TypeError(`Failed to read the 'formats' property from 'BarcodeDetectorOptions': The provided value '${f}' is not a valid enum value of type BarcodeFormat.`)}),Qo(this,ze,c??[]),Ci().then(f=>{this.dispatchEvent(new CustomEvent("load",{detail:f}))}).catch(f=>{this.dispatchEvent(new CustomEvent("error",{detail:f}))})}catch(c){throw Pr(c,"Failed to construct 'BarcodeDetector'")}}static async getSupportedFormats(){return Xo.filter(i=>i!=="unknown")}async detect(i){try{const a=await ai(i);if(a===null)return[];let c;try{qr(a)?c=await _i(a,{tryHarder:!0,formats:Sr(this,ze).map(f=>ft.get(f))}):c=await Ti(a,{tryHarder:!0,formats:Sr(this,ze).map(f=>ft.get(f))})}catch(f){throw console.error(f),new DOMException("Barcode detection service unavailable.","NotSupportedError")}return c.map(f=>{const{topLeft:{x:p,y:m},topRight:{x:$,y:h},bottomLeft:{x:y,y:C},bottomRight:{x:b,y:x}}=f.position,D=Math.min(p,$,y,b),k=Math.min(m,h,C,x),R=Math.max(p,$,y,b),I=Math.max(m,h,C,x);return{boundingBox:new DOMRectReadOnly(D,k,R-D,I-k),rawValue:f.text,format:Ko(f.format),cornerPoints:[{x:p,y:m},{x:$,y:h},{x:b,y:x},{x:y,y:C}]}})}catch(a){throw Pr(a,"Failed to execute 'detect' on 'BarcodeDetector'")}}}ze=new WeakMap;const Qr=(r,i,a="error")=>{let c,f;const p=new Promise((m,$)=>{c=m,f=$,r.addEventListener(i,c),r.addEventListener(a,f)});return p.finally(()=>{r.removeEventListener(i,c),r.removeEventListener(a,f)}),p},Ar=r=>new Promise(i=>setTimeout(i,r));class Xr extends Error{constructor(){super("this browser has no Stream API support"),this.name="StreamApiNotSupportedError"}}class Si extends Error{constructor(){super("camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."),this.name="InsecureContextError"}}class Pi extends Error{constructor(){super("Loading camera stream timed out after 6 seconds. If you are on iOS in PWA mode, this is a known issue (see https://github.com/gruhn/vue-qrcode-reader/issues/298)"),this.name="StreamLoadTimeoutError"}}let Kr;function Zr(r){Kr=new $i({formats:r})}const Ei=async(r,{detectHandler:i,locateHandler:a,minDelay:c,formats:f})=>{console.debug("[vue-qrcode-reader] start scanning"),Zr(f);const p=m=>async $=>{if(r.readyState===0)console.debug("[vue-qrcode-reader] stop scanning: video element readyState is 0");else{const{lastScanned:h,contentBefore:y,lastScanHadContent:C}=m;if($-h!y.includes(R.rawValue));x&&i(b);const D=b.length>0;D&&a(b),!D&&C&&a(b);const k={lastScanned:$,lastScanHadContent:D,contentBefore:x?b.map(R=>R.rawValue):y};window.requestAnimationFrame(p(k))}}};p({lastScanned:performance.now(),contentBefore:[],lastScanHadContent:!1})(performance.now())};var en={},ee={};Object.defineProperty(ee,"__esModule",{value:!0});ee.compactObject=nn;ee.deprecated=Fi;var Oi=ee.detectBrowser=Ii;ee.disableLog=Di;ee.disableWarnings=ji;ee.extractVersion=ht;ee.filterStats=Wi;ee.log=Ri;ee.walkStats=pt;ee.wrapPeerConnectionEvent=ki;function Mi(r,i,a){return i=Ai(i),i in r?Object.defineProperty(r,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[i]=a,r}function Ai(r){var i=xi(r,"string");return _e(i)==="symbol"?i:String(i)}function xi(r,i){if(_e(r)!=="object"||r===null)return r;var a=r[Symbol.toPrimitive];if(a!==void 0){var c=a.call(r,i);if(_e(c)!=="object")return c;throw new TypeError("@@toPrimitive must return a primitive value.")}return(i==="string"?String:Number)(r)}function _e(r){"@babel/helpers - typeof";return _e=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},_e(r)}var tn=!0,rn=!0;function ht(r,i,a){var c=r.match(i);return c&&c.length>=a&&parseInt(c[a],10)}function ki(r,i,a){if(r.RTCPeerConnection){var c=r.RTCPeerConnection.prototype,f=c.addEventListener;c.addEventListener=function(m,$){if(m!==i)return f.apply(this,arguments);var h=function(y){var C=a(y);C&&($.handleEvent?$.handleEvent(C):$(C))};return this._eventMap=this._eventMap||{},this._eventMap[i]||(this._eventMap[i]=new Map),this._eventMap[i].set($,h),f.apply(this,[m,h])};var p=c.removeEventListener;c.removeEventListener=function(m,$){if(m!==i||!this._eventMap||!this._eventMap[i])return p.apply(this,arguments);if(!this._eventMap[i].has($))return p.apply(this,arguments);var h=this._eventMap[i].get($);return this._eventMap[i].delete($),this._eventMap[i].size===0&&delete this._eventMap[i],Object.keys(this._eventMap).length===0&&delete this._eventMap,p.apply(this,[m,h])},Object.defineProperty(c,"on"+i,{get:function(){return this["_on"+i]},set:function(m){this["_on"+i]&&(this.removeEventListener(i,this["_on"+i]),delete this["_on"+i]),m&&this.addEventListener(i,this["_on"+i]=m)},enumerable:!0,configurable:!0})}}function Di(r){return typeof r!="boolean"?new Error("Argument type: "+_e(r)+". Please use a boolean."):(tn=r,r?"adapter.js logging disabled":"adapter.js logging enabled")}function ji(r){return typeof r!="boolean"?new Error("Argument type: "+_e(r)+". Please use a boolean."):(rn=!r,"adapter.js deprecation warnings "+(r?"disabled":"enabled"))}function Ri(){if((typeof window>"u"?"undefined":_e(window))==="object"){if(tn)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function Fi(r,i){rn&&console.warn(r+" is deprecated, please use "+i+" instead.")}function Ii(r){var i={browser:null,version:null};if(typeof r>"u"||!r.navigator||!r.navigator.userAgent)return i.browser="Not a browser.",i;var a=r.navigator;if(a.mozGetUserMedia)i.browser="firefox",i.version=ht(a.userAgent,/Firefox\/(\d+)\./,1);else if(a.webkitGetUserMedia||r.isSecureContext===!1&&r.webkitRTCPeerConnection)i.browser="chrome",i.version=ht(a.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(r.RTCPeerConnection&&a.userAgent.match(/AppleWebKit\/(\d+)\./))i.browser="safari",i.version=ht(a.userAgent,/AppleWebKit\/(\d+)\./,1),i.supportsUnifiedPlan=r.RTCRtpTransceiver&&"currentDirection"in r.RTCRtpTransceiver.prototype;else return i.browser="Not a supported browser.",i;return i}function xr(r){return Object.prototype.toString.call(r)==="[object Object]"}function nn(r){return xr(r)?Object.keys(r).reduce(function(i,a){var c=xr(r[a]),f=c?nn(r[a]):r[a],p=c&&!Object.keys(f).length;return f===void 0||p?i:Object.assign(i,Mi({},a,f))},{}):r}function pt(r,i,a){!i||a.has(i.id)||(a.set(i.id,i),Object.keys(i).forEach(function(c){c.endsWith("Id")?pt(r,r.get(i[c]),a):c.endsWith("Ids")&&i[c].forEach(function(f){pt(r,r.get(f),a)})}))}function Wi(r,i,a){var c=a?"outbound-rtp":"inbound-rtp",f=new Map;if(i===null)return f;var p=[];return r.forEach(function(m){m.type==="track"&&m.trackIdentifier===i.id&&p.push(m)}),p.forEach(function(m){r.forEach(function($){$.type===c&&$.trackId===m.id&&pt(r,$,f)})}),f}Object.defineProperty(en,"__esModule",{value:!0});var Ui=en.shimGetUserMedia=Ni,Li=Hi(ee);function an(r){if(typeof WeakMap!="function")return null;var i=new WeakMap,a=new WeakMap;return(an=function(c){return c?a:i})(r)}function Hi(r,i){if(r&&r.__esModule)return r;if(r===null||Ce(r)!=="object"&&typeof r!="function")return{default:r};var a=an(i);if(a&&a.has(r))return a.get(r);var c={},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var p in r)if(p!=="default"&&Object.prototype.hasOwnProperty.call(r,p)){var m=f?Object.getOwnPropertyDescriptor(r,p):null;m&&(m.get||m.set)?Object.defineProperty(c,p,m):c[p]=r[p]}return c.default=r,a&&a.set(r,c),c}function Ce(r){"@babel/helpers - typeof";return Ce=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},Ce(r)}var kr=Li.log;function Ni(r,i){var a=r&&r.navigator;if(a.mediaDevices){var c=function(h){if(Ce(h)!=="object"||h.mandatory||h.optional)return h;var y={};return Object.keys(h).forEach(function(C){if(!(C==="require"||C==="advanced"||C==="mediaSource")){var b=Ce(h[C])==="object"?h[C]:{ideal:h[C]};b.exact!==void 0&&typeof b.exact=="number"&&(b.min=b.max=b.exact);var x=function(k,R){return k?k+R.charAt(0).toUpperCase()+R.slice(1):R==="deviceId"?"sourceId":R};if(b.ideal!==void 0){y.optional=y.optional||[];var D={};typeof b.ideal=="number"?(D[x("min",C)]=b.ideal,y.optional.push(D),D={},D[x("max",C)]=b.ideal,y.optional.push(D)):(D[x("",C)]=b.ideal,y.optional.push(D))}b.exact!==void 0&&typeof b.exact!="number"?(y.mandatory=y.mandatory||{},y.mandatory[x("",C)]=b.exact):["min","max"].forEach(function(k){b[k]!==void 0&&(y.mandatory=y.mandatory||{},y.mandatory[x(k,C)]=b[k])})}}),h.advanced&&(y.optional=(y.optional||[]).concat(h.advanced)),y},f=function(h,y){if(i.version>=61)return y(h);if(h=JSON.parse(JSON.stringify(h)),h&&Ce(h.audio)==="object"){var C=function(k,R,I){R in k&&!(I in k)&&(k[I]=k[R],delete k[R])};h=JSON.parse(JSON.stringify(h)),C(h.audio,"autoGainControl","googAutoGainControl"),C(h.audio,"noiseSuppression","googNoiseSuppression"),h.audio=c(h.audio)}if(h&&Ce(h.video)==="object"){var b=h.video.facingMode;b=b&&(Ce(b)==="object"?b:{ideal:b});var x=i.version<66;if(b&&(b.exact==="user"||b.exact==="environment"||b.ideal==="user"||b.ideal==="environment")&&!(a.mediaDevices.getSupportedConstraints&&a.mediaDevices.getSupportedConstraints().facingMode&&!x)){delete h.video.facingMode;var D;if(b.exact==="environment"||b.ideal==="environment"?D=["back","rear"]:(b.exact==="user"||b.ideal==="user")&&(D=["front"]),D)return a.mediaDevices.enumerateDevices().then(function(k){k=k.filter(function(I){return I.kind==="videoinput"});var R=k.find(function(I){return D.some(function(U){return I.label.toLowerCase().includes(U)})});return!R&&k.length&&D.includes("back")&&(R=k[k.length-1]),R&&(h.video.deviceId=b.exact?{exact:R.deviceId}:{ideal:R.deviceId}),h.video=c(h.video),kr("chrome: "+JSON.stringify(h)),y(h)})}h.video=c(h.video)}return kr("chrome: "+JSON.stringify(h)),y(h)},p=function(h){return i.version>=64?h:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[h.name]||h.name,message:h.message,constraint:h.constraint||h.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}},m=function(h,y,C){f(h,function(b){a.webkitGetUserMedia(b,y,function(x){C&&C(p(x))})})};if(a.getUserMedia=m.bind(a),a.mediaDevices.getUserMedia){var $=a.mediaDevices.getUserMedia.bind(a.mediaDevices);a.mediaDevices.getUserMedia=function(h){return f(h,function(y){return $(y).then(function(C){if(y.audio&&!C.getAudioTracks().length||y.video&&!C.getVideoTracks().length)throw C.getTracks().forEach(function(b){b.stop()}),new DOMException("","NotFoundError");return C},function(C){return Promise.reject(p(C))})})}}}}var on={};Object.defineProperty(on,"__esModule",{value:!0});var Vi=on.shimGetUserMedia=qi,Bi=zi(ee);function sn(r){if(typeof WeakMap!="function")return null;var i=new WeakMap,a=new WeakMap;return(sn=function(c){return c?a:i})(r)}function zi(r,i){if(r&&r.__esModule)return r;if(r===null||xe(r)!=="object"&&typeof r!="function")return{default:r};var a=sn(i);if(a&&a.has(r))return a.get(r);var c={},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var p in r)if(p!=="default"&&Object.prototype.hasOwnProperty.call(r,p)){var m=f?Object.getOwnPropertyDescriptor(r,p):null;m&&(m.get||m.set)?Object.defineProperty(c,p,m):c[p]=r[p]}return c.default=r,a&&a.set(r,c),c}function xe(r){"@babel/helpers - typeof";return xe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},xe(r)}function qi(r,i){var a=r&&r.navigator,c=r&&r.MediaStreamTrack;if(a.getUserMedia=function(h,y,C){Bi.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),a.mediaDevices.getUserMedia(h).then(y,C)},!(i.version>55&&"autoGainControl"in a.mediaDevices.getSupportedConstraints())){var f=function(h,y,C){y in h&&!(C in h)&&(h[C]=h[y],delete h[y])},p=a.mediaDevices.getUserMedia.bind(a.mediaDevices);if(a.mediaDevices.getUserMedia=function(h){return xe(h)==="object"&&xe(h.audio)==="object"&&(h=JSON.parse(JSON.stringify(h)),f(h.audio,"autoGainControl","mozAutoGainControl"),f(h.audio,"noiseSuppression","mozNoiseSuppression")),p(h)},c&&c.prototype.getSettings){var m=c.prototype.getSettings;c.prototype.getSettings=function(){var h=m.apply(this,arguments);return f(h,"mozAutoGainControl","autoGainControl"),f(h,"mozNoiseSuppression","noiseSuppression"),h}}if(c&&c.prototype.applyConstraints){var $=c.prototype.applyConstraints;c.prototype.applyConstraints=function(h){return this.kind==="audio"&&xe(h)==="object"&&(h=JSON.parse(JSON.stringify(h)),f(h,"autoGainControl","mozAutoGainControl"),f(h,"noiseSuppression","mozNoiseSuppression")),$.apply(this,[h])}}}}var pe={};Object.defineProperty(pe,"__esModule",{value:!0});pe.shimAudioContext=rs;pe.shimCallbacksAPI=Xi;pe.shimConstraints=ln;pe.shimCreateOfferLegacy=ts;var Gi=pe.shimGetUserMedia=Ki;pe.shimLocalStreamsAPI=Yi;pe.shimRTCIceServerUrls=Zi;pe.shimRemoteStreamsAPI=Qi;pe.shimTrackEventTransceiver=es;var cn=Ji(ee);function un(r){if(typeof WeakMap!="function")return null;var i=new WeakMap,a=new WeakMap;return(un=function(c){return c?a:i})(r)}function Ji(r,i){if(r&&r.__esModule)return r;if(r===null||Te(r)!=="object"&&typeof r!="function")return{default:r};var a=un(i);if(a&&a.has(r))return a.get(r);var c={},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var p in r)if(p!=="default"&&Object.prototype.hasOwnProperty.call(r,p)){var m=f?Object.getOwnPropertyDescriptor(r,p):null;m&&(m.get||m.set)?Object.defineProperty(c,p,m):c[p]=r[p]}return c.default=r,a&&a.set(r,c),c}function Te(r){"@babel/helpers - typeof";return Te=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},Te(r)}function Yi(r){if(!(Te(r)!=="object"||!r.RTCPeerConnection)){if("getLocalStreams"in r.RTCPeerConnection.prototype||(r.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in r.RTCPeerConnection.prototype)){var i=r.RTCPeerConnection.prototype.addTrack;r.RTCPeerConnection.prototype.addStream=function(a){var c=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(a)||this._localStreams.push(a),a.getAudioTracks().forEach(function(f){return i.call(c,f,a)}),a.getVideoTracks().forEach(function(f){return i.call(c,f,a)})},r.RTCPeerConnection.prototype.addTrack=function(a){for(var c=this,f=arguments.length,p=new Array(f>1?f-1:0),m=1;m=0)){a._remoteStreams.push(f);var p=new Event("addstream");p.stream=f,a.dispatchEvent(p)}})}),i.apply(a,arguments)}}}function Xi(r){if(!(Te(r)!=="object"||!r.RTCPeerConnection)){var i=r.RTCPeerConnection.prototype,a=i.createOffer,c=i.createAnswer,f=i.setLocalDescription,p=i.setRemoteDescription,m=i.addIceCandidate;i.createOffer=function(h,y){var C=arguments.length>=2?arguments[2]:arguments[0],b=a.apply(this,[C]);return y?(b.then(h,y),Promise.resolve()):b},i.createAnswer=function(h,y){var C=arguments.length>=2?arguments[2]:arguments[0],b=c.apply(this,[C]);return y?(b.then(h,y),Promise.resolve()):b};var $=function(h,y,C){var b=f.apply(this,[h]);return C?(b.then(y,C),Promise.resolve()):b};i.setLocalDescription=$,$=function(h,y,C){var b=p.apply(this,[h]);return C?(b.then(y,C),Promise.resolve()):b},i.setRemoteDescription=$,$=function(h,y,C){var b=m.apply(this,[h]);return C?(b.then(y,C),Promise.resolve()):b},i.addIceCandidate=$}}function Ki(r){var i=r&&r.navigator;if(i.mediaDevices&&i.mediaDevices.getUserMedia){var a=i.mediaDevices,c=a.getUserMedia.bind(a);i.mediaDevices.getUserMedia=function(f){return c(ln(f))}}!i.getUserMedia&&i.mediaDevices&&i.mediaDevices.getUserMedia&&(i.getUserMedia=(function(f,p,m){i.mediaDevices.getUserMedia(f).then(p,m)}).bind(i))}function ln(r){return r&&r.video!==void 0?Object.assign({},r,{video:cn.compactObject(r.video)}):r}function Zi(r){if(r.RTCPeerConnection){var i=r.RTCPeerConnection;r.RTCPeerConnection=function(a,c){if(a&&a.iceServers){for(var f=[],p=0;p{let i=!1,a;return(...c)=>(i||(a=r(c),i=!0),a)};function fe(r,i){if(r===!1)throw new Error(i??"assertion failure")}function Dr(r){throw new Error("this code should be unreachable")}const as=ns(()=>{const r=Oi(window);switch(r.browser){case"chrome":Ui(window,r);break;case"firefox":Vi(window,r);break;case"safari":Gi(window,r);break;default:throw new Xr}});let ke=Promise.resolve({type:"stop",data:{}});async function jr(r,i,a){var c,f,p;if(console.debug("[vue-qrcode-reader] starting camera with constraints: ",JSON.stringify(i)),window.isSecureContext!==!0)throw new Si;if(((c=navigator?.mediaDevices)==null?void 0:c.getUserMedia)===void 0)throw new Xr;as(),console.debug("[vue-qrcode-reader] calling getUserMedia");const m=await navigator.mediaDevices.getUserMedia({audio:!1,video:i});r.srcObject!==void 0?r.srcObject=m:r.mozSrcObject!==void 0?r.mozSrcObject=m:window.URL.createObjectURL?r.src=window.URL.createObjectURL(m):window.webkitURL?r.src=window.webkitURL.createObjectURL(m):r.src=m.id,r.play(),console.debug("[vue-qrcode-reader] waiting for video element to load"),await Promise.race([Qr(r,"loadeddata"),Ar(6e3).then(()=>{throw new Pi})]),console.debug("[vue-qrcode-reader] video element loaded"),await Ar(500);const[$]=m.getVideoTracks(),h=(p=(f=$?.getCapabilities)==null?void 0:f.call($))!=null?p:{};let y=!1;return a&&h.torch&&(await $.applyConstraints({advanced:[{torch:!0}]}),y=!0),console.debug("[vue-qrcode-reader] camera ready"),{type:"start",data:{videoEl:r,stream:m,capabilities:h,constraints:i,isTorchOn:y}}}async function os(r,{constraints:i,torch:a,restart:c=!1}){ke=ke.then(p=>{if(p.type==="start"){const{data:{videoEl:m,stream:$,constraints:h,isTorchOn:y}}=p;return!c&&r===m&&i===h&&a===y?p:dn(m,$,y).then(()=>jr(r,i,a))}else if(p.type==="stop"||p.type==="failed")return jr(r,i,a);Dr()}).catch(p=>(console.debug(`[vue-qrcode-reader] starting camera failed with "${p}"`),{type:"failed",error:p}));const f=await ke;if(f.type==="stop")throw new Error("Something went wrong with the camera task queue (start task).");if(f.type==="failed")throw f.error;if(f.type==="start")return f.data.capabilities;Dr()}async function dn(r,i,a){console.debug("[vue-qrcode-reader] stopping camera"),r.src="",r.srcObject=null,r.load(),await Qr(r,"error");for(const c of i.getTracks())a!=null||await c.applyConstraints({advanced:[{torch:!1}]}),i.removeTrack(c),c.stop();return{type:"stop",data:{}}}async function dt(){if(ke=ke.then(r=>{if(r.type==="stop"||r.type==="failed")return r;const{data:{videoEl:i,stream:a,isTorchOn:c}}=r;return dn(i,a,c)}),(await ke).type==="start")throw new Error("Something went wrong with the camera task queue (stop task).")}const is=To({__name:"QrcodeStream",props:{constraints:{default:()=>({facingMode:"environment"})},formats:{default:()=>["qr_code"]},paused:{type:Boolean,default:!1},torch:{type:Boolean,default:!1},track:{type:Function,default:void 0}},emits:["detect","camera-on","camera-off","error"],setup(r,{emit:i}){const a=r,c=i,f=ae(a.constraints),p=ae(a.formats);Be(()=>a.constraints,(P,T)=>{JSON.stringify(P)!==JSON.stringify(T)&&(f.value=P)},{deep:!0}),Be(()=>a.formats,(P,T)=>{JSON.stringify(P)!==JSON.stringify(T)&&(p.value=P)},{deep:!0});const m=ae(),$=ae(),h=ae(),y=ae(!1),C=ae(!1);Rr(()=>{C.value=!0}),$o(()=>{dt()});const b=Ht(()=>({torch:a.torch,constraints:f.value,shouldStream:C.value&&!a.paused}));Be(b,async P=>{const T=h.value;fe(T!==void 0,"cameraSettings watcher should never be triggered when component is not mounted. Thus video element should always be defined.");const M=m.value;fe(M!==void 0,"cameraSettings watcher should never be triggered when component is not mounted. Thus canvas should always be defined.");const Z=M.getContext("2d");if(fe(Z!==null,"if cavnas is defined, canvas 2d context should also be non-null"),P.shouldStream){dt(),y.value=!1;try{const te=await os(T,P);C.value?(y.value=!0,c("camera-on",te)):await dt()}catch(te){c("error",te)}}else M.width=T.videoWidth,M.height=T.videoHeight,Z.drawImage(T,0,0,T.videoWidth,T.videoHeight),dt(),y.value=!1,c("camera-off")},{deep:!0}),Be(p,P=>{C.value&&Zr(P)});const x=Ht(()=>b.value.shouldStream&&y.value);Be(x,P=>{if(P){fe(m.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus pause frame canvas is defined"),D(m.value),fe($.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus tracking canvas is defined"),D($.value);const T=()=>a.track===void 0?500:40;fe(h.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus video element is defined"),Ei(h.value,{detectHandler:M=>c("detect",M),formats:p.value,locateHandler:k,minDelay:T()})}});const D=P=>{const T=P.getContext("2d");fe(T!==null,"canvas 2d context should always be non-null"),T.clearRect(0,0,P.width,P.height)},k=P=>{const T=$.value;fe(T!==void 0,"onLocate handler should only be called when component is mounted. Thus tracking canvas is always defined.");const M=h.value;if(fe(M!==void 0,"onLocate handler should only be called when component is mounted. Thus video element is always defined."),P.length===0||a.track===void 0)D(T);else{const Z=M.offsetWidth,te=M.offsetHeight,se=M.videoWidth,G=M.videoHeight,je=Math.max(Z/se,te/G),Re=se*je,qe=G*je,mt=Re/se,yt=qe/G,gt=(Z-Re)/2,wt=(te-qe)/2,Fe=({x:we,y:re})=>({x:Math.floor(we*mt),y:Math.floor(re*yt)}),ce=({x:we,y:re})=>({x:Math.floor(we+gt),y:Math.floor(re+wt)}),$e=P.map(we=>{const{boundingBox:re,cornerPoints:bt}=we,{x:Je,y:be}=ce(Fe({x:re.x,y:re.y})),{x:Ye,y:Ct}=Fe({x:re.width,y:re.height});return{...we,cornerPoints:bt.map(Qe=>ce(Fe(Qe))),boundingBox:DOMRectReadOnly.fromRect({x:Je,y:be,width:Ye,height:Ct})}});T.width=M.offsetWidth,T.height=M.offsetHeight;const Ge=T.getContext("2d");fe(Ge!==null,"canvas 2d context should always be non-null"),a.track($e,Ge)}},R={width:"100%",height:"100%",position:"relative","z-index":"0"},I={width:"100%",height:"100%",position:"absolute",top:"0",left:"0"},U={width:"100%",height:"100%","object-fit":"cover"},ie=Ht(()=>x.value?U:{...U,visibility:"hidden",position:"absolute"});return(P,T)=>(he(),ge("div",{style:R},[W("video",{ref_key:"videoRef",ref:h,style:So(ie.value),autoplay:"",muted:"",playsinline:""},null,4),Vt(W("canvas",{id:"qrcode-stream-pause-frame",ref_key:"pauseFrameRef",ref:m,style:U},null,512),[[Fr,!x.value]]),W("canvas",{id:"qrcode-stream-tracking-layer",ref_key:"trackingLayerRef",ref:$,style:I},null,512),W("div",{style:I},[Po(P.$slots,"default")])]))}}),ss={class:"modal is-active"},cs={class:"modal-card is-flex-grow-1"},us={class:"modal-card-body modal-slot py-0 is-align-content-center has-text-centered"},ls={class:"columns is-centered"},ds={class:"column is-three-quarters"},fs={class:"modal-slot has-text-centered is-shadowless"},hs={key:0},ps={class:"block is-size-5"},vs={key:0},ms={class:"is-size-7 mb-3"},ys={class:"is-size-7 mb-3"},gs={class:"addressbar columns is-mobile is-gapless"},ws={class:"column is-narrow has-text-left circled"},bs={class:"column is-narrow has-text-right"},Cs={key:1,class:"is-size-7"},_s={class:"fullscreen-streamer"},Ts={key:0,class:"field has-addons has-addons-centered"},$s={class:"control has-icons-left"},Ss={class:"select"},Ps=["value"],Es={class:"icon is-small is-left"},Rs={__name:"Capture",setup(r){const i=Eo(),{t:a}=Oo(),c=jo(),f=Uo(),p=Fo(),m=ae(!1),$=ae(null),h=ae([]),y=ae(""),C=Mo(new Io({qrcode:null,uri:""})),b=ae(!1);Rr(async()=>{navigator.mediaDevices?.enumerateDevices?await navigator.mediaDevices.enumerateDevices().then(P=>{h.value=P.filter(({kind:T})=>T==="videoinput"),h.value.length>0?$.value=h.value[0]:y.value="no_cam_on_device"}).catch(P=>{x(P)}):y.value="secured_context_required"});const x=P=>{P.name==="NotAllowedError"?y.value="need_grant_permission":P.name==="NotFoundError"?y.value="no_cam_on_device":P.name==="NotSupportedError"||P.name==="InsecureContextError"?y.value="secured_context_required":P.name==="NotReadableError"?y.value="not_readable":P.name==="OverconstrainedError"?y.value="camera_not_suitable":P.name==="StreamApiNotSupportedError"?y.value="stream_api_not_supported":i.show(P)},D=async P=>{const[T]=P;C.uri=T.rawValue,C.uri?C.uri.slice(0,33).toLowerCase()=="otpauth-migration://offline?data="?(f.migrationUri=C.uri,c.push({name:"importAccounts"})):C.uri.slice(0,15).toLowerCase()!=="otpauth://totp/"&&C.uri.slice(0,15).toLowerCase()!=="otpauth://hotp/"?(b.value=!0,p.warn({text:a("error.no_valid_otp")})):(f.decodedUri=C.uri,c.push({name:"createAccount"})):p.warn({text:a("error.qrcode_cannot_be_read")})};function k(P){m.value=!0}function R(P){m.value=!1}function I(){c.go(-1)}const U=(P,T)=>{for(const M of P){const[Z,...te]=M.cornerPoints;T.strokeStyle="red",T.beginPath(),T.moveTo(Z.x,Z.y);for(const{x:se,y:G}of te)T.lineTo(se,G);T.lineTo(Z.x,Z.y),T.closePath(),T.stroke()}};function ie(){location.reload()}return(P,T)=>{const M=lt("Spinner"),Z=lt("Modal"),te=lt("NavigationButton"),se=lt("VueFooter");return he(),ge("div",ss,[T[4]||(T[4]=W("div",{class:"modal-background"},null,-1)),W("div",cs,[W("section",us,[W("div",ls,[W("div",ds,[W("div",fs,[de(K(Lo),null,{default:Nt(({mode:G})=>[K(y)?(he(),ge("div",hs,[W("p",ps,Ee(P.$t("message.stream.live_scan_cant_start")),1),W("p",{class:$r(["block",{"has-text-light":G=="dark"}])},Ee(P.$t("message.stream."+K(y)+".reason")),3),K(y)=="need_grant_permission"?(he(),ge("div",vs,[W("p",ms,Ee(P.$t("message.stream.need_grant_permission.solution")),1),W("p",ys,Ee(P.$t("message.stream.need_grant_permission.click_camera_icon")),1),W("div",gs,[W("div",ws,[de(K(Bo),{class:"ml-1 inline icon-size-1-15"}),de(K(Jo),{class:"ml-3 inline icon-size-1-15"})]),T[3]||(T[3]=W("div",{class:"column has-text-left ml-3"}," http://my.2fauth.app/... ",-1)),W("div",bs,[de(K(qo),{class:"mr-1 inline icon-size-1-15"})])]),W("p",null,[W("a",{class:"is-link",onClick:Ro(ie,["stop"])},Ee(P.$t("label.refresh")),1)])])):(he(),ge("p",Cs,Ee(P.$t("message.stream."+K(y)+".solution")),1))])):(he(),ge("span",{key:1,class:$r(["is-size-4",G=="dark"?"has-text-light":"has-text-grey-dark"])},[de(M,{isVisible:!0,type:"raw",rawSize:32})],2))]),_:1})])])]),Vt(W("div",_s,[K(m)&&K(h).length>1?(he(),ge("div",Ts,[W("p",$s,[W("span",Ss,[Vt(W("select",{"onUpdate:modelValue":T[0]||(T[0]=G=>_r($)?$.value=G:null)},[(he(!0),ge(Ao,null,xo(K(h),G=>(he(),ge("option",{key:G.label,value:G},Ee(G.label?G.label:P.$t("label.default")),9,Ps))),128))],512),[[ko,K($)]])]),W("span",Es,[de(K(No))])])])):Tr("",!0),K($)!==null?(he(),Do(K(is),{key:1,track:U,onDetect:D,onError:x,onCameraOn:k,onCameraOff:R})):Tr("",!0)],512),[[Fr,!K(y)]]),de(Z,{"is-active":K(b),"onUpdate:isActive":T[1]||(T[1]=G=>_r(b)?b.value=G:null)},{default:Nt(()=>[de(Wo,{qrContent:K(C).uri},null,8,["qrContent"])]),_:1},8,["is-active"])]),de(se,null,{default:Nt(()=>[de(te,{action:"cancel",isCapture:!0,useLinkTag:!1,onCanceled:T[2]||(T[2]=G=>I())})]),_:1})])])}}};export{Rs as default}; diff --git a/public/build/assets/CopyButton-CgxgBp0c.js b/public/build/assets/CopyButton-CgxgBp0c.js new file mode 100644 index 0000000..285dd99 --- /dev/null +++ b/public/build/assets/CopyButton-CgxgBp0c.js @@ -0,0 +1 @@ +import{u as r,N as p,h as l,l as u,i as y,j as d,H as _,$ as b}from"./app-dvJP63FL.js";import{c as f}from"./createLucideIcon-DsaEAGzP.js";const h=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],k=f("copy",h),m=["aria-label","title"],g={__name:"CopyButton",props:{token:String},setup(e){const{t:i}=r(),c=b(),{copy:s}=p({legacy:!0}),n=e;function a(){s(n.token),c.success({text:i("notification.copied_to_clipboard")})}return(t,o)=>(l(),u("button",{type:"button","aria-label":t.$t("label.copy_to_clipboard"),title:t.$t("tooltip.copy_to_clipboard"),class:"button is-like-text is-pulled-right is-text",onClick:o[0]||(o[0]=_(x=>a(),["stop"]))},[y(d(k))],8,m))}};export{g as _}; diff --git a/public/build/assets/Create-Vv-BwDWf.js b/public/build/assets/Create-Vv-BwDWf.js new file mode 100644 index 0000000..b15bdcb --- /dev/null +++ b/public/build/assets/Create-Vv-BwDWf.js @@ -0,0 +1 @@ +import{u as V,r as b,d as y,w as l,f as r,g as x,h as B,i as t,m as C,j as o,H as M,$ as U}from"./app-dvJP63FL.js";import{F as k}from"./Form-ZbAUhXmz.js";const h={__name:"Create",setup(N){const{t:i}=V(),d=U(),m=x(),e=b(new k({name:"",email:"",password:"",password_confirmation:"",is_admin:!1}));async function u(p){e.password_confirmation=e.password,e.post("/api/v1/users").then(s=>{const n=s.data;d.success({text:i("notification.user_created")}),m.push({name:"admin.manageUser",params:{userId:n.info.id}})})}return(p,s)=>{const n=r("FormField"),c=r("FormPasswordField"),f=r("FormCheckbox"),w=r("FormButtons"),_=r("FormWrapper"),F=r("VueFooter"),g=r("StackLayout");return B(),y(g,null,{content:l(()=>[t(_,{title:"heading.new_user"},{default:l(()=>[C("form",{onSubmit:M(u,["prevent"]),onKeydown:s[5]||(s[5]=a=>o(e).onKeydown(a))},[t(n,{modelValue:o(e).name,"onUpdate:modelValue":s[0]||(s[0]=a=>o(e).name=a),fieldName:"name",errorMessage:o(e).errors.get("name"),inputType:"text",label:"field.name",autocomplete:"username",maxLength:255,autofocus:""},null,8,["modelValue","errorMessage"]),t(n,{modelValue:o(e).email,"onUpdate:modelValue":s[1]||(s[1]=a=>o(e).email=a),fieldName:"email",errorMessage:o(e).errors.get("email"),inputType:"email",label:"field.email",autocomplete:"email",maxLength:255},null,8,["modelValue","errorMessage"]),t(c,{modelValue:o(e).password,"onUpdate:modelValue":s[2]||(s[2]=a=>o(e).password=a),fieldName:"password",errorMessage:o(e).errors.get("password"),showRules:!0,label:"field.password",autocomplete:"new-password"},null,8,["modelValue","errorMessage"]),t(f,{modelValue:o(e).is_admin,"onUpdate:modelValue":s[3]||(s[3]=a=>o(e).is_admin=a),isDanger:!0,fieldName:"is_admin",label:"field.is_admin",help:"field.is_admin.help"},null,8,["modelValue"]),t(w,{isBusy:o(e).isBusy,isDisabled:o(e).isDisabled,showCancelButton:!0,onCancel:s[4]||(s[4]=a=>o(m).push({name:"admin.users"})),submitLabel:"label.create",submitId:"btnCreateUser"},null,8,["isBusy","isDisabled"])],32)]),_:1})]),footer:l(()=>[t(F)]),_:1})}}};export{h as default}; diff --git a/public/build/assets/CreateUpdate-CbOB1O7q.js b/public/build/assets/CreateUpdate-CbOB1O7q.js new file mode 100644 index 0000000..f79fca7 --- /dev/null +++ b/public/build/assets/CreateUpdate-CbOB1O7q.js @@ -0,0 +1 @@ +import{O as C,a8 as N,r as S,a6 as V,J as k,d as x,w as c,M as I,a2 as M,f as s,g as E,h as L,i as u,j as o,m as O,H as U,B as j}from"./app-dvJP63FL.js";import{F as K}from"./Form-ZbAUhXmz.js";import{u as R}from"./bus-ChE1sp8V.js";const H={__name:"CreateUpdate",props:{groupId:[Number,String]},setup(f){const l=C(),i=E(),h=M(),p=R(),_=I("2fauth"),d=N(_.prefix+"returnTo","groups"),m=f,r=j(()=>m.groupId!=null),e=S(new K({name:"",show_in_chips:!1}));V(()=>{h.name=="editGroup"&&(p.editedGroupName&&(e.name=p.editedGroupName,p.editedGroupName=void 0),k.get(m.groupId).then(n=>{e.name=n.data.name,e.show_in_chips=n.data.show_in_chips}))});function g(){r.value?w():b()}async function b(){e.post("/api/v1/groups").then(n=>{l.addOrEdit(n.data),i.push({name:d.value})})}async function w(){e.put("/api/v1/groups/"+m.groupId).then(n=>{l.addOrEdit(n.data),i.push({name:d.value})})}return(n,t)=>{const B=s("FormField"),F=s("FormCheckbox"),v=s("FormButtons"),y=s("FormWrapper"),G=s("StackLayout");return L(),x(G,null,{content:c(()=>[u(y,{title:o(r)?"heading.edit_group":"heading.new_group"},{default:c(()=>[O("form",{onSubmit:U(g,["prevent"]),onKeydown:t[3]||(t[3]=a=>o(e).onKeydown(a))},[u(B,{modelValue:o(e).name,"onUpdate:modelValue":t[0]||(t[0]=a=>o(e).name=a),fieldName:"name",errorMessage:o(e).errors.get("name"),label:"field.name",autofocus:""},null,8,["modelValue","errorMessage"]),u(F,{modelValue:o(e).show_in_chips,"onUpdate:modelValue":t[1]||(t[1]=a=>o(e).show_in_chips=a),fieldName:"show_in_chips",label:"field.show_in_chips",help:"field.show_in_chips.help"},null,8,["modelValue"]),u(v,{submitId:o(r)?"btnEditGroup":"btnCreateGroup",isBusy:o(e).isBusy,submitLabel:o(r)?"label.save":"label.create",showCancelButton:!0,onCancel:t[2]||(t[2]=a=>o(i).push({name:o(d)}))},null,8,["submitId","isBusy","submitLabel"])],32)]),_:1},8,["title"])]),_:1})}}};export{H as default}; diff --git a/public/build/assets/CreateUpdate-tvLQ26rU.js b/public/build/assets/CreateUpdate-tvLQ26rU.js new file mode 100644 index 0000000..a5b51fb --- /dev/null +++ b/public/build/assets/CreateUpdate-tvLQ26rU.js @@ -0,0 +1 @@ +import{C as et,u as tt,a as ot,b as at,r as ce,e as u,o as lt,I as x,Q as ue,v as N,d as _,w as g,j as e,a2 as st,M as nt,g as rt,f as y,h as n,i as c,m as s,p as de,t as f,l as p,k as d,D as $,_ as pe,H as W,F as J,E as X,q as Fe,n as q,y as Ie,G as $e,a3 as Ue,B as Te,$ as it,a1 as ct,O as ut}from"./app-dvJP63FL.js";import{F as fe}from"./Form-ZbAUhXmz.js";import{_ as dt}from"./QrContentDisplay-DiIjf7a_.js";import{i as G,R as pt}from"./iconService-rm6LRV4U.js";import{u as ft}from"./bus-ChE1sp8V.js";import{U as vt}from"./index-BJsmINgd.js";import{c as Oe}from"./createLucideIcon-DsaEAGzP.js";import{Q as mt}from"./qr-code-eSL1bq0j.js";import"./external-link-CqpXNovN.js";const ht=[["path",{d:"M10.3 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10l-3.1-3.1a2 2 0 0 0-2.814.014L6 21",key:"9csbqa"}],["path",{d:"m14 19.5 3-3 3 3",key:"9vmjn0"}],["path",{d:"M17 22v-5.5",key:"1aa6fl"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}]],Le=Oe("image-up",ht);const gt=[["path",{d:"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",key:"ul74o6"}],["path",{d:"m14 7 3 3",key:"1r5n42"}],["path",{d:"M5 6v4",key:"ilb8ba"}],["path",{d:"M19 14v4",key:"blhpug"}],["path",{d:"M10 2v2",key:"7u0qdc"}],["path",{d:"M7 8H3",key:"zfb6yr"}],["path",{d:"M21 16h-4",key:"1cnmox"}],["path",{d:"M11 3H9",key:"1obp7u"}]],_t=Oe("wand-sparkles",gt),yt={key:1,class:"modal modal-otp is-active"},bt={class:"modal-card is-flex-grow-1"},kt={class:"modal-card-body modal-slot py-0 is-align-content-center has-text-centered"},wt={key:1,for:"filUploadIcon",class:"add-icon-button pt-2"},Vt={key:0,role:"alert",class:"m-3"},xt={class:"field is-grouped is-grouped-centered mt-6"},Pt={class:"control"},Ct={key:0,class:"field is-grouped"},Mt={class:"control"},St=["title"],Ft={class:"file-cta"},It={class:"file-label"},$t={key:2,for:"icon-collection",class:"label"},Ut={key:3,class:"field has-addons"},Tt={class:"control"},Lt={class:"select"},Ot=["disabled"],At=["value"],Et={key:0,class:"control"},Dt={class:"select"},Nt=["disabled"],qt=["value"],Gt=["title"],Bt={class:"field is-grouped"},Ht={class:"control"},Qt={class:"icon is-small"},Kt={class:"control is-flex"},Rt={class:"file-cta"},jt={class:"icon"},zt={class:"file-label"},Wt={class:"is-hidden-mobile ml-1"},Jt=["src","alt"],Xt=["aria-label"],Yt={class:"field"},Zt={key:1,id:"lgdTryMyLuck",class:"help"},eo={key:6},to={key:0},oo={class:"title is-4 mt-5 mb-2"},ao={class:"help mb-4"},lo={class:"control"},so={key:0,class:"control"},ho={__name:"CreateUpdate",props:{twofaccountId:[Number,String]},setup(Ae){const B=et(),{t:v}=tt(),H=nt("2fauth"),P=rt(),Ee=st(),r=ot(),U=at(),Y=ft(),m=it(),o=ce(new fe({service:"",account:"",otp_type:"",icon:"",group_id:Be(),secret:"",algorithm:"",digits:null,counter:null,period:null,image:""})),Q=ce(new fe({qrcode:null})),C=ce(new fe({icon:null})),De=[{text:"selfh.st",value:"selfh",hasVariant:!0},{text:"dashboardicons.com",value:"dashboardicons",hasVariant:!0},{text:"2fa.directory",value:"tfa",hasVariant:!1}],K={selfh:[{text:"label.regular",value:"regular"},{text:"label.light",value:"light"},{text:"label.dark",value:"dark"}],dashboardicons:[{text:"label.regular",value:"regular"},{text:"label.light",value:"light"},{text:"label.dark",value:"dark"}],tfa:[{text:"label.regular",value:"regular"}]},T=u({otp_type:"",account:"",service:"",icon:"",secret:"",digits:null,algorithm:"",period:null,counter:null,image:""}),Ne=[{text:"TOTP",value:"totp"},{text:"HOTP",value:"hotp"},{text:"STEAM",value:"steamtotp"}],qe=[{text:"6",value:6},{text:"7",value:7},{text:"8",value:8},{text:"9",value:9},{text:"10",value:10}],Ge=[{text:"sha1",value:"sha1"},{text:"sha256",value:"sha256"},{text:"sha512",value:"sha512"},{text:"md5",value:"md5"}],M=u(),i=u(""),L=u(!1),S=u(!1),O=u(!1),A=u(!1),k=u(!1),F=u(!1),R=u(!1),w=u(r.preferences.iconCollection),E=u(r.preferences.iconVariant),I=u(r.preferences.iconPack??"/"),V=u([{text:"label.no_available_icon_packs",value:"/"}]),Z=u(!1),ee=u(!1),te=u(null),oe=u(null),j=u(null),ae=u(null),ve=u(null),me=u(null),he=u(null),le=Ae,h=Te(()=>le.twofaccountId!=null),ge=Te(()=>ut().items.map(t=>({text:t.id>0?t.name:"- "+v("label.no_group")+" -",value:t.id})));lt(()=>{Ee.name=="editAccount"?(F.value=!0,x.get(le.twofaccountId).then(t=>{o.fill(t.data),o.group_id==null&&(o.group_id=0),o.setOriginal(),i.value=o.icon,A.value=!0}).finally(()=>{F.value=!1})):Y.decodedUri?(M.value=Y.decodedUri,Y.decodedUri=null,F.value=!0,r.preferences.AutoSaveQrcodedAccount?x.storeFromUri(M.value).then(t=>{Ke(t.data)}).catch(t=>{t.response.data.errors.uri&&(S.value=!0,A.value=!0)}).finally(()=>{F.value=!1}):x.preview(M.value).then(t=>{o.fill(t.data),i.value=t.data.icon?t.data.icon:"",L.value=!0,ue().then(()=>{j.value.show()})}).catch(t=>{t.response.data.errors.uri&&(S.value=!0,A.value=!0)}).finally(()=>{F.value=!1})):A.value=!0,Ce()}),N(w,t=>{E.value=Object.prototype.hasOwnProperty.call(K,t)?K[t][0].value:""}),N(i,t=>{L.value&&ue().then(()=>{j.value.icon=t})}),N(k,t=>{t==!1&&(ae.value?.clearOTP(),j.value?.clearOTP())}),N(O,t=>{t==!1&&(oe.value?.clearOTP(),P.push({name:"accounts"}))}),N(()=>o.otp_type,(t,a)=>{t==="steamtotp"?(o.service="Steam",xe()):a==="steamtotp"&&(o.service="",b())});function Be(){return r.preferences.defaultGroup==-1?r.preferences.activeGroup<=0?0:r.preferences.activeGroup:r.preferences.defaultGroup}function _e(){h.value?He():ye()}async function ye(){o.icon=i.value;const{data:t}=await o.post("/api/v1/twofaccounts");o.errors.any()===!1&&(U.items.push(t),U.sortDefault(),m.success({text:v("notification.account_created")}),P.push({name:"accounts"}))}async function He(){if(i.value!==o.icon){let a="";a=o.icon,o.icon=i.value,i.value=a,b()}const{data:t}=await o.put("/api/v1/twofaccounts/"+le.twofaccountId);if(o.errors.any()===!1){const a=U.items.findIndex(D=>D.id===t.id);U.items.splice(a,1,t),U.sortDefault(),m.success({text:v("notification.account_updated")}),P.push({name:"accounts"})}}function Qe(){o.clear(),k.value=!0,ae.value.show()}function Ke(t){T.value.otp_type=t.otp_type,T.value.service=t.service,T.value.account=t.account,T.value.icon=t.icon,ue().then(()=>{O.value=!0,oe.value.show(t.id)})}function be(){o.hasChanged()||i.value!=o.icon?confirm(v("confirmation.cancel_creation"))===!0&&((!h.value||i.value!=o.icon)&&b(),P.push({name:"accounts"})):P.push({name:"accounts"})}function ke(){b(),C.icon=te.value.files[0],C.upload("/api/v1/icons",{returnError:!0}).then(t=>{i.value=t.data.filename,L.value&&(o.icon=i.value)}).catch(t=>{t.response.status!==422&&m.alert({text:t.response.data.message})})}function b(){h.value?i.value&&(i.value!==o.icon&&G.deleteIcon(i.value),i.value=""):i.value&&(G.deleteIcon(i.value),i.value="",L.value&&(o.icon=""))}function we(t){o.counter=t.nextHotpCounter}function Ve(t){o.errors.set(o.extractErrors(t))}function Re(){Q.qrcode=me.value.files[0],Q.upload("/api/v1/qrcode/decode",{returnError:!0}).then(t=>{M.value=t.data.data,x.preview(M.value,{returnError:!0}).then(a=>{o.fill(a.data),o.group_id=0,i.value=a.data.icon?a.data.icon:null}).catch(a=>{a.response.status===422?a.response.data.errors.uri?S.value=!0:m.alert({text:v(a.response.data.message)}):B.show(a)})}).catch(t=>{t.response.status!==422&&m.alert({text:t.response.data.message})})}function xe(){r.preferences.getOfficialIcons&&(R.value=!0,r.preferences.iconSource=="logolib"?G.getLogo(o.service,w.value,E.value,{returnError:!0}).then(t=>{t.status===201?(b(),i.value=t.data.filename):m.warn({text:v("error.no_icon_for_this_variant")})}).catch(()=>{m.warn({text:v("error.no_icon_for_this_variant")})}).finally(()=>{R.value=!1}):G.getLogoFromPack(o.service,I.value,{returnError:!0}).then(t=>{t.status===201?(b(),i.value=t.data.filename):m.warn({text:v("error.no_match_in_the_icon_pack")})}).catch(t=>{t.response.status===422?(o.clear(),o.errors.set(o.extractErrors(t.response))):m.warn({text:v("error.no_match_in_the_icon_pack")})}).finally(()=>{R.value=!1}))}function Pe(t){r.preferences.activeGroup!=t&&(r.preferences.activeGroup=t),r.preferences.rememberActiveGroup&&ct.updatePreference("activeGroup",r.preferences.activeGroup)}function Ce(){ee.value=!0,G.getIconPacks().then(t=>{V.value=[],t.data.forEach(a=>{V.value.push({text:a.name,value:a.name})}),V.value.length==0?(Z.value=!1,I.value="/",V.value.push({text:"label.no_available_icon_packs",value:"/"})):(Z.value=!0,I.value=r.preferences.iconPack==null||!V.value.some(a=>a.value===r.preferences.iconPack)?V.value[0].value:r.preferences.iconPack)}).finally(()=>{ee.value=!1})}return(t,a)=>{const D=y("Modal"),se=y("FormFieldError"),ne=y("VueButton"),Me=y("NavigationButton"),re=y("FormField"),Se=y("FormSelect"),ie=y("FormToggle"),je=y("FormWrapper"),ze=y("VueFooter"),We=y("StackLayout"),Je=y("Spinner");return n(),_(e(vt),null,{default:g(({mode:z})=>[c(We,null,{content:g(()=>[e(r).preferences.AutoSaveQrcodedAccount?(n(),_(D,{key:0,modelValue:e(O),"onUpdate:modelValue":a[3]||(a[3]=l=>$(O)?O.value=l:null)},{default:g(()=>[c(e(pe),{ref_key:"OtpDisplayForAutoSave",ref:oe,accountParams:e(T),preferences:e(r).preferences,twofaccountService:e(x),iconPathPrefix:e(H).config.subdirectory,onPleaseCloseMe:a[0]||(a[0]=l=>e(P).push({name:"accounts"})),onPleaseUpdateActiveGroup:Pe,onOtpCopiedToClipboard:a[1]||(a[1]=l=>e(m).success({text:e(v)("notification.copied_to_clipboard")})),onError:a[2]||(a[2]=l=>e(B).show(l))},null,8,["accountParams","preferences","twofaccountService","iconPathPrefix"])]),_:1},8,["modelValue"])):d("",!0),!e(h)&&e(L)?(n(),p("div",yt,[a[28]||(a[28]=s("div",{class:"modal-background"},null,-1)),s("div",bt,[s("section",kt,[s("form",{onSubmit:W(ye,["prevent"]),onKeydown:a[7]||(a[7]=l=>e(o).onKeydown(l))},[s("div",null,[e(C).errors.hasAny("icon")?(n(),_(se,{key:0,error:e(C).errors.get("icon"),field:"icon",class:"help-for-file"},null,8,["error"])):d("",!0),e(i)?d("",!0):(n(),p("label",wt,[s("input",{id:"filUploadIcon",class:"file-input",type:"file",accept:"image/*",onChange:ke,ref_key:"iconInput",ref:te},null,544),c(e(Le),{class:"icon-size-3"})])),e(i)?(n(),p("button",{key:2,type:"button",class:"delete delete-icon-button is-medium",onClick:W(b,["prevent"])})):d("",!0),c(e(pe),{ref_key:"OtpDisplayForQuickForm",ref:j,accountParams:e(o).data(),preferences:e(r).preferences,twofaccountService:e(x),iconPathPrefix:e(H).config.subdirectory,can_autoCloseTimeout:!1,onIncrementHotp:we,onPleaseCloseMe:a[4]||(a[4]=l=>k.value=!1),onPleaseUpdateActiveGroup:Pe,onOtpCopiedToClipboard:a[5]||(a[5]=l=>e(m).success({text:e(v)("notification.copied_to_clipboard")})),onValidationError:Ve,onError:a[6]||(a[6]=l=>e(B).show(l))},null,8,["accountParams","preferences","twofaccountService","iconPathPrefix"])]),e(o).errors.any()?(n(),p("div",Vt,[(n(!0),p(J,null,X(e(o).errors.errors,(l,Xe)=>(n(),p("ul",{key:Xe,class:"help is-danger"},[(n(!0),p(J,null,X(l,(Ye,Ze)=>(n(),p("li",{key:Ze},f(Ye),1))),128))]))),128))])):d("",!0),s("div",xt,[s("div",Pt,[c(ne,{nativeType:"submit",isLoading:e(o).isBusy},{default:g(()=>[de(f(t.$t("label.save")),1)]),_:1},8,["isLoading"])]),c(Me,{action:"cancel",isText:!0,isRounded:!1,useLinkTag:!1,onCanceled:be})])],32)])])])):d("",!0),e(A)?(n(),_(je,{key:2,title:e(h)?"heading.edit_account":"heading.new_account"},{default:g(()=>[s("form",{onSubmit:W(_e,["prevent"]),onKeydown:a[22]||(a[22]=l=>e(o).onKeydown(l))},[e(h)?d("",!0):(n(),p("div",Ct,[s("div",Mt,[s("div",{role:"button",tabindex:"0",class:q(["file is-small",{"is-black":z=="dark"}]),onKeyup:a[8]||(a[8]=Fe(l=>e(ve).click(),["enter"]))},[s("label",{class:"file-label",title:t.$t("tooltip.use_qrcode"),ref_key:"qrcodeInputLabel",ref:ve},[s("input",{inert:"",tabindex:"-1",class:"file-input",type:"file",accept:"image/*",onChange:Re,ref_key:"qrcodeInput",ref:me},null,544),s("span",Ft,[s("span",It,[c(e(mt),{class:"mr-2"}),de(f(t.$t("label.prefill_using_qrcode")),1)])])],8,St)],34)])])),e(Q).errors.hasAny("qrcode")?(n(),_(se,{key:1,error:e(Q).errors.get("qrcode"),field:"qrcode",class:"help-for-file"},null,8,["error"])):d("",!0),c(re,{modelValue:e(o).service,"onUpdate:modelValue":a[9]||(a[9]=l=>e(o).service=l),fieldName:"service",errorMessage:e(o).errors.get("email"),isDisabled:e(o).otp_type==="steamtotp",label:"field.service",placeholder:t.$t("field.service.placeholder"),autofocus:""},null,8,["modelValue","errorMessage","isDisabled","placeholder"]),c(re,{modelValue:e(o).account,"onUpdate:modelValue":a[10]||(a[10]=l=>e(o).account=l),fieldName:"account",errorMessage:e(o).errors.get("account"),label:"field.account",placeholder:t.$t("field.account.placeholder")},null,8,["modelValue","errorMessage","placeholder"]),e(r).preferences.iconSource=="logolib"?(n(),p("label",$t,f(t.$t("field.icon")),1)):d("",!0),e(r).preferences.iconSource=="logolib"?(n(),p("div",Ut,[s("div",Tt,[s("div",Lt,[Ie(s("select",{disabled:!e(o).service,name:"icon-collection","onUpdate:modelValue":a[11]||(a[11]=l=>$(w)?w.value=l:null)},[(n(),p(J,null,X(De,l=>s("option",{key:l.text,value:l.value},f(l.text),9,At)),64))],8,Ot),[[$e,e(w)]])])]),K[e(w)]?(n(),p("div",Et,[s("div",Dt,[Ie(s("select",{disabled:!e(o).service,name:"icon-collection-variant","onUpdate:modelValue":a[12]||(a[12]=l=>$(E)?E.value=l:null)},[(n(!0),p(J,null,X(K[e(w)],l=>(n(),p("option",{key:l.value,value:l.value},f(t.$t(l.text)),9,qt))),128))],8,Nt),[[$e,e(E)]])])])):d("",!0)])):e(r).preferences.iconSource=="iconpack"?(n(),_(Se,{key:4,modelValue:e(I),"onUpdate:modelValue":a[13]||(a[13]=l=>$(I)?I.value=l:null),options:e(V),fieldName:"iconPack",isDisabled:!e(o).service,label:"field.icon"},{default:g(()=>[s("button",{class:"button is-ghost",onClick:Ce,type:"button",title:t.$t("tooltip.refresh_icon_pack_list")},[c(e(pt),{class:q({spinning:e(ee)})},null,8,["class"])],8,Gt)]),_:1},8,["modelValue","options","isDisabled"])):d("",!0),s("div",Bt,[s("div",Ht,[c(ne,{onClick:xe,color:z=="dark"?"is-dark":"",nativeType:"button","is-loading":e(R),disabled:!e(o).service||e(r).preferences.iconSource=="iconpack"&&!e(Z),"aria-describedby":"lgdTryMyLuck"},{default:g(()=>[s("span",Qt,[c(e(_t))]),s("span",null,f(t.$t("label.i_m_lucky")),1)]),_:1},8,["color","is-loading","disabled"])]),s("div",Kt,[s("div",{role:"button",tabindex:"0",class:q(["file mr-3",z=="dark"?"is-dark":"is-white"]),onKeyup:a[14]||(a[14]=Fe(l=>e(he).click(),["enter"]))},[s("label",{for:"filUploadIcon",class:"file-label",ref_key:"iconInputLabel",ref:he},[s("input",{id:"filUploadIcon",tabindex:"-1",class:"file-input",type:"file",accept:"image/*",onChange:ke,ref_key:"iconInput",ref:te},null,544),s("span",Rt,[s("span",jt,[c(e(Le))]),s("span",zt,[s("span",Wt,f(t.$t("label.choose_image")),1)])])],512)],34),e(i)?(n(),p("span",{key:0,class:q(["tag is-large",z=="dark"?"is-dark":"is-white"])},[s("img",{class:"icon-preview",src:e(H).config.subdirectory+"/storage/icons/"+e(i),alt:t.$t("alttext.icon_to_illustrate_the_account")},null,8,Jt),s("button",{type:"button",class:"clear-selection delete is-small",onClick:W(b,["prevent"]),"aria-label":t.$t("label.remove_icon")},null,8,Xt)],2)):d("",!0)])]),s("div",Yt,[e(C).errors.hasAny("icon")?(n(),_(se,{key:0,error:e(C).errors.get("icon"),field:"icon",class:"help-for-file"},null,8,["error"])):d("",!0),e(r).preferences.getOfficialIcons?(n(),p("p",Zt,f(t.$t("message.i_m_lucky_legend")),1)):d("",!0)]),e(ge).length>0?(n(),_(Se,{key:5,modelValue:e(o).group_id,"onUpdate:modelValue":a[15]||(a[15]=l=>e(o).group_id=l),options:e(ge),fieldName:"group_id",label:"field.group",help:"field.group.help"},null,8,["modelValue","options"])):d("",!0),c(ie,{modelValue:e(o).otp_type,"onUpdate:modelValue":a[16]||(a[16]=l=>e(o).otp_type=l),isDisabled:e(h),choices:Ne,fieldName:"otp_type",errorMessage:e(o).errors.get("otp_type"),label:"field.otp_type",help:"field.otp_type.help",hasOffset:!0},null,8,["modelValue","isDisabled","errorMessage"]),e(o).otp_type!=""?(n(),p("div",eo,[c(e(Ue),{enableProtection:e(h),modelValue:e(o).secret,"onUpdate:modelValue":a[17]||(a[17]=l=>e(o).secret=l),modelModifiers:{trimAll:!0},fieldName:"secret",errorMessage:e(o).errors.get("secret"),label:"field.secret",help:"field.secret.help"},null,8,["enableProtection","modelValue","errorMessage"]),e(o).otp_type!=="steamtotp"?(n(),p("div",to,[s("h2",oo,f(t.$t("heading.options")),1),s("p",ao,f(t.$t("field.options.help")),1),c(ie,{modelValue:e(o).digits,"onUpdate:modelValue":a[18]||(a[18]=l=>e(o).digits=l),choices:qe,fieldName:"digits",errorMessage:e(o).errors.get("digits"),label:"field.digits",help:"field.digits.help"},null,8,["modelValue","errorMessage"]),c(ie,{modelValue:e(o).algorithm,"onUpdate:modelValue":a[19]||(a[19]=l=>e(o).algorithm=l),choices:Ge,fieldName:"algorithm",errorMessage:e(o).errors.get("algorithm"),label:"field.algorithm",help:"field.algorithm.help"},null,8,["modelValue","errorMessage"]),e(o).otp_type==="totp"?(n(),_(re,{key:0,pattern:"[0-9]{1,4}",class:q("is-half-width-field"),modelValue:e(o).period,"onUpdate:modelValue":a[20]||(a[20]=l=>e(o).period=l),fieldName:"period",errorMessage:e(o).errors.get("period"),label:"field.period",help:"field.period.help",placeholder:t.$t("field.period.placeholder")},null,8,["modelValue","errorMessage","placeholder"])):d("",!0),e(o).otp_type==="hotp"?(n(),_(e(Ue),{key:1,pattern:"[0-9]{1,4}",enableProtection:e(h),isExpanded:!1,modelValue:e(o).counter,"onUpdate:modelValue":a[21]||(a[21]=l=>e(o).counter=l),fieldName:"counter",errorMessage:e(o).errors.get("counter"),label:"field.counter",placeholder:t.$t("field.counter.placeholder"),help:e(h)?"field.counter.help_lock":"field.counter.help"},null,8,["enableProtection","modelValue","errorMessage","placeholder","help"])):d("",!0)])):d("",!0)])):d("",!0)],32),c(D,{"is-active":e(k),"onUpdate:isActive":a[26]||(a[26]=l=>$(k)?k.value=l:null)},{default:g(()=>[c(e(pe),{ref_key:"OtpDisplayForAdvancedForm",ref:ae,accountParams:e(o).data(),preferences:e(r).preferences,twofaccountService:e(x),iconPathPrefix:e(H).config.subdirectory,can_autoCloseTimeout:!1,onIncrementHotp:we,onPleaseCloseMe:a[23]||(a[23]=l=>k.value=!1),onOtpCopiedToClipboard:a[24]||(a[24]=l=>e(m).success({text:e(v)("notification.copied_to_clipboard")})),onValidationError:Ve,onError:a[25]||(a[25]=l=>e(B).show(l))},null,8,["accountParams","preferences","twofaccountService","iconPathPrefix"])]),_:1},8,["is-active"])]),_:2},1032,["title"])):d("",!0),c(D,{"is-active":e(S),"onUpdate:isActive":a[27]||(a[27]=l=>$(S)?S.value=l:null)},{default:g(()=>[c(dt,{qrContent:e(M)},null,8,["qrContent"])]),_:1},8,["is-active"])]),footer:g(()=>[c(ze,null,{default:g(()=>[s("p",lo,[c(ne,{nativeType:"submit",onClick:_e,id:e(h)?"btnUpdate":"btnCreate",isLoading:e(o).isBusy,class:"is-rounded"},{default:g(()=>[de(f(e(h)?t.$t("label.save"):t.$t("label.create")),1)]),_:1},8,["id","isLoading"])]),e(o).otp_type&&e(o).secret?(n(),p("p",so,[s("button",{id:"btnPreview",type:"button",class:"button is-success is-rounded has-text-white",onClick:Qe},f(t.$t("label.test")),1)])):d("",!0),c(Me,{action:"cancel",useLinkTag:!1,onCanceled:be})]),_:1})]),_:2},1024),e(F)?(n(),_(Je,{key:0,type:"fullscreen",isVisible:!0,message:"message.parsing_data"})):d("",!0)]),_:1})}}};export{ho as default}; diff --git a/public/build/assets/Edit-Ba84j7PP.js b/public/build/assets/Edit-Ba84j7PP.js new file mode 100644 index 0000000..81ef1e2 --- /dev/null +++ b/public/build/assets/Edit-Ba84j7PP.js @@ -0,0 +1 @@ +import{u as b,r as w,d as v,w as u,f as s,g as F,h as g,i as a,m as B,j as n,H as h,$ as C}from"./app-dvJP63FL.js";import{F as x}from"./Form-ZbAUhXmz.js";const S={__name:"Edit",props:{credentialId:{type:String,default:""}},setup(l){const{t:r}=b(),i=F(),m=C(),e=w(new x({name:r("label.my_device")})),d=l;function c(){e.patch("/webauthn/credentials/"+d.credentialId+"/name").then(()=>{m.success({text:r("notification.device_successfully_registered")}),i.push({name:"settings.webauthn.devices"})})}return(V,t)=>{const p=s("FormField"),f=s("FormButtons"),_=s("FormWrapper"),y=s("StackLayout");return g(),v(y,null,{content:u(()=>[a(_,{title:"heading.rename_device"},{default:u(()=>[B("form",{onSubmit:h(c,["prevent"]),onKeydown:t[2]||(t[2]=o=>n(e).onKeydown(o))},[a(p,{modelValue:n(e).name,"onUpdate:modelValue":t[0]||(t[0]=o=>n(e).name=o),fieldName:"name",errorMessage:n(e).errors.get("name"),inputType:"text",label:"field.new_name",autofocus:""},null,8,["modelValue","errorMessage"]),a(f,{submitId:"btnEditCredential",isBusy:n(e).isBusy,submitLabel:"label.save",showCancelButton:!0,onCancel:t[1]||(t[1]=o=>n(i).push({name:"settings.webauthn.devices"}))},null,8,["isBusy"])],32)]),_:1})]),_:1})}}};export{S as default}; diff --git a/public/build/assets/Error-DG0pgQA2.js b/public/build/assets/Error-DG0pgQA2.js new file mode 100644 index 0000000..27ce0f6 --- /dev/null +++ b/public/build/assets/Error-DG0pgQA2.js @@ -0,0 +1 @@ +import{C as v,v as w,o as M,d as _,w as f,D as C,j as e,a2 as $,e as B,f as b,g as x,h as t,i as F,l as n,m as i,n as d,t as l,k as c,F as N,E as V,p as q,B as D}from"./app-dvJP63FL.js";import{U as E}from"./index-BJsmINgd.js";const R={key:0,class:"error-message"},U={key:1,class:"error-message"},z={key:3,class:"is-size-7 is-family-code pt-3"},L={__name:"Error",setup(j){const s=v(),m=x(),u=$(),g=B(!0),y=D(()=>!1);w(g,r=>{r==!1&&k()}),M(()=>{u.query.err&&(s.message="error."+u.query.err)});function k(){window.history.length>1&&u.name!=="404"&&u.name!=="notFound"&&!u.query.err?m.go(-1):m.push({name:"accounts"})}return(r,a)=>{const h=b("Modal");return t(),_(h,{"is-active":e(g),"onUpdate:isActive":a[0]||(a[0]=o=>C(g)?g.value=o:null)},{default:f(()=>[F(e(E),null,{default:f(({mode:o})=>[r.$route.name=="404"||r.$route.name=="notFound"?(t(),n("div",R,[a[1]||(a[1]=i("p",{class:"error-404"},null,-1)),i("p",{class:d({"has-text-grey":o!="dark"})},l(r.$t("error.resource_not_found")),3)])):(t(),n("div",U,[a[3]||(a[3]=i("p",{class:"error-generic"},null,-1)),i("p",{class:d({"has-text-grey":o!="dark"})},l(r.$t("message.error_occured")),3),e(s).message?(t(),n("p",{key:0,class:d({"has-text-grey-lighter":o=="dark"})},l(r.$t(e(s).message)),3)):c("",!0),e(s).reasons?(t(!0),n(N,{key:1},V(e(s).reasons,p=>(t(),n("p",{key:p,class:d({"has-text-grey-lighter":o=="dark"})},l(p),3))),128)):c("",!0),e(s).originalMessage?(t(),n("p",{key:2,class:d({"has-text-grey-lighter":o=="dark"})},l(r.$t(e(s).originalMessage)),3)):c("",!0),e(y)&&e(s).debug?(t(),n("p",z,[a[2]||(a[2]=i("br",null,null,-1)),q(l(e(s).debug),1)])):c("",!0)]))]),_:1})]),_:1},8,["is-active"])}}};export{L as default}; diff --git a/public/build/assets/Form-ZbAUhXmz.js b/public/build/assets/Form-ZbAUhXmz.js new file mode 100644 index 0000000..6b52b4b --- /dev/null +++ b/public/build/assets/Form-ZbAUhXmz.js @@ -0,0 +1 @@ +import{ae as u}from"./app-dvJP63FL.js";class l{constructor(){this.errors={}}set(t,s){typeof t=="object"?this.errors=t:this.set({...this.errors,[t]:n(s)})}all(){return this.errors}has(t){return this.errors.hasOwnProperty(t)}hasAny(...t){return t.some(s=>this.has(s))}any(){return Object.keys(this.errors).length>0}get(t){if(this.has(t))return this.getAll(t)[0]}getAll(t){return n(this.errors[t]||[])}only(...t){const s=[];return t.forEach(r=>{const e=this.get(r);e&&s.push(e)}),s}flatten(){return Object.values(this.errors).reduce((t,s)=>t.concat(s),[])}clear(t){const s={};t&&Object.keys(this.errors).forEach(r=>{r!==t&&(s[r]=this.errors[r])}),this.set(s)}}function n(o){return Array.isArray(o)?o:[o]}class i{constructor(t={}){this.axios=u("web"),this.isBusy=!1,this.isDisabled=!1,this.errors=new l,this.originalData=this.deepCopy(t),Object.assign(this,t)}fill(t){this.keys().forEach(s=>{this[s]=t[s]})}setOriginal(){Object.keys(this).filter(t=>!i.ignore.includes(t)).forEach(t=>{this.originalData[t]=this.deepCopy(this[t])})}hasChanged(){return this.keys().some(t=>this[t]!==this.originalData[t])}fillWithKeyValueObject(t){this.keys().forEach(s=>{const r=t.find(e=>e.key===s.toString());r!=null&&(this[s]=r.value)})}data(){return this.keys().reduce((t,s)=>({...t,[s]:this[s]}),{})}keys(){return Object.keys(this).filter(t=>!i.ignore.includes(t))}startProcessing(){this.errors.clear(),this.isBusy=!0}finishProcessing(){this.isBusy=!1}clear(){this.errors.clear()}reset(){Object.keys(this).filter(t=>!i.ignore.includes(t)).forEach(t=>{this[t]=this.deepCopy(this.originalData[t])})}get(t,s={}){return this.submit("get",t,s)}post(t,s={}){return this.submit("post",t,s)}patch(t,s={}){return this.submit("patch",t,s)}put(t,s={}){return this.submit("put",t,s)}delete(t,s={}){return this.submit("delete",t,s)}submit(t,s,r={}){this.startProcessing();const e=t==="get"?{params:this.data()}:this.data();return new Promise((a,c)=>{this.axios.request({url:this.route(s),method:t,data:e,...r}).then(h=>{this.finishProcessing(),a(h)}).catch(h=>{this.isBusy=!1,h.response&&this.errors.set(this.extractErrors(h.response)),h.response?.status!=422&&c(h)})})}upload(t,s={}){return this.startProcessing(),new Promise((r,e)=>{this.axios.post(this.route(t),this.data(),{headers:{"Content-Type":"multipart/form-data"},...s}).then(a=>{this.finishProcessing(),r(a)}).catch(a=>{this.isBusy=!1,a.response&&this.errors.set(this.extractErrors(a.response)),e(a)})})}extractErrors(t){return!t.data||typeof t.data!="object"?{error:i.errorMessage}:t.data.errors?{...t.data.errors}:t.data.message?{error:t.data.message}:{...t.data}}route(t,s={}){let r=t;return i.routes.hasOwnProperty(t)&&(r=decodeURI(i.routes[t])),typeof s!="object"&&(s={id:s}),Object.keys(s).forEach(e=>{r=r.replace(`{${e}}`,s[e])}),r}onKeydown(t){t.target.name&&this.errors.clear(t.target.name)}deepCopy(t){if(t===null||typeof t!="object")return t;const s=Array.isArray(t)?[]:{};return Object.keys(t).forEach(r=>{s[r]=this.deepCopy(t[r])}),s}}i.routes={};i.errorMessage="Something went wrong. Please try again.";i.ignore=["isBusy","isDisabled","errors","originalData","axios"];export{i as F}; diff --git a/public/build/assets/Groups-Ccrpwp-O.js b/public/build/assets/Groups-Ccrpwp-O.js new file mode 100644 index 0000000..ca19dfb --- /dev/null +++ b/public/build/assets/Groups-Ccrpwp-O.js @@ -0,0 +1 @@ +import{U as V}from"./index-BJsmINgd.js";import{O as N,a as S,v as E,o as L,af as T,d as R,w as i,e as x,f as c,g as A,Q as g,h as u,i as a,j as s,m as o,t as n,p as f,l as m,F,E as M,k as v,n as k}from"./app-dvJP63FL.js";import{u as U}from"./bus-ChE1sp8V.js";import{u as W,m as O,T as j,M as q}from"./useSortable-6hRbxhTj.js";import{C as D}from"./circle-plus-BM92Iipr.js";import{c as P}from"./createLucideIcon-DsaEAGzP.js";const Q=[["path",{d:"M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z",key:"oz39mx"}],["path",{d:"m9 10 2 2 4-4",key:"1gnqz4"}]],H=P("bookmark-check",Q),J={class:"title"},K={class:"is-size-7-mobile"},X={class:"mt-3 mb-6"},Y={key:0},Z={id:"dv"},ee={class:"is-flex is-align-items-center"},te={class:"tfa-content is-size-5 is-size-6-mobile pr-2"},se={class:"has-ellipsis"},oe={class:"is-family-primary is-size-6 is-size-7-mobile has-text-grey"},ae={key:0,class:"tfa-cell"},ie={class:"tfa-cell"},ne=["onClick","title"],le={class:"tfa-cell ml-4"},re={class:"mt-2 is-size-7 is-pulled-right"},ge={__name:"Groups",setup(ce){const y=A(),t=N(),b=U(),C=S(),p=x(!1),{start:w,stop:z}=W("#dv",t.withoutTheAllGroup,{animation:200,handle:".drag-handle",onUpdate:e=>{const d=t.withoutTheAllGroup[e.oldIndex].id,l=t.items.findIndex(_=>_.id==d);O(t.items,l,e.newIndex+1,e),g(()=>{t.saveOrder()})}});return E(()=>t.isEmpty,e=>{e==!1?g(()=>{w()}):z()}),L(()=>{p.value=t.isEmpty,t.fetch().finally(()=>{p.value=!1})}),T((e,d)=>{e.name=="editGroup"&&(b.editedGroupName=t.items.find(l=>l.id==e.params.groupId)?.name)}),(e,d)=>{const l=c("RouterLink"),_=c("Spinner"),$=c("ResponsiveWidthWrapper"),G=c("NavigationButton"),B=c("VueFooter"),I=c("StackLayout");return u(),R(I,null,{content:i(()=>[a($,null,{default:i(()=>[o("h1",J,n(e.$t("heading.groups")),1),o("div",K,n(e.$t("message.manage_groups_legend")),1),o("div",X,[a(l,{class:"is-link mt-5",to:{name:"createGroup"}},{default:i(()=>[a(s(D)),f(" "+n(e.$t("link.create_group")),1)]),_:1})]),s(t).isEmpty?v("",!0):(u(),m("div",Y,[a(s(V),null,{default:i(({mode:h})=>[o("span",Z,[(u(!0),m(F,null,M(s(t).withoutTheAllGroup,r=>(u(),m("div",{key:r.id,class:"group-item"},[o("div",ee,[o("div",te,[o("div",se,[f(n(r.name)+" ",1),o("span",oe,n(e.$t("message.x_accounts",{count:r.twofaccounts_count})),1)])]),s(C).preferences.useGroupChips&&r.show_in_chips?(u(),m("div",ae,[a(s(H),{class:"icon mr-2"})])):v("",!0),o("div",ie,[a(l,{to:{name:"editGroup",params:{groupId:r.id}},class:k(["button tag mr-1",h=="dark"?"is-dark":"is-white"]),title:e.$t("tooltip.edit_group")},{default:i(()=>[f(n(e.$t("label.edit")),1)]),_:1},8,["to","class","title"]),o("button",{type:"button",class:k(["button tag",h=="dark"?"is-dark":"is-white"]),onClick:de=>s(t).remove(r.id),title:e.$t("tooltip.delete")},[a(s(j),{class:"icon-size-1"})],10,ne)]),o("div",le,[a(s(q),{class:"drag-handle has-text-grey is-draggable"})])])]))),128))])]),_:1}),o("div",re,n(e.$t("message.deleting_group_does_not_delete_accounts")),1)])),a(_,{isVisible:s(p)&&s(t).isEmpty,type:"list-loading"},null,8,["isVisible"])]),_:1})]),footer:i(()=>[a(B,null,{default:i(()=>[a(G,{action:"close",onClosed:d[0]||(d[0]=h=>s(y).push({name:"accounts"})),"current-page-title":e.$t("title.groups")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{ge as default}; diff --git a/public/build/assets/Import-C0sC5CLD.js b/public/build/assets/Import-C0sC5CLD.js new file mode 100644 index 0000000..6e0ce1b --- /dev/null +++ b/public/build/assets/Import-C0sC5CLD.js @@ -0,0 +1 @@ +import{u as vt,a as _t,b as gt,r as j,v as kt,o as yt,I as X,d as x,w,j as l,e as g,$ as bt,B as D,M as wt,f as k,h as n,i as a,l as u,m as t,t as o,k as d,a4 as Y,n as $,F as V,E as B,p as h,q as Z,a5 as $t,D as tt,H as Ct,_ as zt,Q as At}from"./app-dvJP63FL.js";import{F as U}from"./Form-ZbAUhXmz.js";import{u as xt}from"./bus-ChE1sp8V.js";import{U as Mt}from"./index-BJsmINgd.js";import{Q as Ft}from"./qr-code-eSL1bq0j.js";import{c as H}from"./createLucideIcon-DsaEAGzP.js";import{C as v}from"./check-CPGWPXZa.js";import{X as et}from"./x-DQVIq0xP.js";import{a as St,C as Nt}from"./circle-x-AvUNZzwX.js";const qt=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],Et=H("file-text",qt);const Pt=[["path",{d:"M12 20h-1a2 2 0 0 1-2-2 2 2 0 0 1-2 2H6",key:"1528k5"}],["path",{d:"M13 8h7a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-7",key:"13ksps"}],["path",{d:"M5 16H4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h1",key:"1n9rhb"}],["path",{d:"M6 4h1a2 2 0 0 1 2 2 2 2 0 0 1 2-2h1",key:"1mj8rg"}],["path",{d:"M9 6v12",key:"velyjx"}]],Tt=H("text-cursor-input",Pt);const Vt=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Bt=H("triangle-alert",Vt),It={class:"title"},Ot={key:0},jt={class:"block is-size-7-mobile"},Dt={class:"mb-2"},Ut={class:"columns"},Ht={class:"column"},Lt={class:"block"},Rt={class:"card"},Qt={class:"card-content"},Jt={class:"media"},Wt={class:"media-left"},Kt={class:"image is-32x32"},Gt={class:"media-content"},Xt={class:"title is-5 has-text-grey"},Yt={class:"card-footer"},Zt={class:"block"},te={class:"card"},ee={class:"card-content"},se={class:"media"},le={class:"media-left"},ie={class:"image is-32x32"},oe={class:"media-content"},ne={class:"title is-5 has-text-grey"},ae={class:"card-footer"},re={class:"block"},ue={class:"card"},de={class:"card-content"},ce={class:"media"},pe={class:"media-left"},fe={class:"image is-32x32"},me={class:"media-content"},he={class:"title is-5 has-text-grey"},ve={class:"content"},_e={class:"card-footer"},ge={class:"title is-5"},ke={class:"block is-size-7-mobile"},ye={class:"table is-size-7-mobile is-fullwidth"},be={key:1},we={class:"block is-size-7-mobile"},$e={class:"mb-2"},Ce={class:"is-flex is-justify-content-space-between"},ze=["onClick","title"],Ae=["src"],xe={key:1,class:"is-flex-grow-1 has-ellipsis"},Me={key:2,class:"tags is-flex-wrap-nowrap"},Fe=["onClick","title"],Se=["onClick","title"],Ne={key:3,class:"has-nowrap"},qe={key:0,class:"has-text-success"},Ee={key:1,class:"has-text-danger"},Pe={class:"is-size-6 is-size-7-mobile"},Te={class:"is-family-primary has-text-grey"},Ve={key:0,class:"has-text-danger"},Be={key:1,class:"has-text-warning"},Ie={key:2},Oe={key:0,class:"mt-2 is-size-7 is-pulled-right"},je={key:1,class:"mt-2 is-size-7 is-pulled-right"},De={key:0,class:"control"},Ye={__name:"Import",setup(Ue){const{t:c}=vt(),L=wt("2fauth"),f=bt(),R=_t(),I=xt(),Q=gt(),M=g(null),q=g(null),E=g(null),C=g(null),P=g(null),F=j(new U({service:"",account:"",otp_type:"",icon:"",secret:"",algorithm:"",digits:null,counter:null,period:null})),z=j(new U({file:null,withSecret:!0})),y=j(new U({qrcode:null,withSecret:!0})),A=g(!1);c("label.qr_code"),c("label.plain_text");const r=g([]),m=g(!1),S=D(()=>r.value.filter(s=>s.imported==-1&&s.id>-2).length),J=D(()=>r.value.filter(s=>s.id===-1&&s.imported===-1).length),st=D(()=>r.value.filter(s=>s.imported===1).length);kt(A,s=>{s==!1&&M.value?.clearOTP()}),yt(()=>{I.migrationUri&&(O(I.migrationUri),I.migrationUri=null)});async function O(s,e=null){m.value=!0,await X.migrate(s,{returnError:!0}).then(_=>{_.data.forEach(T=>{T.imported=-1,r.value.push(T)}),K(),C.value=P.value=null}).catch(_=>{f.alert({text:c(_.response.data.message)}),e!=null&&_.response.status===422&&(e.clear(),e.errors.set(e.extractErrors(_.response)))}).finally(()=>{m.value=!1})}function lt(){confirm(c("confirmation.discard_duplicates"))&&(f.clear(),M.value?.clearOTP(),r.value=r.value.filter(s=>s.id!==-1))}function it(){confirm(c("confirmation.discard_all"))&&(f.clear(),M.value?.clearOTP(),r.value=[])}function ot(s){confirm(c("confirmation.discard"))&&r.value.splice(s,1)}async function nt(){for(let s=0;s{r.value[s].imported=1,r.value[s].id=e.data.id,delete e.data.secret,Q.items.push(e.data)}).catch(e=>{r.value[s].imported=0,r.value[s].id=0,r.value[s].errors=F.errors.flatten()})}function at(s){F.fill(r.value[s]),A.value=!0,At().then(()=>{M.value.show()})}function rt(){z.clear(),m.value=!0,z.file=q.value.files[0],z.upload("/api/v1/twofaccounts/migration",{returnError:!0}).then(s=>{s.data.forEach(e=>{e.imported=-1,r.value.push(e)}),K()}).catch(s=>{s.response.status===422?s.response.data.errors?.file==null&&f.alert({text:c("error.invalid_2fa_data")}):f.alert({text:s.response.data.message})}).finally(()=>{m.value=!1})}function ut(){y.clear(),m.value=!0,y.qrcode=E.value.files[0],y.upload("/api/v1/qrcode/decode",{returnError:!0}).then(s=>{O(s.data.data,y)}).catch(s=>{s.response.status===422?s.response.data.errors?.qrcode==null&&f.alert({text:c("error.invalid_2fa_data")}):f.alert({text:s.response.data.message})}).finally(()=>{m.value=!1})}function K(){f.success({text:c("notification.x_valid_accounts_found",{count:S.value})})}function dt(){P.value=null,C.value?O(C.value):P.value=c("validation.required",{attribute:"Direct input"})}return(s,e)=>{const _=k("FormFieldError"),T=k("RouterLink"),ct=k("ResponsiveWidthWrapper"),pt=k("Spinner"),ft=k("Modal"),G=k("NavigationButton"),mt=k("VueFooter"),ht=k("StackLayout");return n(),x(l(Mt),null,{default:w(({mode:b})=>[a(ht,null,{content:w(()=>[a(ct,null,{default:w(()=>[t("h1",It,o(s.$t("heading.import")),1),!l(m)&&l(r).length===0?(n(),u("div",Ot,[t("div",jt,[t("p",Dt,o(s.$t("message.import_legend")),1),t("p",null,o(s.$t("message.import_legend_afterpart")),1)]),t("div",Ut,[t("div",Ht,[t("div",Lt,[t("div",Rt,[t("div",Qt,[t("div",Jt,[t("div",Wt,[t("figure",Kt,[a(l(Ft),{class:$(["icon-size-2",b=="dark"?"has-text-grey-darker":"has-text-grey-lighter"])},null,8,["class"])])]),t("div",Gt,[t("p",Xt,o(s.$t("heading.qr_code")),1),t("p",{class:$(["subtitle is-6 mt-1 is-size-7-mobile",{"has-text-grey-dark":b=="dark"}])},o(s.$t("message.supported_formats_for_qrcode_upload")),3)])]),l(y).errors.any()?(n(!0),u(V,{key:0},B(l(y).errors.all(),(i,p)=>(n(),x(_,{key:p,error:l(y).errors.get(p),field:p},null,8,["error","field"]))),128)):d("",!0)]),t("footer",Yt,[a(T,{id:"btnCapture",to:{name:"capture"},class:"card-footer-item is-link"},{default:w(()=>[h(o(s.$t("link.scan")),1)]),_:1}),t("a",{role:"button",tabindex:"0",class:"card-footer-item is-relative is-link",onClick:e[0]||(e[0]=i=>l(E).click()),onKeyup:e[1]||(e[1]=Z(i=>l(E).click(),["enter"]))},[t("input",{inert:"",tabindex:"-1",class:"file-input",type:"file",accept:"image/*",onChange:ut,ref_key:"qrcodeInput",ref:E},null,544),h(" "+o(s.$t("label.upload")),1)],32)])])]),t("div",Zt,[t("div",te,[t("div",ee,[t("div",se,[t("div",le,[t("figure",ie,[a(l(Et),{class:$(["icon-size-2",b=="dark"?"has-text-grey-darker":"has-text-grey-lighter"])},null,8,["class"])])]),t("div",oe,[t("p",ne,o(s.$t("label.text_file")),1),t("p",{class:$(["subtitle is-6 mt-1 is-size-7-mobile",{"has-text-grey-dark":b=="dark"}])},o(s.$t("message.supported_formats_for_file_upload")),3)])]),l(z).errors.any()?(n(!0),u(V,{key:0},B(l(z).errors.all(),(i,p)=>(n(),x(_,{key:p,error:l(z).errors.get(p),field:p},null,8,["error","field"]))),128)):d("",!0)]),t("footer",ae,[t("a",{role:"button",tabindex:"0",class:"card-footer-item is-relative is-link",onClick:e[2]||(e[2]=i=>l(q).click()),onKeyup:e[3]||(e[3]=Z(i=>l(q).click(),["enter"]))},[t("input",{inert:"",tabindex:"-1",class:"file-input",type:"file",accept:"text/plain,application/json,text/csv,.2fas",onChange:rt,ref_key:"fileInput",ref:q},null,544),h(" "+o(s.$t("label.upload")),1)],32)])])]),t("div",re,[t("div",ue,[t("div",de,[t("div",ce,[t("div",pe,[t("figure",fe,[a(l(Tt),{class:$(["icon-size-2",b=="dark"?"has-text-grey-darker":"has-text-grey-lighter"])},null,8,["class"])])]),t("div",me,[t("p",he,o(s.$t("message.direct_input")),1),t("p",{class:$(["subtitle is-6 mt-1 is-size-7-mobile",{"has-text-grey-dark":b=="dark"}])},o(s.$t("message.expected_format_for_direct_input")),3)])]),t("div",ve,[a(l($t),{modelValue:l(C),"onUpdate:modelValue":e[4]||(e[4]=i=>tt(C)?C.value=i:null),errorMessage:l(P),fieldName:"payload",rows:"5",size:"is-small"},null,8,["modelValue","errorMessage"])])]),t("footer",_e,[t("a",{role:"button",tabindex:"0",class:"card-footer-item is-relative is-link",onClick:Ct(dt,["stop"])},o(s.$t("label.submit")),1)])])])])]),t("h2",ge,o(s.$t("heading.supported_migration_formats")),1),t("div",ke,[a(l(Bt),{class:"inline icon-size-1 has-text-warning-30"}),h(" "+o(s.$t("message.do_not_set_password_or_encryption")),1)]),t("table",ye,[e[34]||(e[34]=t("thead",null,[t("tr",null,[t("th"),t("th",null,"Plain text"),t("th",null,"QR code"),t("th",null,"JSON")])],-1)),t("tbody",null,[t("tr",null,[e[14]||(e[14]=t("th",null,"Google Authenticator",-1)),e[15]||(e[15]=t("td",null,null,-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})]),e[16]||(e[16]=t("td",null,null,-1))]),t("tr",null,[e[17]||(e[17]=t("th",null,"Aegis Auth",-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})]),e[18]||(e[18]=t("td",null,null,-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})])]),t("tr",null,[e[19]||(e[19]=t("th",null,"2FAS auth",-1)),e[20]||(e[20]=t("td",null,null,-1)),e[21]||(e[21]=t("td",null,null,-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})])]),t("tr",null,[e[22]||(e[22]=t("th",null,"FreeOTP+",-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})]),e[23]||(e[23]=t("td",null,null,-1)),e[24]||(e[24]=t("td",null,null,-1))]),t("tr",null,[e[25]||(e[25]=t("th",null,"2FAuth",-1)),e[26]||(e[26]=t("td",null,null,-1)),e[27]||(e[27]=t("td",null,null,-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})])]),t("tr",null,[e[28]||(e[28]=t("th",null,"Bitwarden",-1)),e[29]||(e[29]=t("td",null,null,-1)),e[30]||(e[30]=t("td",null,null,-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})])]),t("tr",null,[e[31]||(e[31]=t("th",null,"Bitwarden Authenticator",-1)),e[32]||(e[32]=t("td",null,null,-1)),e[33]||(e[33]=t("td",null,null,-1)),t("td",null,[a(l(v),{"stroke-width":"3",class:"icon-size-1"})])])])])])):l(m)?d("",!0):(n(),u("div",be,[t("div",we,[t("p",$e,o(s.$t("message.submitted_data_parsed_now_accounts_are_awaiting_import")),1),t("p",null,o(s.$t("message.use_buttons_to_save_or_discard")),1)]),(n(!0),u(V,null,B(l(r),(i,p)=>(n(),u("div",{key:i.name,class:"group-item is-size-5 is-size-6-mobile"},[t("div",Ce,[i.id>-2&&i.imported!==0?(n(),u("div",{key:0,class:"is-flex-grow-1 has-ellipsis is-clickable",onClick:N=>at(p),title:s.$t("tooltip.generate_a_test_password")},[i.icon&&l(R).preferences.showAccountsIcons?(n(),u("img",{key:0,role:"presentation",class:"import-icon",src:l(L).config.subdirectory+"/storage/icons/"+i.icon,alt:""},null,8,Ae)):d("",!0),h(" "+o(i.account),1)],8,ze)):(n(),u("div",xe,o(i.account),1)),i.imported===-1?(n(),u("div",Me,[i.id>-2?(n(),u("button",{key:0,type:"button",class:"button tag is-link",onClick:N=>W(p),title:s.$t("tooltip.import_this_account")},o(s.$t("label.to_import")),9,Fe)):d("",!0),t("button",{type:"button",class:$(["button tag",{"is-dark has-text-grey-light":b=="dark"}]),onClick:N=>ot(p),title:s.$t("tooltip.discard_this_account")},[a(l(et),{class:"icon-size-1"})],10,Se)])):(n(),u("div",Ne,[i.imported===1?(n(),u("span",qe,[h(o(s.$t("message.imported"))+" ",1),a(l(v),{class:"inline"})])):(n(),u("span",Ee,[h(o(s.$t("message.failure"))+" ",1),a(l(et),{class:"inline"})]))]))]),t("div",Pe,[t("div",Te,o(s.$t("label.issuer"))+": "+o(i.service),1),i.id===-2?(n(),u("div",Ve,[a(l(St),{class:"mr-1 icon-size-1 inline"}),h(o(i.secret),1)])):d("",!0),i.id===-1&&i.imported!==1&&!i.errors?(n(),u("div",Be,[a(l(Nt),{class:"mr-1 icon-size-1 inline"}),h(o(s.$t("message.possible_duplicate")),1)])):d("",!0),i.errors?(n(),u("ul",Ie,[(n(!0),u(V,null,B(i.errors,N=>(n(),u("li",{key:N,class:"has-text-danger"},o(N),1))),128))])):d("",!0)])]))),128)),l(S)>0?(n(),u("div",Oe,[l(J)?(n(),u("button",{key:0,onClick:e[5]||(e[5]=i=>lt()),type:"button",class:"has-text-grey button is-small is-ghost"},o(s.$t("label.discard_duplicates"))+" ("+o(l(J))+")",1)):d("",!0),t("button",{onClick:e[6]||(e[6]=i=>it()),type:"button",class:"has-text-grey button is-small is-ghost"},o(s.$t("label.discard_all")),1)])):d("",!0),l(st)==l(r).length?(n(),u("div",je,[t("button",{onClick:e[7]||(e[7]=i=>r.value=[]),type:"button",class:"has-text-grey button is-small is-ghost"},o(s.$t("label.clear")),1)])):d("",!0)]))]),_:2},1024),l(m)&&l(r).length===0?(n(),x(pt,{key:0,type:"fullscreen-overlay",isVisible:!0,message:"message.parsing_data"})):d("",!0),a(ft,{"is-active":l(A),"onUpdate:isActive":e[11]||(e[11]=i=>tt(A)?A.value=i:null)},{default:w(()=>[a(l(zt),{ref_key:"otpDisplay",ref:M,accountParams:l(F).data(),preferences:l(R).preferences,twofaccountService:l(X),iconPathPrefix:l(L).config.subdirectory,onPleaseCloseMe:e[8]||(e[8]=i=>A.value=!1),onOtpCopiedToClipboard:e[9]||(e[9]=i=>l(f).success({text:l(c)("notification.copied_to_clipboard")})),onError:e[10]||(e[10]=i=>s.errorHandler.show(i))},null,8,["accountParams","preferences","twofaccountService","iconPathPrefix"])]),_:1},8,["is-active"])]),footer:w(()=>[a(mt,null,{default:w(()=>[l(S)>0?(n(),u("p",De,[t("button",{type:"button",class:"button is-link is-rounded is-focus",onClick:nt},[t("span",null,o(s.$t("label.import_all"))+" ("+o(l(S))+")",1)])])):d("",!0),l(S)>0?(n(),x(G,{key:1,action:"cancel",onCanceled:e[12]||(e[12]=i=>("router"in s?s.router:l(Y)).push({name:"accounts"}))})):(n(),x(G,{key:2,action:"close",onClosed:e[13]||(e[13]=i=>("router"in s?s.router:l(Y)).push({name:"accounts"})),"current-page-title":s.$t("title.importAccounts")},null,8,["current-page-title"]))]),_:1})]),_:2},1024)]),_:1})}}};export{Ye as default}; diff --git a/public/build/assets/Login-XfEMUKl8.js b/public/build/assets/Login-XfEMUKl8.js new file mode 100644 index 0000000..c00e77c --- /dev/null +++ b/public/build/assets/Login-XfEMUKl8.js @@ -0,0 +1 @@ +import{M as T,h as o,l,t as a,j as t,C as q,u as H,a as z,P as G,r as J,a8 as Q,o as X,d as k,w as u,f as v,g as Y,i as _,k as g,m as n,H as j,p as d,q as O,F as $,E as M,n as N,e as Z,$ as x}from"./app-dvJP63FL.js";import{F as ee}from"./Form-ZbAUhXmz.js";import{w as se}from"./webauthnService-D363et0U.js";const te=["id","href"],R={__name:"SsoConnectLink",props:{provider:{type:String,default:"unknown"}},setup(K){const S=T("2fauth"),c=K;return(m,B)=>(o(),l("a",{id:"lnkSignWith"+c.provider,class:"button is-link",href:t(S).config.subdirectory+"/socialite/redirect/"+c.provider},a(m.$t("label."+c.provider)),9,te))}},ne={key:0,class:"notification is-warning has-text-centered"},ae={class:"block"},oe={class:"nav-links"},ie={key:0,class:"mt-4"},le={key:1,class:"columns mt-4 is-variable is-1"},re={class:"column is-narrow py-1"},ue={class:"column py-1"},de={class:"buttons"},me={key:0,class:"notification is-info has-text-centered is-radiusless"},pe={key:1,class:"notification is-warning has-text-centered is-radiusless"},_e={class:"nav-links"},ge={class:""},ce={class:""},fe={key:2,class:"buttons mt-4"},ye={key:3,class:"is-italic"},ve={class:"nav-links"},ke=["href"],we={key:0,class:"notification is-info has-text-centered is-radiusless"},be={key:1,class:"notification is-warning has-text-centered is-radiusless"},he={key:2,class:"notification is-warning has-text-centered"},$e={class:"nav-links"},Se=["aria-label"],Fe={key:0,class:"mt-4"},Le={key:1,class:"columns mt-4 is-variable is-1"},Ve={class:"column is-narrow py-1"},Be={class:"column py-1"},Ae={class:"buttons"},Re={__name:"Login",setup(K){const S=q(),{t:c}=H(),m=T("2fauth"),B=Y(),W=z(),w=x(),p=G(),r=J(new ee({email:"",password:""})),A=Z(!1),f=Q(m.prefix+"activeLoginForm",null);X(()=>{p.enableSso==!0&&p.useSsoOnly==!0?f.value="sso":(f.value==null||f.value=="sso")&&(f.value="legacy")});function b(s){r.clear(),f.value=s}function D(s){w.clear(),r.post("/user/login",{returnError:!0}).then(async e=>{await W.loginAs({id:e.data.id,name:e.data.name,email:e.data.email,oauth_provider:e.data.oauth_provider,authenticated_by_proxy:!1,preferences:e.data.preferences,isAdmin:e.data.is_admin});for(const[h,F]of Object.entries(e?.data?.appSettings||{}))p[h]=F;B.push({name:"accounts"})}).catch(e=>{e.response?.status===401?w.alert({text:c("notification.authentication_failed"),duration:1e4}):e.response?.status!==422&&S.show(e)})}function I(){w.clear(),r.clear(),A.value=!0,se.authenticate(r.email).then(async s=>{await W.loginAs({id:s.data.id,name:s.data.name,email:s.data.email,oauth_provider:s.data.oauth_provider,authenticated_by_proxy:!1,preferences:s.data.preferences,isAdmin:s.data.is_admin});for(const[e,h]of Object.entries(s?.data?.appSettings||{}))p[e]=h;B.push({name:"accounts"})}).catch(s=>{"webauthn"in s?s.name=="is-warning"?w.warn({text:c(s.message)}):w.alert({text:c(s.message)}):s.response.status===401?w.alert({text:c("notification.authentication_failed"),duration:1e4}):s.response.status==422?r.errors.set(r.extractErrors(s.response)):S.show(s)}).finally(()=>{A.value=!1})}return(s,e)=>{const h=v("FormField"),F=v("FormButtons"),L=v("RouterLink"),C=v("FormWrapper"),V=v("i18n-t"),U=v("FormPasswordField"),E=v("VueFooter"),P=v("StackLayout");return o(),k(P,null,{content:u(()=>[t(f)=="webauthn"?(o(),k(C,{key:0,title:"heading.webauthn_login",punchline:"message.welcome_to_2fauth"},{default:u(()=>[t(p).enableSso==!0&&t(p).useSsoOnly==!0?(o(),l("div",ne,a(s.$t("message.sso_only_form_restricted_to_admin")),1)):g("",!0),n("div",ae,a(s.$t("message.use_security_device_to_sign_in")),1),n("form",{id:"frmWebauthnLogin",onSubmit:j(I,["prevent"]),onKeydown:e[1]||(e[1]=i=>t(r).onKeydown(i))},[_(h,{modelValue:t(r).email,"onUpdate:modelValue":e[0]||(e[0]=i=>t(r).email=i),fieldName:"email",errorMessage:t(r).errors.get("email"),inputType:"email",label:"field.email",autofocus:""},null,8,["modelValue","errorMessage"]),_(F,{isBusy:t(A),submitLabel:"label.continue",submitId:"btnContinue"},null,8,["isBusy"])],32),n("div",oe,[n("p",null,[d(a(s.$t("message.lost_your_device"))+"  ",1),_(L,{id:"lnkRecoverAccount",to:{name:"webauthn.lost"},class:"is-link"},{default:u(()=>[d(a(s.$t("link.recover_your_account")),1)]),_:1})]),n("p",null,[d(a(s.$t("message.sign_in_using"))+"  ",1),n("a",{id:"lnkSignWithLegacy",role:"button",class:"is-link",onKeyup:e[2]||(e[2]=O(i=>b("legacy"),["enter"])),onClick:e[3]||(e[3]=i=>b("legacy")),tabindex:"0"},a(s.$t("link.login_and_password")),33)]),t(p).disableRegistration==!1&&t(p).useSsoOnly==!1?(o(),l("p",ie,[d(a(s.$t("message.dont_have_account_yet"))+"  ",1),_(L,{id:"lnkRegister",to:{name:"register"},class:"is-link"},{default:u(()=>[d(a(s.$t("link.register")),1)]),_:1})])):g("",!0),t(p).enableSso==!0&&Object.values(t(m).config.sso).includes(!0)?(o(),l("div",le,[n("div",re,a(s.$t("message.or_continue_with")),1),n("div",ue,[n("div",de,[(o(!0),l($,null,M(t(m).config.sso,(i,y)=>(o(),l($,{key:y},[i?(o(),k(R,{key:0,class:N("is-outlined is-small"),provider:y},null,8,["provider"])):g("",!0)],64))),128))])])])):g("",!0)])]),_:1})):t(f)=="sso"?(o(),k(C,{key:1,title:"heading.sso_login",punchline:"message.welcome_to_2fauth"},{default:u(()=>[t(m).isDemoApp?(o(),l("div",me,[d(a(s.$t("message.welcome_to_demo_app")),1),e[13]||(e[13]=n("br",null,null,-1)),_(V,{keypath:"message.sign_in_using_email_password",tag:"span"},{email:u(()=>[...e[11]||(e[11]=[n("strong",null,"demo@2fauth.app",-1)])]),password:u(()=>[...e[12]||(e[12]=[n("strong",null,"demo",-1)])]),_:1})])):g("",!0),t(m).isTestingApp?(o(),l("div",pe,[d(a(s.$t("message.welcome_to_testing_app"))+" ",1),_(V,{keypath:"message.use_those_credentials",tag:"span"},{email:u(()=>[...e[14]||(e[14]=[n("strong",null,"testing@2fauth.app",-1)])]),password:u(()=>[...e[15]||(e[15]=[n("strong",null,"password",-1)])]),_:1})])):g("",!0),n("div",_e,[n("p",ge,a(s.$t("message.password_login_and_webauthn_are_disabled")),1),n("p",ce,a(s.$t("message.sign_in_using_sso")),1)]),Object.values(t(m).config.sso).includes(!0)?(o(),l("div",fe,[(o(!0),l($,null,M(t(m).config.sso,(i,y)=>(o(),l($,{key:y},[i?(o(),k(R,{key:0,provider:y},null,8,["provider"])):g("",!0)],64))),128))])):(o(),l("p",ye,"- "+a(s.$t("message.no_provider"))+" -",1)),n("div",ve,[n("p",null,[d(a(s.$t("message.no_sso_provider_or_provider_is_missing"))+"  ",1),n("a",{id:"lnkSsoDocs",class:"is-link",tabindex:"0",href:t(m).urls.ssoDocUrl,target:"_blank"},a(s.$t("link.see_how_to_enable_sso")),9,ke)]),n("p",null,[d(a(s.$t("message.if_administrator"))+"  ",1),n("a",{id:"lnkSignWithLegacy",role:"button",class:"is-link",onKeyup:e[4]||(e[4]=O(i=>b("legacy"),["enter"])),onClick:e[5]||(e[5]=i=>b("legacy")),tabindex:"0"},a(s.$t("link.sign_in_here")),33)])])]),_:1})):t(f)=="legacy"?(o(),k(C,{key:2,title:"heading.login",punchline:"message.welcome_to_2fauth"},{default:u(()=>[t(m).isDemoApp?(o(),l("div",we,[d(a(s.$t("message.welcome_to_demo_app")),1),e[18]||(e[18]=n("br",null,null,-1)),_(V,{keypath:"message.sign_in_using_email_password",tag:"span"},{email:u(()=>[...e[16]||(e[16]=[n("strong",null,"demo@2fauth.app",-1)])]),password:u(()=>[...e[17]||(e[17]=[n("strong",null,"demo",-1)])]),_:1})])):g("",!0),t(m).isTestingApp?(o(),l("div",be,[d(a(s.$t("message.welcome_to_testing_app"))+" ",1),_(V,{keypath:"message.use_those_credentials",tag:"span"},{email:u(()=>[...e[19]||(e[19]=[n("strong",null,"testing@2fauth.app",-1)])]),password:u(()=>[...e[20]||(e[20]=[n("strong",null,"password",-1)])]),_:1})])):g("",!0),t(p).enableSso==!0&&t(p).useSsoOnly==!0?(o(),l("div",he,a(s.$t("message.sso_only_form_restricted_to_admin")),1)):g("",!0),n("form",{id:"frmLegacyLogin",onSubmit:j(D,["prevent"]),onKeydown:e[8]||(e[8]=i=>t(r).onKeydown(i))},[_(h,{modelValue:t(r).email,"onUpdate:modelValue":e[6]||(e[6]=i=>t(r).email=i),fieldName:"email",errorMessage:t(r).errors.get("email"),inputType:"email",label:"field.email",autocomplete:"username",autofocus:""},null,8,["modelValue","errorMessage"]),_(U,{modelValue:t(r).password,"onUpdate:modelValue":e[7]||(e[7]=i=>t(r).password=i),fieldName:"password",errorMessage:t(r).errors.get("password"),label:"field.password",autocomplete:"current-password"},null,8,["modelValue","errorMessage"]),_(F,{isBusy:t(r).isBusy,submitLabel:"label.sign_in",submitId:"btnSignIn"},null,8,["isBusy"])],32),n("div",$e,[n("p",null,[d(a(s.$t("message.forgot_your_password"))+"  ",1),_(L,{id:"lnkResetPwd",to:{name:"password.request"},class:"is-link","aria-label":s.$t("label.reset_your_password")},{default:u(()=>[d(a(s.$t("link.request_password_reset")),1)]),_:1},8,["aria-label"])]),n("p",null,[d(a(s.$t("message.sign_in_using"))+"  ",1),n("a",{id:"lnkSignWithWebauthn",role:"button",class:"is-link",onKeyup:e[9]||(e[9]=O(i=>b("webauthn"),["enter"])),onClick:e[10]||(e[10]=i=>b("webauthn")),tabindex:"0","aria-label":s.$t("tooltip.sign_in_using_security_device")},a(s.$t("link.security_device")),41,Se)]),t(p).disableRegistration==!1&&t(p).useSsoOnly==!1?(o(),l("p",Fe,[d(a(s.$t("message.dont_have_account_yet"))+"  ",1),_(L,{id:"lnkRegister",to:{name:"register"},class:"is-link"},{default:u(()=>[d(a(s.$t("link.register")),1)]),_:1})])):g("",!0),t(p).enableSso&&Object.values(t(m).config.sso).includes(!0)?(o(),l("div",Le,[n("div",Ve,a(s.$t("message.or_continue_with")),1),n("div",Be,[n("div",Ae,[(o(!0),l($,null,M(t(m).config.sso,(i,y)=>(o(),l($,{key:y},[i?(o(),k(R,{key:0,class:N("is-outlined is-small"),provider:y},null,8,["provider"])):g("",!0)],64))),128))])])])):g("",!0)])]),_:1})):g("",!0)]),footer:u(()=>[_(E)]),_:1})}}};export{Re as default}; diff --git a/public/build/assets/Manage-B1CTWqgo.js b/public/build/assets/Manage-B1CTWqgo.js new file mode 100644 index 0000000..05ecbf7 --- /dev/null +++ b/public/build/assets/Manage-B1CTWqgo.js @@ -0,0 +1 @@ +import{_ as se}from"./CopyButton-CgxgBp0c.js";import{_ as te}from"./AccessLogViewer-D5ke4CwJ.js";import{C as ie,u as ne,a as oe,o as ae,a1 as p,d as I,w as m,j as t,e as z,g as re,M as le,a7 as v,f as h,h as a,i as c,m as s,t as n,l as r,k as d,n as g,p as b,F as de,E as ue,Q as B,$ as ce}from"./app-dvJP63FL.js";import{U as _e}from"./index-BJsmINgd.js";import{u as he}from"./bus-ChE1sp8V.js";import{u as fe}from"./breakpoints-CyLcIEOu.js";import{c as pe}from"./createLucideIcon-DsaEAGzP.js";import"./tablet-DYUfDfjC.js";import"./x-DQVIq0xP.js";import"./check-CPGWPXZa.js";const me=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}],["path",{d:"M7 21v-2a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v2",key:"1m6ac2"}]],ge=pe("square-user",me),ke={key:0,class:"pr-5 settings-menu"},ve={class:"menu"},be={class:"menu-list"},ye={key:0},$e={class:"mt-1"},we={key:1},ze={class:"columns is-mobile is-2"},Ce={class:"column"},xe={class:"has-text-weight-light has-text-grey-dark is-pulled-right"},Ue={class:"subtitle is-6"},Ve={key:0,class:"notification is-dark is-size-7-mobile has-text-centered"},Ie={class:"block is-size-6 is-size-7-mobile has-text-grey"},Se={class:"block"},Ee={key:2,class:"block"},Fe={class:"list-item is-size-6 is-size-6-mobile has-text-grey"},Ne={class:"mb-3 is-flex is-justify-content-space-between"},Be={class:"has-text-weight-bold"},Pe={class:"tags ml-3 is-right"},Re=["title"],Le=["title"],qe={class:"is-size-7 is-size-7-mobile has-text-grey-dark"},Ae={key:0,class:"is-block block"},Me={key:1,class:"is-block block"},Te={key:2,class:"is-block block"},je={class:"is-block block"},We={class:"list-item is-size-6 is-size-6-mobile has-text-grey is-flex is-justify-content-space-between"},Ze={class:"has-text-weight-bold"},De={class:"is-block is-family-primary has-text-grey-dark"},He={key:0},Qe={class:"tags ml-3 is-right"},Ge=["title"],Oe={class:"list-item is-size-6 is-size-6-mobile has-text-grey is-flex is-justify-content-space-between"},Ye={class:"has-text-weight-bold"},Je={class:"is-block has-text-grey-dark"},Ke={key:0},Xe={class:"tags ml-3 is-right"},es=["title"],ss={class:"block"},ts={key:3,class:"block is-size-6 is-size-7-mobile has-text-grey"},is={class:"about-debug box is-family-monospace is-size-7 is-shadowless"},ns=["value"],os={class:"has-text-grey"},as={class:"is-left-bordered-danger"},rs={class:"block is-size-6 is-size-7-mobile"},ls={class:"is-block has-text-grey has-text-weight-bold"},vs={__name:"Manage",props:{userId:[Number,String]},setup(P){const y=ie(),{t:u}=ne(),_=ce(),C=re(),x=oe(),R=he(),U=le("2fauth"),{isLaptop:L}=fe(),$=z(!1),i=z(null),S=z(null),E=z(!1),V=P;ae(async()=>{await q()});async function q(){$.value=!0,p.getById(V.userId,{returnError:!0}).then(e=>{i.value=e.data,R.username=i.value.info.name}).catch(e=>{y.show(e)}).finally(()=>{$.value=!1})}async function A(){if(!w())return!1;confirm(u("confirmation.purge_password_reset_request"))===!0&&(await p.resendPasswordEmail(i.value.info.id),i.value.password_reset=null)}async function M(){if(!w())return!1;confirm(u("confirmation.request_password_reset"))===!0&&p.resetPassword(i.value.info.id,{returnError:!0}).then(e=>{i.value=e.data,_.success({text:u("notification.password_successfully_reset")})}).catch(e=>{e.response.status===400?_.alert({text:e.response.data.reason}):y.show(e)})}function T(e){if(!confirm(u("confirmation.change_admin_role"))){B().then(()=>{i.value.info.is_admin=!e});return}if(e===!1&&i.value.info.id===x.id&&!confirm(u("confirmation.demote_own_account"))){B().then(()=>{i.value.info.is_admin=!0});return}p.promote(i.value.info.id,{is_admin:e},{returnError:!0}).then(o=>{i.value.info.is_admin=o.data.info.is_admin,_.success({text:u("notification.user_role_updated")})}).catch(o=>{o.response.status===403?(_.alert({text:o.response.data.message}),i.value.info.is_admin=!0):y.show(o)})}function j(){if(!w())return!1;confirm(u("confirmation.delete_user"))&&p.delete(i.value.info.id,{returnError:!0}).then(e=>{_.success({text:u("notification.user_account_successfully_deleted")}),C.push({name:"admin.users"})}).catch(e=>{e.response.status===403?_.alert({text:e.response.data.message}):y.show(e)})}function W(){if(!w())return!1;p.revokePATs(i.value.info.id).then(e=>{i.value.valid_personal_access_tokens=0,_.success({text:u("notification.pats_succesfully_revoked")})})}function w(){return!(i.value.info.id===x.id&&!confirm(u("confirmation.edit_own_account")))}const Z=v("heading-user"),D=v("heading-access"),H=v("heading-lastAccesses"),Q=v("heading-preferences"),G=v("heading-dangerZone"),k=e=>{e&&e.scrollIntoView({behavior:"smooth"})};return(e,o)=>{const O=h("FormCheckbox"),Y=h("router-link"),J=h("ResponsiveWidthWrapper"),K=h("Spinner"),F=h("NavigationButton"),X=h("VueFooter"),ee=h("StackLayout");return a(),I(t(_e),null,{default:m(({mode:f})=>[c(ee,null,{content:m(()=>[c(J,null,{default:m(()=>[s("h1",{ref:"heading-user",class:"title mb-6"},n(e.$t("heading.user_management")),513),t(L)&&t(x).preferences.showQuickNavMenus?(a(),r("div",ke,[s("aside",ve,[s("ul",be,[s("li",null,[s("button",{onClick:o[0]||(o[0]=l=>k(t(Z)))},n(e.$t("heading.user")),1)]),t(U).config.proxyAuth?d("",!0):(a(),r("li",ye,[s("button",{onClick:o[1]||(o[1]=l=>k(t(D))),class:"has-ellipsis"},n(e.$t("heading.access")),1),s("ul",$e,[s("li",null,[s("button",{onClick:o[2]||(o[2]=l=>k(t(H)))},n(e.$t("heading.last_accesses")),1)])])])),s("li",null,[s("button",{onClick:o[3]||(o[3]=l=>k(t(Q)))},n(e.$t("heading.preferences")),1)]),s("li",null,[s("button",{onClick:o[4]||(o[4]=l=>k(t(G)))},n(e.$t("heading.danger_zone")),1)])])])])):d("",!0),!t($)&&t(i)?(a(),r("div",we,[s("div",ze,[s("div",{class:g(["column is-narrow",f=="dark"?"has-text-grey":"has-text-grey-dark"])},[c(t(ge),{strokeWidth:1,class:"icon-size-3"})],2),s("div",Ce,[s("p",{class:g(["title is-4",f=="dark"?"has-text-grey-lighter":"has-text-grey-dark"])},[s("span",xe,"#"+n(t(i).info.id),1),b(n(t(i).info.name),1)],2),s("p",Ue,n(t(i).info.email),1)])]),t(i).info.oauth_provider?(a(),r("div",Ve,n(e.$t("message.account_bound_to_x_via_oauth",{provider:t(i).info.oauth_provider})),1)):d("",!0),s("div",Ie,n(e.$t("message.registered_on_date",{date:t(i).info.created_at}))+" - "+n(e.$t("message.last_seen_on_date",{date:t(i).info.last_seen_at})),1),s("div",Se,[c(O,{modelValue:t(i).info.is_admin,"onUpdate:modelValue":[o[5]||(o[5]=l=>t(i).info.is_admin=l),o[6]||(o[6]=l=>T(l===!0))],isDanger:!0,fieldName:"is_admin",label:"field.is_admin",help:"field.is_admin.help"},null,8,["modelValue"])]),t(U).config.proxyAuth?d("",!0):(a(),r("h2",{key:1,ref:"heading-access",class:"title is-4"},n(e.$t("heading.access")),513)),t(U).config.proxyAuth?d("",!0):(a(),r("div",Ee,[s("div",Fe,[s("div",Ne,[s("div",null,[s("span",Be,n(e.$t("heading.password")),1)]),s("div",null,[s("div",Pe,[t(i).password_reset?(a(),r("button",{key:0,type:"button",class:g(["button tag is-pulled-right",f=="dark"?"is-dark has-background-link":"is-white"]),onClick:A,title:e.$t("tooltip.resend_email_title")},n(e.$t("label.resend_email")),11,Re)):d("",!0),s("button",{type:"button",class:g(["button tag is-pulled-right",f=="dark"?"is-dark has-background-link":"is-white"]),onClick:M,title:e.$t("tooltip.reset_password_title")},n(e.$t("label.reset_password")),11,Le)])])]),s("div",qe,[t(i).password_reset===0?(a(),r("span",Ae,n(e.$t("message.password_request_expired")),1)):t(i).password_reset?(a(),r("span",Me,n(e.$t("message.password_requested_on_t",{datetime:t(i).password_reset})),1)):d("",!0),t(i).password_reset?(a(),r("span",Te,n(e.$t("message.resend_email_help")),1)):d("",!0),s("span",je,n(e.$t("message.reset_password_help")),1)])]),s("div",We,[s("div",null,[s("span",Ze,n(e.$t("heading.personal_access_tokens")),1),s("span",De,n(e.$t("message.user_has_x_active_pat",{count:t(i).valid_personal_access_tokens})),1)]),t(i).valid_personal_access_tokens>0?(a(),r("div",He,[s("div",Qe,[s("button",{type:"button",class:g(["button tag is-pulled-right",f=="dark"?"is-dark has-background-link":"is-white"]),onClick:W,title:e.$t("tooltip.revoke_all_pat_for_user")},n(e.$t("label.revoke")),11,Ge)])])):d("",!0)]),s("div",Oe,[s("div",null,[s("span",Ye,n(e.$t("heading.security_devices")),1),s("span",Je,n(e.$t("message.user_has_x_security_devices",{count:t(i).webauthn_credentials})),1)]),t(i).webauthn_credentials>0?(a(),r("div",Ke,[s("div",Xe,[s("button",{type:"button",class:g(["button tag is-pulled-right",f=="dark"?"is-dark has-background-link":"is-white"]),title:e.$t("tooltip.revoke_all_devices_for_user")},n(e.$t("label.revoke")),11,es)])])):d("",!0)])])),s("div",ss,[s("h3",{ref:"heading-lastAccesses",class:"title is-5 mb-2"},n(e.$t("heading.last_accesses")),513),t(i)?(a(),I(te,{key:0,userId:V.userId,lastOnly:!0,onHasMoreEntries:o[7]||(o[7]=l=>E.value=!0)},null,8,["userId"])):d("",!0)]),t(E)?(a(),r("div",ts,[b(n(e.$t("message.log_has_more_entries"))+" ",1),c(Y,{id:"lnkFullLogs",class:"is-link",to:{name:"admin.logs.access",params:{userId:V.userId}}},{default:m(()=>[b(n(e.$t("link.see_full_log"))+". ",1)]),_:1},8,["to"])])):d("",!0),s("h2",{ref:"heading-preferences",class:"title is-4"},n(e.$t("heading.preferences")),513),s("div",is,[c(se,{id:"btnCopyEnvVars",token:t(S)?.innerText},null,8,["token"]),s("ul",{ref_key:"listUserPreferences",ref:S,id:"listUserPreferences"},[(a(!0),r(de,null,ue(t(i).info.preferences,(l,N)=>(a(),r("li",{value:l,key:N},[s("b",null,n(N),1),o[10]||(o[10]=b(": ",-1)),s("span",os,n(l),1)],8,ns))),128))],512)]),s("h2",{ref:"heading-dangerZone",class:"title is-4 has-text-danger"},n(e.$t("heading.danger_zone")),513),s("div",as,[s("div",rs,[b(n(e.$t("message.delete_this_user_legend"))+" ",1),s("span",ls,n(e.$t("message.this_is_not_soft_delete")),1)]),s("button",{type:"button",class:"button is-danger",onClick:j,title:"delete"},n(e.$t("label.delete_this_user")),1)])])):d("",!0)]),_:2},1024),t($)||!t(i)?(a(),I(K,{key:0,isVisible:!0,type:"fullscreen-overlay",message:"message.fetching_data"})):d("",!0)]),footer:m(()=>[c(X,null,{default:m(()=>[c(F,{action:"back",onGoback:o[8]||(o[8]=l=>t(C).push({name:"admin.users"})),"previous-page-title":e.$t("title.admin.users")},null,8,["previous-page-title"]),c(F,{action:"close",onClosed:o[9]||(o[9]=l=>t(C).push({name:"accounts"})),"current-page-title":e.$t("title.admin.manageUser")},null,8,["current-page-title"])]),_:1})]),_:2},1024)]),_:1})}}};export{vs as default}; diff --git a/public/build/assets/OAuth-aXCqlLPs.js b/public/build/assets/OAuth-aXCqlLPs.js new file mode 100644 index 0000000..2138701 --- /dev/null +++ b/public/build/assets/OAuth-aXCqlLPs.js @@ -0,0 +1 @@ +import{C as X,u as Y,P as Z,a as ee,a8 as te,N as se,o as oe,r as ae,a1 as N,af as ne,j as t,d as V,w as r,M as ie,e as f,f as p,h as n,i,m as l,H as L,p as b,t as a,a4 as D,l as u,k as m,q as le,F as re,E as ue,n as F,ak as ce,B as de,$ as pe}from"./app-dvJP63FL.js";import{t as me}from"./tabs-Btun2NN0.js";import{F as _e}from"./Form-ZbAUhXmz.js";import{U as fe}from"./index-BJsmINgd.js";import{C as he}from"./circle-plus-BM92Iipr.js";import{C as ve}from"./check-CPGWPXZa.js";import"./createLucideIcon-DsaEAGzP.js";const ge={class:"field is-grouped"},ye={class:"control"},ke={class:"control"},be={key:0,class:"notification is-warning has-text-centered"},we={key:1,class:"notification is-warning has-text-centered"},Te={class:"title is-4"},$e={class:"is-size-7-mobile"},Ce={class:"mt-3"},Se={key:2},xe={class:"tags is-pulled-right"},Ve=["onClick"],Fe=["onClick","title"],ze={key:1,class:"is-family-primary is-size-6 is-size-7-mobile has-text-danger"},Be={key:3,class:"is-size-7-mobile is-size-6 my-3"},Ae={key:4,class:"pat is-family-monospace is-size-6 is-size-7-mobile has-text-success"},Me={class:"mt-2 is-size-7 is-pulled-right"},We={__name:"OAuth",setup(Pe){const E=X(),{t:h}=Y(),w=Z(),K=ie("2fauth"),v=pe(),T=ee(),O=te(K.prefix+"returnTo","accounts"),{copy:U}=se({legacy:!0}),c=f([]),$=f(!1),g=f(!1),y=f(null),C=f(null),S=de(()=>w.enableSso&&w.useSsoOnly&&!w.allowPatWhileSsoOnly||T.authenticated_by_proxy);oe(()=>{z()});const d=ae(new _e({name:""}));function z(){$.value=!0,N.getPersonalAccessTokens({returnError:!0}).then(e=>{c.value=[],e.data.forEach(o=>{o.id===C.value?(o.value=y.value,c.value.unshift(o)):c.value.push(o)})}).catch(e=>{e.response.status===403||E.show(e)}).finally(()=>{$.value=!1,C.value=null,y.value=null})}function B(){j(),S.value?v.warn({text:h("error.unsupported_with_reverseproxy")}):g.value=!0}function W(){d.post("/oauth/personal-access-tokens").then(e=>{y.value=e.data.accessToken,C.value=e.data.accessTokenId,z(),g.value=!1,d.reset()})}function I(e){confirm(h("confirmation.revoke_token"))&&N.deletePersonalAccessToken(e).then(o=>{c.value=c.value.filter(_=>_.id!==e),v.success({text:h("notification.token_revoked")})})}function j(){c.value.forEach(e=>{e.value=null}),y.value=null}function H(e){U(e),v.success({text:h("notification.copied_to_clipboard")})}function q(){g.value=!1,d.reset()}function x(e){const o=new Date(e),_=Date.now(),k=o.getTime()-_;return Math.ceil(k/(1e3*60*60*24))}return ne(e=>{e.name.startsWith("settings.")||v.clear()}),(e,o)=>{const _=p("FormField"),k=p("VueButton"),A=p("FormWrapper"),M=p("StackLayout"),G=p("Spinner"),R=p("NavigationButton"),J=p("VueFooter");return t(g)?(n(),V(M,{key:0},{content:r(()=>[i(A,{title:"heading.new_token"},{default:r(()=>[l("form",{onSubmit:L(W,["prevent"]),onKeydown:o[1]||(o[1]=s=>t(d).onKeydown(s))},[i(_,{modelValue:t(d).name,"onUpdate:modelValue":o[0]||(o[0]=s=>t(d).name=s),fieldName:"name",errorMessage:t(d).errors.get("name"),inputType:"text",label:"field.name",autofocus:""},null,8,["modelValue","errorMessage"]),l("div",ge,[l("div",ye,[i(k,{nativeType:"submit",id:"btnGenerateToken",isLoading:t(d).isBusy},{default:r(()=>[b(a(e.$t("label.generate")),1)]),_:1},8,["isLoading"])]),l("div",ke,[i(k,{onClick:q,nativeType:"button",id:"btnCancel",color:"is-text"},{default:r(()=>[b(a(e.$t("label.cancel")),1)]),_:1})])])],32)]),_:1})]),_:1})):(n(),V(M,{key:1},{header:r(()=>[i(t(ce),{tabs:t(me),"active-tab":"settings.oauth.tokens",onTabSelected:o[2]||(o[2]=s=>("router"in e?e.router:t(D)).push({name:s}))},null,8,["tabs"])]),content:r(()=>[i(A,null,{default:r(()=>[t(S)&&t(T).oauth_provider?(n(),u("div",be,a(e.$t("message.sso_only_x_settings_are_disabled",{auth_method:"OAuth"})),1)):m("",!0),t(S)&&t(T).authenticated_by_proxy?(n(),u("div",we,a(e.$t("message.auth_handled_by_proxy")+" "+e.$t("message.manage_auth_at_proxy_level")),1)):m("",!0),l("h4",Te,a(e.$t("heading.personal_access_tokens")),1),l("div",$e,a(e.$t("message.token_legend")),1),l("div",Ce,[l("a",{tabindex:"0",class:"is-link",onClick:B,onKeyup:le(B,["enter"])},[i(t(he)),b(" "+a(e.$t("link.generate_new_token")),1)],32)]),t(c).length>0?(n(),u("div",Se,[(n(!0),u(re,null,ue(t(c),s=>(n(),u("div",{key:s.id,class:"group-item is-size-5 is-size-6-mobile"},[s.value?(n(),V(t(ve),{key:0,class:"mr-1 has-text-success inline"})):m("",!0),b(a(s.name)+" ",1),l("div",xe,[i(t(fe),null,{default:r(({mode:P})=>[s.value?(n(),u("button",{key:0,type:"button",class:F(["button tag",P!="dark"?"is-link":"is-white"]),onClick:L(Q=>H(s.value),["stop"])},a(e.$t("label.copy")),11,Ve)):m("",!0),l("button",{type:"button",class:F(["button tag",P==="dark"?"is-dark":"is-white"]),onClick:Q=>I(s.id),title:e.$t("tooltip.revoke")},a(e.$t("label.revoke")),11,Fe)]),_:2},1024)]),x(s.expires_at)<0?(n(),u("span",ze,a(e.$t("message.expired_since_x",{expired_at:new Date(s.expires_at).toLocaleDateString()})),1)):(n(),u("span",{key:2,class:F(["is-family-primary is-size-6 is-size-7-mobile has-text-warning",x(s.expires_at)<=7?"has-text-warning":"has-text-grey"])},a(e.$t("message.expire_in_x_day",{days_to_expiration:x(s.expires_at)})),3)),s.value?(n(),u("span",Be,a(e.$t("message.make_sure_copy_token")),1)):m("",!0),s.value?(n(),u("span",Ae,a(s.value),1)):m("",!0)]))),128)),l("div",Me,a(e.$t("message.revoking_a_token_is_permanent")),1)])):m("",!0),i(G,{isVisible:t($)&&t(c).length===0,type:"list-loading"},null,8,["isVisible"])]),_:1})]),footer:r(()=>[i(J,null,{default:r(()=>[i(R,{action:"close",onClosed:o[3]||(o[3]=s=>("router"in e?e.router:t(D)).push({name:t(O)})),"current-page-title":e.$t("title.settings.oauth.tokens")},null,8,["current-page-title"])]),_:1})]),_:1}))}}};export{We as default}; diff --git a/public/build/assets/Options-Bun4hDR8.js b/public/build/assets/Options-Bun4hDR8.js new file mode 100644 index 0000000..3aa1ad3 --- /dev/null +++ b/public/build/assets/Options-Bun4hDR8.js @@ -0,0 +1 @@ +import{u as ce,a as de,O as Ae,P as me,a8 as ve,o as pe,af as fe,d as xe,w as p,M as ge,e as h,f,a7 as x,h as _,i as r,j as a,a4 as D,l as V,m as u,t as c,k as E,p as O,D as ke,n as he,ak as be,B as M,$ as L,a1 as b}from"./app-dvJP63FL.js";import{t as Pe}from"./tabs-Btun2NN0.js";import{i as _e,R as Ce}from"./iconService-rm6LRV4U.js";import{u as ye}from"./breakpoints-CyLcIEOu.js";import{E as T}from"./external-link-CqpXNovN.js";import"./createLucideIcon-DsaEAGzP.js";let Se=[{text:"Africa/Abidjan",value:"Africa/Abidjan"},{text:"Africa/Accra",value:"Africa/Accra"},{text:"Africa/Addis_Ababa",value:"Africa/Addis_Ababa"},{text:"Africa/Algiers",value:"Africa/Algiers"},{text:"Africa/Asmara",value:"Africa/Asmara"},{text:"Africa/Asmera",value:"Africa/Asmera"},{text:"Africa/Bamako",value:"Africa/Bamako"},{text:"Africa/Bangui",value:"Africa/Bangui"},{text:"Africa/Banjul",value:"Africa/Banjul"},{text:"Africa/Bissau",value:"Africa/Bissau"},{text:"Africa/Blantyre",value:"Africa/Blantyre"},{text:"Africa/Brazzaville",value:"Africa/Brazzaville"},{text:"Africa/Bujumbura",value:"Africa/Bujumbura"},{text:"Africa/Cairo",value:"Africa/Cairo"},{text:"Africa/Casablanca",value:"Africa/Casablanca"},{text:"Africa/Ceuta",value:"Africa/Ceuta"},{text:"Africa/Conakry",value:"Africa/Conakry"},{text:"Africa/Dakar",value:"Africa/Dakar"},{text:"Africa/Dar_es_Salaam",value:"Africa/Dar_es_Salaam"},{text:"Africa/Djibouti",value:"Africa/Djibouti"},{text:"Africa/Douala",value:"Africa/Douala"},{text:"Africa/El_Aaiun",value:"Africa/El_Aaiun"},{text:"Africa/Freetown",value:"Africa/Freetown"},{text:"Africa/Gaborone",value:"Africa/Gaborone"},{text:"Africa/Harare",value:"Africa/Harare"},{text:"Africa/Johannesburg",value:"Africa/Johannesburg"},{text:"Africa/Juba",value:"Africa/Juba"},{text:"Africa/Kampala",value:"Africa/Kampala"},{text:"Africa/Khartoum",value:"Africa/Khartoum"},{text:"Africa/Kigali",value:"Africa/Kigali"},{text:"Africa/Kinshasa",value:"Africa/Kinshasa"},{text:"Africa/Lagos",value:"Africa/Lagos"},{text:"Africa/Libreville",value:"Africa/Libreville"},{text:"Africa/Lome",value:"Africa/Lome"},{text:"Africa/Luanda",value:"Africa/Luanda"},{text:"Africa/Lubumbashi",value:"Africa/Lubumbashi"},{text:"Africa/Lusaka",value:"Africa/Lusaka"},{text:"Africa/Malabo",value:"Africa/Malabo"},{text:"Africa/Maputo",value:"Africa/Maputo"},{text:"Africa/Maseru",value:"Africa/Maseru"},{text:"Africa/Mbabane",value:"Africa/Mbabane"},{text:"Africa/Mogadishu",value:"Africa/Mogadishu"},{text:"Africa/Monrovia",value:"Africa/Monrovia"},{text:"Africa/Nairobi",value:"Africa/Nairobi"},{text:"Africa/Ndjamena",value:"Africa/Ndjamena"},{text:"Africa/Niamey",value:"Africa/Niamey"},{text:"Africa/Nouakchott",value:"Africa/Nouakchott"},{text:"Africa/Ouagadougou",value:"Africa/Ouagadougou"},{text:"Africa/Porto-Novo",value:"Africa/Porto-Novo"},{text:"Africa/Sao_Tome",value:"Africa/Sao_Tome"},{text:"Africa/Timbuktu",value:"Africa/Timbuktu"},{text:"Africa/Tripoli",value:"Africa/Tripoli"},{text:"Africa/Tunis",value:"Africa/Tunis"},{text:"Africa/Windhoek",value:"Africa/Windhoek"},{text:"America/Adak",value:"America/Adak"},{text:"America/Anchorage",value:"America/Anchorage"},{text:"America/Anguilla",value:"America/Anguilla"},{text:"America/Antigua",value:"America/Antigua"},{text:"America/Araguaina",value:"America/Araguaina"},{text:"America/Argentina/Buenos_Aires",value:"America/Argentina/Buenos_Aires"},{text:"America/Argentina/Catamarca",value:"America/Argentina/Catamarca"},{text:"America/Argentina/ComodRivadavia",value:"America/Argentina/ComodRivadavia"},{text:"America/Argentina/Cordoba",value:"America/Argentina/Cordoba"},{text:"America/Argentina/Jujuy",value:"America/Argentina/Jujuy"},{text:"America/Argentina/La_Rioja",value:"America/Argentina/La_Rioja"},{text:"America/Argentina/Mendoza",value:"America/Argentina/Mendoza"},{text:"America/Argentina/Rio_Gallegos",value:"America/Argentina/Rio_Gallegos"},{text:"America/Argentina/Salta",value:"America/Argentina/Salta"},{text:"America/Argentina/San_Juan",value:"America/Argentina/San_Juan"},{text:"America/Argentina/San_Luis",value:"America/Argentina/San_Luis"},{text:"America/Argentina/Tucuman",value:"America/Argentina/Tucuman"},{text:"America/Argentina/Ushuaia",value:"America/Argentina/Ushuaia"},{text:"America/Aruba",value:"America/Aruba"},{text:"America/Asuncion",value:"America/Asuncion"},{text:"America/Atikokan",value:"America/Atikokan"},{text:"America/Atka",value:"America/Atka"},{text:"America/Bahia",value:"America/Bahia"},{text:"America/Bahia_Banderas",value:"America/Bahia_Banderas"},{text:"America/Barbados",value:"America/Barbados"},{text:"America/Belem",value:"America/Belem"},{text:"America/Belize",value:"America/Belize"},{text:"America/Blanc-Sablon",value:"America/Blanc-Sablon"},{text:"America/Boa_Vista",value:"America/Boa_Vista"},{text:"America/Bogota",value:"America/Bogota"},{text:"America/Boise",value:"America/Boise"},{text:"America/Buenos_Aires",value:"America/Buenos_Aires"},{text:"America/Cambridge_Bay",value:"America/Cambridge_Bay"},{text:"America/Campo_Grande",value:"America/Campo_Grande"},{text:"America/Cancun",value:"America/Cancun"},{text:"America/Caracas",value:"America/Caracas"},{text:"America/Catamarca",value:"America/Catamarca"},{text:"America/Cayenne",value:"America/Cayenne"},{text:"America/Cayman",value:"America/Cayman"},{text:"America/Chicago",value:"America/Chicago"},{text:"America/Chihuahua",value:"America/Chihuahua"},{text:"America/Ciudad_Juarez",value:"America/Ciudad_Juarez"},{text:"America/Coral_Harbour",value:"America/Coral_Harbour"},{text:"America/Cordoba",value:"America/Cordoba"},{text:"America/Costa_Rica",value:"America/Costa_Rica"},{text:"America/Creston",value:"America/Creston"},{text:"America/Cuiaba",value:"America/Cuiaba"},{text:"America/Curacao",value:"America/Curacao"},{text:"America/Danmarkshavn",value:"America/Danmarkshavn"},{text:"America/Dawson",value:"America/Dawson"},{text:"America/Dawson_Creek",value:"America/Dawson_Creek"},{text:"America/Denver",value:"America/Denver"},{text:"America/Detroit",value:"America/Detroit"},{text:"America/Dominica",value:"America/Dominica"},{text:"America/Edmonton",value:"America/Edmonton"},{text:"America/Eirunepe",value:"America/Eirunepe"},{text:"America/El_Salvador",value:"America/El_Salvador"},{text:"America/Ensenada",value:"America/Ensenada"},{text:"America/Fort_Nelson",value:"America/Fort_Nelson"},{text:"America/Fort_Wayne",value:"America/Fort_Wayne"},{text:"America/Fortaleza",value:"America/Fortaleza"},{text:"America/Glace_Bay",value:"America/Glace_Bay"},{text:"America/Godthab",value:"America/Godthab"},{text:"America/Goose_Bay",value:"America/Goose_Bay"},{text:"America/Grand_Turk",value:"America/Grand_Turk"},{text:"America/Grenada",value:"America/Grenada"},{text:"America/Guadeloupe",value:"America/Guadeloupe"},{text:"America/Guatemala",value:"America/Guatemala"},{text:"America/Guayaquil",value:"America/Guayaquil"},{text:"America/Guyana",value:"America/Guyana"},{text:"America/Halifax",value:"America/Halifax"},{text:"America/Havana",value:"America/Havana"},{text:"America/Hermosillo",value:"America/Hermosillo"},{text:"America/Indiana/Indianapolis",value:"America/Indiana/Indianapolis"},{text:"America/Indiana/Knox",value:"America/Indiana/Knox"},{text:"America/Indiana/Marengo",value:"America/Indiana/Marengo"},{text:"America/Indiana/Petersburg",value:"America/Indiana/Petersburg"},{text:"America/Indiana/Tell_City",value:"America/Indiana/Tell_City"},{text:"America/Indiana/Vevay",value:"America/Indiana/Vevay"},{text:"America/Indiana/Vincennes",value:"America/Indiana/Vincennes"},{text:"America/Indiana/Winamac",value:"America/Indiana/Winamac"},{text:"America/Indianapolis",value:"America/Indianapolis"},{text:"America/Inuvik",value:"America/Inuvik"},{text:"America/Iqaluit",value:"America/Iqaluit"},{text:"America/Jamaica",value:"America/Jamaica"},{text:"America/Jujuy",value:"America/Jujuy"},{text:"America/Juneau",value:"America/Juneau"},{text:"America/Kentucky/Louisville",value:"America/Kentucky/Louisville"},{text:"America/Kentucky/Monticello",value:"America/Kentucky/Monticello"},{text:"America/Knox_IN",value:"America/Knox_IN"},{text:"America/Kralendijk",value:"America/Kralendijk"},{text:"America/La_Paz",value:"America/La_Paz"},{text:"America/Lima",value:"America/Lima"},{text:"America/Los_Angeles",value:"America/Los_Angeles"},{text:"America/Louisville",value:"America/Louisville"},{text:"America/Lower_Princes",value:"America/Lower_Princes"},{text:"America/Maceio",value:"America/Maceio"},{text:"America/Managua",value:"America/Managua"},{text:"America/Manaus",value:"America/Manaus"},{text:"America/Marigot",value:"America/Marigot"},{text:"America/Martinique",value:"America/Martinique"},{text:"America/Matamoros",value:"America/Matamoros"},{text:"America/Mazatlan",value:"America/Mazatlan"},{text:"America/Mendoza",value:"America/Mendoza"},{text:"America/Menominee",value:"America/Menominee"},{text:"America/Merida",value:"America/Merida"},{text:"America/Metlakatla",value:"America/Metlakatla"},{text:"America/Mexico_City",value:"America/Mexico_City"},{text:"America/Miquelon",value:"America/Miquelon"},{text:"America/Moncton",value:"America/Moncton"},{text:"America/Monterrey",value:"America/Monterrey"},{text:"America/Montevideo",value:"America/Montevideo"},{text:"America/Montreal",value:"America/Montreal"},{text:"America/Montserrat",value:"America/Montserrat"},{text:"America/Nassau",value:"America/Nassau"},{text:"America/New_York",value:"America/New_York"},{text:"America/Nipigon",value:"America/Nipigon"},{text:"America/Nome",value:"America/Nome"},{text:"America/Noronha",value:"America/Noronha"},{text:"America/North_Dakota/Beulah",value:"America/North_Dakota/Beulah"},{text:"America/North_Dakota/Center",value:"America/North_Dakota/Center"},{text:"America/North_Dakota/New_Salem",value:"America/North_Dakota/New_Salem"},{text:"America/Nuuk",value:"America/Nuuk"},{text:"America/Ojinaga",value:"America/Ojinaga"},{text:"America/Panama",value:"America/Panama"},{text:"America/Pangnirtung",value:"America/Pangnirtung"},{text:"America/Paramaribo",value:"America/Paramaribo"},{text:"America/Phoenix",value:"America/Phoenix"},{text:"America/Port-au-Prince",value:"America/Port-au-Prince"},{text:"America/Port_of_Spain",value:"America/Port_of_Spain"},{text:"America/Porto_Acre",value:"America/Porto_Acre"},{text:"America/Porto_Velho",value:"America/Porto_Velho"},{text:"America/Puerto_Rico",value:"America/Puerto_Rico"},{text:"America/Punta_Arenas",value:"America/Punta_Arenas"},{text:"America/Rainy_River",value:"America/Rainy_River"},{text:"America/Rankin_Inlet",value:"America/Rankin_Inlet"},{text:"America/Recife",value:"America/Recife"},{text:"America/Regina",value:"America/Regina"},{text:"America/Resolute",value:"America/Resolute"},{text:"America/Rio_Branco",value:"America/Rio_Branco"},{text:"America/Rosario",value:"America/Rosario"},{text:"America/Santa_Isabel",value:"America/Santa_Isabel"},{text:"America/Santarem",value:"America/Santarem"},{text:"America/Santiago",value:"America/Santiago"},{text:"America/Santo_Domingo",value:"America/Santo_Domingo"},{text:"America/Sao_Paulo",value:"America/Sao_Paulo"},{text:"America/Scoresbysund",value:"America/Scoresbysund"},{text:"America/Shiprock",value:"America/Shiprock"},{text:"America/Sitka",value:"America/Sitka"},{text:"America/St_Barthelemy",value:"America/St_Barthelemy"},{text:"America/St_Johns",value:"America/St_Johns"},{text:"America/St_Kitts",value:"America/St_Kitts"},{text:"America/St_Lucia",value:"America/St_Lucia"},{text:"America/St_Thomas",value:"America/St_Thomas"},{text:"America/St_Vincent",value:"America/St_Vincent"},{text:"America/Swift_Current",value:"America/Swift_Current"},{text:"America/Tegucigalpa",value:"America/Tegucigalpa"},{text:"America/Thule",value:"America/Thule"},{text:"America/Thunder_Bay",value:"America/Thunder_Bay"},{text:"America/Tijuana",value:"America/Tijuana"},{text:"America/Toronto",value:"America/Toronto"},{text:"America/Tortola",value:"America/Tortola"},{text:"America/Vancouver",value:"America/Vancouver"},{text:"America/Virgin",value:"America/Virgin"},{text:"America/Whitehorse",value:"America/Whitehorse"},{text:"America/Winnipeg",value:"America/Winnipeg"},{text:"America/Yakutat",value:"America/Yakutat"},{text:"America/Yellowknife",value:"America/Yellowknife"},{text:"Antarctica/Casey",value:"Antarctica/Casey"},{text:"Antarctica/Davis",value:"Antarctica/Davis"},{text:"Antarctica/DumontDUrville",value:"Antarctica/DumontDUrville"},{text:"Antarctica/Macquarie",value:"Antarctica/Macquarie"},{text:"Antarctica/Mawson",value:"Antarctica/Mawson"},{text:"Antarctica/McMurdo",value:"Antarctica/McMurdo"},{text:"Antarctica/Palmer",value:"Antarctica/Palmer"},{text:"Antarctica/Rothera",value:"Antarctica/Rothera"},{text:"Antarctica/South_Pole",value:"Antarctica/South_Pole"},{text:"Antarctica/Syowa",value:"Antarctica/Syowa"},{text:"Antarctica/Troll",value:"Antarctica/Troll"},{text:"Antarctica/Vostok",value:"Antarctica/Vostok"},{text:"Arctic/Longyearbyen",value:"Arctic/Longyearbyen"},{text:"Asia/Aden",value:"Asia/Aden"},{text:"Asia/Almaty",value:"Asia/Almaty"},{text:"Asia/Amman",value:"Asia/Amman"},{text:"Asia/Anadyr",value:"Asia/Anadyr"},{text:"Asia/Aqtau",value:"Asia/Aqtau"},{text:"Asia/Aqtobe",value:"Asia/Aqtobe"},{text:"Asia/Ashgabat",value:"Asia/Ashgabat"},{text:"Asia/Ashkhabad",value:"Asia/Ashkhabad"},{text:"Asia/Atyrau",value:"Asia/Atyrau"},{text:"Asia/Baghdad",value:"Asia/Baghdad"},{text:"Asia/Bahrain",value:"Asia/Bahrain"},{text:"Asia/Baku",value:"Asia/Baku"},{text:"Asia/Bangkok",value:"Asia/Bangkok"},{text:"Asia/Barnaul",value:"Asia/Barnaul"},{text:"Asia/Beirut",value:"Asia/Beirut"},{text:"Asia/Bishkek",value:"Asia/Bishkek"},{text:"Asia/Brunei",value:"Asia/Brunei"},{text:"Asia/Calcutta",value:"Asia/Calcutta"},{text:"Asia/Chita",value:"Asia/Chita"},{text:"Asia/Choibalsan",value:"Asia/Choibalsan"},{text:"Asia/Chongqing",value:"Asia/Chongqing"},{text:"Asia/Chungking",value:"Asia/Chungking"},{text:"Asia/Colombo",value:"Asia/Colombo"},{text:"Asia/Dacca",value:"Asia/Dacca"},{text:"Asia/Damascus",value:"Asia/Damascus"},{text:"Asia/Dhaka",value:"Asia/Dhaka"},{text:"Asia/Dili",value:"Asia/Dili"},{text:"Asia/Dubai",value:"Asia/Dubai"},{text:"Asia/Dushanbe",value:"Asia/Dushanbe"},{text:"Asia/Famagusta",value:"Asia/Famagusta"},{text:"Asia/Gaza",value:"Asia/Gaza"},{text:"Asia/Harbin",value:"Asia/Harbin"},{text:"Asia/Hebron",value:"Asia/Hebron"},{text:"Asia/Ho_Chi_Minh",value:"Asia/Ho_Chi_Minh"},{text:"Asia/Hong_Kong",value:"Asia/Hong_Kong"},{text:"Asia/Hovd",value:"Asia/Hovd"},{text:"Asia/Irkutsk",value:"Asia/Irkutsk"},{text:"Asia/Istanbul",value:"Asia/Istanbul"},{text:"Asia/Jakarta",value:"Asia/Jakarta"},{text:"Asia/Jayapura",value:"Asia/Jayapura"},{text:"Asia/Jerusalem",value:"Asia/Jerusalem"},{text:"Asia/Kabul",value:"Asia/Kabul"},{text:"Asia/Kamchatka",value:"Asia/Kamchatka"},{text:"Asia/Karachi",value:"Asia/Karachi"},{text:"Asia/Kashgar",value:"Asia/Kashgar"},{text:"Asia/Kathmandu",value:"Asia/Kathmandu"},{text:"Asia/Katmandu",value:"Asia/Katmandu"},{text:"Asia/Khandyga",value:"Asia/Khandyga"},{text:"Asia/Kolkata",value:"Asia/Kolkata"},{text:"Asia/Krasnoyarsk",value:"Asia/Krasnoyarsk"},{text:"Asia/Kuala_Lumpur",value:"Asia/Kuala_Lumpur"},{text:"Asia/Kuching",value:"Asia/Kuching"},{text:"Asia/Kuwait",value:"Asia/Kuwait"},{text:"Asia/Macao",value:"Asia/Macao"},{text:"Asia/Macau",value:"Asia/Macau"},{text:"Asia/Magadan",value:"Asia/Magadan"},{text:"Asia/Makassar",value:"Asia/Makassar"},{text:"Asia/Manila",value:"Asia/Manila"},{text:"Asia/Muscat",value:"Asia/Muscat"},{text:"Asia/Nicosia",value:"Asia/Nicosia"},{text:"Asia/Novokuznetsk",value:"Asia/Novokuznetsk"},{text:"Asia/Novosibirsk",value:"Asia/Novosibirsk"},{text:"Asia/Omsk",value:"Asia/Omsk"},{text:"Asia/Oral",value:"Asia/Oral"},{text:"Asia/Phnom_Penh",value:"Asia/Phnom_Penh"},{text:"Asia/Pontianak",value:"Asia/Pontianak"},{text:"Asia/Pyongyang",value:"Asia/Pyongyang"},{text:"Asia/Qatar",value:"Asia/Qatar"},{text:"Asia/Qostanay",value:"Asia/Qostanay"},{text:"Asia/Qyzylorda",value:"Asia/Qyzylorda"},{text:"Asia/Rangoon",value:"Asia/Rangoon"},{text:"Asia/Riyadh",value:"Asia/Riyadh"},{text:"Asia/Saigon",value:"Asia/Saigon"},{text:"Asia/Sakhalin",value:"Asia/Sakhalin"},{text:"Asia/Samarkand",value:"Asia/Samarkand"},{text:"Asia/Seoul",value:"Asia/Seoul"},{text:"Asia/Shanghai",value:"Asia/Shanghai"},{text:"Asia/Singapore",value:"Asia/Singapore"},{text:"Asia/Srednekolymsk",value:"Asia/Srednekolymsk"},{text:"Asia/Taipei",value:"Asia/Taipei"},{text:"Asia/Tashkent",value:"Asia/Tashkent"},{text:"Asia/Tbilisi",value:"Asia/Tbilisi"},{text:"Asia/Tehran",value:"Asia/Tehran"},{text:"Asia/Tel_Aviv",value:"Asia/Tel_Aviv"},{text:"Asia/Thimbu",value:"Asia/Thimbu"},{text:"Asia/Thimphu",value:"Asia/Thimphu"},{text:"Asia/Tokyo",value:"Asia/Tokyo"},{text:"Asia/Tomsk",value:"Asia/Tomsk"},{text:"Asia/Ujung_Pandang",value:"Asia/Ujung_Pandang"},{text:"Asia/Ulaanbaatar",value:"Asia/Ulaanbaatar"},{text:"Asia/Ulan_Bator",value:"Asia/Ulan_Bator"},{text:"Asia/Urumqi",value:"Asia/Urumqi"},{text:"Asia/Ust-Nera",value:"Asia/Ust-Nera"},{text:"Asia/Vientiane",value:"Asia/Vientiane"},{text:"Asia/Vladivostok",value:"Asia/Vladivostok"},{text:"Asia/Yakutsk",value:"Asia/Yakutsk"},{text:"Asia/Yangon",value:"Asia/Yangon"},{text:"Asia/Yekaterinburg",value:"Asia/Yekaterinburg"},{text:"Asia/Yerevan",value:"Asia/Yerevan"},{text:"Atlantic/Azores",value:"Atlantic/Azores"},{text:"Atlantic/Bermuda",value:"Atlantic/Bermuda"},{text:"Atlantic/Canary",value:"Atlantic/Canary"},{text:"Atlantic/Cape_Verde",value:"Atlantic/Cape_Verde"},{text:"Atlantic/Faeroe",value:"Atlantic/Faeroe"},{text:"Atlantic/Faroe",value:"Atlantic/Faroe"},{text:"Atlantic/Jan_Mayen",value:"Atlantic/Jan_Mayen"},{text:"Atlantic/Madeira",value:"Atlantic/Madeira"},{text:"Atlantic/Reykjavik",value:"Atlantic/Reykjavik"},{text:"Atlantic/South_Georgia",value:"Atlantic/South_Georgia"},{text:"Atlantic/St_Helena",value:"Atlantic/St_Helena"},{text:"Atlantic/Stanley",value:"Atlantic/Stanley"},{text:"Australia/ACT",value:"Australia/ACT"},{text:"Australia/Adelaide",value:"Australia/Adelaide"},{text:"Australia/Brisbane",value:"Australia/Brisbane"},{text:"Australia/Broken_Hill",value:"Australia/Broken_Hill"},{text:"Australia/Canberra",value:"Australia/Canberra"},{text:"Australia/Currie",value:"Australia/Currie"},{text:"Australia/Darwin",value:"Australia/Darwin"},{text:"Australia/Eucla",value:"Australia/Eucla"},{text:"Australia/Hobart",value:"Australia/Hobart"},{text:"Australia/LHI",value:"Australia/LHI"},{text:"Australia/Lindeman",value:"Australia/Lindeman"},{text:"Australia/Lord_Howe",value:"Australia/Lord_Howe"},{text:"Australia/Melbourne",value:"Australia/Melbourne"},{text:"Australia/NSW",value:"Australia/NSW"},{text:"Australia/North",value:"Australia/North"},{text:"Australia/Perth",value:"Australia/Perth"},{text:"Australia/Queensland",value:"Australia/Queensland"},{text:"Australia/South",value:"Australia/South"},{text:"Australia/Sydney",value:"Australia/Sydney"},{text:"Australia/Tasmania",value:"Australia/Tasmania"},{text:"Australia/Victoria",value:"Australia/Victoria"},{text:"Australia/West",value:"Australia/West"},{text:"Australia/Yancowinna",value:"Australia/Yancowinna"},{text:"Brazil/Acre",value:"Brazil/Acre"},{text:"Brazil/DeNoronha",value:"Brazil/DeNoronha"},{text:"Brazil/East",value:"Brazil/East"},{text:"Brazil/West",value:"Brazil/West"},{text:"Canada/Atlantic",value:"Canada/Atlantic"},{text:"Canada/Central",value:"Canada/Central"},{text:"Canada/Eastern",value:"Canada/Eastern"},{text:"Canada/Mountain",value:"Canada/Mountain"},{text:"Canada/Newfoundland",value:"Canada/Newfoundland"},{text:"Canada/Pacific",value:"Canada/Pacific"},{text:"Canada/Saskatchewan",value:"Canada/Saskatchewan"},{text:"Canada/Yukon",value:"Canada/Yukon"},{text:"Chile/Continental",value:"Chile/Continental"},{text:"Chile/EasterIsland",value:"Chile/EasterIsland"},{text:"Cuba",value:"Cuba"},{text:"Egypt",value:"Egypt"},{text:"Eire",value:"Eire"},{text:"Europe/Amsterdam",value:"Europe/Amsterdam"},{text:"Europe/Andorra",value:"Europe/Andorra"},{text:"Europe/Astrakhan",value:"Europe/Astrakhan"},{text:"Europe/Athens",value:"Europe/Athens"},{text:"Europe/Belfast",value:"Europe/Belfast"},{text:"Europe/Belgrade",value:"Europe/Belgrade"},{text:"Europe/Berlin",value:"Europe/Berlin"},{text:"Europe/Bratislava",value:"Europe/Bratislava"},{text:"Europe/Brussels",value:"Europe/Brussels"},{text:"Europe/Bucharest",value:"Europe/Bucharest"},{text:"Europe/Budapest",value:"Europe/Budapest"},{text:"Europe/Busingen",value:"Europe/Busingen"},{text:"Europe/Chisinau",value:"Europe/Chisinau"},{text:"Europe/Copenhagen",value:"Europe/Copenhagen"},{text:"Europe/Dublin",value:"Europe/Dublin"},{text:"Europe/Gibraltar",value:"Europe/Gibraltar"},{text:"Europe/Guernsey",value:"Europe/Guernsey"},{text:"Europe/Helsinki",value:"Europe/Helsinki"},{text:"Europe/Isle_of_Man",value:"Europe/Isle_of_Man"},{text:"Europe/Istanbul",value:"Europe/Istanbul"},{text:"Europe/Jersey",value:"Europe/Jersey"},{text:"Europe/Kaliningrad",value:"Europe/Kaliningrad"},{text:"Europe/Kiev",value:"Europe/Kiev"},{text:"Europe/Kirov",value:"Europe/Kirov"},{text:"Europe/Kyiv",value:"Europe/Kyiv"},{text:"Europe/Lisbon",value:"Europe/Lisbon"},{text:"Europe/Ljubljana",value:"Europe/Ljubljana"},{text:"Europe/London",value:"Europe/London"},{text:"Europe/Luxembourg",value:"Europe/Luxembourg"},{text:"Europe/Madrid",value:"Europe/Madrid"},{text:"Europe/Malta",value:"Europe/Malta"},{text:"Europe/Mariehamn",value:"Europe/Mariehamn"},{text:"Europe/Minsk",value:"Europe/Minsk"},{text:"Europe/Monaco",value:"Europe/Monaco"},{text:"Europe/Moscow",value:"Europe/Moscow"},{text:"Europe/Nicosia",value:"Europe/Nicosia"},{text:"Europe/Oslo",value:"Europe/Oslo"},{text:"Europe/Paris",value:"Europe/Paris"},{text:"Europe/Podgorica",value:"Europe/Podgorica"},{text:"Europe/Prague",value:"Europe/Prague"},{text:"Europe/Riga",value:"Europe/Riga"},{text:"Europe/Rome",value:"Europe/Rome"},{text:"Europe/Samara",value:"Europe/Samara"},{text:"Europe/San_Marino",value:"Europe/San_Marino"},{text:"Europe/Sarajevo",value:"Europe/Sarajevo"},{text:"Europe/Saratov",value:"Europe/Saratov"},{text:"Europe/Simferopol",value:"Europe/Simferopol"},{text:"Europe/Skopje",value:"Europe/Skopje"},{text:"Europe/Sofia",value:"Europe/Sofia"},{text:"Europe/Stockholm",value:"Europe/Stockholm"},{text:"Europe/Tallinn",value:"Europe/Tallinn"},{text:"Europe/Tirane",value:"Europe/Tirane"},{text:"Europe/Tiraspol",value:"Europe/Tiraspol"},{text:"Europe/Ulyanovsk",value:"Europe/Ulyanovsk"},{text:"Europe/Uzhgorod",value:"Europe/Uzhgorod"},{text:"Europe/Vaduz",value:"Europe/Vaduz"},{text:"Europe/Vatican",value:"Europe/Vatican"},{text:"Europe/Vienna",value:"Europe/Vienna"},{text:"Europe/Vilnius",value:"Europe/Vilnius"},{text:"Europe/Volgograd",value:"Europe/Volgograd"},{text:"Europe/Warsaw",value:"Europe/Warsaw"},{text:"Europe/Zagreb",value:"Europe/Zagreb"},{text:"Europe/Zaporozhye",value:"Europe/Zaporozhye"},{text:"Europe/Zurich",value:"Europe/Zurich"},{text:"Hongkong",value:"Hongkong"},{text:"Iceland",value:"Iceland"},{text:"Indian/Antananarivo",value:"Indian/Antananarivo"},{text:"Indian/Chagos",value:"Indian/Chagos"},{text:"Indian/Christmas",value:"Indian/Christmas"},{text:"Indian/Cocos",value:"Indian/Cocos"},{text:"Indian/Comoro",value:"Indian/Comoro"},{text:"Indian/Kerguelen",value:"Indian/Kerguelen"},{text:"Indian/Mahe",value:"Indian/Mahe"},{text:"Indian/Maldives",value:"Indian/Maldives"},{text:"Indian/Mauritius",value:"Indian/Mauritius"},{text:"Indian/Mayotte",value:"Indian/Mayotte"},{text:"Indian/Reunion",value:"Indian/Reunion"},{text:"Iran",value:"Iran"},{text:"Israel",value:"Israel"},{text:"Jamaica",value:"Jamaica"},{text:"Japan",value:"Japan"},{text:"Kwajalein",value:"Kwajalein"},{text:"Libya",value:"Libya"},{text:"Mexico/BajaNorte",value:"Mexico/BajaNorte"},{text:"Mexico/BajaSur",value:"Mexico/BajaSur"},{text:"Mexico/General",value:"Mexico/General"},{text:"Navajo",value:"Navajo"},{text:"Pacific/Apia",value:"Pacific/Apia"},{text:"Pacific/Auckland",value:"Pacific/Auckland"},{text:"Pacific/Bougainville",value:"Pacific/Bougainville"},{text:"Pacific/Chatham",value:"Pacific/Chatham"},{text:"Pacific/Chuuk",value:"Pacific/Chuuk"},{text:"Pacific/Easter",value:"Pacific/Easter"},{text:"Pacific/Efate",value:"Pacific/Efate"},{text:"Pacific/Enderbury",value:"Pacific/Enderbury"},{text:"Pacific/Fakaofo",value:"Pacific/Fakaofo"},{text:"Pacific/Fiji",value:"Pacific/Fiji"},{text:"Pacific/Funafuti",value:"Pacific/Funafuti"},{text:"Pacific/Galapagos",value:"Pacific/Galapagos"},{text:"Pacific/Gambier",value:"Pacific/Gambier"},{text:"Pacific/Guadalcanal",value:"Pacific/Guadalcanal"},{text:"Pacific/Guam",value:"Pacific/Guam"},{text:"Pacific/Honolulu",value:"Pacific/Honolulu"},{text:"Pacific/Johnston",value:"Pacific/Johnston"},{text:"Pacific/Kanton",value:"Pacific/Kanton"},{text:"Pacific/Kiritimati",value:"Pacific/Kiritimati"},{text:"Pacific/Kosrae",value:"Pacific/Kosrae"},{text:"Pacific/Kwajalein",value:"Pacific/Kwajalein"},{text:"Pacific/Majuro",value:"Pacific/Majuro"},{text:"Pacific/Marquesas",value:"Pacific/Marquesas"},{text:"Pacific/Midway",value:"Pacific/Midway"},{text:"Pacific/Nauru",value:"Pacific/Nauru"},{text:"Pacific/Niue",value:"Pacific/Niue"},{text:"Pacific/Norfolk",value:"Pacific/Norfolk"},{text:"Pacific/Noumea",value:"Pacific/Noumea"},{text:"Pacific/Pago_Pago",value:"Pacific/Pago_Pago"},{text:"Pacific/Palau",value:"Pacific/Palau"},{text:"Pacific/Pitcairn",value:"Pacific/Pitcairn"},{text:"Pacific/Pohnpei",value:"Pacific/Pohnpei"},{text:"Pacific/Ponape",value:"Pacific/Ponape"},{text:"Pacific/Port_Moresby",value:"Pacific/Port_Moresby"},{text:"Pacific/Rarotonga",value:"Pacific/Rarotonga"},{text:"Pacific/Saipan",value:"Pacific/Saipan"},{text:"Pacific/Samoa",value:"Pacific/Samoa"},{text:"Pacific/Tahiti",value:"Pacific/Tahiti"},{text:"Pacific/Tarawa",value:"Pacific/Tarawa"},{text:"Pacific/Tongatapu",value:"Pacific/Tongatapu"},{text:"Pacific/Truk",value:"Pacific/Truk"},{text:"Pacific/Wake",value:"Pacific/Wake"},{text:"Pacific/Wallis",value:"Pacific/Wallis"},{text:"Pacific/Yap",value:"Pacific/Yap"},{text:"Poland",value:"Poland"},{text:"Portugal",value:"Portugal"},{text:"Singapore",value:"Singapore"},{text:"Turkey",value:"Turkey"},{text:"US/Alaska",value:"US/Alaska"},{text:"US/Aleutian",value:"US/Aleutian"},{text:"US/Arizona",value:"US/Arizona"},{text:"US/Central",value:"US/Central"},{text:"US/East-Indiana",value:"US/East-Indiana"},{text:"US/Eastern",value:"US/Eastern"},{text:"US/Hawaii",value:"US/Hawaii"},{text:"US/Indiana-Starke",value:"US/Indiana-Starke"},{text:"US/Michigan",value:"US/Michigan"},{text:"US/Mountain",value:"US/Mountain"},{text:"US/Pacific",value:"US/Pacific"},{text:"US/Samoa",value:"US/Samoa"},{text:"UTC",value:"UTC"},{text:"Zulu",value:"Zulu"}];const Ve={key:0,class:"pr-5 settings-menu"},Ee={class:"menu"},Me={class:"menu-list"},Le={class:"mt-1"},we={class:"block"},Be={key:0,class:"notification is-warning"},Ne={class:"field help"},Ie={class:"ml-2 is-link",href:"https://crowdin.com/project/2fauth"},De={class:"block"},Oe=["href","title"],Te=["title"],Ue={class:"block"},Re={class:"block"},Ge={class:"title is-5 mb-4"},Ke={class:"block"},We={__name:"Options",setup(je){const{t:C}=ce(),w=ge("2fauth"),i=de(),B=Ae(),U=L(),o=me(),R=ve(w.prefix+"returnTo","accounts"),y=h(!1),{isLaptop:G}=ye(),K=[{text:"label.grid",value:"grid",icon:"Grid3X3"},{text:"label.list",value:"list",icon:"List"}],j=[{text:"label.light",value:"light",icon:"Sun"},{text:"label.dark",value:"dark",icon:"Moon"},{text:"label.automatic",value:"system",icon:"MonitorCheck"}],z=[{text:"label.online_collection",value:"logolib"},{text:"label.uploaded_pack",value:"iconpack"}],P=[{text:"selfh.st",value:"selfh",url:"https://selfh.st/icons/",defaultVariant:"regular"},{text:"dashboardicons.com",value:"dashboardicons",url:"https://dashboardicons.com/",defaultVariant:"regular"},{text:"2fa.directory",value:"tfa",url:"https://2fa.directory/",defaultVariant:"regular"}],S={selfh:[{text:"label.regular",value:"regular"},{text:"label.light",value:"light"},{text:"label.dark",value:"dark"}],dashboardicons:[{text:"label.regular",value:"regular"},{text:"label.light",value:"light"},{text:"label.dark",value:"dark"}],tfa:[{text:"label.regular",value:"regular"}]},A=h("/"),m=h([]),g=h(!1),F=[{text:"label.pair_digit",value:2,legend:"label.pair",title:"label.pair.legend"},{text:"label.trio_digit",value:3,legend:"label.trio",title:"label.trio.legend"},{text:"label.half_digit",value:.5,legend:"label.half",title:"label.half.legend"}],H=[{text:"label.never",value:0},{text:"label.on_otp_copy",value:-1},{text:"label.1_minutes",value:1},{text:"label.5_minutes",value:5},{text:"label.10_minutes",value:10},{text:"label.15_minutes",value:15},{text:"label.30_minutes",value:30},{text:"label.1_hour",value:60},{text:"label.1_day",value:1440}],q=[{text:"label.never",value:0},{text:"label.1_minutes",value:1},{text:"label.2_minutes",value:2},{text:"label.5_minutes",value:5}],N=h([{text:"label.no_group",value:0},{text:"label.active_group",value:-1}]),J=[{text:"label.livescan",value:"livescan"},{text:"label.qr_code_upload",value:"upload"},{text:"label.advanced_form",value:"advancedForm"}],$=[{text:"label.after_a_click_tap",value:!0,legend:"label.alone_in_its_own_view",title:"label.alone_in_its_own_view.title"},{text:"label.constantly",value:!1,legend:"label.all_of_them_on_home",title:"label.all_of_them_on_home.title"}],W=M(()=>{let l=[{text:"label.browser_preference",value:"browser"}];for(const e of w.langs)l.push({text:"lang."+e,value:e});return l}),Q=M(()=>P.find(({value:l})=>l===i.preferences.iconCollection)?.url),Y=M(()=>P.find(({value:l})=>l===i.preferences.iconCollection)?.text);pe(()=>{B.items&&B.items.forEach(l=>{l.id>0&&N.value.push({text:l.name,value:l.id})}),I(),i.refreshPreferences()});function n(l,e){if(l==="iconSource"&&e==="iconpack")if(g.value)i.preferences.iconPack!=A.value&&(i.preferences.iconPack=A.value,b.updatePreference("iconPack",A.value));else return L().alert({text:C("notification.no_available_icon_packs")}),i.preferences.iconSource="logolib",!1;l==="rememberActiveGroup"&&e===!1&&i.preferences.activeGroup!=0&&b.updatePreference("activeGroup",0),b.updatePreference(l,e).then(d=>{i.preferences[l]=e,L().success({text:C("notification.setting_saved")}),l==="lang"?i.applyLanguage():l==="theme"&&i.applyTheme()})}function Z(l){n("iconCollection",l),Object.prototype.hasOwnProperty.call(S,l)?S[l].find(e=>e.value==i.preferences.iconVariant)==null&&(i.preferences.iconVariant=P.find(e=>e.value==l).defaultVariant,b.updatePreference("iconVariant",i.preferences.iconVariant)):i.preferences.iconVariant!="regular"&&(i.preferences.iconVariant="regular",b.updatePreference("iconVariant",i.preferences.iconVariant))}function I(){y.value=!0,_e.getIconPacks().then(l=>{m.value=[],l.data.forEach(e=>{m.value.push({text:e.name,value:e.name})}),m.value.length==0?(g.value=!1,A.value="/",m.value.push({text:"label.no_available_icon_packs",value:"/"})):(g.value=!0,A.value=i.preferences.iconPack==null||!m.value.some(e=>e.value===i.preferences.iconPack)?m.value[0].value:i.preferences.iconPack)}).finally(()=>{y.value=!1})}fe(l=>{l.name.startsWith("settings.")||U.clear()});const X=x("heading-general"),ee=x("heading-accounts"),ae=x("heading-otp"),te=x("heading-icons"),ie=x("heading-groups"),le=x("heading-session"),re=x("heading-dataInput"),v=l=>{l&&l.scrollIntoView({behavior:"smooth"})};return(l,e)=>{const d=f("FormSelect"),k=f("FormToggle"),s=f("FormCheckbox"),oe=f("ResponsiveWidthWrapper"),ne=f("NavigationButton"),ue=f("VueFooter"),se=f("StackLayout");return _(),xe(se,null,{header:p(()=>[r(a(be),{tabs:a(Pe),"active-tab":"settings.options",onTabSelected:e[0]||(e[0]=t=>("router"in l?l.router:a(D)).push({name:t}))},null,8,["tabs"])]),content:p(()=>[r(oe,null,{default:p(()=>[a(G)&&a(i).preferences.showQuickNavMenus?(_(),V("div",Ve,[u("aside",Ee,[u("ul",Me,[u("li",null,[u("button",{onClick:e[1]||(e[1]=t=>v(a(X)))},c(l.$t("heading.general")),1)]),u("li",null,[u("button",{onClick:e[2]||(e[2]=t=>v(a(ee))),class:"has-ellipsis"},c(l.$t("heading.2fa_accounts")),1),u("ul",Le,[u("li",null,[u("button",{onClick:e[3]||(e[3]=t=>v(a(ae)))},"OTP")]),u("li",null,[u("button",{onClick:e[4]||(e[4]=t=>v(a(te)))},c(l.$t("heading.icons")),1)])])]),u("li",null,[u("button",{onClick:e[5]||(e[5]=t=>v(a(ie)))},c(l.$t("heading.groups")),1)]),u("li",null,[u("button",{onClick:e[6]||(e[6]=t=>v(a(le)))},c(l.$t("heading.session")),1)]),u("li",null,[u("button",{onClick:e[7]||(e[7]=t=>v(a(re)))},c(l.$t("heading.data_input")),1)])])])])):E("",!0),u("form",null,[u("div",we,[u("h4",{ref:"heading-general",class:"title is-4"},c(l.$t("heading.general")),513),a(o).lockedPreferences.length>0?(_(),V("div",Be,c(l.$t("message.settings_managed_by_administrator")),1)):E("",!0),r(d,{modelValue:a(i).preferences.lang,"onUpdate:modelValue":[e[8]||(e[8]=t=>a(i).preferences.lang=t),e[9]||(e[9]=t=>n("lang",t))],options:a(W),fieldName:"lang",isLocked:a(o).lockedPreferences.includes("lang"),label:"field.language",help:"field.language.help"},null,8,["modelValue","options","isLocked"]),u("div",Ne,[O(c(l.$t("message.some_translation_are_missing"))+" ",1),u("a",Ie,[O(c(l.$t("link.help_translate_2fauth"))+" ",1),r(a(T),{class:"icon-size-1"})])]),r(d,{modelValue:a(i).preferences.timezone,"onUpdate:modelValue":[e[10]||(e[10]=t=>a(i).preferences.timezone=t),e[11]||(e[11]=t=>n("timezone",t))],options:a(Se),fieldName:"timezone",isLocked:a(o).lockedPreferences.includes("timezone"),label:"field.timezone",help:"field.timezone.help"},null,8,["modelValue","options","isLocked"]),r(k,{modelValue:a(i).preferences.theme,"onUpdate:modelValue":[e[12]||(e[12]=t=>a(i).preferences.theme=t),e[13]||(e[13]=t=>n("theme",t))],choices:j,fieldName:"theme",isLocked:a(o).lockedPreferences.includes("theme"),label:"field.theme",help:"field.theme.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.showEmailInFooter,"onUpdate:modelValue":[e[14]||(e[14]=t=>a(i).preferences.showEmailInFooter=t),e[15]||(e[15]=t=>n("showEmailInFooter",t))],fieldName:"showEmailInFooter",isLocked:a(o).lockedPreferences.includes("showEmailInFooter"),label:"field.show_email_in_footer",help:"field.show_email_in_footer.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.showQuickNavMenus,"onUpdate:modelValue":[e[16]||(e[16]=t=>a(i).preferences.showQuickNavMenus=t),e[17]||(e[17]=t=>n("showQuickNavMenus",t))],fieldName:"showQuickNavMenus",isLocked:a(o).lockedPreferences.includes("showQuickNavMenus"),label:"field.show_quick_nav_menus",help:"field.show_quick_nav_menus.help"},null,8,["modelValue","isLocked"])]),u("div",De,[u("h4",{ref:"heading-accounts",class:"title is-4 pt-4"},c(l.$t("heading.2fa_accounts")),513),r(k,{modelValue:a(i).preferences.displayMode,"onUpdate:modelValue":[e[18]||(e[18]=t=>a(i).preferences.displayMode=t),e[19]||(e[19]=t=>n("displayMode",t))],choices:K,fieldName:"displayMode",isLocked:a(o).lockedPreferences.includes("displayMode"),label:"field.display_mode",help:"field.display_mode.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.sortCaseSensitive,"onUpdate:modelValue":[e[20]||(e[20]=t=>a(i).preferences.sortCaseSensitive=t),e[21]||(e[21]=t=>n("sortCaseSensitive",t))],fieldName:"sortCaseSensitive",isLocked:a(o).lockedPreferences.includes("sortCaseSensitive"),label:"field.sort_case_sensitive",help:"field.sort_case_sensitive.help"},null,8,["modelValue","isLocked"]),u("h5",{ref:"heading-otp",class:"title is-5 pt-3 mb-3"},c(l.$t("heading.one_time_passwords")),513),r(k,{modelValue:a(i).preferences.getOtpOnRequest,"onUpdate:modelValue":[e[22]||(e[22]=t=>a(i).preferences.getOtpOnRequest=t),e[23]||(e[23]=t=>n("getOtpOnRequest",t))],choices:$,fieldName:"getOtpOnRequest",isLocked:a(o).lockedPreferences.includes("getOtpOnRequest"),label:"field.otp_generation",help:"field.otp_generation.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.closeOtpOnCopy,"onUpdate:modelValue":[e[24]||(e[24]=t=>a(i).preferences.closeOtpOnCopy=t),e[25]||(e[25]=t=>n("closeOtpOnCopy",t))],fieldName:"closeOtpOnCopy",isLocked:a(o).lockedPreferences.includes("closeOtpOnCopy"),isDisabled:!a(i).preferences.getOtpOnRequest,label:"field.close_otp_on_copy",help:"field.close_otp_on_copy.help",isIndented:!0},null,8,["modelValue","isLocked","isDisabled"]),r(d,{modelValue:a(i).preferences.autoCloseTimeout,"onUpdate:modelValue":[e[26]||(e[26]=t=>a(i).preferences.autoCloseTimeout=t),e[27]||(e[27]=t=>n("autoCloseTimeout",t))],options:q,fieldName:"autoCloseTimeout",isLocked:a(o).lockedPreferences.includes("autoCloseTimeout"),isDisabled:!a(i).preferences.getOtpOnRequest,label:"field.auto_close_timeout",help:"field.auto_close_timeout.help",isIndented:!0},null,8,["modelValue","isLocked","isDisabled"]),r(s,{modelValue:a(i).preferences.copyOtpOnDisplay,"onUpdate:modelValue":[e[28]||(e[28]=t=>a(i).preferences.copyOtpOnDisplay=t),e[29]||(e[29]=t=>n("copyOtpOnDisplay",t))],fieldName:"copyOtpOnDisplay",isLocked:a(o).lockedPreferences.includes("copyOtpOnDisplay"),isDisabled:!a(i).preferences.getOtpOnRequest,label:"field.copy_otp_on_display",help:"field.copy_otp_on_display.help",isIndented:!0},null,8,["modelValue","isLocked","isDisabled"]),r(s,{modelValue:a(i).preferences.formatPassword,"onUpdate:modelValue":[e[30]||(e[30]=t=>a(i).preferences.formatPassword=t),e[31]||(e[31]=t=>n("formatPassword",t))],fieldName:"formatPassword",isLocked:a(o).lockedPreferences.includes("formatPassword"),label:"field.password_format",help:"field.password_format.help"},null,8,["modelValue","isLocked"]),r(k,{class:"mb-4",modelValue:a(i).preferences.formatPasswordBy,"onUpdate:modelValue":[e[32]||(e[32]=t=>a(i).preferences.formatPasswordBy=t),e[33]||(e[33]=t=>n("formatPasswordBy",t))],choices:F,fieldName:"formatPasswordBy",isLocked:a(o).lockedPreferences.includes("formatPasswordBy"),isDisabled:!a(i).preferences.formatPassword},null,8,["modelValue","isLocked","isDisabled"]),r(s,{modelValue:a(i).preferences.showOtpAsDot,"onUpdate:modelValue":[e[34]||(e[34]=t=>a(i).preferences.showOtpAsDot=t),e[35]||(e[35]=t=>n("showOtpAsDot",t))],fieldName:"showOtpAsDot",isLocked:a(o).lockedPreferences.includes("showOtpAsDot"),label:"field.show_otp_as_dot",help:"field.show_otp_as_dot.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.revealDottedOTP,"onUpdate:modelValue":[e[36]||(e[36]=t=>a(i).preferences.revealDottedOTP=t),e[37]||(e[37]=t=>n("revealDottedOTP",t))],fieldName:"revealDottedOTP",isLocked:a(o).lockedPreferences.includes("revealDottedOTP"),isDisabled:!a(i).preferences.showOtpAsDot,label:"field.reveal_dotted_otp",help:"field.reveal_dotted_otp.help",isIndented:!0},null,8,["modelValue","isLocked","isDisabled"]),r(s,{modelValue:a(i).preferences.showNextOtp,"onUpdate:modelValue":[e[38]||(e[38]=t=>a(i).preferences.showNextOtp=t),e[39]||(e[39]=t=>n("showNextOtp",t))],fieldName:"showNextOtp",isLocked:a(o).lockedPreferences.includes("showNextOtp"),label:"field.show_next_otp",help:"field.show_next_otp.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.clearSearchOnCopy,"onUpdate:modelValue":[e[40]||(e[40]=t=>a(i).preferences.clearSearchOnCopy=t),e[41]||(e[41]=t=>n("clearSearchOnCopy",t))],fieldName:"clearSearchOnCopy",isLocked:a(o).lockedPreferences.includes("clearSearchOnCopy"),label:"field.clear_search_on_copy",help:"field.clear_search_on_copy.help"},null,8,["modelValue","isLocked"]),u("h5",{ref:"heading-icons",class:"title is-5 pt-3 mb-4"},c(l.$t("heading.icons")),513),r(s,{modelValue:a(i).preferences.showAccountsIcons,"onUpdate:modelValue":[e[42]||(e[42]=t=>a(i).preferences.showAccountsIcons=t),e[43]||(e[43]=t=>n("showAccountsIcons",t))],fieldName:"showAccountsIcons",isLocked:a(o).lockedPreferences.includes("showAccountsIcons"),label:"field.show_accounts_icons",help:"field.show_accounts_icons.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.getOfficialIcons,"onUpdate:modelValue":[e[44]||(e[44]=t=>a(i).preferences.getOfficialIcons=t),e[45]||(e[45]=t=>n("getOfficialIcons",t))],fieldName:"getOfficialIcons",isLocked:a(o).lockedPreferences.includes("getOfficialIcons"),label:"field.get_official_icons",help:"field.get_official_icons.help"},null,8,["modelValue","isLocked"]),r(k,{modelValue:a(i).preferences.iconSource,"onUpdate:modelValue":[e[46]||(e[46]=t=>a(i).preferences.iconSource=t),e[47]||(e[47]=t=>n("iconSource",t))],choices:z,fieldName:"iconSource",isLocked:a(o).lockedPreferences.includes("iconSource"),isDisabled:!a(i).preferences.getOfficialIcons,label:"field.icon_source",help:"field.icon_source.help"},null,8,["modelValue","isLocked","isDisabled"]),r(d,{modelValue:a(i).preferences.iconCollection,"onUpdate:modelValue":[e[48]||(e[48]=t=>a(i).preferences.iconCollection=t),e[49]||(e[49]=t=>Z(t))],options:P,fieldName:"iconCollection",isLocked:a(o).lockedPreferences.includes("iconCollection"),isDisabled:!a(i).preferences.getOfficialIcons||a(i).preferences.iconSource!="logolib",label:"field.icon_collection",help:"field.icon_collection.help",isIndented:!0},{default:p(()=>[u("a",{class:"button is-ghost",href:a(Q),target:"_blank",title:l.$t("tooltip.visit_x",{website:a(Y)})},[r(a(T))],8,Oe)]),_:1},8,["modelValue","isLocked","isDisabled"]),r(d,{modelValue:a(i).preferences.iconVariant,"onUpdate:modelValue":[e[50]||(e[50]=t=>a(i).preferences.iconVariant=t),e[51]||(e[51]=t=>n("iconVariant",t))],options:S[a(i).preferences.iconCollection],fieldName:"iconVariant",isLocked:a(o).lockedPreferences.includes("iconVariant"),isDisabled:!a(i).preferences.getOfficialIcons||a(i).preferences.iconSource!="logolib",label:"field.icon_variant",help:"field.icon_variant.help",isIndented:!0},null,8,["modelValue","options","isLocked","isDisabled"]),r(s,{modelValue:a(i).preferences.iconVariantStrictFetch,"onUpdate:modelValue":[e[52]||(e[52]=t=>a(i).preferences.iconVariantStrictFetch=t),e[53]||(e[53]=t=>n("iconVariantStrictFetch",t))],fieldName:"iconVariantStrictFetch",isLocked:a(o).lockedPreferences.includes("iconVariantStrictFetch"),isDisabled:!a(i).preferences.getOfficialIcons||a(i).preferences.iconVariant=="regular"||a(i).preferences.iconSource!="logolib",label:"field.icon_variant_strict_fetch",help:"field.icon_variant_strict_fetch.help",isIndented:!0},null,8,["modelValue","isLocked","isDisabled"]),r(d,{modelValue:a(A),"onUpdate:modelValue":[e[54]||(e[54]=t=>ke(A)?A.value=t:null),e[55]||(e[55]=t=>n("iconPack",t))],options:a(m),fieldName:"iconPack",errorMessage:a(i).preferences.iconSource=="iconpack"&&!a(g)?a(C)("message.warning_no_icon_pack"):null,isLocked:a(o).lockedPreferences.includes("iconPack"),isDisabled:!a(i).preferences.getOfficialIcons||a(i).preferences.iconSource!="iconpack"||!a(g),label:"field.icon_pack",help:"field.icon_pack.help",isIndented:!0},{default:p(()=>[a(i).preferences.iconSource=="iconpack"&&a(i).preferences.getOfficialIcons?(_(),V("button",{key:0,class:"button is-ghost",onClick:I,type:"button",title:l.$t("tooltip.refresh_icon_pack_list")},[r(a(Ce),{class:he({spinning:a(y)})},null,8,["class"])],8,Te)):E("",!0)]),_:1},8,["modelValue","options","errorMessage","isLocked","isDisabled"])]),u("div",Ue,[u("h4",{ref:"heading-groups",class:"title is-4 pt-4"},c(l.$t("heading.groups")),513),r(d,{modelValue:a(i).preferences.defaultGroup,"onUpdate:modelValue":[e[56]||(e[56]=t=>a(i).preferences.defaultGroup=t),e[57]||(e[57]=t=>n("defaultGroup",t))],options:a(N),fieldName:"defaultGroup",label:"field.default_group",help:"field.default_group.help"},null,8,["modelValue","options"]),r(s,{modelValue:a(i).preferences.useGroupChips,"onUpdate:modelValue":[e[58]||(e[58]=t=>a(i).preferences.useGroupChips=t),e[59]||(e[59]=t=>n("useGroupChips",t))],fieldName:"useGroupChips",isLocked:a(o).lockedPreferences.includes("useGroupChips"),label:"field.use_chips_to_select_group",help:"field.use_chips_to_select_group.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.showVirtualChips,"onUpdate:modelValue":[e[60]||(e[60]=t=>a(i).preferences.showVirtualChips=t),e[61]||(e[61]=t=>n("showVirtualChips",t))],fieldName:"showVirtualChips",isLocked:a(o).lockedPreferences.includes("showVirtualChips"),isDisabled:!a(i).preferences.useGroupChips,label:"field.show_virtual_chips",help:"field.show_virtual_chips.help",isIndented:!0},null,8,["modelValue","isLocked","isDisabled"]),r(s,{modelValue:a(i).preferences.rememberActiveGroup,"onUpdate:modelValue":[e[62]||(e[62]=t=>a(i).preferences.rememberActiveGroup=t),e[63]||(e[63]=t=>n("rememberActiveGroup",t))],fieldName:"rememberActiveGroup",isLocked:a(o).lockedPreferences.includes("rememberActiveGroup"),label:"field.remember_active_group",help:"field.remember_active_group.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.viewDefaultGroupOnCopy,"onUpdate:modelValue":[e[64]||(e[64]=t=>a(i).preferences.viewDefaultGroupOnCopy=t),e[65]||(e[65]=t=>n("viewDefaultGroupOnCopy",t))],fieldName:"viewDefaultGroupOnCopy",isLocked:a(o).lockedPreferences.includes("viewDefaultGroupOnCopy"),label:"field.view_default_group_on_copy",help:"field.view_default_group_on_copy.help"},null,8,["modelValue","isLocked"])]),u("div",Re,[u("h4",{ref:"heading-session",class:"title is-4 pt-4"},c(l.$t("heading.session")),513),r(d,{modelValue:a(i).preferences.kickUserAfter,"onUpdate:modelValue":[e[66]||(e[66]=t=>a(i).preferences.kickUserAfter=t),e[67]||(e[67]=t=>n("kickUserAfter",t))],options:H,fieldName:"kickUserAfter",isLocked:a(o).lockedPreferences.includes("kickUserAfter"),label:"field.auto_lock",help:"field.auto_lock.help"},null,8,["modelValue","isLocked"]),u("h5",Ge,c(l.$t("heading.notifications")),1),r(s,{modelValue:a(i).preferences.notifyOnNewAuthDevice,"onUpdate:modelValue":[e[68]||(e[68]=t=>a(i).preferences.notifyOnNewAuthDevice=t),e[69]||(e[69]=t=>n("notifyOnNewAuthDevice",t))],fieldName:"notifyOnNewAuthDevice",isLocked:a(o).lockedPreferences.includes("notifyOnNewAuthDevice"),label:"field.notify_on_new_auth_device",help:"field.notify_on_new_auth_device.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.notifyOnFailedLogin,"onUpdate:modelValue":[e[70]||(e[70]=t=>a(i).preferences.notifyOnFailedLogin=t),e[71]||(e[71]=t=>n("notifyOnFailedLogin",t))],fieldName:"notifyOnFailedLogin",isLocked:a(o).lockedPreferences.includes("notifyOnFailedLogin"),label:"field.notify_on_failed_login",help:"field.notify_on_failed_login.help"},null,8,["modelValue","isLocked"])]),u("div",Ke,[u("h4",{ref:"heading-dataInput",class:"title is-4 pt-4"},c(l.$t("heading.data_input")),513),r(s,{modelValue:a(i).preferences.AutoSaveQrcodedAccount,"onUpdate:modelValue":[e[72]||(e[72]=t=>a(i).preferences.AutoSaveQrcodedAccount=t),e[73]||(e[73]=t=>n("AutoSaveQrcodedAccount",t))],fieldName:"AutoSaveQrcodedAccount",isLocked:a(o).lockedPreferences.includes("AutoSaveQrcodedAccount"),label:"field.auto_save_qrcoded_account",help:"field.auto_save_qrcoded_account.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.useBasicQrcodeReader,"onUpdate:modelValue":[e[74]||(e[74]=t=>a(i).preferences.useBasicQrcodeReader=t),e[75]||(e[75]=t=>n("useBasicQrcodeReader",t))],fieldName:"useBasicQrcodeReader",isLocked:a(o).lockedPreferences.includes("useBasicQrcodeReader"),label:"field.use_basic_qrcode_reader",help:"field.use_basic_qrcode_reader.help"},null,8,["modelValue","isLocked"]),r(s,{modelValue:a(i).preferences.useDirectCapture,"onUpdate:modelValue":[e[76]||(e[76]=t=>a(i).preferences.useDirectCapture=t),e[77]||(e[77]=t=>n("useDirectCapture",t))],fieldName:"useDirectCapture",isLocked:a(o).lockedPreferences.includes("useDirectCapture"),label:"field.useDirectCapture",help:"field.useDirectCapture.help"},null,8,["modelValue","isLocked"]),r(d,{modelValue:a(i).preferences.defaultCaptureMode,"onUpdate:modelValue":[e[78]||(e[78]=t=>a(i).preferences.defaultCaptureMode=t),e[79]||(e[79]=t=>n("defaultCaptureMode",t))],options:J,fieldName:"defaultCaptureMode",isLocked:a(o).lockedPreferences.includes("defaultCaptureMode"),isDisabled:!a(i).preferences.useDirectCapture,label:"field.defaultCaptureMode",help:"field.defaultCaptureMode.help",isIndented:!0},null,8,["modelValue","isLocked","isDisabled"])])])]),_:1})]),footer:p(()=>[r(ue,null,{default:p(()=>[r(ne,{action:"close",onClosed:e[80]||(e[80]=t=>("router"in l?l.router:a(D)).push({name:a(R)})),"current-page-title":l.$t("title.settings.options")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{We as default}; diff --git a/public/build/assets/OtpLogs-CAP6rwu6.js b/public/build/assets/OtpLogs-CAP6rwu6.js new file mode 100644 index 0000000..7232aa2 --- /dev/null +++ b/public/build/assets/OtpLogs-CAP6rwu6.js @@ -0,0 +1 @@ +import{U as x}from"./index-BJsmINgd.js";import{S as Y,T as A,M as F,C as K,a as E}from"./tablet-DYUfDfjC.js";import{X as U}from"./x-DQVIq0xP.js";import{C as j}from"./check-CPGWPXZa.js";import{M as P,f as w,h as a,l as y,i as m,w as d,F as L,m as e,d as c,t as o,j as n,p as S,n as _,k as M,C as R,e as C,o as W,a1 as z,I as X,D as H,X as J,E as G,B as Q,b as Z,g as tt}from"./app-dvJP63FL.js";import{_ as et}from"./TwofaccountMedia-DzLyeBxh.js";import"./createLucideIcon-DsaEAGzP.js";const ot={class:"list-item is-size-6 is-size-7-mobile has-text-grey is-flex is-justify-content-space-between"},st={class:"light-or-darker"},nt={class:"light-or-darker"},at={class:"light-or-darker"},lt={class:"light-or-darker"},rt={class:"light-or-darker"},it={class:"light-or-darker"},ut={class:"light-or-darker"},ct={class:"log-icon-wrapper"},gt={key:1},dt={class:"light-or-darker"},ht={class:"light-or-darker"},pt={class:"light-or-darker"},yt={class:"light-or-darker"},_t={class:"light-or-darker"},mt={__name:"LogItem",props:{log:{type:Object,required:!0},logType:{type:String,required:!0,validator(t,f){return["auth","otp"].includes(t)}}},setup(t){const f=P("2fauth"),k=t,i=l=>!l.login_at&&l.logout_at,u=l=>!l.login_successful&&!l.logout_at;return(l,b)=>{const g=w("i18n-t");return a(),y("div",ot,[m(n(x),null,{default:d(({mode:h})=>[k.logType=="auth"?(a(),y(L,{key:0},[e("div",null,[e("div",null,[u(t.log)?(a(),c(g,{key:0,keypath:"message.failed_login_on",tag:"span"},{login_at:d(()=>[e("span",st,o(t.log.login_at),1)]),_:1})):i(t.log)?(a(),c(g,{key:1,keypath:"message.successful_logout_on",tag:"span"},{logout_at:d(()=>[e("span",nt,o(t.log.logout_at),1)]),_:1})):n(f).config.proxyAuth?(a(),c(g,{key:2,keypath:"message.viewed_on",tag:"span"},{login_at:d(()=>[e("span",at,o(t.log.login_at),1)]),_:1})):(a(),c(g,{key:3,keypath:"message.successful_login_on",tag:"span"},{login_at:d(()=>[e("span",lt,o(t.log.login_at),1)]),_:1}))]),e("div",null,[S(o(l.$t("label.IP"))+": ",1),e("span",rt,o(t.log.ip_address),1),S(" - "+o(l.$t("label.browser"))+": ",1),e("span",it,o(t.log.browser),1),S(" - "+o(l.$t("label.operating_system_short"))+": ",1),e("span",ut,o(t.log.platform),1)])]),e("div",{class:_([h=="dark"?"has-text-grey-darker":"has-text-grey-lighter","is-align-self-center"])},[e("div",ct,[t.log.device=="phone"?(a(),c(n(Y),{key:0,class:"log-icon-bg"})):t.log.device=="tablet"?(a(),c(n(A),{key:1,class:"log-icon-bg"})):(a(),c(n(F),{key:2,class:"log-icon-bg"})),u(t.log)?(a(),c(n(U),{key:3,"stroke-width":"3",class:_(["log-icon-mark","has-text-danger"])})):(a(),c(n(j),{key:4,"stroke-width":"3",class:_(["log-icon-mark","has-text-success-50"])}))])],2)],64)):k.logType=="otp"?(a(),y("div",gt,[m(g,{keypath:"message.otp_generated_by_on",tag:"span"},{otp:d(()=>[e("span",dt,o(t.log.otp_type.toUpperCase()),1)]),requester:d(()=>[e("span",ht,o(t.log.requester_name)+" ("+o(t.log.requester_email)+")",1)]),generated_at:d(()=>[e("span",pt,o(new Date(t.log.generated_at).toLocaleString()),1)]),_:1}),S(" - "+o(l.$t("label.IP"))+": ",1),e("span",yt,o(t.log.ip_address),1),t.log.otp_type=="hotp"?(a(),y(L,{key:0},[S(o(" - "+l.$t("label.counter"))+": ",1),e("span",_t,o(t.log.counter),1)],64)):M("",!0)])):M("",!0)]),_:1})])}}},ft={key:1,class:"level is-mobile mb-2"},kt={class:"level-item has-text-centered"},bt={class:"buttons"},vt=["title"],wt=["title"],$t=["title"],St=["title"],Ct=["title"],It=["title"],Lt={key:3,class:"mt-4"},Mt={key:4},Tt={key:5,class:"mt-5 pl-3"},Nt={__name:"LogViewer",props:{twofaccountId:[Number,String],userId:[Number,String],lastOnly:Boolean,showSearch:Boolean,period:{type:[Number,String],default:12},logType:{type:String,required:!0,validator(t,f){return["auth","otp"].includes(t)}},sortingKey:{type:String,required:!0}},emits:["has-more-entries"],setup(t,{emit:f}){const k=R(),i=t,u={aMonth:1,threeMonths:3,halfYear:6,aYear:12},l=C([]),b=C(!1),g=C(""),h=C(i.period),v=C(!0),T=f,N=Q(()=>l.value.filter(s=>JSON.stringify(s).toString().toLowerCase().includes(g.value)));W(()=>{D()});function I(s){h.value=s,D()}function V(){v.value=!1,B()}function B(){l.value.sort((s,r)=>s[i.sortingKey]>r[i.sortingKey]?1:-1)}function q(){v.value=!0,O()}function O(){l.value.sort((s,r)=>s[i.sortingKey]{l.value=$.data,l.value.length>3&&i.lastOnly&&(T("has-more-entries"),l.value.pop()),v.value==!0?O():B()}).catch($=>{k.show($)}).finally(()=>{b.value=!1})}return(s,r)=>{const $=w("Spinner");return a(),y(L,null,[i.showSearch?(a(),c(n(J),{key:0,keyword:n(g),"onUpdate:keyword":r[0]||(r[0]=p=>H(g)?g.value=p:null),hasNoBackground:!0},null,8,["keyword"])):M("",!0),i.showSearch?(a(),y("nav",ft,[e("div",kt,[e("div",bt,[e("button",{id:"btnShowOneMonth",title:s.$t("tooltip.show_last_month_log"),onClick:r[1]||(r[1]=p=>I(u.aMonth)),class:_([{"has-text-grey":n(h)!==u.aMonth},"button is-ghost p-1"]),type:"button"},o(s.$t("label.one_month")),11,vt),e("button",{id:"btnShowThreeMonths",title:s.$t("tooltip.show_three_months_log"),onClick:r[2]||(r[2]=p=>I(u.threeMonths)),class:_([{"has-text-grey":n(h)!==u.threeMonths},"button is-ghost p-1"]),type:"button"},o(s.$t("label.x_month",{x:"3"})),11,wt),e("button",{id:"btnShowSixMonths",title:s.$t("tooltip.show_six_months_log"),onClick:r[3]||(r[3]=p=>I(u.halfYear)),class:_([{"has-text-grey":n(h)!==u.halfYear},"button is-ghost p-1"]),type:"button"},o(s.$t("label.x_month",{x:"6"})),11,$t),e("button",{id:"btnShowOneYear",title:s.$t("tooltip.show_one_year_log"),onClick:r[4]||(r[4]=p=>I(u.aYear)),class:_([{"has-text-grey":n(h)!==u.aYear},"button is-ghost p-1 mr-5"]),type:"button"},o(s.$t("label.one_year")),11,St),e("button",{id:"btnSortLogDesc",onClick:r[5]||(r[5]=p=>q()),title:s.$t("tooltip.sort_by_date_desc"),class:_([{"has-text-grey":!n(v)},"button p-1 is-ghost"]),type:"button"},[m(n(K))],10,Ct),e("button",{id:"btnSortLogAsc",onClick:r[6]||(r[6]=p=>V()),title:s.$t("tooltip.sort_by_date_asc"),class:_([{"has-text-grey":n(v)},"button p-1 is-ghost"]),type:"button"},[m(n(E))],10,It)])])])):M("",!0),n(b)?(a(),c($,{key:2,isVisible:!0,type:"list-loading"})):n(l).length==0?(a(),y("div",Lt,o(s.$t("message.no_entry_yet")),1)):n(N).length>0?(a(),y("div",Mt,[(a(!0),y(L,null,G(n(N),p=>(a(),c(mt,{key:p.id,log:p,"log-type":i.logType},null,8,["log","log-type"]))),128))])):(a(),y("div",Tt,o(s.$t("message.no_result")),1))],64)}}},Bt={class:"title"},Ft={__name:"OtpLogs",props:{twofaccountId:[Number,String]},setup(t){const f=tt(),k=t,u=Z().getById(k.twofaccountId);return(l,b)=>{const g=w("ResponsiveWidthWrapper"),h=w("NavigationButton"),v=w("VueFooter"),T=w("StackLayout");return a(),c(T,null,{content:d(()=>[m(g,null,{default:d(()=>[e("h1",Bt,o(l.$t("heading.otp_generation_log")),1),m(et,{twofaccount:n(u)},null,8,["twofaccount"]),m(Nt,{twofaccountId:k.twofaccountId,logType:"otp",sortingKey:"generated_at",lastOnly:!1,showSearch:!0,period:1},null,8,["twofaccountId"])]),_:1})]),footer:d(()=>[m(v,null,{default:d(()=>[m(h,{action:"close",onClosed:b[0]||(b[0]=N=>n(f).push({name:"accounts"})),"current-page-title":l.$t("title.otpLogs")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{Ft as default}; diff --git a/public/build/assets/QRcode-Da_iUmWo.js b/public/build/assets/QRcode-Da_iUmWo.js new file mode 100644 index 0000000..d757154 --- /dev/null +++ b/public/build/assets/QRcode-Da_iUmWo.js @@ -0,0 +1 @@ +import{a6 as f,I as h,l as r,m as s,j as a,k as v,i as l,w as i,a2 as w,e as y,f as n,g as B,h as c,d as V,p as b,t as N}from"./app-dvJP63FL.js";const x={class:"modal modal-otp is-active"},R={class:"modal-card is-flex-grow-1"},S={class:"modal-card-body modal-slot py-0 is-align-content-center has-text-centered"},$={class:"has-text-centered m-5"},q=["src","alt"],C={key:1},T={__name:"QRcode",setup(Q){const d=B(),u=w(),t=y();f(()=>{_()});async function _(){const{data:e}=await h.getQrcode(u.params.twofaccountId);t.value=e.qrcode}return(e,o)=>{const m=n("Spinner"),p=n("NavigationButton"),g=n("router-link"),k=n("VueFooter");return c(),r("div",x,[o[1]||(o[1]=s("div",{class:"modal-background"},null,-1)),s("div",R,[s("section",S,[s("p",$,[a(t)?(c(),r("img",{key:0,src:a(t),class:"qrcode has-background-light",alt:e.$t("alttext.image_of_qrcode_to_scan")},null,8,q)):v("",!0),l(m,{isVisible:!a(t),type:"raw",rawSize:32},null,8,["isVisible"])])]),l(k,null,{default:i(()=>[l(p,{action:"close",onClosed:o[0]||(o[0]=F=>a(d).push({name:"accounts"})),"current-page-title":e.$t("title.showQRcode")},null,8,["current-page-title"])]),subpart:i(()=>[e.$route.name!="accounts"?(c(),V(g,{key:0,id:"lnkBackToHome",to:{name:"accounts"},class:"has-text-grey"},{default:i(()=>[b(N(e.$t("link.back_to_home")),1)]),_:1})):(c(),r("span",C," "))]),_:1})])])}}};export{T as default}; diff --git a/public/build/assets/QrContentDisplay-DiIjf7a_.js b/public/build/assets/QrContentDisplay-DiIjf7a_.js new file mode 100644 index 0000000..511d8b8 --- /dev/null +++ b/public/build/assets/QrContentDisplay-DiIjf7a_.js @@ -0,0 +1 @@ +import{N as m,u as v,h as a,l as r,m as n,t as s,H as C,k as l,i as f,j as w,F as y,$ as _}from"./app-dvJP63FL.js";import{E as $}from"./external-link-CqpXNovN.js";const g={class:"block"},h={class:"block mb-6 light-or-darker"},q={key:0,class:"block has-text-link"},E={type:"button",class:"button is-link is-outlined is-rounded"},x={class:"icon is-small"},I={__name:"QrContentDisplay",props:{qrContent:String},setup(o){const{copy:c}=m({legacy:!0}),{t:u}=v(),d=_();function b(e){var t=/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/,i=new RegExp(t);return i.test(e)}function k(e){const t=document.createElement("a");t.setAttribute("href",e),t.dispatchEvent(new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0}))}function p(e){c(e),d.success({text:u("notification.copied_to_clipboard")})}return(e,t)=>(a(),r(y,null,[t[2]||(t[2]=n("div",{class:"too-bad"},null,-1)),n("div",g,s(e.$t("error.data_of_qrcode_is_not_valid_URI")),1),n("div",h,s(o.qrContent?o.qrContent:"["+e.$t("message.nothing")+"]"),1),o.qrContent?(a(),r("div",q,[n("button",{type:"button",class:"button is-link is-outlined is-rounded",onClick:t[0]||(t[0]=C(i=>p(o.qrContent),["stop"]))},s(e.$t("label.copy_to_clipboard")),1)])):l("",!0),b(o.qrContent)?(a(),r("div",{key:1,class:"block has-text-link",onClick:t[1]||(t[1]=i=>k(o.qrContent))},[n("button",E,[n("span",null,s(e.$t("label.open_in_browser")),1),n("span",x,[f(w($))])])])):l("",!0)],64))}};export{I as _}; diff --git a/public/build/assets/Recover-CEob990V.js b/public/build/assets/Recover-CEob990V.js new file mode 100644 index 0000000..a08a6bc --- /dev/null +++ b/public/build/assets/Recover-CEob990V.js @@ -0,0 +1 @@ +import{C as R,u as C,a8 as $,r as x,af as L,d as N,w as u,M as S,a2 as q,f as t,g as A,h as D,i as r,m as i,j as s,H as M,p,t as m,$ as W}from"./app-dvJP63FL.js";import{F as P}from"./Form-ZbAUhXmz.js";const j={class:"field"},U={__name:"Recover",setup(H){const f=R(),{t:_}=C(),w=S("2fauth"),n=W(),d=A(),c=q(),b=$(w.prefix+"showWebauthnForm",!1),o=x(new P({email:c.query.email,password:"",token:c.query.token,revokeAll:!1}));function h(l){n.clear(),o.post("/webauthn/recover",{returnError:!0}).then(e=>{b.value=!1,d.push({name:"accounts"})}).catch(e=>{e.response.status===401?n.alert({text:_("notification.authentication_failed"),duration:-1}):e.response.status===422?n.alert({text:e.response.data.message,duration:-1}):f.show(e)})}return L(()=>{n.clear()}),(l,e)=>{const v=t("FormCheckbox"),k=t("FormPasswordField"),y=t("RouterLink"),F=t("FormButtons"),g=t("FormWrapper"),V=t("VueFooter"),B=t("StackLayout");return D(),N(B,null,{content:u(()=>[r(g,{title:"heading.account_recovery",punchline:"message.recover_account_instructions"},{default:u(()=>[i("div",null,[i("form",{onSubmit:M(h,["prevent"]),onKeydown:e[3]||(e[3]=a=>s(o).onKeydown(a))},[r(v,{modelValue:s(o).revokeAll,"onUpdate:modelValue":e[0]||(e[0]=a=>s(o).revokeAll=a),fieldName:"revokeAll",label:"field.disable_all_security_devices",help:"field.disable_all_security_devices.help"},null,8,["modelValue"]),r(k,{modelValue:s(o).password,"onUpdate:modelValue":e[1]||(e[1]=a=>s(o).password=a),fieldName:"password",errorMessage:s(o).errors.get("password"),autocomplete:"current-password",showRules:!1,label:"field.current_password",help:"field.current_password.help"},null,8,["modelValue","errorMessage"]),i("div",j,[i("p",null,[p(m(l.$t("message.forgot_your_password"))+"  ",1),r(y,{id:"lnkResetPwd",to:{name:"password.request"},class:"is-link","aria-label":l.$t("label.reset_your_password")},{default:u(()=>[p(m(l.$t("link.request_password_reset")),1)]),_:1},8,["aria-label"])])]),r(F,{submitId:"btnRecover",isBusy:s(o).isBusy,isDisabled:s(o).isDisabled,submitLabel:"label.continue",showCancelButton:!0,onCancel:e[2]||(e[2]=a=>s(d).push({name:"login"}))},null,8,["isBusy","isDisabled"])],32)])]),_:1})]),footer:u(()=>[r(V)]),_:1})}}};export{U as default}; diff --git a/public/build/assets/Register-DffuLlzx.js b/public/build/assets/Register-DffuLlzx.js new file mode 100644 index 0000000..38756eb --- /dev/null +++ b/public/build/assets/Register-DffuLlzx.js @@ -0,0 +1 @@ +import{C as U,u as x,a as P,P as W,r as k,af as j,d as b,w as u,f as r,g as A,h as c,i as n,j as s,m as i,t as d,l as F,p as f,H as V,e as S,$ as H}from"./app-dvJP63FL.js";import{F as B}from"./Form-ZbAUhXmz.js";import{w as O}from"./webauthnService-D363et0U.js";import{C as E}from"./check-CPGWPXZa.js";import"./createLucideIcon-DsaEAGzP.js";const J={class:"block"},Y={key:0,class:"field"},q={id:"lblDeviceRegistrationSuccess",class:"label mb-5"},z={key:1,class:"field is-grouped"},G={class:"control"},Q={class:"control"},X={class:"block"},Z={class:"nav-links"},ie={__name:"Register",setup(ee){const D=U(),{t:R}=x(),y=P(),_=H(),$=A(),w=S(!1),L=W(),g=S(null),t=k(new B({name:"",email:"",password:"",password_confirmation:""})),l=k(new B({name:""}));async function M(a){t.password_confirmation=t.password,t.post("/user").then(e=>{y.$patch({id:e.data.id,name:e.data.name,email:e.data.email,preferences:e.data.preferences,isAdmin:e.data.is_admin??!1}),y.applyTheme();for(const[m,p]of Object.entries(e?.data?.appSettings||{}))L[m]=p;w.value=!0})}function N(){O.register().then(a=>{const e=JSON.parse(a.config.data);g.value=e.id}).catch(a=>{a.response.status===422?_.alert({text:a.response.data.message}):D.show(a)})}function C(a){l.patch("/webauthn/credentials/"+g.value+"/name").then(()=>{_.success({text:R("notification.device_successfully_registered")}),$.push({name:"accounts"})})}return j(()=>{_.clear()}),(a,e)=>{const m=r("FormField"),p=r("FormButtons"),h=r("RouterLink"),v=r("FormWrapper"),T=r("FormPasswordField"),I=r("VueFooter"),K=r("StackLayout");return c(),b(K,null,{content:u(()=>[s(w)?(c(),b(v,{key:0,title:"heading.authentication",punchline:"message.enhance_security_using_webauthn"},{default:u(()=>[i("div",J,d(a.$t("message.webauthn_uses_trusted_devices")),1),s(g)?(c(),F("div",Y,[i("label",q,[f(d(a.$t("notification.device_successfully_registered")),1),n(s(E),{class:"ml-1 inline"})]),i("form",{onSubmit:V(C,["prevent"]),onKeydown:e[1]||(e[1]=o=>s(l).onKeydown(o))},[n(m,{modelValue:s(l).name,"onUpdate:modelValue":e[0]||(e[0]=o=>s(l).name=o),fieldName:"name",errorMessage:s(l).errors.get("name"),inputType:"text",placeholder:"iPhone 12, TouchID, Yubikey 5C",label:"field.name_this_device"},null,8,["modelValue","errorMessage"]),n(p,{isBusy:s(l).isBusy,isDisabled:s(l).isDisabled,submitLabel:"label.continue"},null,8,["isBusy","isDisabled"])],32)])):(c(),F("div",z,[i("div",G,[i("button",{type:"button",id:"btnRegisterNewDevice",onClick:e[2]||(e[2]=o=>N()),class:"button is-link"},d(a.$t("label.register_a_device")),1)]),i("div",Q,[n(h,{id:"btnMaybeLater",to:{name:"accounts"},class:"button is-text"},{default:u(()=>[f(d(a.$t("link.maybe_later")),1)]),_:1})])]))]),_:1})):(c(),b(v,{key:1,title:"heading.register",punchline:"message.welcome_to_2fauth"},{default:u(()=>[i("div",X,d(a.$t("message.you_need_an_account_to_go_further")),1),i("form",{onSubmit:V(M,["prevent"]),onKeydown:e[6]||(e[6]=o=>s(t).onKeydown(o))},[n(m,{modelValue:s(t).name,"onUpdate:modelValue":e[3]||(e[3]=o=>s(t).name=o),fieldName:"name",errorMessage:s(t).errors.get("name"),inputType:"text",label:"field.name",autocomplete:"username",maxLength:255,autofocus:""},null,8,["modelValue","errorMessage"]),n(m,{modelValue:s(t).email,"onUpdate:modelValue":e[4]||(e[4]=o=>s(t).email=o),fieldName:"email",errorMessage:s(t).errors.get("email"),inputType:"email",label:"field.email",autocomplete:"email",maxLength:255},null,8,["modelValue","errorMessage"]),n(T,{modelValue:s(t).password,"onUpdate:modelValue":e[5]||(e[5]=o=>s(t).password=o),fieldName:"password",errorMessage:s(t).errors.get("password"),showRules:!0,autocomplete:"new-password",label:"field.password"},null,8,["modelValue","errorMessage"]),n(p,{isBusy:s(t).isBusy,isDisabled:s(t).isDisabled,submitLabel:"label.register",submitId:"btnRegister"},null,8,["isBusy","isDisabled"])],32),i("div",Z,[i("p",null,[f(d(a.$t("message.already_register"))+" ",1),n(h,{id:"lnkSignIn",to:{name:"login"},class:"is-link"},{default:u(()=>[f(d(a.$t("link.sign_in")),1)]),_:1})])])]),_:1}))]),footer:u(()=>[n(I)]),_:1})}}};export{ie as default}; diff --git a/public/build/assets/RequestReset-w8-YSMaH.js b/public/build/assets/RequestReset-w8-YSMaH.js new file mode 100644 index 0000000..c7af8f2 --- /dev/null +++ b/public/build/assets/RequestReset-w8-YSMaH.js @@ -0,0 +1 @@ +import{C as y,r as F,af as h,d as g,w as i,a2 as B,f as n,h as m,i as u,l as k,t as v,k as V,m as R,j as o,H as C,a4 as L,$ as S}from"./app-dvJP63FL.js";import{F as q}from"./Form-ZbAUhXmz.js";const N={key:0,class:"block"},E={__name:"RequestReset",setup($){const c=y(),a=S(),s=B().name=="webauthn.lost",t=F(new q({email:""}));function d(r){a.clear(),t.post(s?"/webauthn/lost":"/user/password/lost",{returnError:!0}).then(e=>{a.success({text:e.data.message,duration:-1})}).catch(e=>{e.response.data.requestFailed?a.alert({text:e.response.data.requestFailed,duration:-1}):e.response.status!==422&&c.show(e)})}return h(()=>{a.clear()}),(r,e)=>{const p=n("FormField"),_=n("FormButtons"),f=n("FormWrapper"),w=n("VueFooter"),b=n("StackLayout");return m(),g(b,null,{content:i(()=>[u(f,{title:s?"heading.account_recovery":"heading.reset_password",punchline:s?"message.recovery_punchline":"message.reset_punchline"},{default:i(()=>[s?(m(),k("div",N,v(r.$t("message.ensure_you_open_mail_in_trusted_device")),1)):V("",!0),R("form",{onSubmit:C(d,["prevent"]),onKeydown:e[2]||(e[2]=l=>o(t).onKeydown(l))},[u(p,{modelValue:o(t).email,"onUpdate:modelValue":e[0]||(e[0]=l=>o(t).email=l),fieldName:"email",errorMessage:o(t).errors.get("email"),label:"field.email",autofocus:""},null,8,["modelValue","errorMessage"]),u(_,{submitId:"btnSendResetPwd",isBusy:o(t).isBusy,submitLabel:s?"label.send_recovery_link":"label.send_password_reset_link",showCancelButton:!0,onCancel:e[1]||(e[1]=l=>("router"in r?r.router:o(L)).push({name:"login"}))},null,8,["isBusy","submitLabel"])],32)]),_:1},8,["title","punchline"])]),footer:i(()=>[u(w)]),_:1})}}};export{E as default}; diff --git a/public/build/assets/Reset-RiTuOlH9.js b/public/build/assets/Reset-RiTuOlH9.js new file mode 100644 index 0000000..4cc46d9 --- /dev/null +++ b/public/build/assets/Reset-RiTuOlH9.js @@ -0,0 +1 @@ +import{C,r as v,af as L,d as n,w as a,a2 as N,f as t,g as x,h as l,i as u,m as M,j as s,H as P,k as m,p as h,t as S,e as $,$ as E}from"./app-dvJP63FL.js";import{F as q}from"./Form-ZbAUhXmz.js";const U={__name:"Reset",setup(D){const f=C(),i=E(),w=x(),p=N(),d=$(!0),e=v(new q({email:p.query.email,password:"",password_confirmation:"",token:p.query.token}));function _(c){e.password_confirmation=e.password,e.post("/user/password/reset",{returnError:!0}).then(o=>{e.password="",e.password_confirmation="",d.value=!1,i.success({text:o.data.message,duration:-1})}).catch(o=>{o.response.data.resetFailed?i.alert({text:o.response.data.resetFailed,duration:-1}):o.response.status!==422&&f.show(o)})}return L(()=>{i.clear()}),(c,o)=>{const F=t("FormField"),k=t("FormPasswordField"),g=t("FormFieldError"),y=t("FormButtons"),V=t("RouterLink"),b=t("FormWrapper"),B=t("VueFooter"),R=t("StackLayout");return l(),n(R,null,{content:a(()=>[u(b,{title:"heading.new_password"},{default:a(()=>[M("form",{onSubmit:P(_,["prevent"]),onKeydown:o[3]||(o[3]=r=>s(e).onKeydown(r))},[u(F,{modelValue:s(e).email,"onUpdate:modelValue":o[0]||(o[0]=r=>s(e).email=r),isDisabled:!0,fieldName:"email",errorMessage:s(e).errors.get("email"),label:"field.email",autofocus:""},null,8,["modelValue","errorMessage"]),u(k,{modelValue:s(e).password,"onUpdate:modelValue":o[1]||(o[1]=r=>s(e).password=r),fieldName:"password",errorMessage:s(e).errors.get("password"),autocomplete:"new-password",showRules:!0,label:"field.new_password"},null,8,["modelValue","errorMessage"]),s(e).errors.get("token")!=null?(l(),n(g,{key:0,error:s(e).errors.get("token"),field:s(e).token},null,8,["error","field"])):m("",!0),s(d)?(l(),n(y,{key:1,submitId:"btnResetPwd",isBusy:s(e).isBusy,submitLabel:"label.change_password",showCancelButton:!0,onCancel:o[2]||(o[2]=r=>s(w).push({name:"login"}))},null,8,["isBusy"])):m("",!0),s(d)?m("",!0):(l(),n(V,{key:2,id:"btnContinue",to:{name:"accounts"},class:"button is-link"},{default:a(()=>[h(S(c.$t("link.continue")),1)]),_:1}))],32)]),_:1})]),footer:a(()=>[u(B)]),_:1})}}};export{U as default}; diff --git a/public/build/assets/Share-DkTnn1jz.js b/public/build/assets/Share-DkTnn1jz.js new file mode 100644 index 0000000..9e8d7e6 --- /dev/null +++ b/public/build/assets/Share-DkTnn1jz.js @@ -0,0 +1 @@ +import{b as Y,a8 as Z,a9 as ee,aa as se,e as d,o as te,I as oe,a6 as ae,ab as ne,v as ie,d as L,w as C,M as re,f as F,g as le,a2 as ce,a7 as ue,h as a,i as p,j as t,m as s,t as i,p as M,H as de,n as _,y as he,D as fe,ac as me,l as r,F as v,E as N,k as pe,B as $}from"./app-dvJP63FL.js";import{s as j}from"./shareService-BU7jlLil.js";import{_ as _e}from"./TwofaccountMedia-DzLyeBxh.js";import{u as ve}from"./bus-ChE1sp8V.js";import{a as ge}from"./helpers-B2oe4lHy.js";import{U as we}from"./index-BJsmINgd.js";import{c as D}from"./createLucideIcon-DsaEAGzP.js";const ke=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],ye=D("loader-circle",ke);const Se=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],be=D("search",Se),Ce={class:"title"},Fe={class:"block is-size-7-mobile"},$e={class:"field"},Be={for:"findUserForShare",class:"label"},Ie={class:"dropdown-trigger"},Te={class:"field"},Ue={class:"control has-icons-right"},Re={class:"icon is-right"},Le=["title"],Me={class:"dropdown-menu",id:"dropdown-menu",role:"menu"},Ne={class:"dropdown-content is-shadowless"},je=["onClick"],De={key:1,class:"dropdown-item has-text-grey"},We={key:0,class:"dropdown-item has-text-grey"},ze={key:1,class:"dropdown-item is-italic"},Ae={class:"help"},Ee={class:"mb-5"},Ve={key:0,class:"field is-grouped is-grouped-multiline"},xe={class:"tags has-addons are-medium"},He=["onClick"],Ke={class:"block is-size-7-mobile has-text-grey"},Ye={__name:"Share",props:{twofaccountId:[Number,String]},setup(W){const z=re("2fauth"),B=le(),A=ce();ve();const E=Y(),I=Z(z.prefix+"returnTo","accountSharing"),h=W;ee("Escape",e=>{e.preventDefault(),y()});const V=ue("findUserForShare"),{focused:x}=se(V),T=d(E.items.find(e=>e.id==h.twofaccountId)),U=d(!1),f=d(!1),g=d(!1),u=d(""),m=d(null),l=d([]),H=$(()=>I.value=="accountSharing"?{name:"accountSharing",params:{twofaccountId:A.params.twofaccountId}}:{name:I.value}),K=$(()=>m.value?.length>0),O=$(()=>l.value.length>0);let w=null,c=null;te(()=>{U.value=!0,oe.get(h.twofaccountId).then(e=>{T.value=e.data}).finally(()=>{U.value=!1})}),ae(()=>{}),ne(()=>{y()}),ie(u,e=>{w&&clearTimeout(w),e.length==0?k():w=setTimeout(()=>{e.length>1&&Q(e)},300)});function Q(e){c?.abort(),c=new AbortController;const o=c,S=setTimeout(()=>{o===c&&(f.value=!0)},250);j.getRecipients(h.twofaccountId,e,{signal:c.signal}).then(b=>{m.value=ge(b.data)}).finally(()=>{clearTimeout(S),o===c&&(f.value=!1)})}function q(e){l.value.some(o=>o.id==e.id)||l.value.push(e),k(),u.value="",x.value=!0}function k(){m.value=null}function G(e){for(var o=0;o0&&j.shareWithUsers(h.twofaccountId,l.value.map(e=>e.id)).then(e=>{B.push({name:"accountSharing",params:{twofaccountId:h.twofaccountId}})}).finally(()=>{g.value=!1})}return(e,o)=>{const S=F("FormButtons"),b=F("ResponsiveWidthWrapper"),P=F("StackLayout");return a(),L(P,null,{content:C(()=>[p(t(we),null,{default:C(({mode:R})=>[p(b,null,{default:C(()=>[s("h1",Ce,i(e.$t("heading.new_sharing")),1),s("div",Fe,[M(i(e.$t("message.share_account_with_other_users")),1),o[2]||(o[2]=s("br",null,null,-1)),M(" "+i(e.$t("message.this_form_does_not_affect_existing_sharing")),1)]),p(_e,{twofaccount:t(T)},null,8,["twofaccount"]),s("form",{onSubmit:de(J,["prevent"])},[s("div",$e,[s("label",Be,i(e.$t("field.findUserForShare")),1),s("div",{class:_(["control",{"has-icons-left":e.leftIcon,"has-icons-right":e.rightIcon}])},[s("div",{class:_(["dropdown",{"is-active":t(m)||t(f)}])},[s("div",Ie,[s("div",Te,[s("p",Ue,[he(s("input",{ref:"findUserForShare",id:"findUserForShare","onUpdate:modelValue":o[0]||(o[0]=n=>fe(u)?u.value=n:null),type:"text",class:"input",autofocus:""},null,512),[[me,t(u)]]),s("span",Re,[t(u)!=""?(a(),r("button",{key:0,type:"button",id:"btnClearSearch",tabindex:"1",title:e.$t("tooltip.clear_search"),class:"clear-selection delete",onClick:y},null,8,Le)):(a(),L(t(be),{key:1}))])])])]),s("div",Me,[s("div",Ne,[t(K)?(a(!0),r(v,{key:0},N(t(m),n=>(a(),r(v,{key:n.id},[n.is_shared_with?(a(),r("span",De,i(n.name)+" ("+i(e.$t("message.already_shared"))+") ",1)):(a(),r("a",{key:0,onClick:X=>q(n),class:"dropdown-item"},i(n.name),9,je))],64))),128)):(a(),r(v,{key:1},[t(f)?(a(),r("span",We,[p(t(ye),{class:"spinning"})])):(a(),r("span",ze,i(e.$t("message.no_match")),1))],64))])])],2)],2),s("p",Ae,i(e.$t("field.findUserForShare.help")),1)]),s("div",Ee,[t(l).length>0?(a(),r("div",Ve,[(a(!0),r(v,null,N(t(l),n=>(a(),r("div",{key:n.id,class:"control"},[s("div",xe,[s("span",{class:_(["tag",R=="dark"?"is-dark":"is-white"])},i(n.name),3),s("button",{onClick:X=>G(n),class:_(["tag is-delete",R=="dark"?"is-black":"is-dark"])},null,10,He)])]))),128))])):pe("",!0)]),s("div",Ke,i(e.$t("message.keep_in_mind_share_principle")),1),p(S,{isDisabled:!t(O),isBusy:t(g),submitLabel:"label.share",showCancelButton:!0,onCancel:o[1]||(o[1]=n=>t(B).push(t(H)))},null,8,["isDisabled","isBusy"])],32)]),_:2},1024)]),_:1})]),_:1})}}};export{Ye as default}; diff --git a/public/build/assets/Start-Dnu4qWlC.js b/public/build/assets/Start-Dnu4qWlC.js new file mode 100644 index 0000000..b5198b9 --- /dev/null +++ b/public/build/assets/Start-Dnu4qWlC.js @@ -0,0 +1 @@ +import{u as D,a as Q,b as K,r as M,o as P,c as T,d as k,w as c,e as b,f as i,$ as j,g as z,h as a,i as $,j as n,k as C,l as _,m as o,n as L,p as r,t as s,q as S}from"./app-dvJP63FL.js";import{F as G}from"./Form-ZbAUhXmz.js";import{u as O}from"./bus-ChE1sp8V.js";const H={key:1,class:"has-text-centered"},J={class:"quick-uploader-wrapper p-0 mt-6 mb-5"},W={class:"quick-uploader-button is-align-content-center"},X={class:"block light-or-darker"},Y={key:0,class:"block has-text-link"},Z={class:"block has-text-link"},ee={class:"block has-text-link"},te={class:"block"},re={__name:"Start",setup(oe){const{t:E}=D(),d=z(),p=Q(),w=O(),B=j(),F=K(),g=b(null),l=b(null),u=M(new G({qrcode:null,inputFormat:"fileUpload"})),v=b(!1),m=b(!1);function y(t){u.clear(),u.qrcode=t??g.value.files[0],u.upload("/api/v1/qrcode/decode",{returnError:!0}).then(e=>{e.data.data.slice(0,33).toLowerCase()==="otpauth-migration://offline?data="?(w.migrationUri=e.data.data,d.push({name:"importAccounts"})):(w.decodedUri=e.data.data,d.push({name:"createAccount"}))}).catch(e=>{e.response.status!==422&&B.alert({text:e.response.data.message})}).finally(()=>{v.value=!1,m.value=!1})}function U(){d.push({name:"capture"})}function h(t){for(let e=0;e{p.preferences.useDirectCapture&&p.preferences.defaultCaptureMode==="upload"&&l.value.click(),console.log("mounting",h),document.addEventListener("paste",h)}),T(()=>{document.removeEventListener("paste",h)}),(t,e)=>{const f=i("Spinner"),N=i("FormFieldError"),I=i("RouterLink"),R=i("NavigationButton"),x=i("VueFooter"),A=i("StackLayout");return a(),k(A,{"is-vertical-centered":!0},{content:c(()=>[n(v)?(a(),k(f,{key:0,type:"fullscreen-overlay",isVisible:!0,message:"message.parsing_data"})):(a(),_("div",H,[o("div",{class:L({"is-hidden":n(F).count!==0})},[r(s(t.$t("message.no_account_here")),1),e[4]||(e[4]=o("br",null,null,-1)),r(" "+s(t.$t("message.add_first_account")),1)],2),o("div",J,[e[5]||(e[5]=o("div",{class:"quick-uploader-background"},null,-1)),o("div",W,[n(p).preferences.useBasicQrcodeReader?(a(),_("label",{key:0,role:"button",tabindex:"0",class:L(["button is-link is-medium is-rounded is-main",{"is-loading":n(m)}]),ref_key:"qrcodeInputLabel",ref:l,onKeyup:e[0]||(e[0]=S(q=>n(l).click(),["enter"]))},[o("input",{"aria-hidden":"true",tabindex:"-1",class:"file-input",type:"file",accept:"image/*",onChange:y,ref_key:"qrcodeInput",ref:g},null,544),r(" "+s(t.$t("label.upload_qrcode")),1)],34)):(a(),_("button",{key:1,type:"button",class:"button is-link is-medium is-rounded is-main",onClick:e[1]||(e[1]=q=>U())},s(t.$t("label.scan_qrcode")),1))]),n(u).errors.hasAny("qrcode")?(a(),k(N,{key:0,error:n(u).errors.get("qrcode"),field:"qrcode"},null,8,["error"])):C("",!0)]),o("div",X,s(t.$t("message.alternative_methods")),1),n(p).preferences.useBasicQrcodeReader?C("",!0):(a(),_("div",Y,[o("label",{role:"button",tabindex:"0",class:L(["button is-link is-outlined is-rounded",{"is-loading":n(m)}]),ref_key:"qrcodeInputLabel",ref:l,onKeyup:e[2]||(e[2]=S(q=>n(l).click(),["enter"]))},[o("input",{"aria-hidden":"true",tabindex:"-1",class:"file-input",type:"file",accept:"image/*",onChange:V,ref_key:"qrcodeInput",ref:g},null,544),r(" "+s(t.$t("label.upload_qrcode")),1)],34)])),o("div",Z,[$(I,{class:"button is-link is-outlined is-rounded",to:{name:"createAccount"}},{default:c(()=>[r(s(t.$t("link.use_advanced_form")),1)]),_:1})]),o("div",ee,[$(I,{id:"btnImport",class:"button is-link is-outlined is-rounded",to:{name:"importAccounts"}},{default:c(()=>[r(s(t.$t("label.import")),1)]),_:1})]),o("div",te,[r(s(t.$t("message.you_can_also_paste")),1),e[6]||(e[6]=o("br",null,null,-1))])]))]),footer:c(()=>[$(x,null,{default:c(()=>[n(F).isEmpty?C("",!0):(a(),k(R,{key:0,action:"back",onGoback:e[3]||(e[3]=q=>n(d).push({name:"accounts"})),"previous-page-title":t.$t("title.accounts")},null,8,["previous-page-title"]))]),_:1})]),_:1})}}};export{re as default}; diff --git a/public/build/assets/TransferOwnership-BsVNwpBY.js b/public/build/assets/TransferOwnership-BsVNwpBY.js new file mode 100644 index 0000000..7b56d30 --- /dev/null +++ b/public/build/assets/TransferOwnership-BsVNwpBY.js @@ -0,0 +1 @@ +import{ad as D,C as P,P as H,b as K,a8 as O,r as W,e as p,o as q,d as G,w as u,M as J,f as a,g as Q,a2 as X,h as y,i as n,j as e,m as d,t as i,p as _,l as Y,F as Z,k as ee,n as F,H as se,B,$ as te}from"./app-dvJP63FL.js";import{F as oe}from"./Form-ZbAUhXmz.js";import{s as ne}from"./shareService-BU7jlLil.js";import{_ as ae}from"./TwofaccountMedia-DzLyeBxh.js";import{a as re}from"./helpers-B2oe4lHy.js";import{U as ie}from"./index-BJsmINgd.js";const ce={class:"block is-size-7-mobile"},le={class:"block is-size-7-mobile"},ue={class:"mb-2"},he={__name:"TransferOwnership",props:{twofaccountId:[Number,String]},setup(I){const{t:c}=D(),$=P(),w=H(),V=J("2fauth"),h=Q(),x=X(),g=te(),m=K(),b=O(V.prefix+"returnTo","accountSharing"),t=W(new oe({new_owner_id:"",confirm_password:""})),l=I,f=p(m.items.find(s=>s.id==l.twofaccountId)),S=p(!1),k=p([]),C=B(()=>b.value=="accountSharing"?{name:"accountSharing",params:{twofaccountId:x.params.twofaccountId}}:{name:b.value}),M=B(()=>f.value.is_shared?c("message.shared_with_specific_users"):w.enableAllUsersSharingScope&&f.value.is_shared_with_all?c("message.shared_with_all"):c("message.not_shared"));q(()=>{N()});function R(){g.clear(),confirm(c("confirmation.you_will_loose_ownership"))&&t.patch(`/api/v1/twofaccounts/${l.twofaccountId}/owner`,{returnError:!0}).then(s=>{m.items.splice(m.items.findIndex(o=>o.id==l.twofaccountId),1),h.push({name:"accounts"})}).catch(s=>{s.response?.status===401?g.alert({text:c("notification.authentication_failed"),duration:1e4}):s.response?.status===422?(t.clear(),t.errors.set(t.extractErrors(s.response))):$.show(s)})}function N(){S.value=!0,ne.getRecipients(l.twofaccountId,"").then(s=>{re(s.data).forEach(o=>{k.value.push({text:o.name,value:o.id})})}).finally(()=>{S.value=!1})}return(s,o)=>{const T=a("RouterLink"),U=a("i18n-t"),L=a("FormSelect"),z=a("FormPasswordField"),A=a("FormButtons"),E=a("FormWrapper"),j=a("StackLayout");return y(),G(j,null,{content:u(()=>[n(e(ie),null,{default:u(({mode:v})=>[n(E,{title:"heading.transfer_ownership"},{default:u(()=>[d("div",ce,i(s.$t("message.ownership_can_be_transferred_legend")),1),n(ae,{twofaccount:e(f)},null,8,["twofaccount"]),d("div",le,[d("p",ue,[_(i(s.$t("message.ownership_can_be_transferred_sharing_legend"))+" ",1),e(w).enableAllUsersSharingScope?(y(),Y(Z,{key:0},[_(i(s.$t("message.ownership_can_be_transferred_sharing_legend_if_with_all")),1)],64)):ee("",!0),_(" "+i(s.$t("message.ownership_can_be_transferred_sharing_legend_if_with_specific_users")),1)]),n(U,{keypath:"message.this_account_is_currently_x",tag:"p",class:F(v=="dark"?"has-text-grey":"has-text-black")},{sharing_status:u(()=>[n(T,{class:"is-link",to:{name:"accountSharing",params:{twofaccountId:l.twofaccountId}}},{default:u(()=>[_(i(e(M)),1)]),_:1},8,["to"])]),_:1},8,["class"])]),d("form",{onSubmit:se(R,["prevent"]),onKeydown:o[3]||(o[3]=r=>e(t).onKeydown(r)),class:"mb-6"},[n(L,{modelValue:e(t).new_owner_id,"onUpdate:modelValue":o[0]||(o[0]=r=>e(t).new_owner_id=r),options:e(k),fieldName:"new_owner_id",errorMessage:e(t).errors.get("new_owner_id"),"is-loading":"isFetchingRecipients",label:"field.new_owner",help:"field.new_owner.help"},null,8,["modelValue","options","errorMessage"]),d("div",{class:F(["is-size-7-mobile mb-3",v=="dark"?"has-text-grey":"has-text-black"])},i(s.$t("message.double_check_new_owner")),3),n(z,{modelValue:e(t).confirm_password,"onUpdate:modelValue":o[1]||(o[1]=r=>e(t).confirm_password=r),fieldName:"confirm_password",errorMessage:e(t).errors.get("confirm_password"),label:"field.current_password",help:"field.current_password.help",autocomplete:"off"},null,8,["modelValue","errorMessage"]),n(A,{isDisabled:!e(t).new_owner_id||!e(t).confirm_password,isBusy:e(t).isBusy,submitLabel:"label.transfer",showCancelButton:!0,onCancel:o[2]||(o[2]=r=>e(h).push(e(C)))},null,8,["isDisabled","isBusy"])],32)]),_:2},1024)]),_:1})]),_:1})}}};export{he as default}; diff --git a/public/build/assets/TwofaccountMedia-DzLyeBxh.js b/public/build/assets/TwofaccountMedia-DzLyeBxh.js new file mode 100644 index 0000000..064cf10 --- /dev/null +++ b/public/build/assets/TwofaccountMedia-DzLyeBxh.js @@ -0,0 +1 @@ +import{U as r}from"./index-BJsmINgd.js";import{M as l,h as e,l as o,i as u,w as d,m as s,j as c,k as m,n as f,t as n}from"./app-dvJP63FL.js";const h={class:"columns is-mobile is-2 is-align-items-center"},_={class:"column is-narrow"},g={class:"image is-32x32"},w=["src"],k=["src"],y={class:"column"},b={class:"subtitle is-7"},j={__name:"TwofaccountMedia",props:{twofaccount:{type:Object,required:!0}},setup(t){const a=l("2fauth");return(x,p)=>(e(),o("div",h,[u(c(r),null,{default:d(({mode:i})=>[s("div",_,[s("figure",g,[t.twofaccount.icon?(e(),o("img",{key:0,role:"presentation",src:c(a).config.subdirectory+"/storage/icons/"+t.twofaccount.icon,alt:""},null,8,w)):t.twofaccount.icon==null?(e(),o("img",{key:1,role:"presentation",src:c(a).config.subdirectory+"/storage/noicon.svg",alt:""},null,8,k)):m("",!0)])]),s("div",y,[s("p",{class:f(["title is-5",i=="dark"?"has-text-grey-lighter":"has-text-black"])},n(t.twofaccount.service),3),s("p",b,n(t.twofaccount.account),1)])]),_:1})]))}};export{j as _}; diff --git a/public/build/assets/Users-DyNCDMUg.js b/public/build/assets/Users-DyNCDMUg.js new file mode 100644 index 0000000..4a73ec8 --- /dev/null +++ b/public/build/assets/Users-DyNCDMUg.js @@ -0,0 +1 @@ +import{C as E,a8 as R,o as T,a1 as I,af as M,d as C,w as u,M as O,e as b,f as p,h as c,i as r,j as i,a4 as $,m as s,t as m,p as L,X as W,D,n as g,l as v,F as Z,E as H,k as x,ak as P,B,$ as X}from"./app-dvJP63FL.js";import{t as q}from"./tabs-BVx9tg1F.js";import{U as G}from"./index-BJsmINgd.js";import{C as J}from"./circle-plus-BM92Iipr.js";import"./createLucideIcon-DsaEAGzP.js";const K={class:"title is-4"},Q={class:"is-size-7-mobile"},Y={class:"mb-6 mt-3"},ee={class:"columns"},te={class:"column pb-0"},se={class:"level has-text-centered is-mobile mb-0"},ae={class:"level-item"},oe={id:"groupChips",class:"tags"},ne={key:0},ie={class:"has-ellipsis"},re={class:"is-block has-ellipsis is-family-primary is-size-6 is-size-7-mobile has-text-grey"},le={class:"tags mt-2"},de={class:"ml-3"},ue={key:2,class:"mt-4 pl-3"},ke={__name:"Users",setup(ce){const z=E(),F=O("2fauth"),S=X(),U=R(F.prefix+"returnTo","accounts"),y=b([]),a=b(""),_=b(!1),w=B(()=>y.value.filter(e=>{let t=e.name.toLowerCase().includes(h.value.keywords)||e.email.toLowerCase().includes(h.value.keywords);return h.value.admin!=null&&(t=t&&e.is_admin==h.value.admin),h.value.oauth!=null&&(t=t&&e.oauth_provider==h.value.oauth),t})),h=B(()=>{const e={admin:void 0,oauth:void 0,keywords:a.value.toLowerCase()},t=a.value.toLowerCase().split(" "),l=/admin:([01])/,k=/oauth:([a-zA-Z0-9])/;return t.forEach(d=>{d.match(l)&&(e.admin=parseInt(d.replace(l,"$1")),e.keywords=e.keywords.replace(d,"").trim()),d.match(k)&&(e.oauth=d.replace(k,"$1"),e.keywords=e.keywords.replace(d,"").trim())}),e});T(()=>{A()});function f(e){const t=/admin:([01])/,l=/oauth:([a-zA-Z0-9]*)/;a.value.match(t)&&e.match(t)?a.value=a.value.replace(t,e):h.value.oauth!=null&&e.match(l)?a.value=a.value.replace(l,e):a.value=a.value?a.value+" "+e:e}function A(){_.value=!0,I.getAll({returnError:!0}).then(e=>{y.value=e.data}).catch(e=>{z.show(e)}).finally(()=>{_.value=!1})}return M(e=>{e.name.startsWith("admin.")||S.clear()}),(e,t)=>{const l=p("RouterLink"),k=p("Spinner"),d=p("FormWrapper"),N=p("NavigationButton"),V=p("VueFooter"),j=p("StackLayout");return c(),C(j,null,{header:u(()=>[r(i(P),{tabs:i(q),"active-tab":"admin.users",onTabSelected:t[0]||(t[0]=o=>("router"in e?e.router:i($)).push({name:o}))},null,8,["tabs"])]),content:u(()=>[r(d,null,{default:u(()=>[r(i(G),null,{default:u(({mode:o})=>[s("h4",K,m(e.$t("heading.users")),1),s("div",Q,m(e.$t("message.admin_users_legend")),1),s("div",Y,[r(l,{class:"is-link mt-5",to:{name:"admin.createUser"}},{default:u(()=>[r(i(J)),L(" "+m(e.$t("link.create_new_user")),1)]),_:1})]),s("div",ee,[s("div",te,[r(i(W),{keyword:i(a),"onUpdate:keyword":t[1]||(t[1]=n=>D(a)?a.value=n:null),hasNoBackground:!0,placeholder:e.$t("placeholder.search_user_placeholder")},null,8,["keyword","placeholder"])])]),s("div",se,[s("div",ae,[s("div",oe,[s("button",{onClick:t[2]||(t[2]=n=>f("admin:1")),class:g(["button tag",{"has-text-grey":o=="dark","is-white has-text-grey":o!="dark"}])}," admin ",2),s("button",{onClick:t[3]||(t[3]=n=>f("oauth:github")),class:g(["button tag",{"has-text-grey":o=="dark","is-white has-text-grey":o!="dark"}])}," github ",2),s("button",{onClick:t[4]||(t[4]=n=>f("oauth:openid")),class:g(["button tag",{"has-text-grey":o=="dark","is-white has-text-grey":o!="dark"}])}," openId ",2)])])]),i(w).length>0?(c(),v("div",ne,[(c(!0),v(Z,null,H(i(w),n=>(c(),v("div",{key:n.id,class:"list-item is-size-5 is-size-6-mobile is-flex is-justify-content-space-between"},[s("div",ie,[s("span",null,m(n.name),1),s("span",re,m(n.email),1),s("div",le,[n.is_admin?(c(),v("span",{key:0,class:g(["tag is-rounded",o=="dark"?"has-text-warning-40 has-background-black-bis":"has-text-warning-35 has-background-grey-lighter"])},"admin",2)):x("",!0),n.oauth_provider?(c(),v("span",{key:1,class:g(["tag is-rounded has-text-grey",o=="dark"?"has-background-black-bis":"has-background-grey-lighter"])},"oauth: "+m(n.oauth_provider),3)):x("",!0)])]),s("div",de,[r(l,{to:{name:"admin.manageUser",params:{userId:n.id}},class:g(["button is-small has-normal-radius",{"is-dark":o=="dark"}]),title:e.$t("tooltip.manage")},{default:u(()=>[L(m(e.$t("link.manage")),1)]),_:1},8,["to","class","title"])])]))),128))])):i(_)?(c(),C(k,{key:1,isVisible:!0,type:"list-loading"})):(c(),v("div",ue,m(e.$t("message.no_result")),1))]),_:1})]),_:1})]),footer:u(()=>[r(V,null,{default:u(()=>[r(N,{action:"close",onClosed:t[5]||(t[5]=o=>("router"in e?e.router:i($)).push({name:i(U)})),"current-page-title":e.$t("title.admin.users")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{ke as default}; diff --git a/public/build/assets/WebAuthn-C_HU0Xj8.js b/public/build/assets/WebAuthn-C_HU0Xj8.js new file mode 100644 index 0000000..cdbc6a2 --- /dev/null +++ b/public/build/assets/WebAuthn-C_HU0Xj8.js @@ -0,0 +1 @@ +import{C as M,u as P,a as j,P as K,a8 as W,o as R,v as q,a1 as y,af as H,d as I,w as d,M as J,e as F,f as p,g as G,h,i as l,j as t,l as _,t as s,k,m as n,q as Q,p as V,F as X,E as Y,n as Z,ak as ee,B as te,$ as se}from"./app-dvJP63FL.js";import{t as ne}from"./tabs-Btun2NN0.js";import{w as ae}from"./webauthnService-D363et0U.js";import{U as ie}from"./index-BJsmINgd.js";import{C as oe}from"./circle-plus-BM92Iipr.js";import"./createLucideIcon-DsaEAGzP.js";const le={key:0,class:"notification is-warning has-text-centered"},re={key:1,class:"notification is-warning has-text-centered"},ue={class:"title is-4"},ce={class:"is-size-7-mobile"},de={class:"mt-3"},pe={key:2,class:"field"},he=["onClick","title"],_e={class:"mt-2 is-size-7 is-pulled-right"},me={class:"title is-4 pt-6"},fe={class:"field"},ge={class:"help"},ve={class:"help mt-3"},Fe={__name:"WebAuthn",setup(be){const w=M(),{t:r}=P(),$=J("2fauth"),i=j(),C=K(),u=se(),f=G(),x=W($.prefix+"returnTo","accounts"),N=W($.prefix+"activeLoginForm","legacy"),o=F([]),g=F(!1),m=te(()=>C.enableSso&&C.useSsoOnly||i.authenticated_by_proxy);R(()=>{L()}),q(()=>i.preferences.useWebauthnOnly,()=>{y.updatePreference("useWebauthnOnly",i.preferences.useWebauthnOnly).then(e=>{u.success({text:r("notification.setting_saved")})})});function S(){if(m.value==!0)return u.warn({text:r("error.unsupported_with_reverseproxy")}),!1;ae.register().then(e=>{f.push({name:"settings.webauthn.editCredential",params:{credentialId:JSON.parse(e.config.data).id}})}).catch(e=>{"webauthn"in e?e.name=="is-warning"?u.warn({text:r(e.message)}):u.alert({text:r(e.message)}):e.response?.status===422?u.alert({text:e.response.data.message}):w.show(e)})}function O(e){confirm(r("confirmation.revoke_device"))&&y.revokeWebauthnDevice(e).then(a=>{o.value=o.value.filter(v=>v.id!==e),o.value.length==0&&(i.preferences.useWebauthnOnly=!1),u.success({text:r("notification.device_revoked")})})}function B(e){return e.alias?e.alias:r("label.my_device")+" (#"+e.id.substring(0,10)+")"}function L(){g.value=!0,y.getWebauthnDevices({returnError:!0}).then(e=>{o.value=e.data}).catch(e=>{e.response.status===403||w.show(e)}).finally(()=>{g.value=!1})}async function D(){N.value="webauthn"}return H(e=>{e.name.startsWith("settings.")||u.clear()}),(e,a)=>{const v=p("Spinner"),z=p("FormCheckbox"),A=p("FormWrapper"),T=p("NavigationButton"),U=p("VueFooter"),E=p("StackLayout");return h(),I(E,null,{header:d(()=>[l(t(ee),{tabs:t(ne),"active-tab":"settings.webauthn.devices",onTabSelected:a[0]||(a[0]=c=>t(f).push({name:c}))},null,8,["tabs"])]),content:d(()=>[l(A,null,{default:d(()=>[t(m)&&t(i).oauth_provider?(h(),_("div",le,s(e.$t("message.sso_only_x_settings_are_disabled",{auth_method:"WebAuthn"})),1)):k("",!0),t(m)&&t(i).authenticated_by_proxy?(h(),_("div",re,s(e.$t("message.auth_handled_by_proxy")+" "+e.$t("message.manage_auth_at_proxy_level")),1)):k("",!0),n("h4",ue,s(e.$t("heading.security_devices")),1),n("div",ce,s(e.$t("message.security_devices_legend")),1),n("div",de,[n("a",{tabindex:"0",class:"is-link",onClick:S,onKeyup:Q(S,["enter"])},[l(t(oe)),V(" "+s(e.$t("link.register_a_new_device")),1)],32)]),t(o).length>0?(h(),_("div",pe,[l(t(ie),null,{default:d(({mode:c})=>[(h(!0),_(X,null,Y(t(o),b=>(h(),_("div",{key:b.id,class:"group-item is-size-5 is-size-6-mobile"},[V(s(B(b))+" ",1),n("button",{type:"button",class:Z(["button tag is-pulled-right",c==="dark"?"is-dark":"is-white"]),onClick:ye=>O(b.id),title:e.$t("tooltip.revoke")},s(e.$t("label.revoke")),11,he)]))),128))]),_:1}),n("div",_e,s(e.$t("message.revoking_a_device_is_permanent")),1)])):k("",!0),l(v,{isVisible:t(g)&&t(o).length===0,type:"list-loading"},null,8,["isVisible"]),n("h4",me,s(e.$t("heading.options")),1),n("div",fe,s(e.$t("message.need_a_security_device_to_enable_options")),1),n("form",null,[l(z,{modelValue:t(i).preferences.useWebauthnOnly,"onUpdate:modelValue":[a[1]||(a[1]=c=>t(i).preferences.useWebauthnOnly=c),a[2]||(a[2]=c=>D())],fieldName:"useWebauthnOnly",label:"field.use_webauthn_only",help:"field.use_webauthn_only.help",isDisabled:t(m)||t(o).length===0},null,8,["modelValue","isDisabled"]),n("p",ge,s(e.$t("field.use_webauthn_only.help_bis")),1),n("p",ve,s(e.$t("field.use_webauthn_only.help_ter")),1)])]),_:1})]),footer:d(()=>[l(U,null,{default:d(()=>[l(T,{action:"close",onClosed:a[3]||(a[3]=c=>t(f).push({name:t(x)})),"current-page-title":e.$t("title.settings.webauthn.devices")},null,8,["current-page-title"])]),_:1})]),_:1})}}};export{Fe as default}; diff --git a/public/build/assets/app-C6trQ8-_.css b/public/build/assets/app-C6trQ8-_.css new file mode 100644 index 0000000..3d75cd7 --- /dev/null +++ b/public/build/assets/app-C6trQ8-_.css @@ -0,0 +1 @@ +@charset "UTF-8";:root{--bulma-control-radius: var(--bulma-radius);--bulma-control-radius-small: var(--bulma-radius-small);--bulma-control-border-width: 1px;--bulma-control-height: 2.5em;--bulma-control-line-height: 1.5;--bulma-control-padding-vertical: calc(.5em - 1px) ;--bulma-control-padding-horizontal: calc(.75em - 1px) ;--bulma-control-size: var(--bulma-size-normal);--bulma-control-focus-shadow-l: 50%}:root{--bulma-scheme-h: 221;--bulma-scheme-s: 14%;--bulma-light-l: 90%;--bulma-light-invert-l: 20%;--bulma-dark-l: 20%;--bulma-dark-invert-l: 90%;--bulma-soft-l: 90%;--bulma-bold-l: 20%;--bulma-soft-invert-l: 20%;--bulma-bold-invert-l: 90%;--bulma-hover-background-l-delta: -5%;--bulma-active-background-l-delta: -10%;--bulma-hover-border-l-delta: -10%;--bulma-active-border-l-delta: -20%;--bulma-hover-color-l-delta: -5%;--bulma-active-color-l-delta: -10%;--bulma-hover-shadow-a-delta: -.05;--bulma-active-shadow-a-delta: -.1;--bulma-scheme-brightness: light;--bulma-scheme-main-l: 100%;--bulma-scheme-main-bis-l: 98%;--bulma-scheme-main-ter-l: 96%;--bulma-background-l: 96%;--bulma-border-weak-l: 93%;--bulma-border-l: 86%;--bulma-text-weak-l: 48%;--bulma-text-strong-l: 21%;--bulma-text-title-l: 14%;--bulma-scheme-invert-ter-l: 14%;--bulma-scheme-invert-bis-l: 7%;--bulma-scheme-invert-l: 4%;--bulma-family-primary: Inter, SF Pro, Segoe UI, Roboto, Oxygen, Ubuntu, Helvetica Neue, Helvetica, Arial, sans-serif;--bulma-family-secondary: Inter, SF Pro, Segoe UI, Roboto, Oxygen, Ubuntu, Helvetica Neue, Helvetica, Arial, sans-serif;--bulma-family-code: Inconsolata, Hack, SF Mono, Roboto Mono, Source Code Pro, Ubuntu Mono, monospace;--bulma-size-small: .75rem;--bulma-size-normal: 1rem;--bulma-size-medium: 1.25rem;--bulma-size-large: 1.5rem;--bulma-weight-light: 300;--bulma-weight-normal: 400;--bulma-weight-medium: 500;--bulma-weight-semibold: 600;--bulma-weight-bold: 700;--bulma-weight-extrabold: 800;--bulma-block-spacing: 1.5rem;--bulma-duration: 50ms;--bulma-easing: ease-out;--bulma-radius-small: .25rem;--bulma-radius: .375rem;--bulma-radius-medium: .5em;--bulma-radius-large: .75rem;--bulma-radius-rounded: 9999px;--bulma-speed: 86ms;--bulma-arrow-color: var(--bulma-link);--bulma-loading-color: var(--bulma-border);--bulma-burger-h: var(--bulma-link-h);--bulma-burger-s: var(--bulma-link-s);--bulma-burger-l: var(--bulma-link-l);--bulma-burger-border-radius: .5em;--bulma-burger-gap: 5px;--bulma-burger-item-height: 2px;--bulma-burger-item-width: 20px;--bulma-white: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-l), 1);--bulma-white-base: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-l), 1);--bulma-white-rgb: 255, 255, 255;--bulma-white-h: 0deg;--bulma-white-s: 0%;--bulma-white-l: 100%;--bulma-white-invert-l: 4%;--bulma-white-invert: hsl(0, 0%, 4%);--bulma-white-on-scheme-l: 35%;--bulma-white-on-scheme: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-on-scheme-l), 1);--bulma-black: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-l), 1);--bulma-black-base: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-l), 1);--bulma-black-rgb: 10.2, 10.2, 10.2;--bulma-black-h: 0deg;--bulma-black-s: 0%;--bulma-black-l: 4%;--bulma-black-invert-l: 100%;--bulma-black-invert: hsl(0, 0%, 100%);--bulma-black-on-scheme-l: 4%;--bulma-black-on-scheme: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-on-scheme-l), 1);--bulma-light: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-l), 1);--bulma-light-base: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-l), 1);--bulma-light-rgb: 244.8, 244.8, 244.8;--bulma-light-h: 0deg;--bulma-light-s: 0%;--bulma-light-l: 96%;--bulma-light-invert-l: 21%;--bulma-light-invert: hsl(0, 0%, 21%);--bulma-light-on-scheme-l: 36%;--bulma-light-on-scheme: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-on-scheme-l), 1);--bulma-dark: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-l), 1);--bulma-dark-base: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-l), 1);--bulma-dark-rgb: 53.55, 53.55, 53.55;--bulma-dark-h: 0deg;--bulma-dark-s: 0%;--bulma-dark-l: 21%;--bulma-dark-invert-l: 96%;--bulma-dark-invert: hsl(0, 0%, 96%);--bulma-dark-on-scheme-l: 21%;--bulma-dark-on-scheme: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-on-scheme-l), 1);--bulma-text: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l), 1);--bulma-text-base: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l), 1);--bulma-text-rgb: 73.95, 73.95, 73.95;--bulma-text-h: 0deg;--bulma-text-s: 0%;--bulma-text-l: 29%;--bulma-text-00-l: 0%;--bulma-text-05-l: 4%;--bulma-text-10-l: 9%;--bulma-text-15-l: 14%;--bulma-text-20-l: 19%;--bulma-text-25-l: 24%;--bulma-text-30-l: 29%;--bulma-text-35-l: 34%;--bulma-text-40-l: 39%;--bulma-text-45-l: 44%;--bulma-text-50-l: 49%;--bulma-text-55-l: 54%;--bulma-text-60-l: 59%;--bulma-text-65-l: 64%;--bulma-text-70-l: 69%;--bulma-text-75-l: 74%;--bulma-text-80-l: 79%;--bulma-text-85-l: 84%;--bulma-text-90-l: 89%;--bulma-text-95-l: 94%;--bulma-text-100-l: 99%;--bulma-text-00: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-00-l), 1);--bulma-text-00-invert-l: var(--bulma-text-55-l);--bulma-text-00-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-00-invert-l), 1);--bulma-text-05: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-05-l), 1);--bulma-text-05-invert-l: var(--bulma-text-60-l);--bulma-text-05-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-05-invert-l), 1);--bulma-text-10: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-10-l), 1);--bulma-text-10-invert-l: var(--bulma-text-65-l);--bulma-text-10-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-10-invert-l), 1);--bulma-text-15: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-15-l), 1);--bulma-text-15-invert-l: var(--bulma-text-75-l);--bulma-text-15-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-15-invert-l), 1);--bulma-text-20: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-20-l), 1);--bulma-text-20-invert-l: var(--bulma-text-85-l);--bulma-text-20-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-20-invert-l), 1);--bulma-text-25: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-25-l), 1);--bulma-text-25-invert-l: var(--bulma-text-95-l);--bulma-text-25-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-25-invert-l), 1);--bulma-text-30: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-30-l), 1);--bulma-text-30-invert-l: var(--bulma-text-100-l);--bulma-text-30-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-30-invert-l), 1);--bulma-text-35: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-35-l), 1);--bulma-text-35-invert-l: var(--bulma-text-100-l);--bulma-text-35-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-35-invert-l), 1);--bulma-text-40: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-40-l), 1);--bulma-text-40-invert-l: var(--bulma-text-100-l);--bulma-text-40-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-40-invert-l), 1);--bulma-text-45: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-45-l), 1);--bulma-text-45-invert-l: var(--bulma-text-100-l);--bulma-text-45-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-45-invert-l), 1);--bulma-text-50: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-50-l), 1);--bulma-text-50-invert-l: var(--bulma-text-100-l);--bulma-text-50-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-50-invert-l), 1);--bulma-text-55: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-55-l), 1);--bulma-text-55-invert-l: var(--bulma-text-00-l);--bulma-text-55-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-55-invert-l), 1);--bulma-text-60: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-60-l), 1);--bulma-text-60-invert-l: var(--bulma-text-05-l);--bulma-text-60-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-60-invert-l), 1);--bulma-text-65: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-65-l), 1);--bulma-text-65-invert-l: var(--bulma-text-10-l);--bulma-text-65-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-65-invert-l), 1);--bulma-text-70: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-70-l), 1);--bulma-text-70-invert-l: var(--bulma-text-10-l);--bulma-text-70-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-70-invert-l), 1);--bulma-text-75: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-75-l), 1);--bulma-text-75-invert-l: var(--bulma-text-15-l);--bulma-text-75-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-75-invert-l), 1);--bulma-text-80: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-80-l), 1);--bulma-text-80-invert-l: var(--bulma-text-15-l);--bulma-text-80-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-80-invert-l), 1);--bulma-text-85: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-85-l), 1);--bulma-text-85-invert-l: var(--bulma-text-20-l);--bulma-text-85-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-85-invert-l), 1);--bulma-text-90: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-90-l), 1);--bulma-text-90-invert-l: var(--bulma-text-20-l);--bulma-text-90-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-90-invert-l), 1);--bulma-text-95: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-95-l), 1);--bulma-text-95-invert-l: var(--bulma-text-25-l);--bulma-text-95-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-95-invert-l), 1);--bulma-text-100: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-100-l), 1);--bulma-text-100-invert-l: var(--bulma-text-25-l);--bulma-text-100-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-100-invert-l), 1);--bulma-text-invert-l: var(--bulma-text-100-l);--bulma-text-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-invert-l), 1);--bulma-text-light-l: var(--bulma-text-90-l);--bulma-text-light: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-light-l), 1);--bulma-text-light-invert-l: var(--bulma-text-20-l);--bulma-text-light-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-light-invert-l), 1);--bulma-text-dark-l: var(--bulma-text-10-l);--bulma-text-dark: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-dark-l), 1);--bulma-text-dark-invert-l: var(--bulma-text-65-l);--bulma-text-dark-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-dark-invert-l), 1);--bulma-text-soft: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-soft-l), 1);--bulma-text-bold: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-bold-l), 1);--bulma-text-soft-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-soft-invert-l), 1);--bulma-text-bold-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-bold-invert-l), 1);--bulma-text-on-scheme-l: 29%;--bulma-text-on-scheme: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-on-scheme-l), 1);--bulma-primary: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);--bulma-primary-base: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);--bulma-primary-rgb: 0, 209.1, 177.735;--bulma-primary-h: 171deg;--bulma-primary-s: 100%;--bulma-primary-l: 41%;--bulma-primary-00-l: 1%;--bulma-primary-05-l: 6%;--bulma-primary-10-l: 11%;--bulma-primary-15-l: 16%;--bulma-primary-20-l: 21%;--bulma-primary-25-l: 26%;--bulma-primary-30-l: 31%;--bulma-primary-35-l: 36%;--bulma-primary-40-l: 41%;--bulma-primary-45-l: 46%;--bulma-primary-50-l: 51%;--bulma-primary-55-l: 56%;--bulma-primary-60-l: 61%;--bulma-primary-65-l: 66%;--bulma-primary-70-l: 71%;--bulma-primary-75-l: 76%;--bulma-primary-80-l: 81%;--bulma-primary-85-l: 86%;--bulma-primary-90-l: 91%;--bulma-primary-95-l: 96%;--bulma-primary-100-l: 100%;--bulma-primary-00: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-00-l), 1);--bulma-primary-00-invert-l: var(--bulma-primary-30-l);--bulma-primary-00-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-00-invert-l), 1);--bulma-primary-05: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-05-l), 1);--bulma-primary-05-invert-l: var(--bulma-primary-40-l);--bulma-primary-05-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-05-invert-l), 1);--bulma-primary-10: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-10-l), 1);--bulma-primary-10-invert-l: var(--bulma-primary-50-l);--bulma-primary-10-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-10-invert-l), 1);--bulma-primary-15: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-15-l), 1);--bulma-primary-15-invert-l: var(--bulma-primary-100-l);--bulma-primary-15-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-15-invert-l), 1);--bulma-primary-20: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-20-l), 1);--bulma-primary-20-invert-l: var(--bulma-primary-100-l);--bulma-primary-20-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-20-invert-l), 1);--bulma-primary-25: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-25-l), 1);--bulma-primary-25-invert-l: var(--bulma-primary-100-l);--bulma-primary-25-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-25-invert-l), 1);--bulma-primary-30: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-30-l), 1);--bulma-primary-30-invert-l: var(--bulma-primary-00-l);--bulma-primary-30-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-30-invert-l), 1);--bulma-primary-35: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-35-l), 1);--bulma-primary-35-invert-l: var(--bulma-primary-00-l);--bulma-primary-35-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-35-invert-l), 1);--bulma-primary-40: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-40-l), 1);--bulma-primary-40-invert-l: var(--bulma-primary-05-l);--bulma-primary-40-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-40-invert-l), 1);--bulma-primary-45: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-45-l), 1);--bulma-primary-45-invert-l: var(--bulma-primary-05-l);--bulma-primary-45-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-45-invert-l), 1);--bulma-primary-50: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-50-l), 1);--bulma-primary-50-invert-l: var(--bulma-primary-10-l);--bulma-primary-50-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-50-invert-l), 1);--bulma-primary-55: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-55-l), 1);--bulma-primary-55-invert-l: var(--bulma-primary-10-l);--bulma-primary-55-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-55-invert-l), 1);--bulma-primary-60: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-60-l), 1);--bulma-primary-60-invert-l: var(--bulma-primary-10-l);--bulma-primary-60-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-60-invert-l), 1);--bulma-primary-65: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-65-l), 1);--bulma-primary-65-invert-l: var(--bulma-primary-10-l);--bulma-primary-65-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-65-invert-l), 1);--bulma-primary-70: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-70-l), 1);--bulma-primary-70-invert-l: var(--bulma-primary-10-l);--bulma-primary-70-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-70-invert-l), 1);--bulma-primary-75: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-75-l), 1);--bulma-primary-75-invert-l: var(--bulma-primary-10-l);--bulma-primary-75-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-75-invert-l), 1);--bulma-primary-80: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-80-l), 1);--bulma-primary-80-invert-l: var(--bulma-primary-10-l);--bulma-primary-80-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-80-invert-l), 1);--bulma-primary-85: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-85-l), 1);--bulma-primary-85-invert-l: var(--bulma-primary-10-l);--bulma-primary-85-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-85-invert-l), 1);--bulma-primary-90: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-90-l), 1);--bulma-primary-90-invert-l: var(--bulma-primary-10-l);--bulma-primary-90-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-90-invert-l), 1);--bulma-primary-95: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-95-l), 1);--bulma-primary-95-invert-l: var(--bulma-primary-10-l);--bulma-primary-95-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-95-invert-l), 1);--bulma-primary-100: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-100-l), 1);--bulma-primary-100-invert-l: var(--bulma-primary-15-l);--bulma-primary-100-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-100-invert-l), 1);--bulma-primary-invert-l: var(--bulma-primary-05-l);--bulma-primary-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-invert-l), 1);--bulma-primary-light-l: var(--bulma-primary-90-l);--bulma-primary-light: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-light-l), 1);--bulma-primary-light-invert-l: var(--bulma-primary-10-l);--bulma-primary-light-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-light-invert-l), 1);--bulma-primary-dark-l: var(--bulma-primary-10-l);--bulma-primary-dark: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-dark-l), 1);--bulma-primary-dark-invert-l: var(--bulma-primary-50-l);--bulma-primary-dark-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-dark-invert-l), 1);--bulma-primary-soft: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-soft-l), 1);--bulma-primary-bold: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-bold-l), 1);--bulma-primary-soft-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-soft-invert-l), 1);--bulma-primary-bold-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-bold-invert-l), 1);--bulma-primary-on-scheme-l: 21%;--bulma-primary-on-scheme: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-on-scheme-l), 1);--bulma-link: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l), 1);--bulma-link-base: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l), 1);--bulma-link-rgb: 50.0565, 115.29485, 220.2435;--bulma-link-h: 217deg;--bulma-link-s: 71%;--bulma-link-l: 53%;--bulma-link-00-l: 0%;--bulma-link-05-l: 3%;--bulma-link-10-l: 8%;--bulma-link-15-l: 13%;--bulma-link-20-l: 18%;--bulma-link-25-l: 23%;--bulma-link-30-l: 28%;--bulma-link-35-l: 33%;--bulma-link-40-l: 38%;--bulma-link-45-l: 43%;--bulma-link-50-l: 48%;--bulma-link-55-l: 53%;--bulma-link-60-l: 58%;--bulma-link-65-l: 63%;--bulma-link-70-l: 68%;--bulma-link-75-l: 73%;--bulma-link-80-l: 78%;--bulma-link-85-l: 83%;--bulma-link-90-l: 88%;--bulma-link-95-l: 93%;--bulma-link-100-l: 98%;--bulma-link-00: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-00-l), 1);--bulma-link-00-invert-l: var(--bulma-link-65-l);--bulma-link-00-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-00-invert-l), 1);--bulma-link-05: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-05-l), 1);--bulma-link-05-invert-l: var(--bulma-link-65-l);--bulma-link-05-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-05-invert-l), 1);--bulma-link-10: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-10-l), 1);--bulma-link-10-invert-l: var(--bulma-link-70-l);--bulma-link-10-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-10-invert-l), 1);--bulma-link-15: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-15-l), 1);--bulma-link-15-invert-l: var(--bulma-link-75-l);--bulma-link-15-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-15-invert-l), 1);--bulma-link-20: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-20-l), 1);--bulma-link-20-invert-l: var(--bulma-link-85-l);--bulma-link-20-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-20-invert-l), 1);--bulma-link-25: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-25-l), 1);--bulma-link-25-invert-l: var(--bulma-link-90-l);--bulma-link-25-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-25-invert-l), 1);--bulma-link-30: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-30-l), 1);--bulma-link-30-invert-l: var(--bulma-link-95-l);--bulma-link-30-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-30-invert-l), 1);--bulma-link-35: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-35-l), 1);--bulma-link-35-invert-l: var(--bulma-link-100-l);--bulma-link-35-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-35-invert-l), 1);--bulma-link-40: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-40-l), 1);--bulma-link-40-invert-l: var(--bulma-link-100-l);--bulma-link-40-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-40-invert-l), 1);--bulma-link-45: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-45-l), 1);--bulma-link-45-invert-l: var(--bulma-link-100-l);--bulma-link-45-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-45-invert-l), 1);--bulma-link-50: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-50-l), 1);--bulma-link-50-invert-l: var(--bulma-link-100-l);--bulma-link-50-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-50-invert-l), 1);--bulma-link-55: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-55-l), 1);--bulma-link-55-invert-l: var(--bulma-link-100-l);--bulma-link-55-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-55-invert-l), 1);--bulma-link-60: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-60-l), 1);--bulma-link-60-invert-l: var(--bulma-link-100-l);--bulma-link-60-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-60-invert-l), 1);--bulma-link-65: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-65-l), 1);--bulma-link-65-invert-l: var(--bulma-link-05-l);--bulma-link-65-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-65-invert-l), 1);--bulma-link-70: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-70-l), 1);--bulma-link-70-invert-l: var(--bulma-link-10-l);--bulma-link-70-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-70-invert-l), 1);--bulma-link-75: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-75-l), 1);--bulma-link-75-invert-l: var(--bulma-link-15-l);--bulma-link-75-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-75-invert-l), 1);--bulma-link-80: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-80-l), 1);--bulma-link-80-invert-l: var(--bulma-link-15-l);--bulma-link-80-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-80-invert-l), 1);--bulma-link-85: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-85-l), 1);--bulma-link-85-invert-l: var(--bulma-link-20-l);--bulma-link-85-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-85-invert-l), 1);--bulma-link-90: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-90-l), 1);--bulma-link-90-invert-l: var(--bulma-link-25-l);--bulma-link-90-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-90-invert-l), 1);--bulma-link-95: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-95-l), 1);--bulma-link-95-invert-l: var(--bulma-link-30-l);--bulma-link-95-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-95-invert-l), 1);--bulma-link-100: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-100-l), 1);--bulma-link-100-invert-l: var(--bulma-link-30-l);--bulma-link-100-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-100-invert-l), 1);--bulma-link-invert-l: var(--bulma-link-100-l);--bulma-link-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-invert-l), 1);--bulma-link-light-l: var(--bulma-link-90-l);--bulma-link-light: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-light-l), 1);--bulma-link-light-invert-l: var(--bulma-link-25-l);--bulma-link-light-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-light-invert-l), 1);--bulma-link-dark-l: var(--bulma-link-10-l);--bulma-link-dark: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-dark-l), 1);--bulma-link-dark-invert-l: var(--bulma-link-70-l);--bulma-link-dark-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-dark-invert-l), 1);--bulma-link-soft: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-soft-l), 1);--bulma-link-bold: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-bold-l), 1);--bulma-link-soft-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-soft-invert-l), 1);--bulma-link-bold-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-bold-invert-l), 1);--bulma-link-on-scheme-l: 43%;--bulma-link-on-scheme: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l), 1);--bulma-info: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-l), 1);--bulma-info-base: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-l), 1);--bulma-info-rgb: 32.079, 155.7642, 238.221;--bulma-info-h: 204deg;--bulma-info-s: 86%;--bulma-info-l: 53%;--bulma-info-00-l: 0%;--bulma-info-05-l: 3%;--bulma-info-10-l: 8%;--bulma-info-15-l: 13%;--bulma-info-20-l: 18%;--bulma-info-25-l: 23%;--bulma-info-30-l: 28%;--bulma-info-35-l: 33%;--bulma-info-40-l: 38%;--bulma-info-45-l: 43%;--bulma-info-50-l: 48%;--bulma-info-55-l: 53%;--bulma-info-60-l: 58%;--bulma-info-65-l: 63%;--bulma-info-70-l: 68%;--bulma-info-75-l: 73%;--bulma-info-80-l: 78%;--bulma-info-85-l: 83%;--bulma-info-90-l: 88%;--bulma-info-95-l: 93%;--bulma-info-100-l: 98%;--bulma-info-00: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-00-l), 1);--bulma-info-00-invert-l: var(--bulma-info-50-l);--bulma-info-00-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-00-invert-l), 1);--bulma-info-05: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-05-l), 1);--bulma-info-05-invert-l: var(--bulma-info-55-l);--bulma-info-05-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-05-invert-l), 1);--bulma-info-10: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-10-l), 1);--bulma-info-10-invert-l: var(--bulma-info-65-l);--bulma-info-10-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-10-invert-l), 1);--bulma-info-15: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-15-l), 1);--bulma-info-15-invert-l: var(--bulma-info-75-l);--bulma-info-15-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-15-invert-l), 1);--bulma-info-20: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-20-l), 1);--bulma-info-20-invert-l: var(--bulma-info-85-l);--bulma-info-20-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-20-invert-l), 1);--bulma-info-25: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-25-l), 1);--bulma-info-25-invert-l: var(--bulma-info-100-l);--bulma-info-25-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-25-invert-l), 1);--bulma-info-30: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-30-l), 1);--bulma-info-30-invert-l: var(--bulma-info-100-l);--bulma-info-30-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-30-invert-l), 1);--bulma-info-35: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-35-l), 1);--bulma-info-35-invert-l: var(--bulma-info-100-l);--bulma-info-35-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-35-invert-l), 1);--bulma-info-40: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-40-l), 1);--bulma-info-40-invert-l: var(--bulma-info-100-l);--bulma-info-40-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-40-invert-l), 1);--bulma-info-45: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-45-l), 1);--bulma-info-45-invert-l: var(--bulma-info-100-l);--bulma-info-45-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-45-invert-l), 1);--bulma-info-50: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-50-l), 1);--bulma-info-50-invert-l: var(--bulma-info-00-l);--bulma-info-50-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-50-invert-l), 1);--bulma-info-55: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-55-l), 1);--bulma-info-55-invert-l: var(--bulma-info-05-l);--bulma-info-55-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-55-invert-l), 1);--bulma-info-60: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-60-l), 1);--bulma-info-60-invert-l: var(--bulma-info-05-l);--bulma-info-60-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-60-invert-l), 1);--bulma-info-65: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-65-l), 1);--bulma-info-65-invert-l: var(--bulma-info-10-l);--bulma-info-65-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-65-invert-l), 1);--bulma-info-70: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-70-l), 1);--bulma-info-70-invert-l: var(--bulma-info-10-l);--bulma-info-70-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-70-invert-l), 1);--bulma-info-75: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-75-l), 1);--bulma-info-75-invert-l: var(--bulma-info-15-l);--bulma-info-75-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-75-invert-l), 1);--bulma-info-80: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-80-l), 1);--bulma-info-80-invert-l: var(--bulma-info-15-l);--bulma-info-80-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-80-invert-l), 1);--bulma-info-85: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-85-l), 1);--bulma-info-85-invert-l: var(--bulma-info-20-l);--bulma-info-85-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-85-invert-l), 1);--bulma-info-90: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-90-l), 1);--bulma-info-90-invert-l: var(--bulma-info-20-l);--bulma-info-90-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-90-invert-l), 1);--bulma-info-95: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-95-l), 1);--bulma-info-95-invert-l: var(--bulma-info-20-l);--bulma-info-95-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-95-invert-l), 1);--bulma-info-100: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-100-l), 1);--bulma-info-100-invert-l: var(--bulma-info-25-l);--bulma-info-100-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-100-invert-l), 1);--bulma-info-invert-l: var(--bulma-info-05-l);--bulma-info-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-invert-l), 1);--bulma-info-light-l: var(--bulma-info-90-l);--bulma-info-light: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-light-l), 1);--bulma-info-light-invert-l: var(--bulma-info-20-l);--bulma-info-light-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-light-invert-l), 1);--bulma-info-dark-l: var(--bulma-info-10-l);--bulma-info-dark: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-dark-l), 1);--bulma-info-dark-invert-l: var(--bulma-info-65-l);--bulma-info-dark-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-dark-invert-l), 1);--bulma-info-soft: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-soft-l), 1);--bulma-info-bold: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-bold-l), 1);--bulma-info-soft-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-soft-invert-l), 1);--bulma-info-bold-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-bold-invert-l), 1);--bulma-info-on-scheme-l: 33%;--bulma-info-on-scheme: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-on-scheme-l), 1);--bulma-success: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-l), 1);--bulma-success-base: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-l), 1);--bulma-success-rgb: 71.6295, 198.6705, 141.50205;--bulma-success-h: 153deg;--bulma-success-s: 53%;--bulma-success-l: 53%;--bulma-success-00-l: 0%;--bulma-success-05-l: 3%;--bulma-success-10-l: 8%;--bulma-success-15-l: 13%;--bulma-success-20-l: 18%;--bulma-success-25-l: 23%;--bulma-success-30-l: 28%;--bulma-success-35-l: 33%;--bulma-success-40-l: 38%;--bulma-success-45-l: 43%;--bulma-success-50-l: 48%;--bulma-success-55-l: 53%;--bulma-success-60-l: 58%;--bulma-success-65-l: 63%;--bulma-success-70-l: 68%;--bulma-success-75-l: 73%;--bulma-success-80-l: 78%;--bulma-success-85-l: 83%;--bulma-success-90-l: 88%;--bulma-success-95-l: 93%;--bulma-success-100-l: 98%;--bulma-success-00: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-00-l), 1);--bulma-success-00-invert-l: var(--bulma-success-45-l);--bulma-success-00-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-00-invert-l), 1);--bulma-success-05: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-05-l), 1);--bulma-success-05-invert-l: var(--bulma-success-45-l);--bulma-success-05-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-05-invert-l), 1);--bulma-success-10: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-10-l), 1);--bulma-success-10-invert-l: var(--bulma-success-55-l);--bulma-success-10-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-10-invert-l), 1);--bulma-success-15: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-15-l), 1);--bulma-success-15-invert-l: var(--bulma-success-75-l);--bulma-success-15-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-15-invert-l), 1);--bulma-success-20: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-20-l), 1);--bulma-success-20-invert-l: var(--bulma-success-95-l);--bulma-success-20-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-20-invert-l), 1);--bulma-success-25: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-25-l), 1);--bulma-success-25-invert-l: var(--bulma-success-100-l);--bulma-success-25-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-25-invert-l), 1);--bulma-success-30: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-30-l), 1);--bulma-success-30-invert-l: var(--bulma-success-100-l);--bulma-success-30-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-30-invert-l), 1);--bulma-success-35: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-35-l), 1);--bulma-success-35-invert-l: var(--bulma-success-100-l);--bulma-success-35-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-35-invert-l), 1);--bulma-success-40: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-40-l), 1);--bulma-success-40-invert-l: var(--bulma-success-100-l);--bulma-success-40-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-40-invert-l), 1);--bulma-success-45: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-45-l), 1);--bulma-success-45-invert-l: var(--bulma-success-05-l);--bulma-success-45-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-45-invert-l), 1);--bulma-success-50: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-50-l), 1);--bulma-success-50-invert-l: var(--bulma-success-05-l);--bulma-success-50-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-50-invert-l), 1);--bulma-success-55: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-55-l), 1);--bulma-success-55-invert-l: var(--bulma-success-10-l);--bulma-success-55-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-55-invert-l), 1);--bulma-success-60: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-60-l), 1);--bulma-success-60-invert-l: var(--bulma-success-10-l);--bulma-success-60-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-60-invert-l), 1);--bulma-success-65: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-65-l), 1);--bulma-success-65-invert-l: var(--bulma-success-10-l);--bulma-success-65-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-65-invert-l), 1);--bulma-success-70: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-70-l), 1);--bulma-success-70-invert-l: var(--bulma-success-10-l);--bulma-success-70-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-70-invert-l), 1);--bulma-success-75: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-75-l), 1);--bulma-success-75-invert-l: var(--bulma-success-15-l);--bulma-success-75-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-75-invert-l), 1);--bulma-success-80: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-80-l), 1);--bulma-success-80-invert-l: var(--bulma-success-15-l);--bulma-success-80-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-80-invert-l), 1);--bulma-success-85: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-85-l), 1);--bulma-success-85-invert-l: var(--bulma-success-15-l);--bulma-success-85-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-85-invert-l), 1);--bulma-success-90: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-90-l), 1);--bulma-success-90-invert-l: var(--bulma-success-15-l);--bulma-success-90-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-90-invert-l), 1);--bulma-success-95: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-95-l), 1);--bulma-success-95-invert-l: var(--bulma-success-20-l);--bulma-success-95-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-95-invert-l), 1);--bulma-success-100: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-100-l), 1);--bulma-success-100-invert-l: var(--bulma-success-20-l);--bulma-success-100-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-100-invert-l), 1);--bulma-success-invert-l: var(--bulma-success-10-l);--bulma-success-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-invert-l), 1);--bulma-success-light-l: var(--bulma-success-90-l);--bulma-success-light: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-light-l), 1);--bulma-success-light-invert-l: var(--bulma-success-15-l);--bulma-success-light-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-light-invert-l), 1);--bulma-success-dark-l: var(--bulma-success-10-l);--bulma-success-dark: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-dark-l), 1);--bulma-success-dark-invert-l: var(--bulma-success-55-l);--bulma-success-dark-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-dark-invert-l), 1);--bulma-success-soft: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-soft-l), 1);--bulma-success-bold: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-bold-l), 1);--bulma-success-soft-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-soft-invert-l), 1);--bulma-success-bold-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-bold-invert-l), 1);--bulma-success-on-scheme-l: 23%;--bulma-success-on-scheme: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-on-scheme-l), 1);--bulma-warning: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-l), 1);--bulma-warning-base: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-l), 1);--bulma-warning-rgb: 255, 223.72, 137.7;--bulma-warning-h: 44deg;--bulma-warning-s: 100%;--bulma-warning-l: 77%;--bulma-warning-00-l: 2%;--bulma-warning-05-l: 7%;--bulma-warning-10-l: 12%;--bulma-warning-15-l: 17%;--bulma-warning-20-l: 22%;--bulma-warning-25-l: 27%;--bulma-warning-30-l: 32%;--bulma-warning-35-l: 37%;--bulma-warning-40-l: 42%;--bulma-warning-45-l: 47%;--bulma-warning-50-l: 52%;--bulma-warning-55-l: 57%;--bulma-warning-60-l: 62%;--bulma-warning-65-l: 67%;--bulma-warning-70-l: 72%;--bulma-warning-75-l: 77%;--bulma-warning-80-l: 82%;--bulma-warning-85-l: 87%;--bulma-warning-90-l: 92%;--bulma-warning-95-l: 97%;--bulma-warning-100-l: 100%;--bulma-warning-00: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-00-l), 1);--bulma-warning-00-invert-l: var(--bulma-warning-35-l);--bulma-warning-00-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-00-invert-l), 1);--bulma-warning-05: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-05-l), 1);--bulma-warning-05-invert-l: var(--bulma-warning-45-l);--bulma-warning-05-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-05-invert-l), 1);--bulma-warning-10: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-10-l), 1);--bulma-warning-10-invert-l: var(--bulma-warning-60-l);--bulma-warning-10-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-10-invert-l), 1);--bulma-warning-15: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-15-l), 1);--bulma-warning-15-invert-l: var(--bulma-warning-95-l);--bulma-warning-15-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-15-invert-l), 1);--bulma-warning-20: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-20-l), 1);--bulma-warning-20-invert-l: var(--bulma-warning-100-l);--bulma-warning-20-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-20-invert-l), 1);--bulma-warning-25: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-25-l), 1);--bulma-warning-25-invert-l: var(--bulma-warning-100-l);--bulma-warning-25-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-25-invert-l), 1);--bulma-warning-30: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-30-l), 1);--bulma-warning-30-invert-l: var(--bulma-warning-100-l);--bulma-warning-30-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-30-invert-l), 1);--bulma-warning-35: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-35-l), 1);--bulma-warning-35-invert-l: var(--bulma-warning-00-l);--bulma-warning-35-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-35-invert-l), 1);--bulma-warning-40: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-40-l), 1);--bulma-warning-40-invert-l: var(--bulma-warning-00-l);--bulma-warning-40-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-40-invert-l), 1);--bulma-warning-45: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-45-l), 1);--bulma-warning-45-invert-l: var(--bulma-warning-05-l);--bulma-warning-45-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-45-invert-l), 1);--bulma-warning-50: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-50-l), 1);--bulma-warning-50-invert-l: var(--bulma-warning-05-l);--bulma-warning-50-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-50-invert-l), 1);--bulma-warning-55: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-55-l), 1);--bulma-warning-55-invert-l: var(--bulma-warning-05-l);--bulma-warning-55-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-55-invert-l), 1);--bulma-warning-60: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-60-l), 1);--bulma-warning-60-invert-l: var(--bulma-warning-10-l);--bulma-warning-60-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-60-invert-l), 1);--bulma-warning-65: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-65-l), 1);--bulma-warning-65-invert-l: var(--bulma-warning-10-l);--bulma-warning-65-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-65-invert-l), 1);--bulma-warning-70: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-70-l), 1);--bulma-warning-70-invert-l: var(--bulma-warning-10-l);--bulma-warning-70-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-70-invert-l), 1);--bulma-warning-75: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-75-l), 1);--bulma-warning-75-invert-l: var(--bulma-warning-10-l);--bulma-warning-75-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-75-invert-l), 1);--bulma-warning-80: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-80-l), 1);--bulma-warning-80-invert-l: var(--bulma-warning-10-l);--bulma-warning-80-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-80-invert-l), 1);--bulma-warning-85: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-85-l), 1);--bulma-warning-85-invert-l: var(--bulma-warning-10-l);--bulma-warning-85-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-85-invert-l), 1);--bulma-warning-90: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-90-l), 1);--bulma-warning-90-invert-l: var(--bulma-warning-10-l);--bulma-warning-90-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-90-invert-l), 1);--bulma-warning-95: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-95-l), 1);--bulma-warning-95-invert-l: var(--bulma-warning-15-l);--bulma-warning-95-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-95-invert-l), 1);--bulma-warning-100: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-100-l), 1);--bulma-warning-100-invert-l: var(--bulma-warning-15-l);--bulma-warning-100-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-100-invert-l), 1);--bulma-warning-invert-l: var(--bulma-warning-10-l);--bulma-warning-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-invert-l), 1);--bulma-warning-light-l: var(--bulma-warning-90-l);--bulma-warning-light: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-light-l), 1);--bulma-warning-light-invert-l: var(--bulma-warning-10-l);--bulma-warning-light-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-light-invert-l), 1);--bulma-warning-dark-l: var(--bulma-warning-10-l);--bulma-warning-dark: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-dark-l), 1);--bulma-warning-dark-invert-l: var(--bulma-warning-60-l);--bulma-warning-dark-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-dark-invert-l), 1);--bulma-warning-soft: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-soft-l), 1);--bulma-warning-bold: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-bold-l), 1);--bulma-warning-soft-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-soft-invert-l), 1);--bulma-warning-bold-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-bold-invert-l), 1);--bulma-warning-on-scheme-l: 22%;--bulma-warning-on-scheme: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-on-scheme-l), 1);--bulma-danger: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-l), 1);--bulma-danger-base: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-l), 1);--bulma-danger-rgb: 241.077, 70.023, 104.2338;--bulma-danger-h: 348deg;--bulma-danger-s: 86%;--bulma-danger-l: 61%;--bulma-danger-00-l: 1%;--bulma-danger-05-l: 6%;--bulma-danger-10-l: 11%;--bulma-danger-15-l: 16%;--bulma-danger-20-l: 21%;--bulma-danger-25-l: 26%;--bulma-danger-30-l: 31%;--bulma-danger-35-l: 36%;--bulma-danger-40-l: 41%;--bulma-danger-45-l: 46%;--bulma-danger-50-l: 51%;--bulma-danger-55-l: 56%;--bulma-danger-60-l: 61%;--bulma-danger-65-l: 66%;--bulma-danger-70-l: 71%;--bulma-danger-75-l: 76%;--bulma-danger-80-l: 81%;--bulma-danger-85-l: 86%;--bulma-danger-90-l: 91%;--bulma-danger-95-l: 96%;--bulma-danger-100-l: 100%;--bulma-danger-00: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-00-l), 1);--bulma-danger-00-invert-l: var(--bulma-danger-65-l);--bulma-danger-00-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-00-invert-l), 1);--bulma-danger-05: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-05-l), 1);--bulma-danger-05-invert-l: var(--bulma-danger-70-l);--bulma-danger-05-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-05-invert-l), 1);--bulma-danger-10: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-10-l), 1);--bulma-danger-10-invert-l: var(--bulma-danger-75-l);--bulma-danger-10-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-10-invert-l), 1);--bulma-danger-15: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-15-l), 1);--bulma-danger-15-invert-l: var(--bulma-danger-80-l);--bulma-danger-15-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-15-invert-l), 1);--bulma-danger-20: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-20-l), 1);--bulma-danger-20-invert-l: var(--bulma-danger-85-l);--bulma-danger-20-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-20-invert-l), 1);--bulma-danger-25: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-25-l), 1);--bulma-danger-25-invert-l: var(--bulma-danger-90-l);--bulma-danger-25-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-25-invert-l), 1);--bulma-danger-30: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-30-l), 1);--bulma-danger-30-invert-l: var(--bulma-danger-100-l);--bulma-danger-30-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-30-invert-l), 1);--bulma-danger-35: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-35-l), 1);--bulma-danger-35-invert-l: var(--bulma-danger-100-l);--bulma-danger-35-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-35-invert-l), 1);--bulma-danger-40: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-40-l), 1);--bulma-danger-40-invert-l: var(--bulma-danger-100-l);--bulma-danger-40-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-40-invert-l), 1);--bulma-danger-45: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-45-l), 1);--bulma-danger-45-invert-l: var(--bulma-danger-100-l);--bulma-danger-45-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-45-invert-l), 1);--bulma-danger-50: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-50-l), 1);--bulma-danger-50-invert-l: var(--bulma-danger-100-l);--bulma-danger-50-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-50-invert-l), 1);--bulma-danger-55: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-55-l), 1);--bulma-danger-55-invert-l: var(--bulma-danger-100-l);--bulma-danger-55-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-55-invert-l), 1);--bulma-danger-60: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-60-l), 1);--bulma-danger-60-invert-l: var(--bulma-danger-100-l);--bulma-danger-60-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-60-invert-l), 1);--bulma-danger-65: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-65-l), 1);--bulma-danger-65-invert-l: var(--bulma-danger-00-l);--bulma-danger-65-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-65-invert-l), 1);--bulma-danger-70: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-70-l), 1);--bulma-danger-70-invert-l: var(--bulma-danger-05-l);--bulma-danger-70-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-70-invert-l), 1);--bulma-danger-75: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-75-l), 1);--bulma-danger-75-invert-l: var(--bulma-danger-10-l);--bulma-danger-75-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-75-invert-l), 1);--bulma-danger-80: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-80-l), 1);--bulma-danger-80-invert-l: var(--bulma-danger-15-l);--bulma-danger-80-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-80-invert-l), 1);--bulma-danger-85: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-85-l), 1);--bulma-danger-85-invert-l: var(--bulma-danger-20-l);--bulma-danger-85-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-85-invert-l), 1);--bulma-danger-90: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-90-l), 1);--bulma-danger-90-invert-l: var(--bulma-danger-25-l);--bulma-danger-90-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-90-invert-l), 1);--bulma-danger-95: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-95-l), 1);--bulma-danger-95-invert-l: var(--bulma-danger-25-l);--bulma-danger-95-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-95-invert-l), 1);--bulma-danger-100: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-100-l), 1);--bulma-danger-100-invert-l: var(--bulma-danger-30-l);--bulma-danger-100-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-100-invert-l), 1);--bulma-danger-invert-l: var(--bulma-danger-100-l);--bulma-danger-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-invert-l), 1);--bulma-danger-light-l: var(--bulma-danger-90-l);--bulma-danger-light: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-light-l), 1);--bulma-danger-light-invert-l: var(--bulma-danger-25-l);--bulma-danger-light-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-light-invert-l), 1);--bulma-danger-dark-l: var(--bulma-danger-10-l);--bulma-danger-dark: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-dark-l), 1);--bulma-danger-dark-invert-l: var(--bulma-danger-75-l);--bulma-danger-dark-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-dark-invert-l), 1);--bulma-danger-soft: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-soft-l), 1);--bulma-danger-bold: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-bold-l), 1);--bulma-danger-soft-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-soft-invert-l), 1);--bulma-danger-bold-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-bold-invert-l), 1);--bulma-danger-on-scheme-l: 41%;--bulma-danger-on-scheme: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l), 1);--bulma-black-bis: hsl(0, 0%, 7%);--bulma-black-ter: hsl(0, 0%, 14%);--bulma-grey-darker: hsl(0, 0%, 21%);--bulma-grey-dark: hsl(0, 0%, 29%);--bulma-grey: hsl(0, 0%, 48%);--bulma-grey-light: hsl(0, 0%, 71%);--bulma-grey-lighter: hsl(0, 0%, 86%);--bulma-white-ter: hsl(0, 0%, 96%);--bulma-white-bis: hsl(0, 0%, 98%);--bulma-shadow-h: 0deg;--bulma-shadow-s: 0%;--bulma-shadow-l: 4%;--bulma-size-1: 3rem;--bulma-size-2: 2.5rem;--bulma-size-3: 2rem;--bulma-size-4: 1.5rem;--bulma-size-5: 1.25rem;--bulma-size-6: 1rem;--bulma-size-7: .75rem;--bulma-scheme-main: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-l));--bulma-scheme-main-bis: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-bis-l));--bulma-scheme-main-ter: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-ter-l));--bulma-background: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-background-l));--bulma-background-hover: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-background-l) + var(--bulma-hover-background-l-delta)));--bulma-background-active: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-background-l) + var(--bulma-active-background-l-delta)));--bulma-border-weak: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-border-weak-l));--bulma-border: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-border-l));--bulma-border-hover: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-border-l) + var(--bulma-hover-border-l-delta)));--bulma-border-active: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-border-l) + var(--bulma-active-border-l-delta)));--bulma-text-weak: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-weak-l));--bulma-text: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l));--bulma-text-strong: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-strong-l));--bulma-scheme-invert-ter: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-ter-l));--bulma-scheme-invert-bis: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-bis-l));--bulma-scheme-invert: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l));--bulma-link: hsl(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l));--bulma-link-text: hsl(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l));--bulma-link-text-hover: hsl(var(--bulma-link-h), var(--bulma-link-s), calc(var(--bulma-link-on-scheme-l) + var(--bulma-hover-color-l-delta)));--bulma-link-text-active: hsl(var(--bulma-link-h), var(--bulma-link-s), calc(var(--bulma-link-on-scheme-l) + var(--bulma-active-color-l-delta)));--bulma-focus-h: var(--bulma-link-h);--bulma-focus-s: var(--bulma-link-s);--bulma-focus-l: var(--bulma-link-l);--bulma-focus-offset: 1px;--bulma-focus-style: solid;--bulma-focus-width: 2px;--bulma-focus-shadow-size: 0 0 0 .1875em;--bulma-focus-shadow-alpha: .25;--bulma-code: hsl(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l));--bulma-code-background: var(--bulma-background);--bulma-pre: var(--bulma-text);--bulma-pre-background: var(--bulma-background);--bulma-shadow: 0 .5em 1em -.125em hsla(var(--bulma-shadow-h), var(--bulma-shadow-s), var(--bulma-shadow-l), .1), 0 0px 0 1px hsla(var(--bulma-shadow-h), var(--bulma-shadow-s), var(--bulma-shadow-l), .02)}@media(prefers-color-scheme:light){:root{--bulma-scheme-h: 221;--bulma-scheme-s: 14%;--bulma-light-l: 90%;--bulma-light-invert-l: 20%;--bulma-dark-l: 20%;--bulma-dark-invert-l: 90%;--bulma-soft-l: 90%;--bulma-bold-l: 20%;--bulma-soft-invert-l: 20%;--bulma-bold-invert-l: 90%;--bulma-hover-background-l-delta: -5%;--bulma-active-background-l-delta: -10%;--bulma-hover-border-l-delta: -10%;--bulma-active-border-l-delta: -20%;--bulma-hover-color-l-delta: -5%;--bulma-active-color-l-delta: -10%;--bulma-hover-shadow-a-delta: -.05;--bulma-active-shadow-a-delta: -.1;--bulma-scheme-brightness: light;--bulma-scheme-main-l: 100%;--bulma-scheme-main-bis-l: 98%;--bulma-scheme-main-ter-l: 96%;--bulma-background-l: 96%;--bulma-border-weak-l: 93%;--bulma-border-l: 86%;--bulma-text-weak-l: 48%;--bulma-text-strong-l: 21%;--bulma-text-title-l: 14%;--bulma-scheme-invert-ter-l: 14%;--bulma-scheme-invert-bis-l: 7%;--bulma-scheme-invert-l: 4%;--bulma-family-primary: Inter, SF Pro, Segoe UI, Roboto, Oxygen, Ubuntu, Helvetica Neue, Helvetica, Arial, sans-serif;--bulma-family-secondary: Inter, SF Pro, Segoe UI, Roboto, Oxygen, Ubuntu, Helvetica Neue, Helvetica, Arial, sans-serif;--bulma-family-code: Inconsolata, Hack, SF Mono, Roboto Mono, Source Code Pro, Ubuntu Mono, monospace;--bulma-size-small: .75rem;--bulma-size-normal: 1rem;--bulma-size-medium: 1.25rem;--bulma-size-large: 1.5rem;--bulma-weight-light: 300;--bulma-weight-normal: 400;--bulma-weight-medium: 500;--bulma-weight-semibold: 600;--bulma-weight-bold: 700;--bulma-weight-extrabold: 800;--bulma-block-spacing: 1.5rem;--bulma-duration: 50ms;--bulma-easing: ease-out;--bulma-radius-small: .25rem;--bulma-radius: .375rem;--bulma-radius-medium: .5em;--bulma-radius-large: .75rem;--bulma-radius-rounded: 9999px;--bulma-speed: 86ms;--bulma-arrow-color: var(--bulma-link);--bulma-loading-color: var(--bulma-border);--bulma-burger-h: var(--bulma-link-h);--bulma-burger-s: var(--bulma-link-s);--bulma-burger-l: var(--bulma-link-l);--bulma-burger-border-radius: .5em;--bulma-burger-gap: 5px;--bulma-burger-item-height: 2px;--bulma-burger-item-width: 20px;--bulma-white: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-l), 1);--bulma-white-base: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-l), 1);--bulma-white-rgb: 255, 255, 255;--bulma-white-h: 0deg;--bulma-white-s: 0%;--bulma-white-l: 100%;--bulma-white-invert-l: 4%;--bulma-white-invert: hsl(0, 0%, 4%);--bulma-white-on-scheme-l: 35%;--bulma-white-on-scheme: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-on-scheme-l), 1);--bulma-black: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-l), 1);--bulma-black-base: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-l), 1);--bulma-black-rgb: 10.2, 10.2, 10.2;--bulma-black-h: 0deg;--bulma-black-s: 0%;--bulma-black-l: 4%;--bulma-black-invert-l: 100%;--bulma-black-invert: hsl(0, 0%, 100%);--bulma-black-on-scheme-l: 4%;--bulma-black-on-scheme: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-on-scheme-l), 1);--bulma-light: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-l), 1);--bulma-light-base: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-l), 1);--bulma-light-rgb: 244.8, 244.8, 244.8;--bulma-light-h: 0deg;--bulma-light-s: 0%;--bulma-light-l: 96%;--bulma-light-invert-l: 21%;--bulma-light-invert: hsl(0, 0%, 21%);--bulma-light-on-scheme-l: 36%;--bulma-light-on-scheme: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-on-scheme-l), 1);--bulma-dark: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-l), 1);--bulma-dark-base: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-l), 1);--bulma-dark-rgb: 53.55, 53.55, 53.55;--bulma-dark-h: 0deg;--bulma-dark-s: 0%;--bulma-dark-l: 21%;--bulma-dark-invert-l: 96%;--bulma-dark-invert: hsl(0, 0%, 96%);--bulma-dark-on-scheme-l: 21%;--bulma-dark-on-scheme: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-on-scheme-l), 1);--bulma-text: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l), 1);--bulma-text-base: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l), 1);--bulma-text-rgb: 73.95, 73.95, 73.95;--bulma-text-h: 0deg;--bulma-text-s: 0%;--bulma-text-l: 29%;--bulma-text-00-l: 0%;--bulma-text-05-l: 4%;--bulma-text-10-l: 9%;--bulma-text-15-l: 14%;--bulma-text-20-l: 19%;--bulma-text-25-l: 24%;--bulma-text-30-l: 29%;--bulma-text-35-l: 34%;--bulma-text-40-l: 39%;--bulma-text-45-l: 44%;--bulma-text-50-l: 49%;--bulma-text-55-l: 54%;--bulma-text-60-l: 59%;--bulma-text-65-l: 64%;--bulma-text-70-l: 69%;--bulma-text-75-l: 74%;--bulma-text-80-l: 79%;--bulma-text-85-l: 84%;--bulma-text-90-l: 89%;--bulma-text-95-l: 94%;--bulma-text-100-l: 99%;--bulma-text-00: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-00-l), 1);--bulma-text-00-invert-l: var(--bulma-text-55-l);--bulma-text-00-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-00-invert-l), 1);--bulma-text-05: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-05-l), 1);--bulma-text-05-invert-l: var(--bulma-text-60-l);--bulma-text-05-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-05-invert-l), 1);--bulma-text-10: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-10-l), 1);--bulma-text-10-invert-l: var(--bulma-text-65-l);--bulma-text-10-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-10-invert-l), 1);--bulma-text-15: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-15-l), 1);--bulma-text-15-invert-l: var(--bulma-text-75-l);--bulma-text-15-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-15-invert-l), 1);--bulma-text-20: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-20-l), 1);--bulma-text-20-invert-l: var(--bulma-text-85-l);--bulma-text-20-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-20-invert-l), 1);--bulma-text-25: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-25-l), 1);--bulma-text-25-invert-l: var(--bulma-text-95-l);--bulma-text-25-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-25-invert-l), 1);--bulma-text-30: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-30-l), 1);--bulma-text-30-invert-l: var(--bulma-text-100-l);--bulma-text-30-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-30-invert-l), 1);--bulma-text-35: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-35-l), 1);--bulma-text-35-invert-l: var(--bulma-text-100-l);--bulma-text-35-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-35-invert-l), 1);--bulma-text-40: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-40-l), 1);--bulma-text-40-invert-l: var(--bulma-text-100-l);--bulma-text-40-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-40-invert-l), 1);--bulma-text-45: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-45-l), 1);--bulma-text-45-invert-l: var(--bulma-text-100-l);--bulma-text-45-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-45-invert-l), 1);--bulma-text-50: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-50-l), 1);--bulma-text-50-invert-l: var(--bulma-text-100-l);--bulma-text-50-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-50-invert-l), 1);--bulma-text-55: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-55-l), 1);--bulma-text-55-invert-l: var(--bulma-text-00-l);--bulma-text-55-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-55-invert-l), 1);--bulma-text-60: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-60-l), 1);--bulma-text-60-invert-l: var(--bulma-text-05-l);--bulma-text-60-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-60-invert-l), 1);--bulma-text-65: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-65-l), 1);--bulma-text-65-invert-l: var(--bulma-text-10-l);--bulma-text-65-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-65-invert-l), 1);--bulma-text-70: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-70-l), 1);--bulma-text-70-invert-l: var(--bulma-text-10-l);--bulma-text-70-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-70-invert-l), 1);--bulma-text-75: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-75-l), 1);--bulma-text-75-invert-l: var(--bulma-text-15-l);--bulma-text-75-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-75-invert-l), 1);--bulma-text-80: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-80-l), 1);--bulma-text-80-invert-l: var(--bulma-text-15-l);--bulma-text-80-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-80-invert-l), 1);--bulma-text-85: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-85-l), 1);--bulma-text-85-invert-l: var(--bulma-text-20-l);--bulma-text-85-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-85-invert-l), 1);--bulma-text-90: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-90-l), 1);--bulma-text-90-invert-l: var(--bulma-text-20-l);--bulma-text-90-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-90-invert-l), 1);--bulma-text-95: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-95-l), 1);--bulma-text-95-invert-l: var(--bulma-text-25-l);--bulma-text-95-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-95-invert-l), 1);--bulma-text-100: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-100-l), 1);--bulma-text-100-invert-l: var(--bulma-text-25-l);--bulma-text-100-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-100-invert-l), 1);--bulma-text-invert-l: var(--bulma-text-100-l);--bulma-text-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-invert-l), 1);--bulma-text-light-l: var(--bulma-text-90-l);--bulma-text-light: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-light-l), 1);--bulma-text-light-invert-l: var(--bulma-text-20-l);--bulma-text-light-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-light-invert-l), 1);--bulma-text-dark-l: var(--bulma-text-10-l);--bulma-text-dark: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-dark-l), 1);--bulma-text-dark-invert-l: var(--bulma-text-65-l);--bulma-text-dark-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-dark-invert-l), 1);--bulma-text-soft: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-soft-l), 1);--bulma-text-bold: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-bold-l), 1);--bulma-text-soft-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-soft-invert-l), 1);--bulma-text-bold-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-bold-invert-l), 1);--bulma-text-on-scheme-l: 29%;--bulma-text-on-scheme: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-on-scheme-l), 1);--bulma-primary: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);--bulma-primary-base: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);--bulma-primary-rgb: 0, 209.1, 177.735;--bulma-primary-h: 171deg;--bulma-primary-s: 100%;--bulma-primary-l: 41%;--bulma-primary-00-l: 1%;--bulma-primary-05-l: 6%;--bulma-primary-10-l: 11%;--bulma-primary-15-l: 16%;--bulma-primary-20-l: 21%;--bulma-primary-25-l: 26%;--bulma-primary-30-l: 31%;--bulma-primary-35-l: 36%;--bulma-primary-40-l: 41%;--bulma-primary-45-l: 46%;--bulma-primary-50-l: 51%;--bulma-primary-55-l: 56%;--bulma-primary-60-l: 61%;--bulma-primary-65-l: 66%;--bulma-primary-70-l: 71%;--bulma-primary-75-l: 76%;--bulma-primary-80-l: 81%;--bulma-primary-85-l: 86%;--bulma-primary-90-l: 91%;--bulma-primary-95-l: 96%;--bulma-primary-100-l: 100%;--bulma-primary-00: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-00-l), 1);--bulma-primary-00-invert-l: var(--bulma-primary-30-l);--bulma-primary-00-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-00-invert-l), 1);--bulma-primary-05: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-05-l), 1);--bulma-primary-05-invert-l: var(--bulma-primary-40-l);--bulma-primary-05-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-05-invert-l), 1);--bulma-primary-10: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-10-l), 1);--bulma-primary-10-invert-l: var(--bulma-primary-50-l);--bulma-primary-10-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-10-invert-l), 1);--bulma-primary-15: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-15-l), 1);--bulma-primary-15-invert-l: var(--bulma-primary-100-l);--bulma-primary-15-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-15-invert-l), 1);--bulma-primary-20: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-20-l), 1);--bulma-primary-20-invert-l: var(--bulma-primary-100-l);--bulma-primary-20-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-20-invert-l), 1);--bulma-primary-25: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-25-l), 1);--bulma-primary-25-invert-l: var(--bulma-primary-100-l);--bulma-primary-25-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-25-invert-l), 1);--bulma-primary-30: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-30-l), 1);--bulma-primary-30-invert-l: var(--bulma-primary-00-l);--bulma-primary-30-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-30-invert-l), 1);--bulma-primary-35: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-35-l), 1);--bulma-primary-35-invert-l: var(--bulma-primary-00-l);--bulma-primary-35-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-35-invert-l), 1);--bulma-primary-40: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-40-l), 1);--bulma-primary-40-invert-l: var(--bulma-primary-05-l);--bulma-primary-40-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-40-invert-l), 1);--bulma-primary-45: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-45-l), 1);--bulma-primary-45-invert-l: var(--bulma-primary-05-l);--bulma-primary-45-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-45-invert-l), 1);--bulma-primary-50: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-50-l), 1);--bulma-primary-50-invert-l: var(--bulma-primary-10-l);--bulma-primary-50-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-50-invert-l), 1);--bulma-primary-55: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-55-l), 1);--bulma-primary-55-invert-l: var(--bulma-primary-10-l);--bulma-primary-55-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-55-invert-l), 1);--bulma-primary-60: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-60-l), 1);--bulma-primary-60-invert-l: var(--bulma-primary-10-l);--bulma-primary-60-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-60-invert-l), 1);--bulma-primary-65: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-65-l), 1);--bulma-primary-65-invert-l: var(--bulma-primary-10-l);--bulma-primary-65-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-65-invert-l), 1);--bulma-primary-70: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-70-l), 1);--bulma-primary-70-invert-l: var(--bulma-primary-10-l);--bulma-primary-70-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-70-invert-l), 1);--bulma-primary-75: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-75-l), 1);--bulma-primary-75-invert-l: var(--bulma-primary-10-l);--bulma-primary-75-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-75-invert-l), 1);--bulma-primary-80: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-80-l), 1);--bulma-primary-80-invert-l: var(--bulma-primary-10-l);--bulma-primary-80-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-80-invert-l), 1);--bulma-primary-85: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-85-l), 1);--bulma-primary-85-invert-l: var(--bulma-primary-10-l);--bulma-primary-85-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-85-invert-l), 1);--bulma-primary-90: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-90-l), 1);--bulma-primary-90-invert-l: var(--bulma-primary-10-l);--bulma-primary-90-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-90-invert-l), 1);--bulma-primary-95: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-95-l), 1);--bulma-primary-95-invert-l: var(--bulma-primary-10-l);--bulma-primary-95-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-95-invert-l), 1);--bulma-primary-100: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-100-l), 1);--bulma-primary-100-invert-l: var(--bulma-primary-15-l);--bulma-primary-100-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-100-invert-l), 1);--bulma-primary-invert-l: var(--bulma-primary-05-l);--bulma-primary-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-invert-l), 1);--bulma-primary-light-l: var(--bulma-primary-90-l);--bulma-primary-light: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-light-l), 1);--bulma-primary-light-invert-l: var(--bulma-primary-10-l);--bulma-primary-light-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-light-invert-l), 1);--bulma-primary-dark-l: var(--bulma-primary-10-l);--bulma-primary-dark: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-dark-l), 1);--bulma-primary-dark-invert-l: var(--bulma-primary-50-l);--bulma-primary-dark-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-dark-invert-l), 1);--bulma-primary-soft: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-soft-l), 1);--bulma-primary-bold: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-bold-l), 1);--bulma-primary-soft-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-soft-invert-l), 1);--bulma-primary-bold-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-bold-invert-l), 1);--bulma-primary-on-scheme-l: 21%;--bulma-primary-on-scheme: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-on-scheme-l), 1);--bulma-link: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l), 1);--bulma-link-base: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l), 1);--bulma-link-rgb: 50.0565, 115.29485, 220.2435;--bulma-link-h: 217deg;--bulma-link-s: 71%;--bulma-link-l: 53%;--bulma-link-00-l: 0%;--bulma-link-05-l: 3%;--bulma-link-10-l: 8%;--bulma-link-15-l: 13%;--bulma-link-20-l: 18%;--bulma-link-25-l: 23%;--bulma-link-30-l: 28%;--bulma-link-35-l: 33%;--bulma-link-40-l: 38%;--bulma-link-45-l: 43%;--bulma-link-50-l: 48%;--bulma-link-55-l: 53%;--bulma-link-60-l: 58%;--bulma-link-65-l: 63%;--bulma-link-70-l: 68%;--bulma-link-75-l: 73%;--bulma-link-80-l: 78%;--bulma-link-85-l: 83%;--bulma-link-90-l: 88%;--bulma-link-95-l: 93%;--bulma-link-100-l: 98%;--bulma-link-00: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-00-l), 1);--bulma-link-00-invert-l: var(--bulma-link-65-l);--bulma-link-00-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-00-invert-l), 1);--bulma-link-05: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-05-l), 1);--bulma-link-05-invert-l: var(--bulma-link-65-l);--bulma-link-05-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-05-invert-l), 1);--bulma-link-10: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-10-l), 1);--bulma-link-10-invert-l: var(--bulma-link-70-l);--bulma-link-10-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-10-invert-l), 1);--bulma-link-15: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-15-l), 1);--bulma-link-15-invert-l: var(--bulma-link-75-l);--bulma-link-15-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-15-invert-l), 1);--bulma-link-20: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-20-l), 1);--bulma-link-20-invert-l: var(--bulma-link-85-l);--bulma-link-20-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-20-invert-l), 1);--bulma-link-25: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-25-l), 1);--bulma-link-25-invert-l: var(--bulma-link-90-l);--bulma-link-25-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-25-invert-l), 1);--bulma-link-30: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-30-l), 1);--bulma-link-30-invert-l: var(--bulma-link-95-l);--bulma-link-30-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-30-invert-l), 1);--bulma-link-35: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-35-l), 1);--bulma-link-35-invert-l: var(--bulma-link-100-l);--bulma-link-35-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-35-invert-l), 1);--bulma-link-40: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-40-l), 1);--bulma-link-40-invert-l: var(--bulma-link-100-l);--bulma-link-40-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-40-invert-l), 1);--bulma-link-45: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-45-l), 1);--bulma-link-45-invert-l: var(--bulma-link-100-l);--bulma-link-45-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-45-invert-l), 1);--bulma-link-50: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-50-l), 1);--bulma-link-50-invert-l: var(--bulma-link-100-l);--bulma-link-50-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-50-invert-l), 1);--bulma-link-55: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-55-l), 1);--bulma-link-55-invert-l: var(--bulma-link-100-l);--bulma-link-55-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-55-invert-l), 1);--bulma-link-60: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-60-l), 1);--bulma-link-60-invert-l: var(--bulma-link-100-l);--bulma-link-60-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-60-invert-l), 1);--bulma-link-65: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-65-l), 1);--bulma-link-65-invert-l: var(--bulma-link-05-l);--bulma-link-65-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-65-invert-l), 1);--bulma-link-70: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-70-l), 1);--bulma-link-70-invert-l: var(--bulma-link-10-l);--bulma-link-70-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-70-invert-l), 1);--bulma-link-75: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-75-l), 1);--bulma-link-75-invert-l: var(--bulma-link-15-l);--bulma-link-75-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-75-invert-l), 1);--bulma-link-80: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-80-l), 1);--bulma-link-80-invert-l: var(--bulma-link-15-l);--bulma-link-80-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-80-invert-l), 1);--bulma-link-85: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-85-l), 1);--bulma-link-85-invert-l: var(--bulma-link-20-l);--bulma-link-85-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-85-invert-l), 1);--bulma-link-90: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-90-l), 1);--bulma-link-90-invert-l: var(--bulma-link-25-l);--bulma-link-90-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-90-invert-l), 1);--bulma-link-95: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-95-l), 1);--bulma-link-95-invert-l: var(--bulma-link-30-l);--bulma-link-95-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-95-invert-l), 1);--bulma-link-100: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-100-l), 1);--bulma-link-100-invert-l: var(--bulma-link-30-l);--bulma-link-100-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-100-invert-l), 1);--bulma-link-invert-l: var(--bulma-link-100-l);--bulma-link-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-invert-l), 1);--bulma-link-light-l: var(--bulma-link-90-l);--bulma-link-light: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-light-l), 1);--bulma-link-light-invert-l: var(--bulma-link-25-l);--bulma-link-light-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-light-invert-l), 1);--bulma-link-dark-l: var(--bulma-link-10-l);--bulma-link-dark: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-dark-l), 1);--bulma-link-dark-invert-l: var(--bulma-link-70-l);--bulma-link-dark-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-dark-invert-l), 1);--bulma-link-soft: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-soft-l), 1);--bulma-link-bold: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-bold-l), 1);--bulma-link-soft-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-soft-invert-l), 1);--bulma-link-bold-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-bold-invert-l), 1);--bulma-link-on-scheme-l: 43%;--bulma-link-on-scheme: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l), 1);--bulma-info: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-l), 1);--bulma-info-base: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-l), 1);--bulma-info-rgb: 32.079, 155.7642, 238.221;--bulma-info-h: 204deg;--bulma-info-s: 86%;--bulma-info-l: 53%;--bulma-info-00-l: 0%;--bulma-info-05-l: 3%;--bulma-info-10-l: 8%;--bulma-info-15-l: 13%;--bulma-info-20-l: 18%;--bulma-info-25-l: 23%;--bulma-info-30-l: 28%;--bulma-info-35-l: 33%;--bulma-info-40-l: 38%;--bulma-info-45-l: 43%;--bulma-info-50-l: 48%;--bulma-info-55-l: 53%;--bulma-info-60-l: 58%;--bulma-info-65-l: 63%;--bulma-info-70-l: 68%;--bulma-info-75-l: 73%;--bulma-info-80-l: 78%;--bulma-info-85-l: 83%;--bulma-info-90-l: 88%;--bulma-info-95-l: 93%;--bulma-info-100-l: 98%;--bulma-info-00: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-00-l), 1);--bulma-info-00-invert-l: var(--bulma-info-50-l);--bulma-info-00-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-00-invert-l), 1);--bulma-info-05: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-05-l), 1);--bulma-info-05-invert-l: var(--bulma-info-55-l);--bulma-info-05-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-05-invert-l), 1);--bulma-info-10: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-10-l), 1);--bulma-info-10-invert-l: var(--bulma-info-65-l);--bulma-info-10-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-10-invert-l), 1);--bulma-info-15: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-15-l), 1);--bulma-info-15-invert-l: var(--bulma-info-75-l);--bulma-info-15-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-15-invert-l), 1);--bulma-info-20: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-20-l), 1);--bulma-info-20-invert-l: var(--bulma-info-85-l);--bulma-info-20-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-20-invert-l), 1);--bulma-info-25: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-25-l), 1);--bulma-info-25-invert-l: var(--bulma-info-100-l);--bulma-info-25-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-25-invert-l), 1);--bulma-info-30: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-30-l), 1);--bulma-info-30-invert-l: var(--bulma-info-100-l);--bulma-info-30-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-30-invert-l), 1);--bulma-info-35: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-35-l), 1);--bulma-info-35-invert-l: var(--bulma-info-100-l);--bulma-info-35-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-35-invert-l), 1);--bulma-info-40: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-40-l), 1);--bulma-info-40-invert-l: var(--bulma-info-100-l);--bulma-info-40-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-40-invert-l), 1);--bulma-info-45: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-45-l), 1);--bulma-info-45-invert-l: var(--bulma-info-100-l);--bulma-info-45-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-45-invert-l), 1);--bulma-info-50: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-50-l), 1);--bulma-info-50-invert-l: var(--bulma-info-00-l);--bulma-info-50-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-50-invert-l), 1);--bulma-info-55: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-55-l), 1);--bulma-info-55-invert-l: var(--bulma-info-05-l);--bulma-info-55-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-55-invert-l), 1);--bulma-info-60: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-60-l), 1);--bulma-info-60-invert-l: var(--bulma-info-05-l);--bulma-info-60-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-60-invert-l), 1);--bulma-info-65: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-65-l), 1);--bulma-info-65-invert-l: var(--bulma-info-10-l);--bulma-info-65-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-65-invert-l), 1);--bulma-info-70: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-70-l), 1);--bulma-info-70-invert-l: var(--bulma-info-10-l);--bulma-info-70-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-70-invert-l), 1);--bulma-info-75: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-75-l), 1);--bulma-info-75-invert-l: var(--bulma-info-15-l);--bulma-info-75-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-75-invert-l), 1);--bulma-info-80: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-80-l), 1);--bulma-info-80-invert-l: var(--bulma-info-15-l);--bulma-info-80-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-80-invert-l), 1);--bulma-info-85: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-85-l), 1);--bulma-info-85-invert-l: var(--bulma-info-20-l);--bulma-info-85-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-85-invert-l), 1);--bulma-info-90: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-90-l), 1);--bulma-info-90-invert-l: var(--bulma-info-20-l);--bulma-info-90-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-90-invert-l), 1);--bulma-info-95: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-95-l), 1);--bulma-info-95-invert-l: var(--bulma-info-20-l);--bulma-info-95-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-95-invert-l), 1);--bulma-info-100: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-100-l), 1);--bulma-info-100-invert-l: var(--bulma-info-25-l);--bulma-info-100-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-100-invert-l), 1);--bulma-info-invert-l: var(--bulma-info-05-l);--bulma-info-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-invert-l), 1);--bulma-info-light-l: var(--bulma-info-90-l);--bulma-info-light: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-light-l), 1);--bulma-info-light-invert-l: var(--bulma-info-20-l);--bulma-info-light-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-light-invert-l), 1);--bulma-info-dark-l: var(--bulma-info-10-l);--bulma-info-dark: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-dark-l), 1);--bulma-info-dark-invert-l: var(--bulma-info-65-l);--bulma-info-dark-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-dark-invert-l), 1);--bulma-info-soft: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-soft-l), 1);--bulma-info-bold: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-bold-l), 1);--bulma-info-soft-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-soft-invert-l), 1);--bulma-info-bold-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-bold-invert-l), 1);--bulma-info-on-scheme-l: 33%;--bulma-info-on-scheme: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-on-scheme-l), 1);--bulma-success: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-l), 1);--bulma-success-base: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-l), 1);--bulma-success-rgb: 71.6295, 198.6705, 141.50205;--bulma-success-h: 153deg;--bulma-success-s: 53%;--bulma-success-l: 53%;--bulma-success-00-l: 0%;--bulma-success-05-l: 3%;--bulma-success-10-l: 8%;--bulma-success-15-l: 13%;--bulma-success-20-l: 18%;--bulma-success-25-l: 23%;--bulma-success-30-l: 28%;--bulma-success-35-l: 33%;--bulma-success-40-l: 38%;--bulma-success-45-l: 43%;--bulma-success-50-l: 48%;--bulma-success-55-l: 53%;--bulma-success-60-l: 58%;--bulma-success-65-l: 63%;--bulma-success-70-l: 68%;--bulma-success-75-l: 73%;--bulma-success-80-l: 78%;--bulma-success-85-l: 83%;--bulma-success-90-l: 88%;--bulma-success-95-l: 93%;--bulma-success-100-l: 98%;--bulma-success-00: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-00-l), 1);--bulma-success-00-invert-l: var(--bulma-success-45-l);--bulma-success-00-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-00-invert-l), 1);--bulma-success-05: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-05-l), 1);--bulma-success-05-invert-l: var(--bulma-success-45-l);--bulma-success-05-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-05-invert-l), 1);--bulma-success-10: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-10-l), 1);--bulma-success-10-invert-l: var(--bulma-success-55-l);--bulma-success-10-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-10-invert-l), 1);--bulma-success-15: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-15-l), 1);--bulma-success-15-invert-l: var(--bulma-success-75-l);--bulma-success-15-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-15-invert-l), 1);--bulma-success-20: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-20-l), 1);--bulma-success-20-invert-l: var(--bulma-success-95-l);--bulma-success-20-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-20-invert-l), 1);--bulma-success-25: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-25-l), 1);--bulma-success-25-invert-l: var(--bulma-success-100-l);--bulma-success-25-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-25-invert-l), 1);--bulma-success-30: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-30-l), 1);--bulma-success-30-invert-l: var(--bulma-success-100-l);--bulma-success-30-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-30-invert-l), 1);--bulma-success-35: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-35-l), 1);--bulma-success-35-invert-l: var(--bulma-success-100-l);--bulma-success-35-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-35-invert-l), 1);--bulma-success-40: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-40-l), 1);--bulma-success-40-invert-l: var(--bulma-success-100-l);--bulma-success-40-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-40-invert-l), 1);--bulma-success-45: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-45-l), 1);--bulma-success-45-invert-l: var(--bulma-success-05-l);--bulma-success-45-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-45-invert-l), 1);--bulma-success-50: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-50-l), 1);--bulma-success-50-invert-l: var(--bulma-success-05-l);--bulma-success-50-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-50-invert-l), 1);--bulma-success-55: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-55-l), 1);--bulma-success-55-invert-l: var(--bulma-success-10-l);--bulma-success-55-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-55-invert-l), 1);--bulma-success-60: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-60-l), 1);--bulma-success-60-invert-l: var(--bulma-success-10-l);--bulma-success-60-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-60-invert-l), 1);--bulma-success-65: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-65-l), 1);--bulma-success-65-invert-l: var(--bulma-success-10-l);--bulma-success-65-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-65-invert-l), 1);--bulma-success-70: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-70-l), 1);--bulma-success-70-invert-l: var(--bulma-success-10-l);--bulma-success-70-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-70-invert-l), 1);--bulma-success-75: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-75-l), 1);--bulma-success-75-invert-l: var(--bulma-success-15-l);--bulma-success-75-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-75-invert-l), 1);--bulma-success-80: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-80-l), 1);--bulma-success-80-invert-l: var(--bulma-success-15-l);--bulma-success-80-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-80-invert-l), 1);--bulma-success-85: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-85-l), 1);--bulma-success-85-invert-l: var(--bulma-success-15-l);--bulma-success-85-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-85-invert-l), 1);--bulma-success-90: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-90-l), 1);--bulma-success-90-invert-l: var(--bulma-success-15-l);--bulma-success-90-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-90-invert-l), 1);--bulma-success-95: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-95-l), 1);--bulma-success-95-invert-l: var(--bulma-success-20-l);--bulma-success-95-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-95-invert-l), 1);--bulma-success-100: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-100-l), 1);--bulma-success-100-invert-l: var(--bulma-success-20-l);--bulma-success-100-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-100-invert-l), 1);--bulma-success-invert-l: var(--bulma-success-10-l);--bulma-success-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-invert-l), 1);--bulma-success-light-l: var(--bulma-success-90-l);--bulma-success-light: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-light-l), 1);--bulma-success-light-invert-l: var(--bulma-success-15-l);--bulma-success-light-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-light-invert-l), 1);--bulma-success-dark-l: var(--bulma-success-10-l);--bulma-success-dark: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-dark-l), 1);--bulma-success-dark-invert-l: var(--bulma-success-55-l);--bulma-success-dark-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-dark-invert-l), 1);--bulma-success-soft: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-soft-l), 1);--bulma-success-bold: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-bold-l), 1);--bulma-success-soft-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-soft-invert-l), 1);--bulma-success-bold-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-bold-invert-l), 1);--bulma-success-on-scheme-l: 23%;--bulma-success-on-scheme: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-on-scheme-l), 1);--bulma-warning: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-l), 1);--bulma-warning-base: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-l), 1);--bulma-warning-rgb: 255, 223.72, 137.7;--bulma-warning-h: 44deg;--bulma-warning-s: 100%;--bulma-warning-l: 77%;--bulma-warning-00-l: 2%;--bulma-warning-05-l: 7%;--bulma-warning-10-l: 12%;--bulma-warning-15-l: 17%;--bulma-warning-20-l: 22%;--bulma-warning-25-l: 27%;--bulma-warning-30-l: 32%;--bulma-warning-35-l: 37%;--bulma-warning-40-l: 42%;--bulma-warning-45-l: 47%;--bulma-warning-50-l: 52%;--bulma-warning-55-l: 57%;--bulma-warning-60-l: 62%;--bulma-warning-65-l: 67%;--bulma-warning-70-l: 72%;--bulma-warning-75-l: 77%;--bulma-warning-80-l: 82%;--bulma-warning-85-l: 87%;--bulma-warning-90-l: 92%;--bulma-warning-95-l: 97%;--bulma-warning-100-l: 100%;--bulma-warning-00: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-00-l), 1);--bulma-warning-00-invert-l: var(--bulma-warning-35-l);--bulma-warning-00-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-00-invert-l), 1);--bulma-warning-05: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-05-l), 1);--bulma-warning-05-invert-l: var(--bulma-warning-45-l);--bulma-warning-05-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-05-invert-l), 1);--bulma-warning-10: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-10-l), 1);--bulma-warning-10-invert-l: var(--bulma-warning-60-l);--bulma-warning-10-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-10-invert-l), 1);--bulma-warning-15: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-15-l), 1);--bulma-warning-15-invert-l: var(--bulma-warning-95-l);--bulma-warning-15-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-15-invert-l), 1);--bulma-warning-20: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-20-l), 1);--bulma-warning-20-invert-l: var(--bulma-warning-100-l);--bulma-warning-20-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-20-invert-l), 1);--bulma-warning-25: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-25-l), 1);--bulma-warning-25-invert-l: var(--bulma-warning-100-l);--bulma-warning-25-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-25-invert-l), 1);--bulma-warning-30: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-30-l), 1);--bulma-warning-30-invert-l: var(--bulma-warning-100-l);--bulma-warning-30-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-30-invert-l), 1);--bulma-warning-35: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-35-l), 1);--bulma-warning-35-invert-l: var(--bulma-warning-00-l);--bulma-warning-35-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-35-invert-l), 1);--bulma-warning-40: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-40-l), 1);--bulma-warning-40-invert-l: var(--bulma-warning-00-l);--bulma-warning-40-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-40-invert-l), 1);--bulma-warning-45: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-45-l), 1);--bulma-warning-45-invert-l: var(--bulma-warning-05-l);--bulma-warning-45-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-45-invert-l), 1);--bulma-warning-50: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-50-l), 1);--bulma-warning-50-invert-l: var(--bulma-warning-05-l);--bulma-warning-50-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-50-invert-l), 1);--bulma-warning-55: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-55-l), 1);--bulma-warning-55-invert-l: var(--bulma-warning-05-l);--bulma-warning-55-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-55-invert-l), 1);--bulma-warning-60: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-60-l), 1);--bulma-warning-60-invert-l: var(--bulma-warning-10-l);--bulma-warning-60-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-60-invert-l), 1);--bulma-warning-65: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-65-l), 1);--bulma-warning-65-invert-l: var(--bulma-warning-10-l);--bulma-warning-65-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-65-invert-l), 1);--bulma-warning-70: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-70-l), 1);--bulma-warning-70-invert-l: var(--bulma-warning-10-l);--bulma-warning-70-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-70-invert-l), 1);--bulma-warning-75: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-75-l), 1);--bulma-warning-75-invert-l: var(--bulma-warning-10-l);--bulma-warning-75-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-75-invert-l), 1);--bulma-warning-80: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-80-l), 1);--bulma-warning-80-invert-l: var(--bulma-warning-10-l);--bulma-warning-80-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-80-invert-l), 1);--bulma-warning-85: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-85-l), 1);--bulma-warning-85-invert-l: var(--bulma-warning-10-l);--bulma-warning-85-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-85-invert-l), 1);--bulma-warning-90: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-90-l), 1);--bulma-warning-90-invert-l: var(--bulma-warning-10-l);--bulma-warning-90-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-90-invert-l), 1);--bulma-warning-95: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-95-l), 1);--bulma-warning-95-invert-l: var(--bulma-warning-15-l);--bulma-warning-95-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-95-invert-l), 1);--bulma-warning-100: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-100-l), 1);--bulma-warning-100-invert-l: var(--bulma-warning-15-l);--bulma-warning-100-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-100-invert-l), 1);--bulma-warning-invert-l: var(--bulma-warning-10-l);--bulma-warning-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-invert-l), 1);--bulma-warning-light-l: var(--bulma-warning-90-l);--bulma-warning-light: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-light-l), 1);--bulma-warning-light-invert-l: var(--bulma-warning-10-l);--bulma-warning-light-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-light-invert-l), 1);--bulma-warning-dark-l: var(--bulma-warning-10-l);--bulma-warning-dark: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-dark-l), 1);--bulma-warning-dark-invert-l: var(--bulma-warning-60-l);--bulma-warning-dark-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-dark-invert-l), 1);--bulma-warning-soft: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-soft-l), 1);--bulma-warning-bold: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-bold-l), 1);--bulma-warning-soft-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-soft-invert-l), 1);--bulma-warning-bold-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-bold-invert-l), 1);--bulma-warning-on-scheme-l: 22%;--bulma-warning-on-scheme: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-on-scheme-l), 1);--bulma-danger: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-l), 1);--bulma-danger-base: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-l), 1);--bulma-danger-rgb: 241.077, 70.023, 104.2338;--bulma-danger-h: 348deg;--bulma-danger-s: 86%;--bulma-danger-l: 61%;--bulma-danger-00-l: 1%;--bulma-danger-05-l: 6%;--bulma-danger-10-l: 11%;--bulma-danger-15-l: 16%;--bulma-danger-20-l: 21%;--bulma-danger-25-l: 26%;--bulma-danger-30-l: 31%;--bulma-danger-35-l: 36%;--bulma-danger-40-l: 41%;--bulma-danger-45-l: 46%;--bulma-danger-50-l: 51%;--bulma-danger-55-l: 56%;--bulma-danger-60-l: 61%;--bulma-danger-65-l: 66%;--bulma-danger-70-l: 71%;--bulma-danger-75-l: 76%;--bulma-danger-80-l: 81%;--bulma-danger-85-l: 86%;--bulma-danger-90-l: 91%;--bulma-danger-95-l: 96%;--bulma-danger-100-l: 100%;--bulma-danger-00: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-00-l), 1);--bulma-danger-00-invert-l: var(--bulma-danger-65-l);--bulma-danger-00-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-00-invert-l), 1);--bulma-danger-05: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-05-l), 1);--bulma-danger-05-invert-l: var(--bulma-danger-70-l);--bulma-danger-05-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-05-invert-l), 1);--bulma-danger-10: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-10-l), 1);--bulma-danger-10-invert-l: var(--bulma-danger-75-l);--bulma-danger-10-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-10-invert-l), 1);--bulma-danger-15: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-15-l), 1);--bulma-danger-15-invert-l: var(--bulma-danger-80-l);--bulma-danger-15-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-15-invert-l), 1);--bulma-danger-20: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-20-l), 1);--bulma-danger-20-invert-l: var(--bulma-danger-85-l);--bulma-danger-20-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-20-invert-l), 1);--bulma-danger-25: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-25-l), 1);--bulma-danger-25-invert-l: var(--bulma-danger-90-l);--bulma-danger-25-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-25-invert-l), 1);--bulma-danger-30: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-30-l), 1);--bulma-danger-30-invert-l: var(--bulma-danger-100-l);--bulma-danger-30-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-30-invert-l), 1);--bulma-danger-35: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-35-l), 1);--bulma-danger-35-invert-l: var(--bulma-danger-100-l);--bulma-danger-35-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-35-invert-l), 1);--bulma-danger-40: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-40-l), 1);--bulma-danger-40-invert-l: var(--bulma-danger-100-l);--bulma-danger-40-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-40-invert-l), 1);--bulma-danger-45: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-45-l), 1);--bulma-danger-45-invert-l: var(--bulma-danger-100-l);--bulma-danger-45-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-45-invert-l), 1);--bulma-danger-50: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-50-l), 1);--bulma-danger-50-invert-l: var(--bulma-danger-100-l);--bulma-danger-50-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-50-invert-l), 1);--bulma-danger-55: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-55-l), 1);--bulma-danger-55-invert-l: var(--bulma-danger-100-l);--bulma-danger-55-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-55-invert-l), 1);--bulma-danger-60: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-60-l), 1);--bulma-danger-60-invert-l: var(--bulma-danger-100-l);--bulma-danger-60-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-60-invert-l), 1);--bulma-danger-65: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-65-l), 1);--bulma-danger-65-invert-l: var(--bulma-danger-00-l);--bulma-danger-65-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-65-invert-l), 1);--bulma-danger-70: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-70-l), 1);--bulma-danger-70-invert-l: var(--bulma-danger-05-l);--bulma-danger-70-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-70-invert-l), 1);--bulma-danger-75: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-75-l), 1);--bulma-danger-75-invert-l: var(--bulma-danger-10-l);--bulma-danger-75-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-75-invert-l), 1);--bulma-danger-80: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-80-l), 1);--bulma-danger-80-invert-l: var(--bulma-danger-15-l);--bulma-danger-80-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-80-invert-l), 1);--bulma-danger-85: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-85-l), 1);--bulma-danger-85-invert-l: var(--bulma-danger-20-l);--bulma-danger-85-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-85-invert-l), 1);--bulma-danger-90: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-90-l), 1);--bulma-danger-90-invert-l: var(--bulma-danger-25-l);--bulma-danger-90-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-90-invert-l), 1);--bulma-danger-95: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-95-l), 1);--bulma-danger-95-invert-l: var(--bulma-danger-25-l);--bulma-danger-95-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-95-invert-l), 1);--bulma-danger-100: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-100-l), 1);--bulma-danger-100-invert-l: var(--bulma-danger-30-l);--bulma-danger-100-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-100-invert-l), 1);--bulma-danger-invert-l: var(--bulma-danger-100-l);--bulma-danger-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-invert-l), 1);--bulma-danger-light-l: var(--bulma-danger-90-l);--bulma-danger-light: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-light-l), 1);--bulma-danger-light-invert-l: var(--bulma-danger-25-l);--bulma-danger-light-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-light-invert-l), 1);--bulma-danger-dark-l: var(--bulma-danger-10-l);--bulma-danger-dark: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-dark-l), 1);--bulma-danger-dark-invert-l: var(--bulma-danger-75-l);--bulma-danger-dark-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-dark-invert-l), 1);--bulma-danger-soft: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-soft-l), 1);--bulma-danger-bold: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-bold-l), 1);--bulma-danger-soft-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-soft-invert-l), 1);--bulma-danger-bold-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-bold-invert-l), 1);--bulma-danger-on-scheme-l: 41%;--bulma-danger-on-scheme: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l), 1);--bulma-black-bis: hsl(0, 0%, 7%);--bulma-black-ter: hsl(0, 0%, 14%);--bulma-grey-darker: hsl(0, 0%, 21%);--bulma-grey-dark: hsl(0, 0%, 29%);--bulma-grey: hsl(0, 0%, 48%);--bulma-grey-light: hsl(0, 0%, 71%);--bulma-grey-lighter: hsl(0, 0%, 86%);--bulma-white-ter: hsl(0, 0%, 96%);--bulma-white-bis: hsl(0, 0%, 98%);--bulma-shadow-h: 0deg;--bulma-shadow-s: 0%;--bulma-shadow-l: 4%;--bulma-size-1: 3rem;--bulma-size-2: 2.5rem;--bulma-size-3: 2rem;--bulma-size-4: 1.5rem;--bulma-size-5: 1.25rem;--bulma-size-6: 1rem;--bulma-size-7: .75rem}}@media(prefers-color-scheme:dark){:root{--bulma-white-on-scheme-l: 100%;--bulma-white-on-scheme: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-on-scheme-l), 1);--bulma-black-on-scheme-l: -51%;--bulma-black-on-scheme: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-on-scheme-l), 1);--bulma-light-on-scheme-l: 96%;--bulma-light-on-scheme: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-on-scheme-l), 1);--bulma-dark-on-scheme-l: 56%;--bulma-dark-on-scheme: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-on-scheme-l), 1);--bulma-text-on-scheme-l: 54%;--bulma-text-on-scheme: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-on-scheme-l), 1);--bulma-primary-on-scheme-l: 41%;--bulma-primary-on-scheme: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-on-scheme-l), 1);--bulma-link-on-scheme-l: 63%;--bulma-link-on-scheme: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l), 1);--bulma-info-on-scheme-l: 53%;--bulma-info-on-scheme: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-on-scheme-l), 1);--bulma-success-on-scheme-l: 53%;--bulma-success-on-scheme: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-on-scheme-l), 1);--bulma-warning-on-scheme-l: 77%;--bulma-warning-on-scheme: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-on-scheme-l), 1);--bulma-danger-on-scheme-l: 66%;--bulma-danger-on-scheme: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l), 1);--bulma-scheme-brightness: dark;--bulma-scheme-main-l: 9%;--bulma-scheme-main-bis-l: 11%;--bulma-scheme-main-ter-l: 13%;--bulma-soft-l: 20%;--bulma-bold-l: 90%;--bulma-soft-invert-l: 90%;--bulma-bold-invert-l: 20%;--bulma-background-l: 14%;--bulma-border-weak-l: 21%;--bulma-border-l: 24%;--bulma-text-weak-l: 53%;--bulma-text-l: 71%;--bulma-text-strong-l: 93%;--bulma-text-title-l: 100%;--bulma-hover-background-l-delta: 5%;--bulma-active-background-l-delta: 10%;--bulma-hover-border-l-delta: 10%;--bulma-active-border-l-delta: 20%;--bulma-hover-color-l-delta: 5%;--bulma-active-color-l-delta: 10%;--bulma-shadow-h: 0deg;--bulma-shadow-s: 0%;--bulma-shadow-l: 100%}}[data-theme=light],.theme-light{--bulma-scheme-h: 221;--bulma-scheme-s: 14%;--bulma-light-l: 90%;--bulma-light-invert-l: 20%;--bulma-dark-l: 20%;--bulma-dark-invert-l: 90%;--bulma-soft-l: 90%;--bulma-bold-l: 20%;--bulma-soft-invert-l: 20%;--bulma-bold-invert-l: 90%;--bulma-hover-background-l-delta: -5%;--bulma-active-background-l-delta: -10%;--bulma-hover-border-l-delta: -10%;--bulma-active-border-l-delta: -20%;--bulma-hover-color-l-delta: -5%;--bulma-active-color-l-delta: -10%;--bulma-hover-shadow-a-delta: -.05;--bulma-active-shadow-a-delta: -.1;--bulma-scheme-brightness: light;--bulma-scheme-main-l: 100%;--bulma-scheme-main-bis-l: 98%;--bulma-scheme-main-ter-l: 96%;--bulma-background-l: 96%;--bulma-border-weak-l: 93%;--bulma-border-l: 86%;--bulma-text-weak-l: 48%;--bulma-text-strong-l: 21%;--bulma-text-title-l: 14%;--bulma-scheme-invert-ter-l: 14%;--bulma-scheme-invert-bis-l: 7%;--bulma-scheme-invert-l: 4%;--bulma-family-primary: Inter, SF Pro, Segoe UI, Roboto, Oxygen, Ubuntu, Helvetica Neue, Helvetica, Arial, sans-serif;--bulma-family-secondary: Inter, SF Pro, Segoe UI, Roboto, Oxygen, Ubuntu, Helvetica Neue, Helvetica, Arial, sans-serif;--bulma-family-code: Inconsolata, Hack, SF Mono, Roboto Mono, Source Code Pro, Ubuntu Mono, monospace;--bulma-size-small: .75rem;--bulma-size-normal: 1rem;--bulma-size-medium: 1.25rem;--bulma-size-large: 1.5rem;--bulma-weight-light: 300;--bulma-weight-normal: 400;--bulma-weight-medium: 500;--bulma-weight-semibold: 600;--bulma-weight-bold: 700;--bulma-weight-extrabold: 800;--bulma-block-spacing: 1.5rem;--bulma-duration: 50ms;--bulma-easing: ease-out;--bulma-radius-small: .25rem;--bulma-radius: .375rem;--bulma-radius-medium: .5em;--bulma-radius-large: .75rem;--bulma-radius-rounded: 9999px;--bulma-speed: 86ms;--bulma-arrow-color: var(--bulma-link);--bulma-loading-color: var(--bulma-border);--bulma-burger-h: var(--bulma-link-h);--bulma-burger-s: var(--bulma-link-s);--bulma-burger-l: var(--bulma-link-l);--bulma-burger-border-radius: .5em;--bulma-burger-gap: 5px;--bulma-burger-item-height: 2px;--bulma-burger-item-width: 20px;--bulma-white: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-l), 1);--bulma-white-base: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-l), 1);--bulma-white-rgb: 255, 255, 255;--bulma-white-h: 0deg;--bulma-white-s: 0%;--bulma-white-l: 100%;--bulma-white-invert-l: 4%;--bulma-white-invert: hsl(0, 0%, 4%);--bulma-white-on-scheme-l: 35%;--bulma-white-on-scheme: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-on-scheme-l), 1);--bulma-black: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-l), 1);--bulma-black-base: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-l), 1);--bulma-black-rgb: 10.2, 10.2, 10.2;--bulma-black-h: 0deg;--bulma-black-s: 0%;--bulma-black-l: 4%;--bulma-black-invert-l: 100%;--bulma-black-invert: hsl(0, 0%, 100%);--bulma-black-on-scheme-l: 4%;--bulma-black-on-scheme: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-on-scheme-l), 1);--bulma-light: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-l), 1);--bulma-light-base: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-l), 1);--bulma-light-rgb: 244.8, 244.8, 244.8;--bulma-light-h: 0deg;--bulma-light-s: 0%;--bulma-light-l: 96%;--bulma-light-invert-l: 21%;--bulma-light-invert: hsl(0, 0%, 21%);--bulma-light-on-scheme-l: 36%;--bulma-light-on-scheme: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-on-scheme-l), 1);--bulma-dark: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-l), 1);--bulma-dark-base: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-l), 1);--bulma-dark-rgb: 53.55, 53.55, 53.55;--bulma-dark-h: 0deg;--bulma-dark-s: 0%;--bulma-dark-l: 21%;--bulma-dark-invert-l: 96%;--bulma-dark-invert: hsl(0, 0%, 96%);--bulma-dark-on-scheme-l: 21%;--bulma-dark-on-scheme: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-on-scheme-l), 1);--bulma-text: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l), 1);--bulma-text-base: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l), 1);--bulma-text-rgb: 73.95, 73.95, 73.95;--bulma-text-h: 0deg;--bulma-text-s: 0%;--bulma-text-l: 29%;--bulma-text-00-l: 0%;--bulma-text-05-l: 4%;--bulma-text-10-l: 9%;--bulma-text-15-l: 14%;--bulma-text-20-l: 19%;--bulma-text-25-l: 24%;--bulma-text-30-l: 29%;--bulma-text-35-l: 34%;--bulma-text-40-l: 39%;--bulma-text-45-l: 44%;--bulma-text-50-l: 49%;--bulma-text-55-l: 54%;--bulma-text-60-l: 59%;--bulma-text-65-l: 64%;--bulma-text-70-l: 69%;--bulma-text-75-l: 74%;--bulma-text-80-l: 79%;--bulma-text-85-l: 84%;--bulma-text-90-l: 89%;--bulma-text-95-l: 94%;--bulma-text-100-l: 99%;--bulma-text-00: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-00-l), 1);--bulma-text-00-invert-l: var(--bulma-text-55-l);--bulma-text-00-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-00-invert-l), 1);--bulma-text-05: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-05-l), 1);--bulma-text-05-invert-l: var(--bulma-text-60-l);--bulma-text-05-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-05-invert-l), 1);--bulma-text-10: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-10-l), 1);--bulma-text-10-invert-l: var(--bulma-text-65-l);--bulma-text-10-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-10-invert-l), 1);--bulma-text-15: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-15-l), 1);--bulma-text-15-invert-l: var(--bulma-text-75-l);--bulma-text-15-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-15-invert-l), 1);--bulma-text-20: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-20-l), 1);--bulma-text-20-invert-l: var(--bulma-text-85-l);--bulma-text-20-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-20-invert-l), 1);--bulma-text-25: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-25-l), 1);--bulma-text-25-invert-l: var(--bulma-text-95-l);--bulma-text-25-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-25-invert-l), 1);--bulma-text-30: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-30-l), 1);--bulma-text-30-invert-l: var(--bulma-text-100-l);--bulma-text-30-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-30-invert-l), 1);--bulma-text-35: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-35-l), 1);--bulma-text-35-invert-l: var(--bulma-text-100-l);--bulma-text-35-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-35-invert-l), 1);--bulma-text-40: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-40-l), 1);--bulma-text-40-invert-l: var(--bulma-text-100-l);--bulma-text-40-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-40-invert-l), 1);--bulma-text-45: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-45-l), 1);--bulma-text-45-invert-l: var(--bulma-text-100-l);--bulma-text-45-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-45-invert-l), 1);--bulma-text-50: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-50-l), 1);--bulma-text-50-invert-l: var(--bulma-text-100-l);--bulma-text-50-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-50-invert-l), 1);--bulma-text-55: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-55-l), 1);--bulma-text-55-invert-l: var(--bulma-text-00-l);--bulma-text-55-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-55-invert-l), 1);--bulma-text-60: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-60-l), 1);--bulma-text-60-invert-l: var(--bulma-text-05-l);--bulma-text-60-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-60-invert-l), 1);--bulma-text-65: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-65-l), 1);--bulma-text-65-invert-l: var(--bulma-text-10-l);--bulma-text-65-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-65-invert-l), 1);--bulma-text-70: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-70-l), 1);--bulma-text-70-invert-l: var(--bulma-text-10-l);--bulma-text-70-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-70-invert-l), 1);--bulma-text-75: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-75-l), 1);--bulma-text-75-invert-l: var(--bulma-text-15-l);--bulma-text-75-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-75-invert-l), 1);--bulma-text-80: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-80-l), 1);--bulma-text-80-invert-l: var(--bulma-text-15-l);--bulma-text-80-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-80-invert-l), 1);--bulma-text-85: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-85-l), 1);--bulma-text-85-invert-l: var(--bulma-text-20-l);--bulma-text-85-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-85-invert-l), 1);--bulma-text-90: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-90-l), 1);--bulma-text-90-invert-l: var(--bulma-text-20-l);--bulma-text-90-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-90-invert-l), 1);--bulma-text-95: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-95-l), 1);--bulma-text-95-invert-l: var(--bulma-text-25-l);--bulma-text-95-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-95-invert-l), 1);--bulma-text-100: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-100-l), 1);--bulma-text-100-invert-l: var(--bulma-text-25-l);--bulma-text-100-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-100-invert-l), 1);--bulma-text-invert-l: var(--bulma-text-100-l);--bulma-text-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-invert-l), 1);--bulma-text-light-l: var(--bulma-text-90-l);--bulma-text-light: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-light-l), 1);--bulma-text-light-invert-l: var(--bulma-text-20-l);--bulma-text-light-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-light-invert-l), 1);--bulma-text-dark-l: var(--bulma-text-10-l);--bulma-text-dark: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-dark-l), 1);--bulma-text-dark-invert-l: var(--bulma-text-65-l);--bulma-text-dark-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-dark-invert-l), 1);--bulma-text-soft: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-soft-l), 1);--bulma-text-bold: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-bold-l), 1);--bulma-text-soft-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-soft-invert-l), 1);--bulma-text-bold-invert: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-bold-invert-l), 1);--bulma-text-on-scheme-l: 29%;--bulma-text-on-scheme: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-on-scheme-l), 1);--bulma-primary: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);--bulma-primary-base: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);--bulma-primary-rgb: 0, 209.1, 177.735;--bulma-primary-h: 171deg;--bulma-primary-s: 100%;--bulma-primary-l: 41%;--bulma-primary-00-l: 1%;--bulma-primary-05-l: 6%;--bulma-primary-10-l: 11%;--bulma-primary-15-l: 16%;--bulma-primary-20-l: 21%;--bulma-primary-25-l: 26%;--bulma-primary-30-l: 31%;--bulma-primary-35-l: 36%;--bulma-primary-40-l: 41%;--bulma-primary-45-l: 46%;--bulma-primary-50-l: 51%;--bulma-primary-55-l: 56%;--bulma-primary-60-l: 61%;--bulma-primary-65-l: 66%;--bulma-primary-70-l: 71%;--bulma-primary-75-l: 76%;--bulma-primary-80-l: 81%;--bulma-primary-85-l: 86%;--bulma-primary-90-l: 91%;--bulma-primary-95-l: 96%;--bulma-primary-100-l: 100%;--bulma-primary-00: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-00-l), 1);--bulma-primary-00-invert-l: var(--bulma-primary-30-l);--bulma-primary-00-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-00-invert-l), 1);--bulma-primary-05: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-05-l), 1);--bulma-primary-05-invert-l: var(--bulma-primary-40-l);--bulma-primary-05-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-05-invert-l), 1);--bulma-primary-10: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-10-l), 1);--bulma-primary-10-invert-l: var(--bulma-primary-50-l);--bulma-primary-10-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-10-invert-l), 1);--bulma-primary-15: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-15-l), 1);--bulma-primary-15-invert-l: var(--bulma-primary-100-l);--bulma-primary-15-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-15-invert-l), 1);--bulma-primary-20: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-20-l), 1);--bulma-primary-20-invert-l: var(--bulma-primary-100-l);--bulma-primary-20-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-20-invert-l), 1);--bulma-primary-25: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-25-l), 1);--bulma-primary-25-invert-l: var(--bulma-primary-100-l);--bulma-primary-25-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-25-invert-l), 1);--bulma-primary-30: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-30-l), 1);--bulma-primary-30-invert-l: var(--bulma-primary-00-l);--bulma-primary-30-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-30-invert-l), 1);--bulma-primary-35: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-35-l), 1);--bulma-primary-35-invert-l: var(--bulma-primary-00-l);--bulma-primary-35-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-35-invert-l), 1);--bulma-primary-40: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-40-l), 1);--bulma-primary-40-invert-l: var(--bulma-primary-05-l);--bulma-primary-40-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-40-invert-l), 1);--bulma-primary-45: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-45-l), 1);--bulma-primary-45-invert-l: var(--bulma-primary-05-l);--bulma-primary-45-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-45-invert-l), 1);--bulma-primary-50: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-50-l), 1);--bulma-primary-50-invert-l: var(--bulma-primary-10-l);--bulma-primary-50-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-50-invert-l), 1);--bulma-primary-55: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-55-l), 1);--bulma-primary-55-invert-l: var(--bulma-primary-10-l);--bulma-primary-55-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-55-invert-l), 1);--bulma-primary-60: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-60-l), 1);--bulma-primary-60-invert-l: var(--bulma-primary-10-l);--bulma-primary-60-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-60-invert-l), 1);--bulma-primary-65: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-65-l), 1);--bulma-primary-65-invert-l: var(--bulma-primary-10-l);--bulma-primary-65-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-65-invert-l), 1);--bulma-primary-70: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-70-l), 1);--bulma-primary-70-invert-l: var(--bulma-primary-10-l);--bulma-primary-70-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-70-invert-l), 1);--bulma-primary-75: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-75-l), 1);--bulma-primary-75-invert-l: var(--bulma-primary-10-l);--bulma-primary-75-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-75-invert-l), 1);--bulma-primary-80: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-80-l), 1);--bulma-primary-80-invert-l: var(--bulma-primary-10-l);--bulma-primary-80-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-80-invert-l), 1);--bulma-primary-85: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-85-l), 1);--bulma-primary-85-invert-l: var(--bulma-primary-10-l);--bulma-primary-85-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-85-invert-l), 1);--bulma-primary-90: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-90-l), 1);--bulma-primary-90-invert-l: var(--bulma-primary-10-l);--bulma-primary-90-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-90-invert-l), 1);--bulma-primary-95: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-95-l), 1);--bulma-primary-95-invert-l: var(--bulma-primary-10-l);--bulma-primary-95-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-95-invert-l), 1);--bulma-primary-100: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-100-l), 1);--bulma-primary-100-invert-l: var(--bulma-primary-15-l);--bulma-primary-100-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-100-invert-l), 1);--bulma-primary-invert-l: var(--bulma-primary-05-l);--bulma-primary-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-invert-l), 1);--bulma-primary-light-l: var(--bulma-primary-90-l);--bulma-primary-light: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-light-l), 1);--bulma-primary-light-invert-l: var(--bulma-primary-10-l);--bulma-primary-light-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-light-invert-l), 1);--bulma-primary-dark-l: var(--bulma-primary-10-l);--bulma-primary-dark: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-dark-l), 1);--bulma-primary-dark-invert-l: var(--bulma-primary-50-l);--bulma-primary-dark-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-dark-invert-l), 1);--bulma-primary-soft: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-soft-l), 1);--bulma-primary-bold: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-bold-l), 1);--bulma-primary-soft-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-soft-invert-l), 1);--bulma-primary-bold-invert: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-bold-invert-l), 1);--bulma-primary-on-scheme-l: 21%;--bulma-primary-on-scheme: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-on-scheme-l), 1);--bulma-link: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l), 1);--bulma-link-base: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l), 1);--bulma-link-rgb: 50.0565, 115.29485, 220.2435;--bulma-link-h: 217deg;--bulma-link-s: 71%;--bulma-link-l: 53%;--bulma-link-00-l: 0%;--bulma-link-05-l: 3%;--bulma-link-10-l: 8%;--bulma-link-15-l: 13%;--bulma-link-20-l: 18%;--bulma-link-25-l: 23%;--bulma-link-30-l: 28%;--bulma-link-35-l: 33%;--bulma-link-40-l: 38%;--bulma-link-45-l: 43%;--bulma-link-50-l: 48%;--bulma-link-55-l: 53%;--bulma-link-60-l: 58%;--bulma-link-65-l: 63%;--bulma-link-70-l: 68%;--bulma-link-75-l: 73%;--bulma-link-80-l: 78%;--bulma-link-85-l: 83%;--bulma-link-90-l: 88%;--bulma-link-95-l: 93%;--bulma-link-100-l: 98%;--bulma-link-00: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-00-l), 1);--bulma-link-00-invert-l: var(--bulma-link-65-l);--bulma-link-00-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-00-invert-l), 1);--bulma-link-05: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-05-l), 1);--bulma-link-05-invert-l: var(--bulma-link-65-l);--bulma-link-05-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-05-invert-l), 1);--bulma-link-10: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-10-l), 1);--bulma-link-10-invert-l: var(--bulma-link-70-l);--bulma-link-10-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-10-invert-l), 1);--bulma-link-15: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-15-l), 1);--bulma-link-15-invert-l: var(--bulma-link-75-l);--bulma-link-15-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-15-invert-l), 1);--bulma-link-20: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-20-l), 1);--bulma-link-20-invert-l: var(--bulma-link-85-l);--bulma-link-20-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-20-invert-l), 1);--bulma-link-25: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-25-l), 1);--bulma-link-25-invert-l: var(--bulma-link-90-l);--bulma-link-25-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-25-invert-l), 1);--bulma-link-30: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-30-l), 1);--bulma-link-30-invert-l: var(--bulma-link-95-l);--bulma-link-30-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-30-invert-l), 1);--bulma-link-35: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-35-l), 1);--bulma-link-35-invert-l: var(--bulma-link-100-l);--bulma-link-35-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-35-invert-l), 1);--bulma-link-40: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-40-l), 1);--bulma-link-40-invert-l: var(--bulma-link-100-l);--bulma-link-40-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-40-invert-l), 1);--bulma-link-45: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-45-l), 1);--bulma-link-45-invert-l: var(--bulma-link-100-l);--bulma-link-45-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-45-invert-l), 1);--bulma-link-50: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-50-l), 1);--bulma-link-50-invert-l: var(--bulma-link-100-l);--bulma-link-50-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-50-invert-l), 1);--bulma-link-55: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-55-l), 1);--bulma-link-55-invert-l: var(--bulma-link-100-l);--bulma-link-55-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-55-invert-l), 1);--bulma-link-60: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-60-l), 1);--bulma-link-60-invert-l: var(--bulma-link-100-l);--bulma-link-60-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-60-invert-l), 1);--bulma-link-65: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-65-l), 1);--bulma-link-65-invert-l: var(--bulma-link-05-l);--bulma-link-65-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-65-invert-l), 1);--bulma-link-70: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-70-l), 1);--bulma-link-70-invert-l: var(--bulma-link-10-l);--bulma-link-70-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-70-invert-l), 1);--bulma-link-75: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-75-l), 1);--bulma-link-75-invert-l: var(--bulma-link-15-l);--bulma-link-75-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-75-invert-l), 1);--bulma-link-80: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-80-l), 1);--bulma-link-80-invert-l: var(--bulma-link-15-l);--bulma-link-80-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-80-invert-l), 1);--bulma-link-85: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-85-l), 1);--bulma-link-85-invert-l: var(--bulma-link-20-l);--bulma-link-85-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-85-invert-l), 1);--bulma-link-90: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-90-l), 1);--bulma-link-90-invert-l: var(--bulma-link-25-l);--bulma-link-90-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-90-invert-l), 1);--bulma-link-95: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-95-l), 1);--bulma-link-95-invert-l: var(--bulma-link-30-l);--bulma-link-95-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-95-invert-l), 1);--bulma-link-100: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-100-l), 1);--bulma-link-100-invert-l: var(--bulma-link-30-l);--bulma-link-100-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-100-invert-l), 1);--bulma-link-invert-l: var(--bulma-link-100-l);--bulma-link-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-invert-l), 1);--bulma-link-light-l: var(--bulma-link-90-l);--bulma-link-light: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-light-l), 1);--bulma-link-light-invert-l: var(--bulma-link-25-l);--bulma-link-light-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-light-invert-l), 1);--bulma-link-dark-l: var(--bulma-link-10-l);--bulma-link-dark: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-dark-l), 1);--bulma-link-dark-invert-l: var(--bulma-link-70-l);--bulma-link-dark-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-dark-invert-l), 1);--bulma-link-soft: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-soft-l), 1);--bulma-link-bold: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-bold-l), 1);--bulma-link-soft-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-soft-invert-l), 1);--bulma-link-bold-invert: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-bold-invert-l), 1);--bulma-link-on-scheme-l: 43%;--bulma-link-on-scheme: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l), 1);--bulma-info: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-l), 1);--bulma-info-base: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-l), 1);--bulma-info-rgb: 32.079, 155.7642, 238.221;--bulma-info-h: 204deg;--bulma-info-s: 86%;--bulma-info-l: 53%;--bulma-info-00-l: 0%;--bulma-info-05-l: 3%;--bulma-info-10-l: 8%;--bulma-info-15-l: 13%;--bulma-info-20-l: 18%;--bulma-info-25-l: 23%;--bulma-info-30-l: 28%;--bulma-info-35-l: 33%;--bulma-info-40-l: 38%;--bulma-info-45-l: 43%;--bulma-info-50-l: 48%;--bulma-info-55-l: 53%;--bulma-info-60-l: 58%;--bulma-info-65-l: 63%;--bulma-info-70-l: 68%;--bulma-info-75-l: 73%;--bulma-info-80-l: 78%;--bulma-info-85-l: 83%;--bulma-info-90-l: 88%;--bulma-info-95-l: 93%;--bulma-info-100-l: 98%;--bulma-info-00: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-00-l), 1);--bulma-info-00-invert-l: var(--bulma-info-50-l);--bulma-info-00-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-00-invert-l), 1);--bulma-info-05: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-05-l), 1);--bulma-info-05-invert-l: var(--bulma-info-55-l);--bulma-info-05-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-05-invert-l), 1);--bulma-info-10: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-10-l), 1);--bulma-info-10-invert-l: var(--bulma-info-65-l);--bulma-info-10-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-10-invert-l), 1);--bulma-info-15: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-15-l), 1);--bulma-info-15-invert-l: var(--bulma-info-75-l);--bulma-info-15-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-15-invert-l), 1);--bulma-info-20: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-20-l), 1);--bulma-info-20-invert-l: var(--bulma-info-85-l);--bulma-info-20-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-20-invert-l), 1);--bulma-info-25: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-25-l), 1);--bulma-info-25-invert-l: var(--bulma-info-100-l);--bulma-info-25-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-25-invert-l), 1);--bulma-info-30: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-30-l), 1);--bulma-info-30-invert-l: var(--bulma-info-100-l);--bulma-info-30-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-30-invert-l), 1);--bulma-info-35: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-35-l), 1);--bulma-info-35-invert-l: var(--bulma-info-100-l);--bulma-info-35-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-35-invert-l), 1);--bulma-info-40: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-40-l), 1);--bulma-info-40-invert-l: var(--bulma-info-100-l);--bulma-info-40-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-40-invert-l), 1);--bulma-info-45: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-45-l), 1);--bulma-info-45-invert-l: var(--bulma-info-100-l);--bulma-info-45-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-45-invert-l), 1);--bulma-info-50: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-50-l), 1);--bulma-info-50-invert-l: var(--bulma-info-00-l);--bulma-info-50-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-50-invert-l), 1);--bulma-info-55: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-55-l), 1);--bulma-info-55-invert-l: var(--bulma-info-05-l);--bulma-info-55-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-55-invert-l), 1);--bulma-info-60: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-60-l), 1);--bulma-info-60-invert-l: var(--bulma-info-05-l);--bulma-info-60-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-60-invert-l), 1);--bulma-info-65: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-65-l), 1);--bulma-info-65-invert-l: var(--bulma-info-10-l);--bulma-info-65-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-65-invert-l), 1);--bulma-info-70: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-70-l), 1);--bulma-info-70-invert-l: var(--bulma-info-10-l);--bulma-info-70-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-70-invert-l), 1);--bulma-info-75: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-75-l), 1);--bulma-info-75-invert-l: var(--bulma-info-15-l);--bulma-info-75-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-75-invert-l), 1);--bulma-info-80: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-80-l), 1);--bulma-info-80-invert-l: var(--bulma-info-15-l);--bulma-info-80-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-80-invert-l), 1);--bulma-info-85: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-85-l), 1);--bulma-info-85-invert-l: var(--bulma-info-20-l);--bulma-info-85-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-85-invert-l), 1);--bulma-info-90: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-90-l), 1);--bulma-info-90-invert-l: var(--bulma-info-20-l);--bulma-info-90-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-90-invert-l), 1);--bulma-info-95: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-95-l), 1);--bulma-info-95-invert-l: var(--bulma-info-20-l);--bulma-info-95-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-95-invert-l), 1);--bulma-info-100: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-100-l), 1);--bulma-info-100-invert-l: var(--bulma-info-25-l);--bulma-info-100-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-100-invert-l), 1);--bulma-info-invert-l: var(--bulma-info-05-l);--bulma-info-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-invert-l), 1);--bulma-info-light-l: var(--bulma-info-90-l);--bulma-info-light: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-light-l), 1);--bulma-info-light-invert-l: var(--bulma-info-20-l);--bulma-info-light-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-light-invert-l), 1);--bulma-info-dark-l: var(--bulma-info-10-l);--bulma-info-dark: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-dark-l), 1);--bulma-info-dark-invert-l: var(--bulma-info-65-l);--bulma-info-dark-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-dark-invert-l), 1);--bulma-info-soft: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-soft-l), 1);--bulma-info-bold: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-bold-l), 1);--bulma-info-soft-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-soft-invert-l), 1);--bulma-info-bold-invert: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-bold-invert-l), 1);--bulma-info-on-scheme-l: 33%;--bulma-info-on-scheme: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-on-scheme-l), 1);--bulma-success: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-l), 1);--bulma-success-base: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-l), 1);--bulma-success-rgb: 71.6295, 198.6705, 141.50205;--bulma-success-h: 153deg;--bulma-success-s: 53%;--bulma-success-l: 53%;--bulma-success-00-l: 0%;--bulma-success-05-l: 3%;--bulma-success-10-l: 8%;--bulma-success-15-l: 13%;--bulma-success-20-l: 18%;--bulma-success-25-l: 23%;--bulma-success-30-l: 28%;--bulma-success-35-l: 33%;--bulma-success-40-l: 38%;--bulma-success-45-l: 43%;--bulma-success-50-l: 48%;--bulma-success-55-l: 53%;--bulma-success-60-l: 58%;--bulma-success-65-l: 63%;--bulma-success-70-l: 68%;--bulma-success-75-l: 73%;--bulma-success-80-l: 78%;--bulma-success-85-l: 83%;--bulma-success-90-l: 88%;--bulma-success-95-l: 93%;--bulma-success-100-l: 98%;--bulma-success-00: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-00-l), 1);--bulma-success-00-invert-l: var(--bulma-success-45-l);--bulma-success-00-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-00-invert-l), 1);--bulma-success-05: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-05-l), 1);--bulma-success-05-invert-l: var(--bulma-success-45-l);--bulma-success-05-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-05-invert-l), 1);--bulma-success-10: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-10-l), 1);--bulma-success-10-invert-l: var(--bulma-success-55-l);--bulma-success-10-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-10-invert-l), 1);--bulma-success-15: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-15-l), 1);--bulma-success-15-invert-l: var(--bulma-success-75-l);--bulma-success-15-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-15-invert-l), 1);--bulma-success-20: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-20-l), 1);--bulma-success-20-invert-l: var(--bulma-success-95-l);--bulma-success-20-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-20-invert-l), 1);--bulma-success-25: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-25-l), 1);--bulma-success-25-invert-l: var(--bulma-success-100-l);--bulma-success-25-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-25-invert-l), 1);--bulma-success-30: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-30-l), 1);--bulma-success-30-invert-l: var(--bulma-success-100-l);--bulma-success-30-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-30-invert-l), 1);--bulma-success-35: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-35-l), 1);--bulma-success-35-invert-l: var(--bulma-success-100-l);--bulma-success-35-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-35-invert-l), 1);--bulma-success-40: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-40-l), 1);--bulma-success-40-invert-l: var(--bulma-success-100-l);--bulma-success-40-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-40-invert-l), 1);--bulma-success-45: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-45-l), 1);--bulma-success-45-invert-l: var(--bulma-success-05-l);--bulma-success-45-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-45-invert-l), 1);--bulma-success-50: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-50-l), 1);--bulma-success-50-invert-l: var(--bulma-success-05-l);--bulma-success-50-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-50-invert-l), 1);--bulma-success-55: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-55-l), 1);--bulma-success-55-invert-l: var(--bulma-success-10-l);--bulma-success-55-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-55-invert-l), 1);--bulma-success-60: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-60-l), 1);--bulma-success-60-invert-l: var(--bulma-success-10-l);--bulma-success-60-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-60-invert-l), 1);--bulma-success-65: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-65-l), 1);--bulma-success-65-invert-l: var(--bulma-success-10-l);--bulma-success-65-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-65-invert-l), 1);--bulma-success-70: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-70-l), 1);--bulma-success-70-invert-l: var(--bulma-success-10-l);--bulma-success-70-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-70-invert-l), 1);--bulma-success-75: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-75-l), 1);--bulma-success-75-invert-l: var(--bulma-success-15-l);--bulma-success-75-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-75-invert-l), 1);--bulma-success-80: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-80-l), 1);--bulma-success-80-invert-l: var(--bulma-success-15-l);--bulma-success-80-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-80-invert-l), 1);--bulma-success-85: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-85-l), 1);--bulma-success-85-invert-l: var(--bulma-success-15-l);--bulma-success-85-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-85-invert-l), 1);--bulma-success-90: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-90-l), 1);--bulma-success-90-invert-l: var(--bulma-success-15-l);--bulma-success-90-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-90-invert-l), 1);--bulma-success-95: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-95-l), 1);--bulma-success-95-invert-l: var(--bulma-success-20-l);--bulma-success-95-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-95-invert-l), 1);--bulma-success-100: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-100-l), 1);--bulma-success-100-invert-l: var(--bulma-success-20-l);--bulma-success-100-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-100-invert-l), 1);--bulma-success-invert-l: var(--bulma-success-10-l);--bulma-success-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-invert-l), 1);--bulma-success-light-l: var(--bulma-success-90-l);--bulma-success-light: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-light-l), 1);--bulma-success-light-invert-l: var(--bulma-success-15-l);--bulma-success-light-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-light-invert-l), 1);--bulma-success-dark-l: var(--bulma-success-10-l);--bulma-success-dark: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-dark-l), 1);--bulma-success-dark-invert-l: var(--bulma-success-55-l);--bulma-success-dark-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-dark-invert-l), 1);--bulma-success-soft: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-soft-l), 1);--bulma-success-bold: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-bold-l), 1);--bulma-success-soft-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-soft-invert-l), 1);--bulma-success-bold-invert: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-bold-invert-l), 1);--bulma-success-on-scheme-l: 23%;--bulma-success-on-scheme: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-on-scheme-l), 1);--bulma-warning: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-l), 1);--bulma-warning-base: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-l), 1);--bulma-warning-rgb: 255, 223.72, 137.7;--bulma-warning-h: 44deg;--bulma-warning-s: 100%;--bulma-warning-l: 77%;--bulma-warning-00-l: 2%;--bulma-warning-05-l: 7%;--bulma-warning-10-l: 12%;--bulma-warning-15-l: 17%;--bulma-warning-20-l: 22%;--bulma-warning-25-l: 27%;--bulma-warning-30-l: 32%;--bulma-warning-35-l: 37%;--bulma-warning-40-l: 42%;--bulma-warning-45-l: 47%;--bulma-warning-50-l: 52%;--bulma-warning-55-l: 57%;--bulma-warning-60-l: 62%;--bulma-warning-65-l: 67%;--bulma-warning-70-l: 72%;--bulma-warning-75-l: 77%;--bulma-warning-80-l: 82%;--bulma-warning-85-l: 87%;--bulma-warning-90-l: 92%;--bulma-warning-95-l: 97%;--bulma-warning-100-l: 100%;--bulma-warning-00: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-00-l), 1);--bulma-warning-00-invert-l: var(--bulma-warning-35-l);--bulma-warning-00-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-00-invert-l), 1);--bulma-warning-05: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-05-l), 1);--bulma-warning-05-invert-l: var(--bulma-warning-45-l);--bulma-warning-05-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-05-invert-l), 1);--bulma-warning-10: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-10-l), 1);--bulma-warning-10-invert-l: var(--bulma-warning-60-l);--bulma-warning-10-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-10-invert-l), 1);--bulma-warning-15: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-15-l), 1);--bulma-warning-15-invert-l: var(--bulma-warning-95-l);--bulma-warning-15-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-15-invert-l), 1);--bulma-warning-20: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-20-l), 1);--bulma-warning-20-invert-l: var(--bulma-warning-100-l);--bulma-warning-20-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-20-invert-l), 1);--bulma-warning-25: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-25-l), 1);--bulma-warning-25-invert-l: var(--bulma-warning-100-l);--bulma-warning-25-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-25-invert-l), 1);--bulma-warning-30: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-30-l), 1);--bulma-warning-30-invert-l: var(--bulma-warning-100-l);--bulma-warning-30-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-30-invert-l), 1);--bulma-warning-35: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-35-l), 1);--bulma-warning-35-invert-l: var(--bulma-warning-00-l);--bulma-warning-35-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-35-invert-l), 1);--bulma-warning-40: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-40-l), 1);--bulma-warning-40-invert-l: var(--bulma-warning-00-l);--bulma-warning-40-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-40-invert-l), 1);--bulma-warning-45: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-45-l), 1);--bulma-warning-45-invert-l: var(--bulma-warning-05-l);--bulma-warning-45-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-45-invert-l), 1);--bulma-warning-50: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-50-l), 1);--bulma-warning-50-invert-l: var(--bulma-warning-05-l);--bulma-warning-50-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-50-invert-l), 1);--bulma-warning-55: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-55-l), 1);--bulma-warning-55-invert-l: var(--bulma-warning-05-l);--bulma-warning-55-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-55-invert-l), 1);--bulma-warning-60: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-60-l), 1);--bulma-warning-60-invert-l: var(--bulma-warning-10-l);--bulma-warning-60-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-60-invert-l), 1);--bulma-warning-65: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-65-l), 1);--bulma-warning-65-invert-l: var(--bulma-warning-10-l);--bulma-warning-65-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-65-invert-l), 1);--bulma-warning-70: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-70-l), 1);--bulma-warning-70-invert-l: var(--bulma-warning-10-l);--bulma-warning-70-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-70-invert-l), 1);--bulma-warning-75: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-75-l), 1);--bulma-warning-75-invert-l: var(--bulma-warning-10-l);--bulma-warning-75-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-75-invert-l), 1);--bulma-warning-80: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-80-l), 1);--bulma-warning-80-invert-l: var(--bulma-warning-10-l);--bulma-warning-80-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-80-invert-l), 1);--bulma-warning-85: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-85-l), 1);--bulma-warning-85-invert-l: var(--bulma-warning-10-l);--bulma-warning-85-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-85-invert-l), 1);--bulma-warning-90: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-90-l), 1);--bulma-warning-90-invert-l: var(--bulma-warning-10-l);--bulma-warning-90-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-90-invert-l), 1);--bulma-warning-95: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-95-l), 1);--bulma-warning-95-invert-l: var(--bulma-warning-15-l);--bulma-warning-95-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-95-invert-l), 1);--bulma-warning-100: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-100-l), 1);--bulma-warning-100-invert-l: var(--bulma-warning-15-l);--bulma-warning-100-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-100-invert-l), 1);--bulma-warning-invert-l: var(--bulma-warning-10-l);--bulma-warning-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-invert-l), 1);--bulma-warning-light-l: var(--bulma-warning-90-l);--bulma-warning-light: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-light-l), 1);--bulma-warning-light-invert-l: var(--bulma-warning-10-l);--bulma-warning-light-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-light-invert-l), 1);--bulma-warning-dark-l: var(--bulma-warning-10-l);--bulma-warning-dark: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-dark-l), 1);--bulma-warning-dark-invert-l: var(--bulma-warning-60-l);--bulma-warning-dark-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-dark-invert-l), 1);--bulma-warning-soft: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-soft-l), 1);--bulma-warning-bold: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-bold-l), 1);--bulma-warning-soft-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-soft-invert-l), 1);--bulma-warning-bold-invert: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-bold-invert-l), 1);--bulma-warning-on-scheme-l: 22%;--bulma-warning-on-scheme: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-on-scheme-l), 1);--bulma-danger: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-l), 1);--bulma-danger-base: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-l), 1);--bulma-danger-rgb: 241.077, 70.023, 104.2338;--bulma-danger-h: 348deg;--bulma-danger-s: 86%;--bulma-danger-l: 61%;--bulma-danger-00-l: 1%;--bulma-danger-05-l: 6%;--bulma-danger-10-l: 11%;--bulma-danger-15-l: 16%;--bulma-danger-20-l: 21%;--bulma-danger-25-l: 26%;--bulma-danger-30-l: 31%;--bulma-danger-35-l: 36%;--bulma-danger-40-l: 41%;--bulma-danger-45-l: 46%;--bulma-danger-50-l: 51%;--bulma-danger-55-l: 56%;--bulma-danger-60-l: 61%;--bulma-danger-65-l: 66%;--bulma-danger-70-l: 71%;--bulma-danger-75-l: 76%;--bulma-danger-80-l: 81%;--bulma-danger-85-l: 86%;--bulma-danger-90-l: 91%;--bulma-danger-95-l: 96%;--bulma-danger-100-l: 100%;--bulma-danger-00: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-00-l), 1);--bulma-danger-00-invert-l: var(--bulma-danger-65-l);--bulma-danger-00-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-00-invert-l), 1);--bulma-danger-05: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-05-l), 1);--bulma-danger-05-invert-l: var(--bulma-danger-70-l);--bulma-danger-05-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-05-invert-l), 1);--bulma-danger-10: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-10-l), 1);--bulma-danger-10-invert-l: var(--bulma-danger-75-l);--bulma-danger-10-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-10-invert-l), 1);--bulma-danger-15: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-15-l), 1);--bulma-danger-15-invert-l: var(--bulma-danger-80-l);--bulma-danger-15-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-15-invert-l), 1);--bulma-danger-20: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-20-l), 1);--bulma-danger-20-invert-l: var(--bulma-danger-85-l);--bulma-danger-20-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-20-invert-l), 1);--bulma-danger-25: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-25-l), 1);--bulma-danger-25-invert-l: var(--bulma-danger-90-l);--bulma-danger-25-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-25-invert-l), 1);--bulma-danger-30: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-30-l), 1);--bulma-danger-30-invert-l: var(--bulma-danger-100-l);--bulma-danger-30-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-30-invert-l), 1);--bulma-danger-35: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-35-l), 1);--bulma-danger-35-invert-l: var(--bulma-danger-100-l);--bulma-danger-35-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-35-invert-l), 1);--bulma-danger-40: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-40-l), 1);--bulma-danger-40-invert-l: var(--bulma-danger-100-l);--bulma-danger-40-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-40-invert-l), 1);--bulma-danger-45: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-45-l), 1);--bulma-danger-45-invert-l: var(--bulma-danger-100-l);--bulma-danger-45-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-45-invert-l), 1);--bulma-danger-50: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-50-l), 1);--bulma-danger-50-invert-l: var(--bulma-danger-100-l);--bulma-danger-50-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-50-invert-l), 1);--bulma-danger-55: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-55-l), 1);--bulma-danger-55-invert-l: var(--bulma-danger-100-l);--bulma-danger-55-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-55-invert-l), 1);--bulma-danger-60: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-60-l), 1);--bulma-danger-60-invert-l: var(--bulma-danger-100-l);--bulma-danger-60-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-60-invert-l), 1);--bulma-danger-65: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-65-l), 1);--bulma-danger-65-invert-l: var(--bulma-danger-00-l);--bulma-danger-65-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-65-invert-l), 1);--bulma-danger-70: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-70-l), 1);--bulma-danger-70-invert-l: var(--bulma-danger-05-l);--bulma-danger-70-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-70-invert-l), 1);--bulma-danger-75: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-75-l), 1);--bulma-danger-75-invert-l: var(--bulma-danger-10-l);--bulma-danger-75-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-75-invert-l), 1);--bulma-danger-80: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-80-l), 1);--bulma-danger-80-invert-l: var(--bulma-danger-15-l);--bulma-danger-80-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-80-invert-l), 1);--bulma-danger-85: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-85-l), 1);--bulma-danger-85-invert-l: var(--bulma-danger-20-l);--bulma-danger-85-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-85-invert-l), 1);--bulma-danger-90: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-90-l), 1);--bulma-danger-90-invert-l: var(--bulma-danger-25-l);--bulma-danger-90-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-90-invert-l), 1);--bulma-danger-95: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-95-l), 1);--bulma-danger-95-invert-l: var(--bulma-danger-25-l);--bulma-danger-95-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-95-invert-l), 1);--bulma-danger-100: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-100-l), 1);--bulma-danger-100-invert-l: var(--bulma-danger-30-l);--bulma-danger-100-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-100-invert-l), 1);--bulma-danger-invert-l: var(--bulma-danger-100-l);--bulma-danger-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-invert-l), 1);--bulma-danger-light-l: var(--bulma-danger-90-l);--bulma-danger-light: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-light-l), 1);--bulma-danger-light-invert-l: var(--bulma-danger-25-l);--bulma-danger-light-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-light-invert-l), 1);--bulma-danger-dark-l: var(--bulma-danger-10-l);--bulma-danger-dark: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-dark-l), 1);--bulma-danger-dark-invert-l: var(--bulma-danger-75-l);--bulma-danger-dark-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-dark-invert-l), 1);--bulma-danger-soft: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-soft-l), 1);--bulma-danger-bold: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-bold-l), 1);--bulma-danger-soft-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-soft-invert-l), 1);--bulma-danger-bold-invert: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-bold-invert-l), 1);--bulma-danger-on-scheme-l: 41%;--bulma-danger-on-scheme: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l), 1);--bulma-black-bis: hsl(0, 0%, 7%);--bulma-black-ter: hsl(0, 0%, 14%);--bulma-grey-darker: hsl(0, 0%, 21%);--bulma-grey-dark: hsl(0, 0%, 29%);--bulma-grey: hsl(0, 0%, 48%);--bulma-grey-light: hsl(0, 0%, 71%);--bulma-grey-lighter: hsl(0, 0%, 86%);--bulma-white-ter: hsl(0, 0%, 96%);--bulma-white-bis: hsl(0, 0%, 98%);--bulma-shadow-h: 0deg;--bulma-shadow-s: 0%;--bulma-shadow-l: 4%;--bulma-size-1: 3rem;--bulma-size-2: 2.5rem;--bulma-size-3: 2rem;--bulma-size-4: 1.5rem;--bulma-size-5: 1.25rem;--bulma-size-6: 1rem;--bulma-size-7: .75rem;--bulma-scheme-main: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-l));--bulma-scheme-main-bis: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-bis-l));--bulma-scheme-main-ter: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-ter-l));--bulma-background: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-background-l));--bulma-background-hover: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-background-l) + var(--bulma-hover-background-l-delta)));--bulma-background-active: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-background-l) + var(--bulma-active-background-l-delta)));--bulma-border-weak: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-border-weak-l));--bulma-border: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-border-l));--bulma-border-hover: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-border-l) + var(--bulma-hover-border-l-delta)));--bulma-border-active: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-border-l) + var(--bulma-active-border-l-delta)));--bulma-text-weak: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-weak-l));--bulma-text: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l));--bulma-text-strong: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-strong-l));--bulma-scheme-invert-ter: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-ter-l));--bulma-scheme-invert-bis: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-bis-l));--bulma-scheme-invert: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l));--bulma-link: hsl(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l));--bulma-link-text: hsl(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l));--bulma-link-text-hover: hsl(var(--bulma-link-h), var(--bulma-link-s), calc(var(--bulma-link-on-scheme-l) + var(--bulma-hover-color-l-delta)));--bulma-link-text-active: hsl(var(--bulma-link-h), var(--bulma-link-s), calc(var(--bulma-link-on-scheme-l) + var(--bulma-active-color-l-delta)));--bulma-focus-h: var(--bulma-link-h);--bulma-focus-s: var(--bulma-link-s);--bulma-focus-l: var(--bulma-link-l);--bulma-focus-offset: 1px;--bulma-focus-style: solid;--bulma-focus-width: 2px;--bulma-focus-shadow-size: 0 0 0 .1875em;--bulma-focus-shadow-alpha: .25;--bulma-code: hsl(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l));--bulma-code-background: var(--bulma-background);--bulma-pre: var(--bulma-text);--bulma-pre-background: var(--bulma-background);--bulma-shadow: 0 .5em 1em -.125em hsla(var(--bulma-shadow-h), var(--bulma-shadow-s), var(--bulma-shadow-l), .1), 0 0px 0 1px hsla(var(--bulma-shadow-h), var(--bulma-shadow-s), var(--bulma-shadow-l), .02)}[data-theme=dark],.theme-dark{--bulma-white-on-scheme-l: 100%;--bulma-white-on-scheme: hsla(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-white-on-scheme-l), 1);--bulma-black-on-scheme-l: -51%;--bulma-black-on-scheme: hsla(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-black-on-scheme-l), 1);--bulma-light-on-scheme-l: 96%;--bulma-light-on-scheme: hsla(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-light-on-scheme-l), 1);--bulma-dark-on-scheme-l: 56%;--bulma-dark-on-scheme: hsla(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-dark-on-scheme-l), 1);--bulma-text-on-scheme-l: 54%;--bulma-text-on-scheme: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-on-scheme-l), 1);--bulma-primary-on-scheme-l: 41%;--bulma-primary-on-scheme: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-on-scheme-l), 1);--bulma-link-on-scheme-l: 63%;--bulma-link-on-scheme: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l), 1);--bulma-info-on-scheme-l: 53%;--bulma-info-on-scheme: hsla(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-info-on-scheme-l), 1);--bulma-success-on-scheme-l: 53%;--bulma-success-on-scheme: hsla(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-success-on-scheme-l), 1);--bulma-warning-on-scheme-l: 77%;--bulma-warning-on-scheme: hsla(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-warning-on-scheme-l), 1);--bulma-danger-on-scheme-l: 66%;--bulma-danger-on-scheme: hsla(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l), 1);--bulma-scheme-brightness: dark;--bulma-scheme-main-l: 9%;--bulma-scheme-main-bis-l: 11%;--bulma-scheme-main-ter-l: 13%;--bulma-soft-l: 20%;--bulma-bold-l: 90%;--bulma-soft-invert-l: 90%;--bulma-bold-invert-l: 20%;--bulma-background-l: 14%;--bulma-border-weak-l: 21%;--bulma-border-l: 24%;--bulma-text-weak-l: 53%;--bulma-text-l: 71%;--bulma-text-strong-l: 93%;--bulma-text-title-l: 100%;--bulma-hover-background-l-delta: 5%;--bulma-active-background-l-delta: 10%;--bulma-hover-border-l-delta: 10%;--bulma-active-border-l-delta: 20%;--bulma-hover-color-l-delta: 5%;--bulma-active-color-l-delta: 10%;--bulma-shadow-h: 0deg;--bulma-shadow-s: 0%;--bulma-shadow-l: 100%;--bulma-scheme-main: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-l));--bulma-scheme-main-bis: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-bis-l));--bulma-scheme-main-ter: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-main-ter-l));--bulma-background: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-background-l));--bulma-background-hover: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-background-l) + var(--bulma-hover-background-l-delta)));--bulma-background-active: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-background-l) + var(--bulma-active-background-l-delta)));--bulma-border-weak: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-border-weak-l));--bulma-border: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-border-l));--bulma-border-hover: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-border-l) + var(--bulma-hover-border-l-delta)));--bulma-border-active: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), calc(var(--bulma-border-l) + var(--bulma-active-border-l-delta)));--bulma-text-weak: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-weak-l));--bulma-text: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-l));--bulma-text-strong: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-strong-l));--bulma-scheme-invert-ter: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-ter-l));--bulma-scheme-invert-bis: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-bis-l));--bulma-scheme-invert: hsl(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l));--bulma-link: hsl(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-l));--bulma-link-text: hsl(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l));--bulma-link-text-hover: hsl(var(--bulma-link-h), var(--bulma-link-s), calc(var(--bulma-link-on-scheme-l) + var(--bulma-hover-color-l-delta)));--bulma-link-text-active: hsl(var(--bulma-link-h), var(--bulma-link-s), calc(var(--bulma-link-on-scheme-l) + var(--bulma-active-color-l-delta)));--bulma-focus-h: var(--bulma-link-h);--bulma-focus-s: var(--bulma-link-s);--bulma-focus-l: var(--bulma-link-l);--bulma-focus-offset: 1px;--bulma-focus-style: solid;--bulma-focus-width: 2px;--bulma-focus-shadow-size: 0 0 0 .1875em;--bulma-focus-shadow-alpha: .25;--bulma-code: hsl(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-danger-on-scheme-l));--bulma-code-background: var(--bulma-background);--bulma-pre: var(--bulma-text);--bulma-pre-background: var(--bulma-background);--bulma-shadow: 0 .5em 1em -.125em hsla(var(--bulma-shadow-h), var(--bulma-shadow-s), var(--bulma-shadow-l), .1), 0 0px 0 1px hsla(var(--bulma-shadow-h), var(--bulma-shadow-s), var(--bulma-shadow-l), .02)}html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}:root{--bulma-body-background-color: var(--bulma-scheme-main);--bulma-body-size: 1em;--bulma-body-min-width: 300px;--bulma-body-rendering: optimizeLegibility;--bulma-body-family: var(--bulma-family-primary);--bulma-body-overflow-x: hidden;--bulma-body-overflow-y: scroll;--bulma-body-color: var(--bulma-text);--bulma-body-font-size: 1em;--bulma-body-weight: var(--bulma-weight-normal);--bulma-body-line-height: 1.5;--bulma-code-family: var(--bulma-family-code);--bulma-code-padding: .25em .5em .25em;--bulma-code-weight: normal;--bulma-code-size: .875em;--bulma-small-font-size: .875em;--bulma-hr-background-color: var(--bulma-background);--bulma-hr-height: 2px;--bulma-hr-margin: 1.5rem 0;--bulma-strong-color: var(--bulma-text-strong);--bulma-strong-weight: var(--bulma-weight-semibold);--bulma-pre-font-size: .875em;--bulma-pre-padding: 1.25rem 1.5rem;--bulma-pre-code-font-size: 1em}html{background-color:var(--bulma-body-background-color);font-size:var(--bulma-body-size);-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:var(--bulma-body-min-width);overflow-x:var(--bulma-body-overflow-x);overflow-y:var(--bulma-body-overflow-y);text-rendering:var(--bulma-body-rendering);text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:var(--bulma-body-family)}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:var(--bulma-code-family)}body{color:var(--bulma-body-color);font-size:var(--bulma-body-font-size);font-weight:var(--bulma-body-weight);line-height:var(--bulma-body-line-height)}a,button{cursor:pointer}a:focus-visible,button:focus-visible{outline-color:hsl(var(--bulma-focus-h),var(--bulma-focus-s),var(--bulma-focus-l));outline-offset:var(--bulma-focus-offset);outline-style:var(--bulma-focus-style);outline-width:var(--bulma-focus-width)}a:focus-visible:active,button:focus-visible:active{outline-width:1px}a:active,button:active{outline-width:1px}a{color:var(--bulma-link-text);cursor:pointer;text-decoration:none;transition-duration:var(--bulma-duration);transition-property:background-color,border-color,color}a strong{color:currentColor}button{appearance:none;background:none;border:none;color:inherit;font-family:inherit;font-size:1em;margin:0;padding:0;transition-duration:var(--bulma-duration);transition-property:background-color,border-color,color}code{background-color:var(--bulma-code-background);border-radius:.5em;color:var(--bulma-code);font-size:var(--bulma-code-size);font-weight:var(--bulma-code-weight);padding:var(--bulma-code-padding)}hr{background-color:var(--bulma-hr-background-color);border:none;display:block;height:var(--bulma-hr-height);margin:var(--bulma-hr-margin)}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:var(--bulma-small-font-size)}span{font-style:inherit;font-weight:inherit}strong{color:var(--bulma-strong-color);font-weight:var(--bulma-strong-weight)}svg{height:auto;width:auto}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:var(--bulma-pre-background);color:var(--bulma-pre);font-size:var(--bulma-pre-font-size);overflow-x:auto;padding:var(--bulma-pre-padding);white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:var(--bulma-pre-code-font-size);padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:var(--bulma-text-strong)}@keyframes spinAround{0%{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes pulsate{50%{opacity:.5}}.navbar-link:not(.is-arrowless):after,.select:not(.is-multiple):not(.is-loading):after{border:.125em solid var(--bulma-arrow-color);border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;transition-duration:var(--bulma-duration);transition-property:border-color;width:.625em}.skeleton-block:not(:last-child),.media:not(:last-child),.level:not(:last-child),.fixed-grid:not(:last-child),.grid:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.card:not(:last-child),.breadcrumb:not(:last-child),.field:not(:last-child),.file:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.tags:not(:last-child),.table:not(:last-child),.table-container:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.buttons:not(:last-child),.box:not(:last-child),.block:not(:last-child){margin-bottom:var(--bulma-block-spacing)}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.input,.textarea,.button{align-items:center;appearance:none;border-color:transparent;border-style:solid;border-width:var(--bulma-control-border-width);border-radius:var(--bulma-control-radius);box-shadow:none;display:inline-flex;font-size:var(--bulma-control-size);height:var(--bulma-control-height);justify-content:flex-start;line-height:var(--bulma-control-line-height);padding-bottom:var(--bulma-control-padding-vertical);padding-left:var(--bulma-control-padding-horizontal);padding-right:var(--bulma-control-padding-horizontal);padding-top:var(--bulma-control-padding-vertical);position:relative;transition-duration:var(--bulma-duration);transition-property:background-color,border-color,box-shadow,color;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.input:focus,.textarea:focus,.button:focus,.pagination-previous:focus-visible,.pagination-next:focus-visible,.pagination-link:focus-visible,.pagination-ellipsis:focus-visible,.file-cta:focus-visible,.file-name:focus-visible,.select select:focus-visible,.input:focus-visible,.textarea:focus-visible,.button:focus-visible,.pagination-previous:focus-within,.pagination-next:focus-within,.pagination-link:focus-within,.pagination-ellipsis:focus-within,.file-cta:focus-within,.file-name:focus-within,.select select:focus-within,.input:focus-within,.textarea:focus-within,.button:focus-within,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.input,.is-focused.textarea,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.input:active,.textarea:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.input,.is-active.textarea,.is-active.button{outline:none}[disabled].pagination-previous,[disabled].pagination-next,[disabled].pagination-link,[disabled].pagination-ellipsis,[disabled].file-cta,[disabled].file-name,.select select[disabled],[disabled].input,[disabled].textarea,[disabled].button,fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .input,fieldset[disabled] .textarea,fieldset[disabled] .button{cursor:not-allowed}.modal-close{--bulma-delete-dimensions: 1.25rem;--bulma-delete-background-l: 0%;--bulma-delete-background-alpha: .5;--bulma-delete-color: var(--bulma-white);appearance:none;background-color:hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-delete-background-l),var(--bulma-delete-background-alpha));border:none;border-radius:var(--bulma-radius-rounded);cursor:pointer;pointer-events:auto;display:inline-flex;flex-grow:0;flex-shrink:0;font-size:1em;height:var(--bulma-delete-dimensions);max-height:var(--bulma-delete-dimensions);max-width:var(--bulma-delete-dimensions);min-height:var(--bulma-delete-dimensions);min-width:var(--bulma-delete-dimensions);outline:none;position:relative;vertical-align:top;width:var(--bulma-delete-dimensions)}.modal-close:before,.modal-close:after{background-color:var(--bulma-delete-color);content:"";display:block;left:50%;position:absolute;top:50%;transform:translate(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close:before{height:2px;width:50%}.modal-close:after{height:50%;width:2px}.modal-close:hover,.modal-close:focus{--bulma-delete-background-alpha: .4}.modal-close:active{--bulma-delete-background-alpha: .5}.is-small.modal-close{--bulma-delete-dimensions: 1rem}.is-medium.modal-close{--bulma-delete-dimensions: 1.5rem}.is-large.modal-close{--bulma-delete-dimensions: 2rem}.control.is-loading:after,.select.is-loading:after,.button.is-loading:after{animation:spinAround .5s infinite linear;border:2px solid var(--bulma-loading-color);border-radius:var(--bulma-radius-rounded);border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.is-overlay,.hero-video,.modal,.modal-background{inset:0;position:absolute}.navbar-burger,.menu-list a,.menu-list button,.menu-list .menu-item{appearance:none;background:none;border:none;color:inherit;font-family:inherit;font-size:1em;margin:0;padding:0}.is-unselectable,.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.box{--bulma-box-background-color: var(--bulma-scheme-main);--bulma-box-color: var(--bulma-text);--bulma-box-radius: var(--bulma-radius-large);--bulma-box-shadow: var(--bulma-shadow);--bulma-box-padding: 1.25rem;--bulma-box-link-hover-shadow: 0 .5em 1em -.125em hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .1), 0 0 0 1px var(--bulma-link);--bulma-box-link-active-shadow: inset 0 1px 2px hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .2), 0 0 0 1px var(--bulma-link)}.box{background-color:var(--bulma-box-background-color);border-radius:var(--bulma-box-radius);box-shadow:var(--bulma-box-shadow);color:var(--bulma-box-color);display:block;padding:var(--bulma-box-padding)}a.box:hover,a.box:focus{box-shadow:var(--bulma-box-link-hover-shadow)}a.box:active{box-shadow:var(--bulma-box-link-active-shadow)}.button{--bulma-button-family: false;--bulma-button-weight: var(--bulma-weight-medium);--bulma-button-border-color: var(--bulma-border);--bulma-button-border-style: solid;--bulma-button-border-width: var(--bulma-control-border-width);--bulma-button-padding-vertical: .5em;--bulma-button-padding-horizontal: 1em;--bulma-button-focus-border-color: var(--bulma-link-focus-border);--bulma-button-focus-box-shadow-size: 0 0 0 .125em;--bulma-button-focus-box-shadow-color: hsla(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-link-on-scheme-l), .25);--bulma-button-active-color: var(--bulma-link-active);--bulma-button-active-border-color: var(--bulma-link-active-border);--bulma-button-text-color: var(--bulma-text);--bulma-button-text-decoration: underline;--bulma-button-text-hover-background-color: var(--bulma-background);--bulma-button-text-hover-color: var(--bulma-text-strong);--bulma-button-ghost-background: none;--bulma-button-ghost-border-color: transparent;--bulma-button-ghost-color: var(--bulma-link-text);--bulma-button-ghost-decoration: none;--bulma-button-ghost-hover-color: var(--bulma-link);--bulma-button-ghost-hover-decoration: underline;--bulma-button-disabled-background-color: var(--bulma-scheme-main);--bulma-button-disabled-border-color: var(--bulma-border);--bulma-button-disabled-shadow: none;--bulma-button-disabled-opacity: .5;--bulma-button-static-color: var(--bulma-text-weak);--bulma-button-static-background-color: var(--bulma-scheme-main-ter);--bulma-button-static-border-color: var(--bulma-border)}.button{--bulma-button-h: var(--bulma-scheme-h);--bulma-button-s: var(--bulma-scheme-s);--bulma-button-l: var(--bulma-scheme-main-l);--bulma-button-background-l: var(--bulma-scheme-main-l);--bulma-button-background-l-delta: 0%;--bulma-button-hover-background-l-delta: var(--bulma-hover-background-l-delta);--bulma-button-active-background-l-delta: var(--bulma-active-background-l-delta);--bulma-button-color-l: var(--bulma-text-strong-l);--bulma-button-border-l: var(--bulma-border-l);--bulma-button-border-l-delta: 0%;--bulma-button-hover-border-l-delta: var(--bulma-hover-border-l-delta);--bulma-button-active-border-l-delta: var(--bulma-active-border-l-delta);--bulma-button-focus-border-l-delta: var(--bulma-focus-border-l-delta);--bulma-button-outer-shadow-h: 0;--bulma-button-outer-shadow-s: 0%;--bulma-button-outer-shadow-l: 20%;--bulma-button-outer-shadow-a: .05;--bulma-loading-color: hsl(var(--bulma-button-h), var(--bulma-button-s), var(--bulma-button-color-l));background-color:hsl(var(--bulma-button-h),var(--bulma-button-s),calc(var(--bulma-button-background-l) + var(--bulma-button-background-l-delta)));border-color:hsl(var(--bulma-button-h),var(--bulma-button-s),calc(var(--bulma-button-border-l) + var(--bulma-button-border-l-delta)));border-style:var(--bulma-button-border-style);border-width:var(--bulma-button-border-width);box-shadow:0 .0625em .125em hsla(var(--bulma-button-outer-shadow-h),var(--bulma-button-outer-shadow-s),var(--bulma-button-outer-shadow-l),var(--bulma-button-outer-shadow-a)),0 .125em .25em hsla(var(--bulma-button-outer-shadow-h),var(--bulma-button-outer-shadow-s),var(--bulma-button-outer-shadow-l),var(--bulma-button-outer-shadow-a));color:hsl(var(--bulma-button-h),var(--bulma-button-s),var(--bulma-button-color-l));cursor:pointer;font-weight:var(--bulma-button-weight);height:auto;justify-content:center;padding-bottom:calc(var(--bulma-button-padding-vertical) - var(--bulma-button-border-width));padding-left:calc(var(--bulma-button-padding-horizontal) - var(--bulma-button-border-width));padding-right:calc(var(--bulma-button-padding-horizontal) - var(--bulma-button-border-width));padding-top:calc(var(--bulma-button-padding-vertical) - var(--bulma-button-border-width));text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-inline-start:calc(-.5 * var(--bulma-button-padding-horizontal));margin-inline-end:calc(var(--bulma-button-padding-horizontal) * .25)}.button .icon:last-child:not(:first-child){margin-inline-start:calc(var(--bulma-button-padding-horizontal) * .25);margin-inline-end:calc(-.5 * var(--bulma-button-padding-horizontal))}.button .icon:first-child:last-child{margin-inline-start:calc(-.5 * var(--bulma-button-padding-horizontal));margin-inline-end:calc(-.5 * var(--bulma-button-padding-horizontal))}.button:hover,.button.is-hovered{--bulma-button-background-l-delta: var(--bulma-button-hover-background-l-delta);--bulma-button-border-l-delta: var(--bulma-button-hover-border-l-delta)}.button:focus-visible,.button.is-focused{--bulma-button-border-width: 1px;border-color:hsl(var(--bulma-focus-h),var(--bulma-focus-s),var(--bulma-focus-l));box-shadow:var(--bulma-focus-shadow-size) hsla(var(--bulma-focus-h),var(--bulma-focus-s),var(--bulma-focus-l),var(--bulma-focus-shadow-alpha))}.button:active,.button.is-active{--bulma-button-background-l-delta: var(--bulma-button-active-background-l-delta);--bulma-button-border-l-delta: var(--bulma-button-active-border-l-delta);--bulma-button-outer-shadow-a: 0}.button[disabled],fieldset[disabled] .button{background-color:var(--bulma-button-disabled-background-color);border-color:var(--bulma-button-disabled-border-color);box-shadow:var(--bulma-button-disabled-shadow);opacity:var(--bulma-button-disabled-opacity)}.button.is-white{--bulma-button-h: var(--bulma-white-h);--bulma-button-s: var(--bulma-white-s);--bulma-button-l: var(--bulma-white-l);--bulma-button-background-l: var(--bulma-white-l);--bulma-button-border-l: var(--bulma-white-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-white-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-white:focus-visible,.button.is-white.is-focused{--bulma-button-border-width: 1px}.button.is-white.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-white.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:var(--bulma-white);border-color:var(--bulma-white);box-shadow:none}.button.is-black{--bulma-button-h: var(--bulma-black-h);--bulma-button-s: var(--bulma-black-s);--bulma-button-l: var(--bulma-black-l);--bulma-button-background-l: var(--bulma-black-l);--bulma-button-border-l: var(--bulma-black-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-black-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-black:focus-visible,.button.is-black.is-focused{--bulma-button-border-width: 1px}.button.is-black.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-black.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:var(--bulma-black);border-color:var(--bulma-black);box-shadow:none}.button.is-light{--bulma-button-h: var(--bulma-light-h);--bulma-button-s: var(--bulma-light-s);--bulma-button-l: var(--bulma-light-l);--bulma-button-background-l: var(--bulma-light-l);--bulma-button-border-l: var(--bulma-light-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-light-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-light:focus-visible,.button.is-light.is-focused{--bulma-button-border-width: 1px}.button.is-light.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-light.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:var(--bulma-light);border-color:var(--bulma-light);box-shadow:none}.button.is-dark{--bulma-button-h: var(--bulma-dark-h);--bulma-button-s: var(--bulma-dark-s);--bulma-button-l: var(--bulma-dark-l);--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-border-l: var(--bulma-dark-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-dark-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-dark:focus-visible,.button.is-dark.is-focused{--bulma-button-border-width: 1px}.button.is-dark.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-dark.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:var(--bulma-dark);border-color:var(--bulma-dark);box-shadow:none}.button.is-text{--bulma-button-h: var(--bulma-text-h);--bulma-button-s: var(--bulma-text-s);--bulma-button-l: var(--bulma-text-l);--bulma-button-background-l: var(--bulma-text-l);--bulma-button-border-l: var(--bulma-text-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-text-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-text:focus-visible,.button.is-text.is-focused{--bulma-button-border-width: 1px}.button.is-text.is-light{--bulma-button-background-l: var(--bulma-light-l);--bulma-button-color-l: var(--bulma-text-light-invert-l)}.button.is-text.is-dark{--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-color-l: var(--bulma-text-dark-invert-l)}.button.is-text.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-text.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:var(--bulma-text);border-color:var(--bulma-text);box-shadow:none}.button.is-primary{--bulma-button-h: var(--bulma-primary-h);--bulma-button-s: var(--bulma-primary-s);--bulma-button-l: var(--bulma-primary-l);--bulma-button-background-l: var(--bulma-primary-l);--bulma-button-border-l: var(--bulma-primary-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-primary-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-primary:focus-visible,.button.is-primary.is-focused{--bulma-button-border-width: 1px}.button.is-primary.is-light{--bulma-button-background-l: var(--bulma-light-l);--bulma-button-color-l: var(--bulma-primary-light-invert-l)}.button.is-primary.is-dark{--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-color-l: var(--bulma-primary-dark-invert-l)}.button.is-primary.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-primary.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:var(--bulma-primary);border-color:var(--bulma-primary);box-shadow:none}.button.is-link{--bulma-button-h: var(--bulma-link-h);--bulma-button-s: var(--bulma-link-s);--bulma-button-l: var(--bulma-link-l);--bulma-button-background-l: var(--bulma-link-l);--bulma-button-border-l: var(--bulma-link-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-link-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-link:focus-visible,.button.is-link.is-focused{--bulma-button-border-width: 1px}.button.is-link.is-light{--bulma-button-background-l: var(--bulma-light-l);--bulma-button-color-l: var(--bulma-link-light-invert-l)}.button.is-link.is-dark{--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-color-l: var(--bulma-link-dark-invert-l)}.button.is-link.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-link.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:var(--bulma-link);border-color:var(--bulma-link);box-shadow:none}.button.is-info{--bulma-button-h: var(--bulma-info-h);--bulma-button-s: var(--bulma-info-s);--bulma-button-l: var(--bulma-info-l);--bulma-button-background-l: var(--bulma-info-l);--bulma-button-border-l: var(--bulma-info-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-info-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-info:focus-visible,.button.is-info.is-focused{--bulma-button-border-width: 1px}.button.is-info.is-light{--bulma-button-background-l: var(--bulma-light-l);--bulma-button-color-l: var(--bulma-info-light-invert-l)}.button.is-info.is-dark{--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-color-l: var(--bulma-info-dark-invert-l)}.button.is-info.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-info.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:var(--bulma-info);border-color:var(--bulma-info);box-shadow:none}.button.is-success{--bulma-button-h: var(--bulma-success-h);--bulma-button-s: var(--bulma-success-s);--bulma-button-l: var(--bulma-success-l);--bulma-button-background-l: var(--bulma-success-l);--bulma-button-border-l: var(--bulma-success-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-success-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-success:focus-visible,.button.is-success.is-focused{--bulma-button-border-width: 1px}.button.is-success.is-light{--bulma-button-background-l: var(--bulma-light-l);--bulma-button-color-l: var(--bulma-success-light-invert-l)}.button.is-success.is-dark{--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-color-l: var(--bulma-success-dark-invert-l)}.button.is-success.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-success.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:var(--bulma-success);border-color:var(--bulma-success);box-shadow:none}.button.is-warning{--bulma-button-h: var(--bulma-warning-h);--bulma-button-s: var(--bulma-warning-s);--bulma-button-l: var(--bulma-warning-l);--bulma-button-background-l: var(--bulma-warning-l);--bulma-button-border-l: var(--bulma-warning-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-warning-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-warning:focus-visible,.button.is-warning.is-focused{--bulma-button-border-width: 1px}.button.is-warning.is-light{--bulma-button-background-l: var(--bulma-light-l);--bulma-button-color-l: var(--bulma-warning-light-invert-l)}.button.is-warning.is-dark{--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-color-l: var(--bulma-warning-dark-invert-l)}.button.is-warning.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-warning.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:var(--bulma-warning);border-color:var(--bulma-warning);box-shadow:none}.button.is-danger{--bulma-button-h: var(--bulma-danger-h);--bulma-button-s: var(--bulma-danger-s);--bulma-button-l: var(--bulma-danger-l);--bulma-button-background-l: var(--bulma-danger-l);--bulma-button-border-l: var(--bulma-danger-l);--bulma-button-border-width: 0px;--bulma-button-color-l: var(--bulma-danger-invert-l);--bulma-button-outer-shadow-a: 0}.button.is-danger:focus-visible,.button.is-danger.is-focused{--bulma-button-border-width: 1px}.button.is-danger.is-light{--bulma-button-background-l: var(--bulma-light-l);--bulma-button-color-l: var(--bulma-danger-light-invert-l)}.button.is-danger.is-dark{--bulma-button-background-l: var(--bulma-dark-l);--bulma-button-color-l: var(--bulma-danger-dark-invert-l)}.button.is-danger.is-soft{--bulma-button-background-l: var(--bulma-soft-l);--bulma-button-color-l: var(--bulma-soft-invert-l)}.button.is-danger.is-bold{--bulma-button-background-l: var(--bulma-bold-l);--bulma-button-color-l: var(--bulma-bold-invert-l)}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:var(--bulma-danger);border-color:var(--bulma-danger);box-shadow:none}.button.is-outlined{--bulma-button-border-width: max(1px, .0625em);--bulma-loading-color: hsl(var(--bulma-button-h), var(--bulma-button-s), var(--bulma-button-l));background-color:transparent;border-color:hsl(var(--bulma-button-h),var(--bulma-button-s),var(--bulma-button-l));color:hsl(var(--bulma-button-h),var(--bulma-button-s),var(--bulma-button-l))}.button.is-outlined:hover{--bulma-button-border-width: max(2px, .125em);--bulma-button-outer-shadow-alpha: 1}.button.is-outlined[disabled],fieldset[disabled] .button.is-outlined{background-color:transparent;box-shadow:none}.button.is-inverted{background-color:hsl(var(--bulma-button-h),var(--bulma-button-s),calc(var(--bulma-button-color-l) + var(--bulma-button-background-l-delta)));color:hsl(var(--bulma-button-h),var(--bulma-button-s),var(--bulma-button-background-l))}.button.is-text{background-color:transparent;border-color:transparent;color:var(--bulma-button-text-color);text-decoration:var(--bulma-button-text-decoration)}.button.is-text:hover,.button.is-text.is-hovered{background-color:var(--bulma-button-text-hover-background-color);color:var(--bulma-button-text-hover-color)}.button.is-text:active,.button.is-text.is-active{color:var(--bulma-button-text-hover-color)}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:var(--bulma-button-ghost-background);border-color:var(--bulma-button-ghost-border-color);box-shadow:none;color:var(--bulma-button-ghost-color);text-decoration:var(--bulma-button-ghost-decoration)}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:var(--bulma-button-ghost-hover-color);text-decoration:var(--bulma-button-ghost-hover-decoration)}.button.is-small{--bulma-control-size: var(--bulma-size-small);--bulma-control-radius: var(--bulma-radius-small)}.button.is-normal{--bulma-control-size: var(--bulma-size-normal);--bulma-control-radius: var(--bulma-radius)}.button.is-medium{--bulma-control-size: var(--bulma-size-medium);--bulma-control-radius: var(--bulma-radius-medium)}.button.is-large{--bulma-control-size: var(--bulma-size-large);--bulma-control-radius: var(--bulma-radius-medium)}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{box-shadow:none;color:transparent!important;pointer-events:none}.button.is-loading:after{position:absolute;left:calc(50% - .5em);top:calc(50% - .5em);position:absolute!important}.button.is-static{background-color:var(--bulma-button-static-background-color);border-color:var(--bulma-button-static-border-color);color:var(--bulma-button-static-color);box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:var(--bulma-radius-rounded);padding-left:calc(var(--bulma-button-padding-horizontal) + .25em - var(--bulma-button-border-width));padding-right:calc(var(--bulma-button-padding-horizontal) + .25em - var(--bulma-button-border-width))}.buttons{align-items:center;display:flex;flex-wrap:wrap;gap:.75rem;justify-content:flex-start}.buttons.are-small{--bulma-control-size: var(--bulma-size-small);--bulma-control-radius: var(--bulma-radius-small)}.buttons.are-medium{--bulma-control-size: var(--bulma-size-medium);--bulma-control-radius: var(--bulma-radius-medium)}.buttons.are-large{--bulma-control-size: var(--bulma-size-large);--bulma-control-radius: var(--bulma-radius-large)}.buttons.has-addons{gap:0}.buttons.has-addons .button:not(:first-child){border-end-start-radius:0;border-start-start-radius:0}.buttons.has-addons .button:not(:last-child){border-end-end-radius:0;border-start-end-radius:0;margin-inline-end:-1px}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-right{justify-content:flex-end}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:calc(var(--bulma-size-small) * .75)}.button.is-responsive,.button.is-responsive.is-normal{font-size:calc(var(--bulma-size-small) * .875)}.button.is-responsive.is-medium{font-size:var(--bulma-size-small)}.button.is-responsive.is-large{font-size:var(--bulma-size-normal)}}@media screen and (min-width:769px)and (max-width:1023px){.button.is-responsive.is-small{font-size:calc(var(--bulma-size-small) * .875)}.button.is-responsive,.button.is-responsive.is-normal{font-size:var(--bulma-size-small)}.button.is-responsive.is-medium{font-size:var(--bulma-size-normal)}.button.is-responsive.is-large{font-size:var(--bulma-size-medium)}}.content{--bulma-content-heading-color: var(--bulma-text-strong);--bulma-content-heading-weight: var(--bulma-weight-extrabold);--bulma-content-heading-line-height: 1.125;--bulma-content-block-margin-bottom: 1em;--bulma-content-blockquote-background-color: var(--bulma-background);--bulma-content-blockquote-border-left: 5px solid var(--bulma-border);--bulma-content-blockquote-padding: 1.25em 1.5em;--bulma-content-pre-padding: 1.25em 1.5em;--bulma-content-table-cell-border: 1px solid var(--bulma-border);--bulma-content-table-cell-border-width: 0 0 1px;--bulma-content-table-cell-padding: .5em .75em;--bulma-content-table-cell-heading-color: var(--bulma-text-strong);--bulma-content-table-head-cell-border-width: 0 0 2px;--bulma-content-table-head-cell-color: var(--bulma-text-strong);--bulma-content-table-body-last-row-cell-border-bottom-width: 0;--bulma-content-table-foot-cell-border-width: 2px 0 0;--bulma-content-table-foot-cell-color: var(--bulma-text-strong)}.content li+li{margin-top:.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:var(--bulma-content-block-margin-bottom)}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:var(--bulma-content-heading-color);font-weight:var(--bulma-content-heading-weight);line-height:var(--bulma-content-heading-line-height)}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:var(--bulma-content-blockquote-background-color);border-inline-start:var(--bulma-content-blockquote-border-left);padding:var(--bulma-content-blockquote-padding)}.content ol{list-style-position:outside;margin-inline-start:2em}.content ol:not(:first-child){margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-inline-start:2em}.content ul:not(:first-child){margin-top:1em}.content ul ul{list-style-type:circle;margin-bottom:.25em;margin-top:.25em}.content ul ul ul{list-style-type:square}.content dd{margin-inline-start:2em}.content figure:not([class]){margin-left:2em;margin-right:2em;text-align:center}.content figure:not([class]):not(:first-child){margin-top:2em}.content figure:not([class]):not(:last-child){margin-bottom:2em}.content figure:not([class]) img{display:inline-block}.content figure:not([class]) figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:var(--bulma-content-pre-padding);white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table td,.content table th{border:var(--bulma-content-table-cell-border);border-width:var(--bulma-content-table-cell-border-width);padding:var(--bulma-content-table-cell-padding);vertical-align:top}.content table th{color:var(--bulma-content-table-cell-heading-color)}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:var(--bulma-content-table-head-cell-border-width);color:var(--bulma-content-table-head-cell-color)}.content table tfoot td,.content table tfoot th{border-width:var(--bulma-content-table-foot-cell-border-width);color:var(--bulma-content-table-foot-cell-color)}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:var(--bulma-content-table-body-last-row-cell-border-bottom-width)}.content .tabs li+li{margin-top:0}.content.is-small{font-size:var(--bulma-size-small)}.content.is-normal{font-size:var(--bulma-size-normal)}.content.is-medium{font-size:var(--bulma-size-medium)}.content.is-large{font-size:var(--bulma-size-large)}.delete{--bulma-delete-dimensions: 1.25rem;--bulma-delete-background-l: 0%;--bulma-delete-background-alpha: .5;--bulma-delete-color: var(--bulma-white);appearance:none;background-color:hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-delete-background-l),var(--bulma-delete-background-alpha));border:none;border-radius:var(--bulma-radius-rounded);cursor:pointer;pointer-events:auto;display:inline-flex;flex-grow:0;flex-shrink:0;font-size:1em;height:var(--bulma-delete-dimensions);max-height:var(--bulma-delete-dimensions);max-width:var(--bulma-delete-dimensions);min-height:var(--bulma-delete-dimensions);min-width:var(--bulma-delete-dimensions);outline:none;position:relative;vertical-align:top;width:var(--bulma-delete-dimensions)}.delete:before,.delete:after{background-color:var(--bulma-delete-color);content:"";display:block;left:50%;position:absolute;top:50%;transform:translate(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete:before{height:2px;width:50%}.delete:after{height:50%;width:2px}.delete:hover,.delete:focus{--bulma-delete-background-alpha: .4}.delete:active{--bulma-delete-background-alpha: .5}.delete.is-small{--bulma-delete-dimensions: 1rem}.delete.is-medium{--bulma-delete-dimensions: 1.5rem}.delete.is-large{--bulma-delete-dimensions: 2rem}.icon,.icon-text{--bulma-icon-dimensions: 1.5rem;--bulma-icon-dimensions-small: 1rem;--bulma-icon-dimensions-medium: 2rem;--bulma-icon-dimensions-large: 3rem;--bulma-icon-text-spacing: .25em}.icon{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center;height:var(--bulma-icon-dimensions);transition-duration:var(--bulma-duration);transition-property:color;width:var(--bulma-icon-dimensions)}.icon.is-small{height:var(--bulma-icon-dimensions-small);width:var(--bulma-icon-dimensions-small)}.icon.is-medium{height:var(--bulma-icon-dimensions-medium);width:var(--bulma-icon-dimensions-medium)}.icon.is-large{height:var(--bulma-icon-dimensions-large);width:var(--bulma-icon-dimensions-large)}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;gap:var(--bulma-icon-text-spacing);line-height:var(--bulma-icon-dimensions);vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:var(--bulma-radius-rounded)}.image.is-fullwidth{width:100%}.image.is-square img,.image.is-square .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-square{aspect-ratio:1}.image.is-1by1{aspect-ratio:1/1}.image.is-1by1 img,.image.is-1by1 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-5by4{aspect-ratio:5/4}.image.is-5by4 img,.image.is-5by4 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-4by3{aspect-ratio:4/3}.image.is-4by3 img,.image.is-4by3 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-3by2{aspect-ratio:3/2}.image.is-3by2 img,.image.is-3by2 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-5by3{aspect-ratio:5/3}.image.is-5by3 img,.image.is-5by3 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-16by9{aspect-ratio:16/9}.image.is-16by9 img,.image.is-16by9 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-2by1{aspect-ratio:2/1}.image.is-2by1 img,.image.is-2by1 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-3by1{aspect-ratio:3/1}.image.is-3by1 img,.image.is-3by1 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-4by5{aspect-ratio:4/5}.image.is-4by5 img,.image.is-4by5 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-3by4{aspect-ratio:3/4}.image.is-3by4 img,.image.is-3by4 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-2by3{aspect-ratio:2/3}.image.is-2by3 img,.image.is-2by3 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-3by5{aspect-ratio:3/5}.image.is-3by5 img,.image.is-3by5 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-9by16{aspect-ratio:9/16}.image.is-9by16 img,.image.is-9by16 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-1by2{aspect-ratio:1/2}.image.is-1by2 img,.image.is-1by2 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-1by3{aspect-ratio:1/3}.image.is-1by3 img,.image.is-1by3 .has-ratio{inset:0;position:absolute;height:100%;width:100%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.loader{animation:spinAround .5s infinite linear;border:2px solid var(--bulma-border);border-radius:var(--bulma-radius-rounded);border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.notification{--bulma-notification-h: var(--bulma-scheme-h);--bulma-notification-s: var(--bulma-scheme-s);--bulma-notification-background-l: var(--bulma-background-l);--bulma-notification-color-l: var(--bulma-text-strong-l);--bulma-notification-code-background-color: var(--bulma-scheme-main);--bulma-notification-radius: var(--bulma-radius);--bulma-notification-padding: 1.375em 1.5em}.notification{background-color:hsl(var(--bulma-notification-h),var(--bulma-notification-s),var(--bulma-notification-background-l));border-radius:var(--bulma-notification-radius);color:hsl(var(--bulma-notification-h),var(--bulma-notification-s),var(--bulma-notification-color-l));padding:var(--bulma-notification-padding);position:relative}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:var(--bulma-notification-code-background-color)}.notification pre code{background:transparent}.notification>.delete{position:absolute;inset-inline-end:1rem;top:1rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{--bulma-notification-h: var(--bulma-white-h);--bulma-notification-s: var(--bulma-white-s);--bulma-notification-background-l: var(--bulma-white-l);--bulma-notification-color-l: var(--bulma-white-invert-l)}.notification.is-white.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-white-light-invert-l)}.notification.is-white.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-white-dark-invert-l)}.notification.is-black{--bulma-notification-h: var(--bulma-black-h);--bulma-notification-s: var(--bulma-black-s);--bulma-notification-background-l: var(--bulma-black-l);--bulma-notification-color-l: var(--bulma-black-invert-l)}.notification.is-black.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-black-light-invert-l)}.notification.is-black.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-black-dark-invert-l)}.notification.is-light{--bulma-notification-h: var(--bulma-light-h);--bulma-notification-s: var(--bulma-light-s);--bulma-notification-background-l: var(--bulma-light-l);--bulma-notification-color-l: var(--bulma-light-invert-l)}.notification.is-light.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-light-light-invert-l)}.notification.is-light.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-light-dark-invert-l)}.notification.is-dark{--bulma-notification-h: var(--bulma-dark-h);--bulma-notification-s: var(--bulma-dark-s);--bulma-notification-background-l: var(--bulma-dark-l);--bulma-notification-color-l: var(--bulma-dark-invert-l)}.notification.is-dark.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-dark-light-invert-l)}.notification.is-dark.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-dark-dark-invert-l)}.notification.is-text{--bulma-notification-h: var(--bulma-text-h);--bulma-notification-s: var(--bulma-text-s);--bulma-notification-background-l: var(--bulma-text-l);--bulma-notification-color-l: var(--bulma-text-invert-l)}.notification.is-text.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-text-light-invert-l)}.notification.is-text.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-text-dark-invert-l)}.notification.is-primary{--bulma-notification-h: var(--bulma-primary-h);--bulma-notification-s: var(--bulma-primary-s);--bulma-notification-background-l: var(--bulma-primary-l);--bulma-notification-color-l: var(--bulma-primary-invert-l)}.notification.is-primary.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-primary-light-invert-l)}.notification.is-primary.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-primary-dark-invert-l)}.notification.is-link{--bulma-notification-h: var(--bulma-link-h);--bulma-notification-s: var(--bulma-link-s);--bulma-notification-background-l: var(--bulma-link-l);--bulma-notification-color-l: var(--bulma-link-invert-l)}.notification.is-link.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-link-light-invert-l)}.notification.is-link.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-link-dark-invert-l)}.notification.is-info{--bulma-notification-h: var(--bulma-info-h);--bulma-notification-s: var(--bulma-info-s);--bulma-notification-background-l: var(--bulma-info-l);--bulma-notification-color-l: var(--bulma-info-invert-l)}.notification.is-info.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-info-light-invert-l)}.notification.is-info.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-info-dark-invert-l)}.notification.is-success{--bulma-notification-h: var(--bulma-success-h);--bulma-notification-s: var(--bulma-success-s);--bulma-notification-background-l: var(--bulma-success-l);--bulma-notification-color-l: var(--bulma-success-invert-l)}.notification.is-success.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-success-light-invert-l)}.notification.is-success.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-success-dark-invert-l)}.notification.is-warning{--bulma-notification-h: var(--bulma-warning-h);--bulma-notification-s: var(--bulma-warning-s);--bulma-notification-background-l: var(--bulma-warning-l);--bulma-notification-color-l: var(--bulma-warning-invert-l)}.notification.is-warning.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-warning-light-invert-l)}.notification.is-warning.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-warning-dark-invert-l)}.notification.is-danger{--bulma-notification-h: var(--bulma-danger-h);--bulma-notification-s: var(--bulma-danger-s);--bulma-notification-background-l: var(--bulma-danger-l);--bulma-notification-color-l: var(--bulma-danger-invert-l)}.notification.is-danger.is-light{--bulma-notification-background-l: 90%;--bulma-notification-color-l: var(--bulma-danger-light-invert-l)}.notification.is-danger.is-dark{--bulma-notification-background-l: 20%;--bulma-notification-color-l: var(--bulma-danger-dark-invert-l)}.progress{--bulma-progress-border-radius: var(--bulma-radius-rounded);--bulma-progress-bar-background-color: var(--bulma-border-weak);--bulma-progress-value-background-color: var(--bulma-text);--bulma-progress-indeterminate-duration: 1.5s}.progress{appearance:none;border:none;border-radius:var(--bulma-progress-border-radius);display:block;height:var(--bulma-size-normal);overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:var(--bulma-progress-bar-background-color)}.progress::-webkit-progress-value{background-color:var(--bulma-progress-value-background-color)}.progress::-moz-progress-bar{background-color:var(--bulma-progress-value-background-color)}.progress::-ms-fill{background-color:var(--bulma-progress-value-background-color);border:none}.progress.is-white{--bulma-progress-value-background-color: var(--bulma-white)}.progress.is-black{--bulma-progress-value-background-color: var(--bulma-black)}.progress.is-light{--bulma-progress-value-background-color: var(--bulma-light)}.progress.is-dark{--bulma-progress-value-background-color: var(--bulma-dark)}.progress.is-text{--bulma-progress-value-background-color: var(--bulma-text)}.progress.is-primary{--bulma-progress-value-background-color: var(--bulma-primary)}.progress.is-link{--bulma-progress-value-background-color: var(--bulma-link)}.progress.is-info{--bulma-progress-value-background-color: var(--bulma-info)}.progress.is-success{--bulma-progress-value-background-color: var(--bulma-success)}.progress.is-warning{--bulma-progress-value-background-color: var(--bulma-warning)}.progress.is-danger{--bulma-progress-value-background-color: var(--bulma-danger)}.progress:indeterminate{animation-duration:var(--bulma-progress-indeterminate-duration);animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:var(--bulma-progress-bar-background-color);background-image:linear-gradient(to right,var(--bulma-progress-value-background-color) 30%,var(--bulma-progress-bar-background-color) 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:var(--bulma-size-small)}.progress.is-medium{height:var(--bulma-size-medium)}.progress.is-large{height:var(--bulma-size-large)}@keyframes moveIndeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}.table{--bulma-table-color: var(--bulma-text-strong);--bulma-table-background-color: var(--bulma-scheme-main);--bulma-table-cell-border-color: var(--bulma-border);--bulma-table-cell-border-style: solid;--bulma-table-cell-border-width: 0 0 1px;--bulma-table-cell-padding: .5em .75em;--bulma-table-cell-heading-color: var(--bulma-text-strong);--bulma-table-cell-text-align: left;--bulma-table-head-cell-border-width: 0 0 2px;--bulma-table-head-cell-color: var(--bulma-text-strong);--bulma-table-foot-cell-border-width: 2px 0 0;--bulma-table-foot-cell-color: var(--bulma-text-strong);--bulma-table-head-background-color: transparent;--bulma-table-body-background-color: transparent;--bulma-table-foot-background-color: transparent;--bulma-table-row-hover-background-color: var(--bulma-scheme-main-bis);--bulma-table-row-active-background-color: var(--bulma-primary);--bulma-table-row-active-color: var(--bulma-primary-invert);--bulma-table-striped-row-even-background-color: var(--bulma-scheme-main-bis);--bulma-table-striped-row-even-hover-background-color: var(--bulma-scheme-main-ter)}.table{background-color:var(--bulma-table-background-color);color:var(--bulma-table-color)}.table td,.table th{background-color:var(--bulma-table-cell-background-color);border-color:var(--bulma-table-cell-border-color);border-style:var(--bulma-table-cell-border-style);border-width:var(--bulma-table-cell-border-width);color:var(--bulma-table-color);padding:var(--bulma-table-cell-padding);vertical-align:top}.table td.is-white,.table th.is-white{--bulma-table-color: var(--bulma-white-invert);--bulma-table-cell-heading-color: var(--bulma-white-invert);--bulma-table-cell-background-color: var(--bulma-white);--bulma-table-cell-border-color: var(--bulma-white)}.table td.is-black,.table th.is-black{--bulma-table-color: var(--bulma-black-invert);--bulma-table-cell-heading-color: var(--bulma-black-invert);--bulma-table-cell-background-color: var(--bulma-black);--bulma-table-cell-border-color: var(--bulma-black)}.table td.is-light,.table th.is-light{--bulma-table-color: var(--bulma-light-invert);--bulma-table-cell-heading-color: var(--bulma-light-invert);--bulma-table-cell-background-color: var(--bulma-light);--bulma-table-cell-border-color: var(--bulma-light)}.table td.is-dark,.table th.is-dark{--bulma-table-color: var(--bulma-dark-invert);--bulma-table-cell-heading-color: var(--bulma-dark-invert);--bulma-table-cell-background-color: var(--bulma-dark);--bulma-table-cell-border-color: var(--bulma-dark)}.table td.is-text,.table th.is-text{--bulma-table-color: var(--bulma-text-invert);--bulma-table-cell-heading-color: var(--bulma-text-invert);--bulma-table-cell-background-color: var(--bulma-text);--bulma-table-cell-border-color: var(--bulma-text)}.table td.is-primary,.table th.is-primary{--bulma-table-color: var(--bulma-primary-invert);--bulma-table-cell-heading-color: var(--bulma-primary-invert);--bulma-table-cell-background-color: var(--bulma-primary);--bulma-table-cell-border-color: var(--bulma-primary)}.table td.is-link,.table th.is-link{--bulma-table-color: var(--bulma-link-invert);--bulma-table-cell-heading-color: var(--bulma-link-invert);--bulma-table-cell-background-color: var(--bulma-link);--bulma-table-cell-border-color: var(--bulma-link)}.table td.is-info,.table th.is-info{--bulma-table-color: var(--bulma-info-invert);--bulma-table-cell-heading-color: var(--bulma-info-invert);--bulma-table-cell-background-color: var(--bulma-info);--bulma-table-cell-border-color: var(--bulma-info)}.table td.is-success,.table th.is-success{--bulma-table-color: var(--bulma-success-invert);--bulma-table-cell-heading-color: var(--bulma-success-invert);--bulma-table-cell-background-color: var(--bulma-success);--bulma-table-cell-border-color: var(--bulma-success)}.table td.is-warning,.table th.is-warning{--bulma-table-color: var(--bulma-warning-invert);--bulma-table-cell-heading-color: var(--bulma-warning-invert);--bulma-table-cell-background-color: var(--bulma-warning);--bulma-table-cell-border-color: var(--bulma-warning)}.table td.is-danger,.table th.is-danger{--bulma-table-color: var(--bulma-danger-invert);--bulma-table-cell-heading-color: var(--bulma-danger-invert);--bulma-table-cell-background-color: var(--bulma-danger);--bulma-table-cell-border-color: var(--bulma-danger)}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:var(--bulma-table-row-active-background-color);color:var(--bulma-table-row-active-color)}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:var(--bulma-table-cell-heading-color)}.table th:not([align]){text-align:var(--bulma-table-cell-text-align)}.table tr.is-selected{background-color:var(--bulma-table-row-active-background-color);color:var(--bulma-table-row-active-color)}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:var(--bulma-table-row-active-color);color:currentColor}.table tr.is-white{--bulma-table-color: var(--bulma-white-invert);--bulma-table-cell-heading-color: var(--bulma-white-invert);--bulma-table-cell-background-color: var(--bulma-white);--bulma-table-cell-border-color: var(--bulma-white)}.table tr.is-black{--bulma-table-color: var(--bulma-black-invert);--bulma-table-cell-heading-color: var(--bulma-black-invert);--bulma-table-cell-background-color: var(--bulma-black);--bulma-table-cell-border-color: var(--bulma-black)}.table tr.is-light{--bulma-table-color: var(--bulma-light-invert);--bulma-table-cell-heading-color: var(--bulma-light-invert);--bulma-table-cell-background-color: var(--bulma-light);--bulma-table-cell-border-color: var(--bulma-light)}.table tr.is-dark{--bulma-table-color: var(--bulma-dark-invert);--bulma-table-cell-heading-color: var(--bulma-dark-invert);--bulma-table-cell-background-color: var(--bulma-dark);--bulma-table-cell-border-color: var(--bulma-dark)}.table tr.is-text{--bulma-table-color: var(--bulma-text-invert);--bulma-table-cell-heading-color: var(--bulma-text-invert);--bulma-table-cell-background-color: var(--bulma-text);--bulma-table-cell-border-color: var(--bulma-text)}.table tr.is-primary{--bulma-table-color: var(--bulma-primary-invert);--bulma-table-cell-heading-color: var(--bulma-primary-invert);--bulma-table-cell-background-color: var(--bulma-primary);--bulma-table-cell-border-color: var(--bulma-primary)}.table tr.is-link{--bulma-table-color: var(--bulma-link-invert);--bulma-table-cell-heading-color: var(--bulma-link-invert);--bulma-table-cell-background-color: var(--bulma-link);--bulma-table-cell-border-color: var(--bulma-link)}.table tr.is-info{--bulma-table-color: var(--bulma-info-invert);--bulma-table-cell-heading-color: var(--bulma-info-invert);--bulma-table-cell-background-color: var(--bulma-info);--bulma-table-cell-border-color: var(--bulma-info)}.table tr.is-success{--bulma-table-color: var(--bulma-success-invert);--bulma-table-cell-heading-color: var(--bulma-success-invert);--bulma-table-cell-background-color: var(--bulma-success);--bulma-table-cell-border-color: var(--bulma-success)}.table tr.is-warning{--bulma-table-color: var(--bulma-warning-invert);--bulma-table-cell-heading-color: var(--bulma-warning-invert);--bulma-table-cell-background-color: var(--bulma-warning);--bulma-table-cell-border-color: var(--bulma-warning)}.table tr.is-danger{--bulma-table-color: var(--bulma-danger-invert);--bulma-table-cell-heading-color: var(--bulma-danger-invert);--bulma-table-cell-background-color: var(--bulma-danger);--bulma-table-cell-border-color: var(--bulma-danger)}.table thead{background-color:var(--bulma-table-head-background-color)}.table thead td,.table thead th{border-width:var(--bulma-table-head-cell-border-width);color:var(--bulma-table-head-cell-color)}.table tfoot{background-color:var(--bulma-table-foot-background-color)}.table tfoot td,.table tfoot th{border-width:var(--bulma-table-foot-cell-border-width);color:var(--bulma-table-foot-cell-color)}.table tbody{background-color:var(--bulma-table-body-background-color)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:var(--bulma-table-row-hover-background-color)}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:var(--bulma-table-row-hover-background-color)}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:var(--bulma-table-striped-row-even-hover-background-color)}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:var(--bulma-table-striped-row-even-background-color)}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;color:hsl(var(--bulma-tag-h),var(--bulma-tag-s),var(--bulma-tag-color-l));display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-start}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:var(--bulma-size-normal)}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:var(--bulma-size-medium)}.tags.is-centered{gap:.25rem;justify-content:center}.tags.is-right{justify-content:flex-end}.tags.has-addons{gap:0}.tags.has-addons .tag:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.tags.has-addons .tag:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.tag{--bulma-tag-h: var(--bulma-scheme-h);--bulma-tag-s: var(--bulma-scheme-s);--bulma-tag-background-l: var(--bulma-background-l);--bulma-tag-background-l-delta: 0%;--bulma-tag-hover-background-l-delta: var(--bulma-hover-background-l-delta);--bulma-tag-active-background-l-delta: var(--bulma-active-background-l-delta);--bulma-tag-color-l: var(--bulma-text-l);--bulma-tag-radius: var(--bulma-radius);--bulma-tag-delete-margin: 1px;align-items:center;background-color:hsl(var(--bulma-tag-h),var(--bulma-tag-s),calc(var(--bulma-tag-background-l) + var(--bulma-tag-background-l-delta)));border-radius:var(--bulma-radius);color:hsl(var(--bulma-tag-h),var(--bulma-tag-s),var(--bulma-tag-color-l));display:inline-flex;font-size:var(--bulma-size-small);height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag .delete{margin-inline-start:.25rem;margin-inline-end:-.375rem}.tag.is-white{--bulma-tag-h: var(--bulma-white-h);--bulma-tag-s: var(--bulma-white-s);--bulma-tag-background-l: var(--bulma-white-l);--bulma-tag-color-l: var(--bulma-white-invert-l)}.tag.is-white.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-white-light-invert-l)}.tag.is-black{--bulma-tag-h: var(--bulma-black-h);--bulma-tag-s: var(--bulma-black-s);--bulma-tag-background-l: var(--bulma-black-l);--bulma-tag-color-l: var(--bulma-black-invert-l)}.tag.is-black.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-black-light-invert-l)}.tag.is-light{--bulma-tag-h: var(--bulma-light-h);--bulma-tag-s: var(--bulma-light-s);--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-light-invert-l)}.tag.is-light.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-light-light-invert-l)}.tag.is-dark{--bulma-tag-h: var(--bulma-dark-h);--bulma-tag-s: var(--bulma-dark-s);--bulma-tag-background-l: var(--bulma-dark-l);--bulma-tag-color-l: var(--bulma-dark-invert-l)}.tag.is-dark.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-dark-light-invert-l)}.tag.is-text{--bulma-tag-h: var(--bulma-text-h);--bulma-tag-s: var(--bulma-text-s);--bulma-tag-background-l: var(--bulma-text-l);--bulma-tag-color-l: var(--bulma-text-invert-l)}.tag.is-text.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-text-light-invert-l)}.tag.is-primary{--bulma-tag-h: var(--bulma-primary-h);--bulma-tag-s: var(--bulma-primary-s);--bulma-tag-background-l: var(--bulma-primary-l);--bulma-tag-color-l: var(--bulma-primary-invert-l)}.tag.is-primary.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-primary-light-invert-l)}.tag.is-link{--bulma-tag-h: var(--bulma-link-h);--bulma-tag-s: var(--bulma-link-s);--bulma-tag-background-l: var(--bulma-link-l);--bulma-tag-color-l: var(--bulma-link-invert-l)}.tag.is-link.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-link-light-invert-l)}.tag.is-info{--bulma-tag-h: var(--bulma-info-h);--bulma-tag-s: var(--bulma-info-s);--bulma-tag-background-l: var(--bulma-info-l);--bulma-tag-color-l: var(--bulma-info-invert-l)}.tag.is-info.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-info-light-invert-l)}.tag.is-success{--bulma-tag-h: var(--bulma-success-h);--bulma-tag-s: var(--bulma-success-s);--bulma-tag-background-l: var(--bulma-success-l);--bulma-tag-color-l: var(--bulma-success-invert-l)}.tag.is-success.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-success-light-invert-l)}.tag.is-warning{--bulma-tag-h: var(--bulma-warning-h);--bulma-tag-s: var(--bulma-warning-s);--bulma-tag-background-l: var(--bulma-warning-l);--bulma-tag-color-l: var(--bulma-warning-invert-l)}.tag.is-warning.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-warning-light-invert-l)}.tag.is-danger{--bulma-tag-h: var(--bulma-danger-h);--bulma-tag-s: var(--bulma-danger-s);--bulma-tag-background-l: var(--bulma-danger-l);--bulma-tag-color-l: var(--bulma-danger-invert-l)}.tag.is-danger.is-light{--bulma-tag-background-l: var(--bulma-light-l);--bulma-tag-color-l: var(--bulma-danger-light-invert-l)}.tag.is-normal{font-size:var(--bulma-size-small)}.tag.is-medium{font-size:var(--bulma-size-normal)}.tag.is-large{font-size:var(--bulma-size-medium)}.tag .icon:first-child:not(:last-child){margin-inline-start:-.375em;margin-inline-end:.1875em}.tag .icon:last-child:not(:first-child){margin-inline-start:.1875em;margin-inline-end:-.375em}.tag .icon:first-child:last-child{margin-inline-start:-.375em;margin-inline-end:-.375em}.tag.is-delete{margin-inline-start:var(--bulma-tag-delete-margin);padding:0;position:relative;width:2em}.tag.is-delete:before,.tag.is-delete:after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translate(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:before{height:1px;width:50%}.tag.is-delete:after{height:50%;width:1px}.tag.is-rounded{border-radius:var(--bulma-radius-rounded)}a.tag,button.tag,.tag.is-hoverable{cursor:pointer}a.tag:hover,button.tag:hover,.tag.is-hoverable:hover{--bulma-tag-background-l-delta: var(--bulma-tag-hover-background-l-delta)}a.tag:active,button.tag:active,.tag.is-hoverable:active{--bulma-tag-background-l-delta: var(--bulma-tag-active-background-l-delta)}.title,.subtitle{--bulma-title-color: var(--bulma-text-strong);--bulma-title-family: false;--bulma-title-size: var(--bulma-size-3);--bulma-title-weight: 600;--bulma-title-line-height: 1.125;--bulma-title-strong-color: inherit;--bulma-title-strong-weight: inherit;--bulma-title-sub-size: .75em;--bulma-title-sup-size: .75em;--bulma-subtitle-color: var(--bulma-text);--bulma-subtitle-family: false;--bulma-subtitle-size: var(--bulma-size-5);--bulma-subtitle-weight: var(--bulma-weight-normal);--bulma-subtitle-line-height: 1.25;--bulma-subtitle-strong-color: var(--bulma-text-strong);--bulma-subtitle-strong-weight: var(--bulma-weight-semibold)}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:var(--bulma-title-sub-size)}.title sup,.subtitle sup{font-size:var(--bulma-title-sup-size)}.title .tag,.subtitle .tag{vertical-align:middle}.title{color:var(--bulma-title-color);font-size:var(--bulma-title-size);font-weight:var(--bulma-title-weight);line-height:var(--bulma-title-line-height)}.title strong{color:var(--bulma-title-strong-color);font-weight:var(--bulma-title-strong-weight)}.title:not(.is-spaced):has(+.subtitle){margin-bottom:0}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:var(--bulma-subtitle-color);font-size:var(--bulma-subtitle-size);font-weight:var(--bulma-subtitle-weight);line-height:var(--bulma-subtitle-line-height)}.subtitle strong{color:var(--bulma-subtitle-strong-color);font-weight:var(--bulma-subtitle-strong-weight)}.subtitle:not(.is-spaced):has(+.title){margin-bottom:0}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.control,.input,.textarea,.select{--bulma-input-h: var(--bulma-scheme-h);--bulma-input-s: var(--bulma-scheme-s);--bulma-input-l: var(--bulma-scheme-main-l);--bulma-input-border-style: solid;--bulma-input-border-width: var(--bulma-control-border-width);--bulma-input-border-l: var(--bulma-border-l);--bulma-input-border-l-delta: 0%;--bulma-input-border-color: hsl(var(--bulma-input-h), var(--bulma-input-s), calc(var(--bulma-input-border-l) + var(--bulma-input-border-l-delta)));--bulma-input-hover-border-l-delta: var(--bulma-hover-border-l-delta);--bulma-input-active-border-l-delta: var(--bulma-active-border-l-delta);--bulma-input-focus-h: var(--bulma-focus-h);--bulma-input-focus-s: var(--bulma-focus-s);--bulma-input-focus-l: var(--bulma-focus-l);--bulma-input-focus-shadow-size: var(--bulma-focus-shadow-size);--bulma-input-focus-shadow-alpha: var(--bulma-focus-shadow-alpha);--bulma-input-color-l: var(--bulma-text-strong-l);--bulma-input-background-l: var(--bulma-scheme-main-l);--bulma-input-background-l-delta: 0%;--bulma-input-height: var(--bulma-control-height);--bulma-input-shadow: inset 0 .0625em .125em hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .05);--bulma-input-placeholder-color: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-strong-l), .3);--bulma-input-disabled-color: var(--bulma-text-weak);--bulma-input-disabled-background-color: var(--bulma-background);--bulma-input-disabled-border-color: var(--bulma-background);--bulma-input-disabled-placeholder-color: hsla(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-text-weak-l), .3);--bulma-input-arrow: var(--bulma-link);--bulma-input-icon-color: var(--bulma-text-light);--bulma-input-icon-hover-color: var(--bulma-text-weak);--bulma-input-icon-focus-color: var(--bulma-link);--bulma-input-radius: var(--bulma-radius)}.select select,.input,.textarea{background-color:hsl(var(--bulma-input-h),var(--bulma-input-s),calc(var(--bulma-input-background-l) + var(--bulma-input-background-l-delta)));border-color:var(--bulma-input-border-color);border-radius:var(--bulma-input-radius);color:hsl(var(--bulma-input-h),var(--bulma-input-s),var(--bulma-input-color-l))}.select select::-moz-placeholder,.input::-moz-placeholder,.textarea::-moz-placeholder{color:var(--bulma-input-placeholder-color)}.select select::-webkit-input-placeholder,.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:var(--bulma-input-placeholder-color)}.select select:-moz-placeholder,.input:-moz-placeholder,.textarea:-moz-placeholder{color:var(--bulma-input-placeholder-color)}.select select:-ms-input-placeholder,.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:var(--bulma-input-placeholder-color)}.select select:hover,.input:hover,.textarea:hover,.select select.is-hovered,.is-hovered.input,.is-hovered.textarea{--bulma-input-border-l-delta: var(--bulma-input-hover-border-l-delta)}.select select:active,.input:active,.textarea:active,.select select.is-active,.is-active.input,.is-active.textarea{--bulma-input-border-l-delta: var(--bulma-input-active-border-l-delta)}.select select:focus,.input:focus,.textarea:focus,.select select:focus-within,.input:focus-within,.textarea:focus-within,.select select.is-focused,.is-focused.input,.is-focused.textarea{border-color:hsl(var(--bulma-input-focus-h),var(--bulma-input-focus-s),var(--bulma-input-focus-l));box-shadow:var(--bulma-input-focus-shadow-size) hsla(var(--bulma-input-focus-h),var(--bulma-input-focus-s),var(--bulma-input-focus-l),var(--bulma-input-focus-shadow-alpha))}.select select[disabled],[disabled].input,[disabled].textarea,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .input,fieldset[disabled] .textarea{background-color:var(--bulma-input-disabled-background-color);border-color:var(--bulma-input-disabled-border-color);box-shadow:none;color:var(--bulma-input-disabled-color)}.select select[disabled]::-moz-placeholder,[disabled].input::-moz-placeholder,[disabled].textarea::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:var(--bulma-input-disabled-placeholder-color)}.select select[disabled]::-webkit-input-placeholder,[disabled].input::-webkit-input-placeholder,[disabled].textarea::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:var(--bulma-input-disabled-placeholder-color)}.select select[disabled]:-moz-placeholder,[disabled].input:-moz-placeholder,[disabled].textarea:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:var(--bulma-input-disabled-placeholder-color)}.select select[disabled]:-ms-input-placeholder,[disabled].input:-ms-input-placeholder,[disabled].textarea:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:var(--bulma-input-disabled-placeholder-color)}.textarea,.input{box-shadow:inset 0 .0625em .125em hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-scheme-invert-l),.05);max-width:100%;width:100%}[readonly].textarea,[readonly].input{box-shadow:none}.is-white.textarea,.is-white.input{--bulma-input-h: var(--bulma-white-h);--bulma-input-s: var(--bulma-white-s);--bulma-input-l: var(--bulma-white-l);--bulma-input-focus-h: var(--bulma-white-h);--bulma-input-focus-s: var(--bulma-white-s);--bulma-input-focus-l: var(--bulma-white-l);--bulma-input-border-l: var(--bulma-white-l)}.is-black.textarea,.is-black.input{--bulma-input-h: var(--bulma-black-h);--bulma-input-s: var(--bulma-black-s);--bulma-input-l: var(--bulma-black-l);--bulma-input-focus-h: var(--bulma-black-h);--bulma-input-focus-s: var(--bulma-black-s);--bulma-input-focus-l: var(--bulma-black-l);--bulma-input-border-l: var(--bulma-black-l)}.is-light.textarea,.is-light.input{--bulma-input-h: var(--bulma-light-h);--bulma-input-s: var(--bulma-light-s);--bulma-input-l: var(--bulma-light-l);--bulma-input-focus-h: var(--bulma-light-h);--bulma-input-focus-s: var(--bulma-light-s);--bulma-input-focus-l: var(--bulma-light-l);--bulma-input-border-l: var(--bulma-light-l)}.is-dark.textarea,.is-dark.input{--bulma-input-h: var(--bulma-dark-h);--bulma-input-s: var(--bulma-dark-s);--bulma-input-l: var(--bulma-dark-l);--bulma-input-focus-h: var(--bulma-dark-h);--bulma-input-focus-s: var(--bulma-dark-s);--bulma-input-focus-l: var(--bulma-dark-l);--bulma-input-border-l: var(--bulma-dark-l)}.is-text.textarea,.is-text.input{--bulma-input-h: var(--bulma-text-h);--bulma-input-s: var(--bulma-text-s);--bulma-input-l: var(--bulma-text-l);--bulma-input-focus-h: var(--bulma-text-h);--bulma-input-focus-s: var(--bulma-text-s);--bulma-input-focus-l: var(--bulma-text-l);--bulma-input-border-l: var(--bulma-text-l)}.is-primary.textarea,.is-primary.input{--bulma-input-h: var(--bulma-primary-h);--bulma-input-s: var(--bulma-primary-s);--bulma-input-l: var(--bulma-primary-l);--bulma-input-focus-h: var(--bulma-primary-h);--bulma-input-focus-s: var(--bulma-primary-s);--bulma-input-focus-l: var(--bulma-primary-l);--bulma-input-border-l: var(--bulma-primary-l)}.is-link.textarea,.is-link.input{--bulma-input-h: var(--bulma-link-h);--bulma-input-s: var(--bulma-link-s);--bulma-input-l: var(--bulma-link-l);--bulma-input-focus-h: var(--bulma-link-h);--bulma-input-focus-s: var(--bulma-link-s);--bulma-input-focus-l: var(--bulma-link-l);--bulma-input-border-l: var(--bulma-link-l)}.is-info.textarea,.is-info.input{--bulma-input-h: var(--bulma-info-h);--bulma-input-s: var(--bulma-info-s);--bulma-input-l: var(--bulma-info-l);--bulma-input-focus-h: var(--bulma-info-h);--bulma-input-focus-s: var(--bulma-info-s);--bulma-input-focus-l: var(--bulma-info-l);--bulma-input-border-l: var(--bulma-info-l)}.is-success.textarea,.is-success.input{--bulma-input-h: var(--bulma-success-h);--bulma-input-s: var(--bulma-success-s);--bulma-input-l: var(--bulma-success-l);--bulma-input-focus-h: var(--bulma-success-h);--bulma-input-focus-s: var(--bulma-success-s);--bulma-input-focus-l: var(--bulma-success-l);--bulma-input-border-l: var(--bulma-success-l)}.is-warning.textarea,.is-warning.input{--bulma-input-h: var(--bulma-warning-h);--bulma-input-s: var(--bulma-warning-s);--bulma-input-l: var(--bulma-warning-l);--bulma-input-focus-h: var(--bulma-warning-h);--bulma-input-focus-s: var(--bulma-warning-s);--bulma-input-focus-l: var(--bulma-warning-l);--bulma-input-border-l: var(--bulma-warning-l)}.is-danger.textarea,.is-danger.input{--bulma-input-h: var(--bulma-danger-h);--bulma-input-s: var(--bulma-danger-s);--bulma-input-l: var(--bulma-danger-l);--bulma-input-focus-h: var(--bulma-danger-h);--bulma-input-focus-s: var(--bulma-danger-s);--bulma-input-focus-l: var(--bulma-danger-l);--bulma-input-border-l: var(--bulma-danger-l)}.is-small.textarea,.is-small.input{border-radius:var(--bulma-radius-small);font-size:var(--bulma-size-small)}.is-medium.textarea,.is-medium.input{font-size:var(--bulma-size-medium)}.is-large.textarea,.is-large.input{font-size:var(--bulma-size-large)}.is-fullwidth.textarea,.is-fullwidth.input{display:block;width:100%}.is-inline.textarea,.is-inline.input{display:inline;width:auto}.input.is-rounded{border-radius:var(--bulma-radius-rounded);padding-left:calc(1.125em - 1px);padding-right:calc(1.125em - 1px)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{--bulma-textarea-padding: var(--bulma-control-padding-horizontal);--bulma-textarea-max-height: 40em;--bulma-textarea-min-height: 8em;display:block;max-width:100%;min-width:100%;padding:var(--bulma-textarea-padding);resize:vertical}.textarea:not([rows]){max-height:var(--bulma-textarea-max-height);min-height:var(--bulma-textarea-min-height)}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}[disabled].radio,[disabled].checkbox,fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:var(--bulma-text-weak);cursor:not-allowed}.checkboxes,.radios{display:flex;flex-wrap:wrap;column-gap:1em;row-gap:.5em}.select{--bulma-input-h: var(--bulma-scheme-h);--bulma-input-s: var(--bulma-scheme-s);--bulma-input-border-style: solid;--bulma-input-border-width: 1px;--bulma-input-border-l: var(--bulma-border-l);display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:var(--bulma-control-height)}.select:not(.is-multiple):not(.is-loading):after{inset-inline-end:1.125em;z-index:4}.select.is-rounded select{border-radius:var(--bulma-radius-rounded);padding-inline-start:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:var(--bulma-background)}.select select:not([multiple]){padding-inline-end:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select.is-white{--bulma-input-h: var(--bulma-white-h);--bulma-input-s: var(--bulma-white-s);--bulma-input-l: var(--bulma-white-l);--bulma-input-focus-h: var(--bulma-white-h);--bulma-input-focus-s: var(--bulma-white-s);--bulma-input-focus-l: var(--bulma-white-l);--bulma-input-border-l: var(--bulma-white-l);--bulma-arrow-color: var(--bulma-white)}.select.is-black{--bulma-input-h: var(--bulma-black-h);--bulma-input-s: var(--bulma-black-s);--bulma-input-l: var(--bulma-black-l);--bulma-input-focus-h: var(--bulma-black-h);--bulma-input-focus-s: var(--bulma-black-s);--bulma-input-focus-l: var(--bulma-black-l);--bulma-input-border-l: var(--bulma-black-l);--bulma-arrow-color: var(--bulma-black)}.select.is-light{--bulma-input-h: var(--bulma-light-h);--bulma-input-s: var(--bulma-light-s);--bulma-input-l: var(--bulma-light-l);--bulma-input-focus-h: var(--bulma-light-h);--bulma-input-focus-s: var(--bulma-light-s);--bulma-input-focus-l: var(--bulma-light-l);--bulma-input-border-l: var(--bulma-light-l);--bulma-arrow-color: var(--bulma-light)}.select.is-dark{--bulma-input-h: var(--bulma-dark-h);--bulma-input-s: var(--bulma-dark-s);--bulma-input-l: var(--bulma-dark-l);--bulma-input-focus-h: var(--bulma-dark-h);--bulma-input-focus-s: var(--bulma-dark-s);--bulma-input-focus-l: var(--bulma-dark-l);--bulma-input-border-l: var(--bulma-dark-l);--bulma-arrow-color: var(--bulma-dark)}.select.is-text{--bulma-input-h: var(--bulma-text-h);--bulma-input-s: var(--bulma-text-s);--bulma-input-l: var(--bulma-text-l);--bulma-input-focus-h: var(--bulma-text-h);--bulma-input-focus-s: var(--bulma-text-s);--bulma-input-focus-l: var(--bulma-text-l);--bulma-input-border-l: var(--bulma-text-l);--bulma-arrow-color: var(--bulma-text)}.select.is-primary{--bulma-input-h: var(--bulma-primary-h);--bulma-input-s: var(--bulma-primary-s);--bulma-input-l: var(--bulma-primary-l);--bulma-input-focus-h: var(--bulma-primary-h);--bulma-input-focus-s: var(--bulma-primary-s);--bulma-input-focus-l: var(--bulma-primary-l);--bulma-input-border-l: var(--bulma-primary-l);--bulma-arrow-color: var(--bulma-primary)}.select.is-link{--bulma-input-h: var(--bulma-link-h);--bulma-input-s: var(--bulma-link-s);--bulma-input-l: var(--bulma-link-l);--bulma-input-focus-h: var(--bulma-link-h);--bulma-input-focus-s: var(--bulma-link-s);--bulma-input-focus-l: var(--bulma-link-l);--bulma-input-border-l: var(--bulma-link-l);--bulma-arrow-color: var(--bulma-link)}.select.is-info{--bulma-input-h: var(--bulma-info-h);--bulma-input-s: var(--bulma-info-s);--bulma-input-l: var(--bulma-info-l);--bulma-input-focus-h: var(--bulma-info-h);--bulma-input-focus-s: var(--bulma-info-s);--bulma-input-focus-l: var(--bulma-info-l);--bulma-input-border-l: var(--bulma-info-l);--bulma-arrow-color: var(--bulma-info)}.select.is-success{--bulma-input-h: var(--bulma-success-h);--bulma-input-s: var(--bulma-success-s);--bulma-input-l: var(--bulma-success-l);--bulma-input-focus-h: var(--bulma-success-h);--bulma-input-focus-s: var(--bulma-success-s);--bulma-input-focus-l: var(--bulma-success-l);--bulma-input-border-l: var(--bulma-success-l);--bulma-arrow-color: var(--bulma-success)}.select.is-warning{--bulma-input-h: var(--bulma-warning-h);--bulma-input-s: var(--bulma-warning-s);--bulma-input-l: var(--bulma-warning-l);--bulma-input-focus-h: var(--bulma-warning-h);--bulma-input-focus-s: var(--bulma-warning-s);--bulma-input-focus-l: var(--bulma-warning-l);--bulma-input-border-l: var(--bulma-warning-l);--bulma-arrow-color: var(--bulma-warning)}.select.is-danger{--bulma-input-h: var(--bulma-danger-h);--bulma-input-s: var(--bulma-danger-s);--bulma-input-l: var(--bulma-danger-l);--bulma-input-focus-h: var(--bulma-danger-h);--bulma-input-focus-s: var(--bulma-danger-s);--bulma-input-focus-l: var(--bulma-danger-l);--bulma-input-border-l: var(--bulma-danger-l);--bulma-arrow-color: var(--bulma-danger)}.select.is-small{border-radius:var(--bulma-radius-small);font-size:var(--bulma-size-small)}.select.is-medium{font-size:var(--bulma-size-medium)}.select.is-large{font-size:var(--bulma-size-large)}.select.is-disabled:after{border-color:var(--bulma-text-weak)!important;opacity:.5}.select.is-fullwidth,.select.is-fullwidth select{width:100%}.select.is-loading:after{inset-inline-end:.625em;margin-top:0;position:absolute;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:var(--bulma-size-small)}.select.is-loading.is-medium:after{font-size:var(--bulma-size-medium)}.select.is-loading.is-large:after{font-size:var(--bulma-size-large)}.file{--bulma-file-radius: var(--bulma-radius);--bulma-file-name-border-color: var(--bulma-border);--bulma-file-name-border-style: solid;--bulma-file-name-border-width: 1px 1px 1px 0;--bulma-file-name-max-width: 16em;--bulma-file-h: var(--bulma-scheme-h);--bulma-file-s: var(--bulma-scheme-s);--bulma-file-background-l: var(--bulma-scheme-main-ter-l);--bulma-file-background-l-delta: 0%;--bulma-file-hover-background-l-delta: -5%;--bulma-file-active-background-l-delta: -10%;--bulma-file-border-l: var(--bulma-border-l);--bulma-file-border-l-delta: 0%;--bulma-file-hover-border-l-delta: -10%;--bulma-file-active-border-l-delta: -20%;--bulma-file-cta-color-l: var(--bulma-text-strong-l);--bulma-file-name-color-l: var(--bulma-text-strong-l);--bulma-file-color-l-delta: 0%;--bulma-file-hover-color-l-delta: -5%;--bulma-file-active-color-l-delta: -10%;align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white{--bulma-file-h: var(--bulma-white-h);--bulma-file-s: var(--bulma-white-s);--bulma-file-background-l: var(--bulma-white-l);--bulma-file-border-l: var(--bulma-white-l);--bulma-file-cta-color-l: var(--bulma-white-invert-l);--bulma-file-name-color-l: var(--bulma-white-on-scheme-l)}.file.is-black{--bulma-file-h: var(--bulma-black-h);--bulma-file-s: var(--bulma-black-s);--bulma-file-background-l: var(--bulma-black-l);--bulma-file-border-l: var(--bulma-black-l);--bulma-file-cta-color-l: var(--bulma-black-invert-l);--bulma-file-name-color-l: var(--bulma-black-on-scheme-l)}.file.is-light{--bulma-file-h: var(--bulma-light-h);--bulma-file-s: var(--bulma-light-s);--bulma-file-background-l: var(--bulma-light-l);--bulma-file-border-l: var(--bulma-light-l);--bulma-file-cta-color-l: var(--bulma-light-invert-l);--bulma-file-name-color-l: var(--bulma-light-on-scheme-l)}.file.is-dark{--bulma-file-h: var(--bulma-dark-h);--bulma-file-s: var(--bulma-dark-s);--bulma-file-background-l: var(--bulma-dark-l);--bulma-file-border-l: var(--bulma-dark-l);--bulma-file-cta-color-l: var(--bulma-dark-invert-l);--bulma-file-name-color-l: var(--bulma-dark-on-scheme-l)}.file.is-text{--bulma-file-h: var(--bulma-text-h);--bulma-file-s: var(--bulma-text-s);--bulma-file-background-l: var(--bulma-text-l);--bulma-file-border-l: var(--bulma-text-l);--bulma-file-cta-color-l: var(--bulma-text-invert-l);--bulma-file-name-color-l: var(--bulma-text-on-scheme-l)}.file.is-primary{--bulma-file-h: var(--bulma-primary-h);--bulma-file-s: var(--bulma-primary-s);--bulma-file-background-l: var(--bulma-primary-l);--bulma-file-border-l: var(--bulma-primary-l);--bulma-file-cta-color-l: var(--bulma-primary-invert-l);--bulma-file-name-color-l: var(--bulma-primary-on-scheme-l)}.file.is-link{--bulma-file-h: var(--bulma-link-h);--bulma-file-s: var(--bulma-link-s);--bulma-file-background-l: var(--bulma-link-l);--bulma-file-border-l: var(--bulma-link-l);--bulma-file-cta-color-l: var(--bulma-link-invert-l);--bulma-file-name-color-l: var(--bulma-link-on-scheme-l)}.file.is-info{--bulma-file-h: var(--bulma-info-h);--bulma-file-s: var(--bulma-info-s);--bulma-file-background-l: var(--bulma-info-l);--bulma-file-border-l: var(--bulma-info-l);--bulma-file-cta-color-l: var(--bulma-info-invert-l);--bulma-file-name-color-l: var(--bulma-info-on-scheme-l)}.file.is-success{--bulma-file-h: var(--bulma-success-h);--bulma-file-s: var(--bulma-success-s);--bulma-file-background-l: var(--bulma-success-l);--bulma-file-border-l: var(--bulma-success-l);--bulma-file-cta-color-l: var(--bulma-success-invert-l);--bulma-file-name-color-l: var(--bulma-success-on-scheme-l)}.file.is-warning{--bulma-file-h: var(--bulma-warning-h);--bulma-file-s: var(--bulma-warning-s);--bulma-file-background-l: var(--bulma-warning-l);--bulma-file-border-l: var(--bulma-warning-l);--bulma-file-cta-color-l: var(--bulma-warning-invert-l);--bulma-file-name-color-l: var(--bulma-warning-on-scheme-l)}.file.is-danger{--bulma-file-h: var(--bulma-danger-h);--bulma-file-s: var(--bulma-danger-s);--bulma-file-background-l: var(--bulma-danger-l);--bulma-file-border-l: var(--bulma-danger-l);--bulma-file-cta-color-l: var(--bulma-danger-invert-l);--bulma-file-name-color-l: var(--bulma-danger-on-scheme-l)}.file.is-small{font-size:var(--bulma-size-small)}.file.is-normal{font-size:var(--bulma-size-normal)}.file.is-medium{font-size:var(--bulma-size-medium)}.file.is-medium .file-icon .fa{font-size:1.5rem}.file.is-large{font-size:var(--bulma-size-large)}.file.is-large .file-icon .fa{font-size:2rem}.file.has-name .file-cta{border-end-end-radius:0;border-start-end-radius:0}.file.has-name .file-name{border-end-start-radius:0;border-start-start-radius:0}.file.has-name.is-empty .file-cta{border-radius:var(--bulma-file-radius)}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:1.5rem}.file.is-boxed.is-small .file-icon .fa{font-size:1rem}.file.is-boxed.is-medium .file-icon .fa{font-size:2rem}.file.is-boxed.is-large .file-icon .fa{font-size:2.5rem}.file.is-boxed.has-name .file-cta{border-end-end-radius:0;border-end-start-radius:0;border-start-end-radius:var(--bulma-file-radius);border-start-start-radius:var(--bulma-file-radius)}.file.is-boxed.has-name .file-name{border-end-end-radius:var(--bulma-file-radius);border-end-start-radius:var(--bulma-file-radius);border-start-end-radius:0;border-start-start-radius:0;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 var(--bulma-file-radius) var(--bulma-file-radius) 0}.file.is-right .file-name{border-radius:var(--bulma-file-radius) 0 0 var(--bulma-file-radius);border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover{--bulma-file-background-l-delta: var(--bulma-file-hover-background-l-delta);--bulma-file-border-l-delta: var(--bulma-file-hover-border-l-delta);--bulma-file-color-l-delta: var(--bulma-file-hover-color-l-delta)}.file-label:active{--bulma-file-background-l-delta: var(--bulma-file-active-background-l-delta);--bulma-file-border-l-delta: var(--bulma-file-active-border-l-delta);--bulma-file-color-l-delta: var(--bulma-file-active-color-l-delta)}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:hsl(var(--bulma-file-h),var(--bulma-file-s),calc(var(--bulma-file-border-l) + var(--bulma-file-border-l-delta)));border-radius:var(--bulma-file-radius);font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:hsl(var(--bulma-file-h),var(--bulma-file-s),calc(var(--bulma-file-background-l) + var(--bulma-file-background-l-delta)));color:hsl(var(--bulma-file-h),var(--bulma-file-s),calc(var(--bulma-file-cta-color-l) + var(--bulma-file-color-l-delta)))}.file-name{border-color:hsl(var(--bulma-file-h),var(--bulma-file-s),calc(var(--bulma-file-border-l) + var(--bulma-file-color-l-delta)));border-style:var(--bulma-file-name-border-style);border-width:var(--bulma-file-name-border-width);color:hsl(var(--bulma-file-h),var(--bulma-file-s),calc(var(--bulma-file-name-color-l) + var(--bulma-file-color-l-delta)));display:block;max-width:var(--bulma-file-name-max-width);overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-inline-end:.5em;width:1em}.file-icon .fa{font-size:1rem}:root{--bulma-label-color: var(--bulma-text-strong);--bulma-label-spacing: .5em;--bulma-label-weight: var(--bulma-weight-semibold);--bulma-help-size: var(--bulma-size-small);--bulma-field-block-spacing: .75rem}.label{color:var(--bulma-label-color);display:block;font-size:var(--bulma-size-normal);font-weight:var(--bulma-weight-semibold)}.label:not(:last-child){margin-bottom:var(--bulma-label-spacing)}.label.is-small{font-size:var(--bulma-size-small)}.label.is-medium{font-size:var(--bulma-size-medium)}.label.is-large{font-size:var(--bulma-size-large)}.help{display:block;font-size:var(--bulma-help-size);margin-top:.25rem}.help.is-white{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-on-scheme-l))}.help.is-black{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-on-scheme-l))}.help.is-light{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-on-scheme-l))}.help.is-dark{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-on-scheme-l))}.help.is-text{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-on-scheme-l))}.help.is-primary{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-on-scheme-l))}.help.is-link{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-on-scheme-l))}.help.is-info{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-on-scheme-l))}.help.is-success{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-on-scheme-l))}.help.is-warning{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-on-scheme-l))}.help.is-danger{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-on-scheme-l))}.field{--bulma-block-spacing: var(--bulma-field-block-spacing)}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-inline-end:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-start-end-radius:0;border-end-end-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-start-start-radius:0;border-end-start-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered{z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]).is-active{z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;gap:.75rem;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-inline-end:1.5rem;text-align:right}.field-label.is-small{font-size:var(--bulma-size-small);padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:var(--bulma-size-medium);padding-top:.375em}.field-label.is-large{font-size:var(--bulma-size-large);padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-inline-end:.75rem}}.control{box-sizing:border-box;clear:both;font-size:var(--bulma-size-normal);position:relative;text-align:inherit}.control.has-icons-left .input:hover~.icon,.control.has-icons-left .select:hover~.icon,.control.has-icons-right .input:hover~.icon,.control.has-icons-right .select:hover~.icon{color:var(--bulma-input-icon-hover-color)}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:var(--bulma-input-icon-focus-color)}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:var(--bulma-size-small)}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:var(--bulma-size-medium)}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:var(--bulma-size-large)}.control.has-icons-left .icon,.control.has-icons-right .icon{color:var(--bulma-input-icon-color);height:var(--bulma-input-height);pointer-events:none;position:absolute;top:0;width:var(--bulma-input-height);z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:var(--bulma-input-height)}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:var(--bulma-input-height)}.control.has-icons-right .icon.is-right{right:0}.control.is-loading:after{inset-inline-end:.75em;position:absolute!important;top:.75em;z-index:4}.control.is-loading.is-small:after{font-size:var(--bulma-size-small)}.control.is-loading.is-medium:after{font-size:var(--bulma-size-medium)}.control.is-loading.is-large:after{font-size:var(--bulma-size-large)}.breadcrumb{--bulma-breadcrumb-item-color: var(--bulma-link-text);--bulma-breadcrumb-item-hover-color: var(--bulma-link-text-hover);--bulma-breadcrumb-item-active-color: var(--bulma-link-text-active);--bulma-breadcrumb-item-padding-vertical: 0;--bulma-breadcrumb-item-padding-horizontal: .75em;--bulma-breadcrumb-item-separator-color: var(--bulma-border)}.breadcrumb{font-size:var(--bulma-size-normal);white-space:nowrap}.breadcrumb a{align-items:center;color:var(--bulma-breadcrumb-item-color);display:flex;justify-content:center;padding:var(--bulma-breadcrumb-item-padding-vertical) var(--bulma-breadcrumb-item-padding-horizontal)}.breadcrumb a:hover{color:var(--bulma-breadcrumb-item-hover-color)}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-inline-start:0}.breadcrumb li.is-active a{color:var(--bulma-breadcrumb-item-active-color);cursor:default;pointer-events:none}.breadcrumb li+li:before{color:var(--bulma-breadcrumb-item-separator-color);content:"/"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-inline-end:.5em}.breadcrumb .icon:last-child{margin-inline-start:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:var(--bulma-size-small)}.breadcrumb.is-medium{font-size:var(--bulma-size-medium)}.breadcrumb.is-large{font-size:var(--bulma-size-large)}.breadcrumb.has-arrow-separator li+li:before{content:"→"}.breadcrumb.has-bullet-separator li+li:before{content:"•"}.breadcrumb.has-dot-separator li+li:before{content:"·"}.breadcrumb.has-succeeds-separator li+li:before{content:"≻"}.card{--bulma-card-color: var(--bulma-text);--bulma-card-background-color: var(--bulma-scheme-main);--bulma-card-shadow: var(--bulma-shadow);--bulma-card-radius: .75rem;--bulma-card-header-background-color: transparent;--bulma-card-header-color: var(--bulma-text-strong);--bulma-card-header-padding: .75rem 1rem;--bulma-card-header-shadow: 0 .125em .25em hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .1);--bulma-card-header-weight: var(--bulma-weight-bold);--bulma-card-content-background-color: transparent;--bulma-card-content-padding: 1.5rem;--bulma-card-footer-background-color: transparent;--bulma-card-footer-border-top: 1px solid var(--bulma-border-weak);--bulma-card-footer-padding: .75rem;--bulma-card-media-margin: var(--bulma-block-spacing)}.card{background-color:var(--bulma-card-background-color);border-radius:var(--bulma-card-radius);box-shadow:var(--bulma-card-shadow);color:var(--bulma-card-color);max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-start-start-radius:var(--bulma-card-radius);border-start-end-radius:var(--bulma-card-radius)}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-end-start-radius:var(--bulma-card-radius);border-end-end-radius:var(--bulma-card-radius)}.card-header{background-color:var(--bulma-card-header-background-color);align-items:stretch;box-shadow:var(--bulma-card-header-shadow);display:flex}.card-header-title{align-items:center;color:var(--bulma-card-header-color);display:flex;flex-grow:1;font-weight:var(--bulma-card-header-weight);padding:var(--bulma-card-header-padding)}.card-header-title.is-centered{justify-content:center}.card-header-icon{appearance:none;background:none;border:none;color:inherit;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:var(--bulma-card-header-padding)}.card-image{display:block;position:relative}.card-image:first-child img{border-start-start-radius:var(--bulma-card-radius);border-start-end-radius:var(--bulma-card-radius)}.card-image:last-child img{border-end-start-radius:var(--bulma-card-radius);border-end-end-radius:var(--bulma-card-radius)}.card-content{background-color:var(--bulma-card-content-background-color);padding:var(--bulma-card-content-padding)}.card-footer{background-color:var(--bulma-card-footer-background-color);border-top:var(--bulma-card-footer-border-top);align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:var(--bulma-card-footer-padding)}.card-footer-item:not(:last-child){border-inline-end:var(--bulma-card-footer-border-top)}.card .media:not(:last-child){margin-bottom:var(--bulma-card-media-margin)}.dropdown{--bulma-dropdown-menu-min-width: 12rem;--bulma-dropdown-content-background-color: var(--bulma-scheme-main);--bulma-dropdown-content-offset: .25rem;--bulma-dropdown-content-padding-bottom: .5rem;--bulma-dropdown-content-padding-top: .5rem;--bulma-dropdown-content-radius: var(--bulma-radius);--bulma-dropdown-content-shadow: var(--bulma-shadow);--bulma-dropdown-content-z: 20;--bulma-dropdown-item-h: var(--bulma-scheme-h);--bulma-dropdown-item-s: var(--bulma-scheme-s);--bulma-dropdown-item-l: var(--bulma-scheme-main-l);--bulma-dropdown-item-background-l: var(--bulma-scheme-main-l);--bulma-dropdown-item-background-l-delta: 0%;--bulma-dropdown-item-hover-background-l-delta: var(--bulma-hover-background-l-delta);--bulma-dropdown-item-active-background-l-delta: var(--bulma-active-background-l-delta);--bulma-dropdown-item-color-l: var(--bulma-text-strong-l);--bulma-dropdown-item-selected-h: var(--bulma-link-h);--bulma-dropdown-item-selected-s: var(--bulma-link-s);--bulma-dropdown-item-selected-l: var(--bulma-link-l);--bulma-dropdown-item-selected-background-l: var(--bulma-link-l);--bulma-dropdown-item-selected-color-l: var(--bulma-link-invert-l);--bulma-dropdown-divider-background-color: var(--bulma-border-weak)}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:var(--bulma-dropdown-content-offset);padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:var(--bulma-dropdown-menu-min-width);padding-top:var(--bulma-dropdown-content-offset);position:absolute;top:100%;z-index:var(--bulma-dropdown-content-z)}.dropdown-content{background-color:var(--bulma-dropdown-content-background-color);border-radius:var(--bulma-dropdown-content-radius);box-shadow:var(--bulma-dropdown-content-shadow);padding-bottom:var(--bulma-dropdown-content-padding-bottom);padding-top:var(--bulma-dropdown-content-padding-top)}.dropdown-item{color:hsl(var(--bulma-dropdown-item-h),var(--bulma-dropdown-item-s),var(--bulma-dropdown-item-color-l));display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem}a.dropdown-item,button.dropdown-item{background-color:hsl(var(--bulma-dropdown-item-h),var(--bulma-dropdown-item-s),calc(var(--bulma-dropdown-item-background-l) + var(--bulma-dropdown-item-background-l-delta)));padding-inline-end:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{--bulma-dropdown-item-background-l-delta: var(--bulma-dropdown-item-hover-background-l-delta);--bulma-dropdown-item-border-l-delta: var(--bulma-dropdown-item-hover-border-l-delta)}a.dropdown-item:active,button.dropdown-item:active{--bulma-dropdown-item-background-l-delta: var(--bulma-dropdown-item-active-background-l-delta);--bulma-dropdown-item-border-l-delta: var(--bulma-dropdown-item-active-border-l-delta)}a.dropdown-item.is-active,a.dropdown-item.is-selected,button.dropdown-item.is-active,button.dropdown-item.is-selected{--bulma-dropdown-item-h: var(--bulma-dropdown-item-selected-h);--bulma-dropdown-item-s: var(--bulma-dropdown-item-selected-s);--bulma-dropdown-item-l: var(--bulma-dropdown-item-selected-l);--bulma-dropdown-item-background-l: var(--bulma-dropdown-item-selected-background-l);--bulma-dropdown-item-color-l: var(--bulma-dropdown-item-selected-color-l)}.dropdown-divider{background-color:var(--bulma-dropdown-divider-background-color);border:none;display:block;height:1px;margin:.5rem 0}.menu{--bulma-menu-item-h: var(--bulma-scheme-h);--bulma-menu-item-s: var(--bulma-scheme-s);--bulma-menu-item-l: var(--bulma-scheme-main-l);--bulma-menu-item-background-l: var(--bulma-scheme-main-l);--bulma-menu-item-background-l-delta: 0%;--bulma-menu-item-hover-background-l-delta: var(--bulma-hover-background-l-delta);--bulma-menu-item-active-background-l-delta: var(--bulma-active-background-l-delta);--bulma-menu-item-color-l: var(--bulma-text-l);--bulma-menu-item-radius: var(--bulma-radius-small);--bulma-menu-item-selected-h: var(--bulma-link-h);--bulma-menu-item-selected-s: var(--bulma-link-s);--bulma-menu-item-selected-l: var(--bulma-link-l);--bulma-menu-item-selected-background-l: var(--bulma-link-l);--bulma-menu-item-selected-color-l: var(--bulma-link-invert-l);--bulma-menu-list-border-left: 1px solid var(--bulma-border);--bulma-menu-list-line-height: 1.25;--bulma-menu-list-link-padding: .5em .75em;--bulma-menu-nested-list-margin: .75em;--bulma-menu-nested-list-padding-left: .75em;--bulma-menu-label-color: var(--bulma-text-weak);--bulma-menu-label-font-size: .75em;--bulma-menu-label-letter-spacing: .1em;--bulma-menu-label-spacing: 1em}.menu{font-size:var(--bulma-size-normal)}.menu.is-small{font-size:var(--bulma-size-small)}.menu.is-medium{font-size:var(--bulma-size-medium)}.menu.is-large{font-size:var(--bulma-size-large)}.menu-list{line-height:var(--bulma-menu-list-line-height)}.menu-list a,.menu-list button,.menu-list .menu-item{background-color:hsl(var(--bulma-menu-item-h),var(--bulma-menu-item-s),calc(var(--bulma-menu-item-background-l) + var(--bulma-menu-item-background-l-delta)));border-radius:var(--bulma-menu-item-radius);color:hsl(var(--bulma-menu-item-h),var(--bulma-menu-item-s),var(--bulma-menu-item-color-l));display:block;padding:var(--bulma-menu-list-link-padding);text-align:left;width:100%}.menu-list a:hover,.menu-list button:hover,.menu-list .menu-item:hover{--bulma-menu-item-background-l-delta: var(--bulma-menu-item-hover-background-l-delta)}.menu-list a:active,.menu-list button:active,.menu-list .menu-item:active{--bulma-menu-item-background-l-delta: var(--bulma-menu-item-active-background-l-delta)}.menu-list a.is-active,.menu-list a.is-selected,.menu-list button.is-active,.menu-list button.is-selected,.menu-list .menu-item.is-active,.menu-list .menu-item.is-selected{--bulma-menu-item-h: var(--bulma-menu-item-selected-h);--bulma-menu-item-s: var(--bulma-menu-item-selected-s);--bulma-menu-item-l: var(--bulma-menu-item-selected-l);--bulma-menu-item-background-l: var(--bulma-menu-item-selected-background-l);--bulma-menu-item-color-l: var(--bulma-menu-item-selected-color-l)}.menu-list li ul{border-inline-start:var(--bulma-menu-list-border-left);margin:var(--bulma-menu-nested-list-margin);padding-inline-start:var(--bulma-menu-nested-list-padding-left)}.menu-label{color:var(--bulma-menu-label-color);font-size:var(--bulma-menu-label-font-size);letter-spacing:var(--bulma-menu-label-letter-spacing);text-transform:uppercase}.menu-label:not(:first-child){margin-top:var(--bulma-menu-label-spacing)}.menu-label:not(:last-child){margin-bottom:var(--bulma-menu-label-spacing)}.message{--bulma-message-border-l-delta: -20%;--bulma-message-radius: var(--bulma-radius);--bulma-message-header-weight: var(--bulma-weight-semibold);--bulma-message-header-padding: 1em 1.25em;--bulma-message-header-radius: var(--bulma-radius);--bulma-message-body-border-width: 0 0 0 4px;--bulma-message-body-color: var(--bulma-text);--bulma-message-body-padding: 1.25em 1.5em;--bulma-message-body-radius: var(--bulma-radius-small);--bulma-message-body-pre-code-background-color: transparent;--bulma-message-header-body-border-width: 0;--bulma-message-h: var(--bulma-scheme-h);--bulma-message-s: var(--bulma-scheme-s);--bulma-message-background-l: var(--bulma-background-l);--bulma-message-border-l: var(--bulma-border-l);--bulma-message-border-style: solid;--bulma-message-border-width: .25em;--bulma-message-color-l: var(--bulma-text-l);--bulma-message-header-background-l: var(--bulma-dark-l);--bulma-message-header-color-l: var(--bulma-text-dark-invert-l)}.message{border-radius:var(--bulma-message-radius);color:hsl(var(--bulma-message-h),var(--bulma-message-s),var(--bulma-message-color-l));font-size:var(--bulma-size-normal)}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:var(--bulma-size-small)}.message.is-medium{font-size:var(--bulma-size-medium)}.message.is-large{font-size:var(--bulma-size-large)}.message.is-white{--bulma-message-h: var(--bulma-white-h);--bulma-message-s: var(--bulma-white-s);--bulma-message-border-l: calc(var(--bulma-white-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-white-on-scheme-l);--bulma-message-header-background-l: var(--bulma-white-l);--bulma-message-header-color-l: var(--bulma-white-invert-l)}.message.is-black{--bulma-message-h: var(--bulma-black-h);--bulma-message-s: var(--bulma-black-s);--bulma-message-border-l: calc(var(--bulma-black-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-black-on-scheme-l);--bulma-message-header-background-l: var(--bulma-black-l);--bulma-message-header-color-l: var(--bulma-black-invert-l)}.message.is-light{--bulma-message-h: var(--bulma-light-h);--bulma-message-s: var(--bulma-light-s);--bulma-message-border-l: calc(var(--bulma-light-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-light-on-scheme-l);--bulma-message-header-background-l: var(--bulma-light-l);--bulma-message-header-color-l: var(--bulma-light-invert-l)}.message.is-dark{--bulma-message-h: var(--bulma-dark-h);--bulma-message-s: var(--bulma-dark-s);--bulma-message-border-l: calc(var(--bulma-dark-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-dark-on-scheme-l);--bulma-message-header-background-l: var(--bulma-dark-l);--bulma-message-header-color-l: var(--bulma-dark-invert-l)}.message.is-text{--bulma-message-h: var(--bulma-text-h);--bulma-message-s: var(--bulma-text-s);--bulma-message-border-l: calc(var(--bulma-text-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-text-on-scheme-l);--bulma-message-header-background-l: var(--bulma-text-l);--bulma-message-header-color-l: var(--bulma-text-invert-l)}.message.is-primary{--bulma-message-h: var(--bulma-primary-h);--bulma-message-s: var(--bulma-primary-s);--bulma-message-border-l: calc(var(--bulma-primary-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-primary-on-scheme-l);--bulma-message-header-background-l: var(--bulma-primary-l);--bulma-message-header-color-l: var(--bulma-primary-invert-l)}.message.is-link{--bulma-message-h: var(--bulma-link-h);--bulma-message-s: var(--bulma-link-s);--bulma-message-border-l: calc(var(--bulma-link-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-link-on-scheme-l);--bulma-message-header-background-l: var(--bulma-link-l);--bulma-message-header-color-l: var(--bulma-link-invert-l)}.message.is-info{--bulma-message-h: var(--bulma-info-h);--bulma-message-s: var(--bulma-info-s);--bulma-message-border-l: calc(var(--bulma-info-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-info-on-scheme-l);--bulma-message-header-background-l: var(--bulma-info-l);--bulma-message-header-color-l: var(--bulma-info-invert-l)}.message.is-success{--bulma-message-h: var(--bulma-success-h);--bulma-message-s: var(--bulma-success-s);--bulma-message-border-l: calc(var(--bulma-success-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-success-on-scheme-l);--bulma-message-header-background-l: var(--bulma-success-l);--bulma-message-header-color-l: var(--bulma-success-invert-l)}.message.is-warning{--bulma-message-h: var(--bulma-warning-h);--bulma-message-s: var(--bulma-warning-s);--bulma-message-border-l: calc(var(--bulma-warning-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-warning-on-scheme-l);--bulma-message-header-background-l: var(--bulma-warning-l);--bulma-message-header-color-l: var(--bulma-warning-invert-l)}.message.is-danger{--bulma-message-h: var(--bulma-danger-h);--bulma-message-s: var(--bulma-danger-s);--bulma-message-border-l: calc(var(--bulma-danger-l) + var(--bulma-message-border-l-delta));--bulma-message-color-l: var(--bulma-danger-on-scheme-l);--bulma-message-header-background-l: var(--bulma-danger-l);--bulma-message-header-color-l: var(--bulma-danger-invert-l)}.message-header{align-items:center;background-color:hsl(var(--bulma-message-h),var(--bulma-message-s),var(--bulma-message-header-background-l));border-start-start-radius:var(--bulma-message-header-radius);border-start-end-radius:var(--bulma-message-header-radius);color:hsl(var(--bulma-message-h),var(--bulma-message-s),var(--bulma-message-header-color-l));display:flex;font-weight:var(--bulma-message-header-weight);justify-content:space-between;line-height:1.25;padding:var(--bulma-message-header-padding);position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-inline-start:.75em}.message-header+.message-body{border-width:var(--bulma-message-header-body-border-width);border-start-start-radius:0;border-start-end-radius:0}.message-body{background-color:hsl(var(--bulma-message-h),var(--bulma-message-s),var(--bulma-message-background-l));border-inline-start-color:hsl(var(--bulma-message-h),var(--bulma-message-s),var(--bulma-message-border-l));border-inline-start-style:var(--bulma-message-border-style);border-inline-start-width:var(--bulma-message-border-width);border-radius:var(--bulma-message-body-radius);padding:var(--bulma-message-body-padding)}.message-body code,.message-body pre{background-color:hsl(var(--bulma-message-h),var(--bulma-message-s),var(--bulma-message-header-color-l));color:hsl(var(--bulma-message-h),var(--bulma-message-s),var(--bulma-message-header-background-l))}.message-body pre code{background-color:var(--bulma-message-body-pre-code-background-color)}.modal{--bulma-modal-z: 40;--bulma-modal-background-background-color: hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .86);--bulma-modal-content-width: 40rem;--bulma-modal-content-margin-mobile: 1.25rem;--bulma-modal-content-spacing-mobile: 10rem;--bulma-modal-content-spacing-tablet: 2.5rem;--bulma-modal-close-dimensions: 2.5rem;--bulma-modal-close-right: 1.25rem;--bulma-modal-close-top: 1.25rem;--bulma-modal-card-spacing: 2.5rem;--bulma-modal-card-head-background-color: var(--bulma-scheme-main);--bulma-modal-card-head-padding: 2rem;--bulma-modal-card-head-radius: var(--bulma-radius-large);--bulma-modal-card-title-color: var(--bulma-text-strong);--bulma-modal-card-title-line-height: 1;--bulma-modal-card-title-size: var(--bulma-size-4);--bulma-modal-card-foot-background-color: var(--bulma-scheme-main-bis);--bulma-modal-card-foot-radius: var(--bulma-radius-large);--bulma-modal-card-body-background-color: var(--bulma-scheme-main);--bulma-modal-card-body-padding: 2rem}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:var(--bulma-modal-z)}.modal.is-active{display:flex}.modal-background{background-color:var(--bulma-modal-background-background-color)}.modal-content,.modal-card{margin:0 var(--bulma-modal-content-margin-mobile);max-height:calc(100vh - var(--bulma-modal-content-spacing-mobile));overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - var(--bulma-modal-content-spacing-tablet));width:var(--bulma-modal-content-width)}}.modal-close{background:none;height:var(--bulma-modal-close-dimensions);inset-inline-end:var(--bulma-modal-close-right);position:fixed;top:var(--bulma-modal-close-top);width:var(--bulma-modal-close-dimensions)}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - var(--bulma-modal-card-spacing));overflow:hidden;overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;display:flex;flex-shrink:0;justify-content:flex-start;padding:var(--bulma-modal-card-head-padding);position:relative}.modal-card-head{background-color:var(--bulma-modal-card-head-background-color);border-start-start-radius:var(--bulma-modal-card-head-radius);border-start-end-radius:var(--bulma-modal-card-head-radius);box-shadow:var(--bulma-shadow)}.modal-card-title{color:var(--bulma-modal-card-title-color);flex-grow:1;flex-shrink:0;font-size:var(--bulma-modal-card-title-size);line-height:var(--bulma-modal-card-title-line-height)}.modal-card-foot{background-color:var(--bulma-modal-card-foot-background-color);border-end-start-radius:var(--bulma-modal-card-foot-radius);border-end-end-radius:var(--bulma-modal-card-foot-radius)}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:var(--bulma-modal-card-body-background-color);flex-grow:1;flex-shrink:1;overflow:auto;padding:var(--bulma-modal-card-body-padding)}:root{--bulma-navbar-height: 3.25rem}.navbar{--bulma-navbar-h: var(--bulma-scheme-h);--bulma-navbar-s: var(--bulma-scheme-s);--bulma-navbar-l: var(--bulma-scheme-main-l);--bulma-navbar-background-color: var(--bulma-scheme-main);--bulma-navbar-box-shadow-size: 0 .125em 0 0;--bulma-navbar-box-shadow-color: var(--bulma-background);--bulma-navbar-padding-vertical: 1rem;--bulma-navbar-padding-horizontal: 2rem;--bulma-navbar-z: 30;--bulma-navbar-fixed-z: 30;--bulma-navbar-item-background-a: 0;--bulma-navbar-item-background-l: var(--bulma-scheme-main-l);--bulma-navbar-item-background-l-delta: 0%;--bulma-navbar-item-hover-background-l-delta: var(--bulma-hover-background-l-delta);--bulma-navbar-item-active-background-l-delta: var(--bulma-active-background-l-delta);--bulma-navbar-item-color-l: var(--bulma-text-l);--bulma-navbar-item-color: hsl(var(--bulma-navbar-h), var(--bulma-navbar-s), var(--bulma-navbar-item-color-l));--bulma-navbar-item-selected-h: var(--bulma-link-h);--bulma-navbar-item-selected-s: var(--bulma-link-s);--bulma-navbar-item-selected-l: var(--bulma-link-l);--bulma-navbar-item-selected-background-l: var(--bulma-link-l);--bulma-navbar-item-selected-color-l: var(--bulma-link-invert-l);--bulma-navbar-item-img-max-height: 1.75rem;--bulma-navbar-burger-color: var(--bulma-link);--bulma-navbar-tab-hover-background-color: transparent;--bulma-navbar-tab-hover-border-bottom-color: var(--bulma-link);--bulma-navbar-tab-active-color: var(--bulma-link);--bulma-navbar-tab-active-background-color: transparent;--bulma-navbar-tab-active-border-bottom-color: var(--bulma-link);--bulma-navbar-tab-active-border-bottom-style: solid;--bulma-navbar-tab-active-border-bottom-width: .1875em;--bulma-navbar-dropdown-background-color: var(--bulma-scheme-main);--bulma-navbar-dropdown-border-l: var(--bulma-border-l);--bulma-navbar-dropdown-border-color: hsl(var(--bulma-navbar-h), var(--bulma-navbar-s), var(--bulma-navbar-dropdown-border-l));--bulma-navbar-dropdown-border-style: solid;--bulma-navbar-dropdown-border-width: .125em;--bulma-navbar-dropdown-offset: -.25em;--bulma-navbar-dropdown-arrow: var(--bulma-link);--bulma-navbar-dropdown-radius: var(--bulma-radius-large);--bulma-navbar-dropdown-z: 20;--bulma-navbar-dropdown-boxed-radius: var(--bulma-radius-large);--bulma-navbar-dropdown-boxed-shadow: 0 .5em .5em hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .1), 0 0 0 1px hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .1);--bulma-navbar-dropdown-item-h: var(--bulma-scheme-h);--bulma-navbar-dropdown-item-s: var(--bulma-scheme-s);--bulma-navbar-dropdown-item-l: var(--bulma-scheme-main-l);--bulma-navbar-dropdown-item-background-l: var(--bulma-scheme-main-l);--bulma-navbar-dropdown-item-color-l: var(--bulma-text-l);--bulma-navbar-divider-background-l: var(--bulma-background-l);--bulma-navbar-divider-height: .125em;--bulma-navbar-bottom-box-shadow-size: 0 -.125em 0 0}.navbar{background-color:var(--bulma-navbar-background-color);min-height:var(--bulma-navbar-height);position:relative;z-index:var(--bulma-navbar-z)}.navbar.is-white{--bulma-navbar-h: var(--bulma-white-h);--bulma-navbar-s: var(--bulma-white-s);--bulma-navbar-l: var(--bulma-white-l);--bulma-burger-h: var(--bulma-white-h);--bulma-burger-s: var(--bulma-white-s);--bulma-burger-l: var(--bulma-white-invert-l);--bulma-navbar-background-color: var(--bulma-white);--bulma-navbar-item-background-l: var(--bulma-white-l);--bulma-navbar-item-color-l: var(--bulma-white-invert-l);--bulma-navbar-item-selected-h: var(--bulma-white-h);--bulma-navbar-item-selected-s: var(--bulma-white-s);--bulma-navbar-item-selected-l: var(--bulma-white-l);--bulma-navbar-item-selected-background-l: var(--bulma-white-l);--bulma-navbar-item-selected-color-l: var(--bulma-white-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-white-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-white-h), var(--bulma-white-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-white-h);--bulma-navbar-dropdown-item-s: var(--bulma-white-s)}.navbar.is-black{--bulma-navbar-h: var(--bulma-black-h);--bulma-navbar-s: var(--bulma-black-s);--bulma-navbar-l: var(--bulma-black-l);--bulma-burger-h: var(--bulma-black-h);--bulma-burger-s: var(--bulma-black-s);--bulma-burger-l: var(--bulma-black-invert-l);--bulma-navbar-background-color: var(--bulma-black);--bulma-navbar-item-background-l: var(--bulma-black-l);--bulma-navbar-item-color-l: var(--bulma-black-invert-l);--bulma-navbar-item-selected-h: var(--bulma-black-h);--bulma-navbar-item-selected-s: var(--bulma-black-s);--bulma-navbar-item-selected-l: var(--bulma-black-l);--bulma-navbar-item-selected-background-l: var(--bulma-black-l);--bulma-navbar-item-selected-color-l: var(--bulma-black-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-black-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-black-h), var(--bulma-black-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-black-h);--bulma-navbar-dropdown-item-s: var(--bulma-black-s)}.navbar.is-light{--bulma-navbar-h: var(--bulma-light-h);--bulma-navbar-s: var(--bulma-light-s);--bulma-navbar-l: var(--bulma-light-l);--bulma-burger-h: var(--bulma-light-h);--bulma-burger-s: var(--bulma-light-s);--bulma-burger-l: var(--bulma-light-invert-l);--bulma-navbar-background-color: var(--bulma-light);--bulma-navbar-item-background-l: var(--bulma-light-l);--bulma-navbar-item-color-l: var(--bulma-light-invert-l);--bulma-navbar-item-selected-h: var(--bulma-light-h);--bulma-navbar-item-selected-s: var(--bulma-light-s);--bulma-navbar-item-selected-l: var(--bulma-light-l);--bulma-navbar-item-selected-background-l: var(--bulma-light-l);--bulma-navbar-item-selected-color-l: var(--bulma-light-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-light-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-light-h), var(--bulma-light-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-light-h);--bulma-navbar-dropdown-item-s: var(--bulma-light-s)}.navbar.is-dark{--bulma-navbar-h: var(--bulma-dark-h);--bulma-navbar-s: var(--bulma-dark-s);--bulma-navbar-l: var(--bulma-dark-l);--bulma-burger-h: var(--bulma-dark-h);--bulma-burger-s: var(--bulma-dark-s);--bulma-burger-l: var(--bulma-dark-invert-l);--bulma-navbar-background-color: var(--bulma-dark);--bulma-navbar-item-background-l: var(--bulma-dark-l);--bulma-navbar-item-color-l: var(--bulma-dark-invert-l);--bulma-navbar-item-selected-h: var(--bulma-dark-h);--bulma-navbar-item-selected-s: var(--bulma-dark-s);--bulma-navbar-item-selected-l: var(--bulma-dark-l);--bulma-navbar-item-selected-background-l: var(--bulma-dark-l);--bulma-navbar-item-selected-color-l: var(--bulma-dark-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-dark-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-dark-h), var(--bulma-dark-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-dark-h);--bulma-navbar-dropdown-item-s: var(--bulma-dark-s)}.navbar.is-text{--bulma-navbar-h: var(--bulma-text-h);--bulma-navbar-s: var(--bulma-text-s);--bulma-navbar-l: var(--bulma-text-l);--bulma-burger-h: var(--bulma-text-h);--bulma-burger-s: var(--bulma-text-s);--bulma-burger-l: var(--bulma-text-invert-l);--bulma-navbar-background-color: var(--bulma-text);--bulma-navbar-item-background-l: var(--bulma-text-l);--bulma-navbar-item-color-l: var(--bulma-text-invert-l);--bulma-navbar-item-selected-h: var(--bulma-text-h);--bulma-navbar-item-selected-s: var(--bulma-text-s);--bulma-navbar-item-selected-l: var(--bulma-text-l);--bulma-navbar-item-selected-background-l: var(--bulma-text-l);--bulma-navbar-item-selected-color-l: var(--bulma-text-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-text-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-text-h), var(--bulma-text-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-text-h);--bulma-navbar-dropdown-item-s: var(--bulma-text-s)}.navbar.is-primary{--bulma-navbar-h: var(--bulma-primary-h);--bulma-navbar-s: var(--bulma-primary-s);--bulma-navbar-l: var(--bulma-primary-l);--bulma-burger-h: var(--bulma-primary-h);--bulma-burger-s: var(--bulma-primary-s);--bulma-burger-l: var(--bulma-primary-invert-l);--bulma-navbar-background-color: var(--bulma-primary);--bulma-navbar-item-background-l: var(--bulma-primary-l);--bulma-navbar-item-color-l: var(--bulma-primary-invert-l);--bulma-navbar-item-selected-h: var(--bulma-primary-h);--bulma-navbar-item-selected-s: var(--bulma-primary-s);--bulma-navbar-item-selected-l: var(--bulma-primary-l);--bulma-navbar-item-selected-background-l: var(--bulma-primary-l);--bulma-navbar-item-selected-color-l: var(--bulma-primary-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-primary-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-primary-h);--bulma-navbar-dropdown-item-s: var(--bulma-primary-s)}.navbar.is-link{--bulma-navbar-h: var(--bulma-link-h);--bulma-navbar-s: var(--bulma-link-s);--bulma-navbar-l: var(--bulma-link-l);--bulma-burger-h: var(--bulma-link-h);--bulma-burger-s: var(--bulma-link-s);--bulma-burger-l: var(--bulma-link-invert-l);--bulma-navbar-background-color: var(--bulma-link);--bulma-navbar-item-background-l: var(--bulma-link-l);--bulma-navbar-item-color-l: var(--bulma-link-invert-l);--bulma-navbar-item-selected-h: var(--bulma-link-h);--bulma-navbar-item-selected-s: var(--bulma-link-s);--bulma-navbar-item-selected-l: var(--bulma-link-l);--bulma-navbar-item-selected-background-l: var(--bulma-link-l);--bulma-navbar-item-selected-color-l: var(--bulma-link-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-link-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-link-h), var(--bulma-link-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-link-h);--bulma-navbar-dropdown-item-s: var(--bulma-link-s)}.navbar.is-info{--bulma-navbar-h: var(--bulma-info-h);--bulma-navbar-s: var(--bulma-info-s);--bulma-navbar-l: var(--bulma-info-l);--bulma-burger-h: var(--bulma-info-h);--bulma-burger-s: var(--bulma-info-s);--bulma-burger-l: var(--bulma-info-invert-l);--bulma-navbar-background-color: var(--bulma-info);--bulma-navbar-item-background-l: var(--bulma-info-l);--bulma-navbar-item-color-l: var(--bulma-info-invert-l);--bulma-navbar-item-selected-h: var(--bulma-info-h);--bulma-navbar-item-selected-s: var(--bulma-info-s);--bulma-navbar-item-selected-l: var(--bulma-info-l);--bulma-navbar-item-selected-background-l: var(--bulma-info-l);--bulma-navbar-item-selected-color-l: var(--bulma-info-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-info-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-info-h), var(--bulma-info-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-info-h);--bulma-navbar-dropdown-item-s: var(--bulma-info-s)}.navbar.is-success{--bulma-navbar-h: var(--bulma-success-h);--bulma-navbar-s: var(--bulma-success-s);--bulma-navbar-l: var(--bulma-success-l);--bulma-burger-h: var(--bulma-success-h);--bulma-burger-s: var(--bulma-success-s);--bulma-burger-l: var(--bulma-success-invert-l);--bulma-navbar-background-color: var(--bulma-success);--bulma-navbar-item-background-l: var(--bulma-success-l);--bulma-navbar-item-color-l: var(--bulma-success-invert-l);--bulma-navbar-item-selected-h: var(--bulma-success-h);--bulma-navbar-item-selected-s: var(--bulma-success-s);--bulma-navbar-item-selected-l: var(--bulma-success-l);--bulma-navbar-item-selected-background-l: var(--bulma-success-l);--bulma-navbar-item-selected-color-l: var(--bulma-success-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-success-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-success-h), var(--bulma-success-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-success-h);--bulma-navbar-dropdown-item-s: var(--bulma-success-s)}.navbar.is-warning{--bulma-navbar-h: var(--bulma-warning-h);--bulma-navbar-s: var(--bulma-warning-s);--bulma-navbar-l: var(--bulma-warning-l);--bulma-burger-h: var(--bulma-warning-h);--bulma-burger-s: var(--bulma-warning-s);--bulma-burger-l: var(--bulma-warning-invert-l);--bulma-navbar-background-color: var(--bulma-warning);--bulma-navbar-item-background-l: var(--bulma-warning-l);--bulma-navbar-item-color-l: var(--bulma-warning-invert-l);--bulma-navbar-item-selected-h: var(--bulma-warning-h);--bulma-navbar-item-selected-s: var(--bulma-warning-s);--bulma-navbar-item-selected-l: var(--bulma-warning-l);--bulma-navbar-item-selected-background-l: var(--bulma-warning-l);--bulma-navbar-item-selected-color-l: var(--bulma-warning-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-warning-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-warning-h), var(--bulma-warning-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-warning-h);--bulma-navbar-dropdown-item-s: var(--bulma-warning-s)}.navbar.is-danger{--bulma-navbar-h: var(--bulma-danger-h);--bulma-navbar-s: var(--bulma-danger-s);--bulma-navbar-l: var(--bulma-danger-l);--bulma-burger-h: var(--bulma-danger-h);--bulma-burger-s: var(--bulma-danger-s);--bulma-burger-l: var(--bulma-danger-invert-l);--bulma-navbar-background-color: var(--bulma-danger);--bulma-navbar-item-background-l: var(--bulma-danger-l);--bulma-navbar-item-color-l: var(--bulma-danger-invert-l);--bulma-navbar-item-selected-h: var(--bulma-danger-h);--bulma-navbar-item-selected-s: var(--bulma-danger-s);--bulma-navbar-item-selected-l: var(--bulma-danger-l);--bulma-navbar-item-selected-background-l: var(--bulma-danger-l);--bulma-navbar-item-selected-color-l: var(--bulma-danger-invert-l);--bulma-navbar-dropdown-arrow: var(--bulma-danger-invert-l);--bulma-navbar-dropdown-background-color: hsl(var(--bulma-danger-h), var(--bulma-danger-s), var(--bulma-navbar-dropdown-item-background-l));--bulma-navbar-dropdown-item-h: var(--bulma-danger-h);--bulma-navbar-dropdown-item-s: var(--bulma-danger-s)}.navbar>.container{align-items:stretch;display:flex;min-height:var(--bulma-navbar-height);width:100%}.navbar.has-shadow{box-shadow:var(--bulma-navbar-box-shadow-size) var(--bulma-navbar-box-shadow-color)}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:var(--bulma-navbar-fixed-z)}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:var(--bulma-navbar-bottom-box-shadow-size) var(--bulma-navbar-box-shadow-color)}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:var(--bulma-navbar-height)}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:var(--bulma-navbar-height)}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:var(--bulma-navbar-height)}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{align-items:center;appearance:none;background:none;border:none;border-radius:var(--bulma-burger-border-radius);color:hsl(var(--bulma-burger-h),var(--bulma-burger-s),var(--bulma-burger-l));cursor:pointer;display:inline-flex;flex-direction:column;flex-shrink:0;height:2.5rem;justify-content:center;position:relative;vertical-align:top;width:2.5rem}.navbar-burger span{background-color:currentColor;display:block;height:var(--bulma-burger-item-height);left:calc(50% - (var(--bulma-burger-item-width)) / 2);position:absolute;transform-origin:center;transition-duration:var(--bulma-duration);transition-property:background-color,color,opacity,transform;transition-timing-function:var(--bulma-easing);width:var(--bulma-burger-item-width)}.navbar-burger span:nth-child(1),.navbar-burger span:nth-child(2){top:calc(50% - (var(--bulma-burger-item-height)) / 2)}.navbar-burger span:nth-child(3){bottom:calc(50% + var(--bulma-burger-gap))}.navbar-burger span:nth-child(4){top:calc(50% + var(--bulma-burger-gap))}.navbar-burger:hover{background-color:hsla(var(--bulma-burger-h),var(--bulma-burger-s),var(--bulma-burger-l),.1)}.navbar-burger:active{background-color:hsla(var(--bulma-burger-h),var(--bulma-burger-s),var(--bulma-burger-l),.2)}.navbar-burger.is-active span:nth-child(1){transform:rotate(-45deg)}.navbar-burger.is-active span:nth-child(2){transform:rotate(45deg)}.navbar-burger.is-active span:nth-child(3),.navbar-burger.is-active span:nth-child(4){opacity:0}.navbar-burger{align-self:center;color:var(--bulma-navbar-burger-color);margin-inline-start:auto;margin-inline-end:.375rem}.navbar-menu{display:none}.navbar-item,.navbar-link{color:var(--bulma-navbar-item-color);display:block;gap:.75rem;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}a.navbar-item,.navbar-link{background-color:hsla(var(--bulma-navbar-h),var(--bulma-navbar-s),calc(var(--bulma-navbar-item-background-l) + var(--bulma-navbar-item-background-l-delta)),var(--bulma-navbar-item-background-a));cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover{--bulma-navbar-item-background-l-delta: var(--bulma-navbar-item-hover-background-l-delta);--bulma-navbar-item-background-a: 1}a.navbar-item:active,.navbar-link:active{--bulma-navbar-item-background-l-delta: var(--bulma-navbar-item-active-background-l-delta);--bulma-navbar-item-background-a: 1}a.navbar-item.is-active,a.navbar-item.is-selected,.navbar-link.is-active,.navbar-link.is-selected{--bulma-navbar-h: var(--bulma-navbar-item-selected-h);--bulma-navbar-s: var(--bulma-navbar-item-selected-s);--bulma-navbar-l: var(--bulma-navbar-item-selected-l);--bulma-navbar-item-background-l: var(--bulma-navbar-item-selected-background-l);--bulma-navbar-item-background-a: 1;--bulma-navbar-item-color-l: var(--bulma-navbar-item-selected-color-l)}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img,.navbar-item svg{max-height:var(--bulma-navbar-item-img-max-height)}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:var(--bulma-navbar-height);padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:var(--bulma-navbar-tab-hover-background-color);border-bottom-color:var(--bulma-navbar-tab-hover-border-bottom-color)}.navbar-item.is-tab.is-active{background-color:var(--bulma-navbar-tab-active-background-color);border-bottom-color:var(--bulma-navbar-tab-active-border-bottom-color);border-bottom-style:var(--bulma-navbar-tab-active-border-bottom-style);border-bottom-width:var(--bulma-navbar-tab-active-border-bottom-width);color:var(--bulma-navbar-tab-active-color);padding-bottom:calc(.5rem - var(--bulma-navbar-tab-active-border-bottom-width))}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-inline-end:2.5em}.navbar-link:not(.is-arrowless):after{border-color:var(--bulma-navbar-dropdown-arrow);margin-top:-.375em;inset-inline-end:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.75rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-dropdown .navbar-item:not(.is-active,.is-selected){background-color:hsl(var(--bulma-navbar-dropdown-item-h),var(--bulma-navbar-dropdown-item-s),calc(var(--bulma-navbar-dropdown-item-background-l) + var(--bulma-navbar-item-background-l-delta)));color:hsl(var(--bulma-navbar-dropdown-item-h),var(--bulma-navbar-dropdown-item-s),var(--bulma-navbar-dropdown-item-color-l))}.navbar-divider{background-color:hsl(var(--bulma-navbar-h),var(--bulma-navbar-s),var(--bulma-navbar-divider-background-l));border:none;display:none;height:var(--bulma-navbar-divider-height);margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link:after{display:none}.navbar-menu{background-color:var(--bulma-navbar-background-color);box-shadow:0 .5em 1em hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-scheme-invert-l),.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:var(--bulma-navbar-fixed-z)}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -.125em .1875em hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-scheme-invert-l),.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - var(--bulma-navbar-height));overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:var(--bulma-navbar-height)}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:var(--bulma-navbar-height)}}@media screen and (min-width:1024px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:var(--bulma-navbar-height)}.navbar.is-spaced{padding:var(--bulma-navbar-padding-vertical) var(--bulma-navbar-padding-horizontal)}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:var(--bulma-radius)}.navbar.is-transparent{--bulma-navbar-item-background-a: 0}.navbar.is-transparent .navbar-dropdown a.navbar-item{background-color:hsl(var(--bulma-navbar-h),var(--bulma-navbar-s),calc(var(--bulma-navbar-item-background-l) + var(--bulma-navbar-item-background-l-delta)))}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active,.navbar.is-transparent .navbar-dropdown a.navbar-item.is-selected{--bulma-navbar-h: var(--bulma-navbar-item-selected-h);--bulma-navbar-s: var(--bulma-navbar-item-selected-s);--bulma-navbar-l: var(--bulma-navbar-item-selected-l);--bulma-navbar-item-background-l: var(--bulma-navbar-item-selected-background-l);--bulma-navbar-item-color-l: var(--bulma-navbar-item-selected-color-l)}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link:after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom-color:var(--bulma-navbar-dropdown-border-color);border-bottom-style:var(--bulma-navbar-dropdown-border-style);border-bottom-width:var(--bulma-navbar-dropdown-border-width);border-radius:var(--bulma-navbar-dropdown-radius) var(--bulma-navbar-dropdown-radius) 0 0;border-top:none;bottom:100%;box-shadow:0 -.5em .5em hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-scheme-invert-l),.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-inline-end:auto}.navbar-end{justify-content:flex-end;margin-inline-start:auto}.navbar-dropdown{background-color:var(--bulma-navbar-dropdown-background-color);border-end-start-radius:var(--bulma-navbar-dropdown-radius);border-end-end-radius:var(--bulma-navbar-dropdown-radius);border-top-color:var(--bulma-navbar-dropdown-border-color);border-top-style:var(--bulma-navbar-dropdown-border-style);border-top-width:var(--bulma-navbar-dropdown-border-width);box-shadow:0 .5em .5em hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-scheme-invert-l),.1);display:none;font-size:.875rem;inset-inline-start:0;min-width:100%;position:absolute;top:100%;z-index:var(--bulma-navbar-dropdown-z)}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-inline-end:3rem}.navbar-dropdown a.navbar-item:not(.is-active,.is-selected){background-color:hsl(var(--bulma-navbar-dropdown-item-h),var(--bulma-navbar-dropdown-item-s),calc(var(--bulma-navbar-dropdown-item-background-l) + var(--bulma-navbar-item-background-l-delta)));color:hsl(var(--bulma-navbar-dropdown-item-h),var(--bulma-navbar-dropdown-item-s),var(--bulma-navbar-dropdown-item-color-l))}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:var(--bulma-navbar-dropdown-boxed-radius);border-top:none;box-shadow:var(--bulma-navbar-dropdown-boxed-shadow);display:block;opacity:0;pointer-events:none;top:calc(100% + (var(--bulma-navbar-dropdown-offset)));transform:translateY(-5px);transition-duration:var(--bulma-duration);transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-inline-start:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-inline-end:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:var(--bulma-navbar-fixed-z)}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -.125em .1875em hsla(var(--bulma-scheme-h),var(--bulma-scheme-s),var(--bulma-scheme-invert-l),.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:var(--bulma-navbar-height)}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:var(--bulma-navbar-height)}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:calc(var(--bulma-navbar-height) + var(--bulma-navbar-padding-vertical) * 2)}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:calc(var(--bulma-navbar-height) + var(--bulma-navbar-padding-vertical) * 2)}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - var(--bulma-navbar-height))}.pagination{--bulma-pagination-margin: -.25rem;--bulma-pagination-min-width: var(--bulma-control-height);--bulma-pagination-item-h: var(--bulma-scheme-h);--bulma-pagination-item-s: var(--bulma-scheme-s);--bulma-pagination-item-l: var(--bulma-scheme-main-l);--bulma-pagination-item-background-l-delta: 0%;--bulma-pagination-item-hover-background-l-delta: var(--bulma-hover-background-l-delta);--bulma-pagination-item-active-background-l-delta: var(--bulma-active-background-l-delta);--bulma-pagination-item-border-style: solid;--bulma-pagination-item-border-width: var(--bulma-control-border-width);--bulma-pagination-item-border-l: var(--bulma-border-l);--bulma-pagination-item-border-l-delta: 0%;--bulma-pagination-item-hover-border-l-delta: var(--bulma-hover-border-l-delta);--bulma-pagination-item-active-border-l-delta: var(--bulma-active-border-l-delta);--bulma-pagination-item-focus-border-l-delta: var(--bulma-focus-border-l-delta);--bulma-pagination-item-color-l: var(--bulma-text-strong-l);--bulma-pagination-item-font-size: 1em;--bulma-pagination-item-margin: .25rem;--bulma-pagination-item-padding-left: .5em;--bulma-pagination-item-padding-right: .5em;--bulma-pagination-item-outer-shadow-h: 0;--bulma-pagination-item-outer-shadow-s: 0%;--bulma-pagination-item-outer-shadow-l: 20%;--bulma-pagination-item-outer-shadow-a: .05;--bulma-pagination-nav-padding-left: .75em;--bulma-pagination-nav-padding-right: .75em;--bulma-pagination-disabled-color: var(--bulma-text-weak);--bulma-pagination-disabled-background-color: var(--bulma-border);--bulma-pagination-disabled-border-color: var(--bulma-border);--bulma-pagination-current-color: var(--bulma-link-invert);--bulma-pagination-current-background-color: var(--bulma-link);--bulma-pagination-current-border-color: var(--bulma-link);--bulma-pagination-ellipsis-color: var(--bulma-text-weak);--bulma-pagination-shadow-inset: inset 0 .0625em .125em hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-scheme-invert-l), .2);--bulma-pagination-selected-item-h: var(--bulma-link-h);--bulma-pagination-selected-item-s: var(--bulma-link-s);--bulma-pagination-selected-item-l: var(--bulma-link-l);--bulma-pagination-selected-item-background-l: var(--bulma-link-l);--bulma-pagination-selected-item-border-l: var(--bulma-link-l);--bulma-pagination-selected-item-color-l: var(--bulma-link-invert-l)}.pagination{font-size:var(--bulma-size-normal);margin:var(--bulma-pagination-margin)}.pagination.is-small{font-size:var(--bulma-size-small)}.pagination.is-medium{font-size:var(--bulma-size-medium)}.pagination.is-large{font-size:var(--bulma-size-large)}.pagination.is-rounded .pagination-previous,.pagination.is-rounded .pagination-next{padding-left:1em;padding-right:1em;border-radius:var(--bulma-radius-rounded)}.pagination.is-rounded .pagination-link{border-radius:var(--bulma-radius-rounded)}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{color:hsl(var(--bulma-pagination-item-h),var(--bulma-pagination-item-s),var(--bulma-pagination-item-color-l));font-size:var(--bulma-pagination-item-font-size);justify-content:center;margin:var(--bulma-pagination-item-margin);padding-left:var(--bulma-pagination-item-padding-left);padding-right:var(--bulma-pagination-item-padding-right);text-align:center}.pagination-previous,.pagination-next,.pagination-link{background-color:hsl(var(--bulma-pagination-item-h),var(--bulma-pagination-item-s),calc(var(--bulma-pagination-item-background-l) + var(--bulma-pagination-item-background-l-delta)));border-color:hsl(var(--bulma-pagination-item-h),var(--bulma-pagination-item-s),calc(var(--bulma-pagination-item-border-l) + var(--bulma-pagination-item-border-l-delta)));border-style:var(--bulma-pagination-item-border-style);border-width:var(--bulma-pagination-item-border-width);box-shadow:0 .0625em .125em hsla(var(--bulma-pagination-item-outer-shadow-h),var(--bulma-pagination-item-outer-shadow-s),var(--bulma-pagination-item-outer-shadow-l),var(--bulma-pagination-item-outer-shadow-a)),0 .125em .25em hsla(var(--bulma-pagination-item-outer-shadow-h),var(--bulma-pagination-item-outer-shadow-s),var(--bulma-pagination-item-outer-shadow-l),var(--bulma-pagination-item-outer-shadow-a));color:hsl(var(--bulma-pagination-item-h),var(--bulma-pagination-item-s),var(--bulma-pagination-item-color-l));min-width:var(--bulma-pagination-min-width);transition-duration:var(--bulma-duration);transition-property:background-color,border-color,box-shadow,color}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{--bulma-pagination-item-background-l-delta: var(--bulma-pagination-item-hover-background-l-delta);--bulma-pagination-item-border-l-delta: var(--bulma-pagination-item-hover-border-l-delta)}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{--bulma-pagination-item-background-l-delta: var(--bulma-pagination-item-hover-background-l-delta);--bulma-pagination-item-border-l-delta: var(--bulma-pagination-item-hover-border-l-delta)}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:var(--bulma-pagination-shadow-inset)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:var(--bulma-pagination-disabled-background-color);border-color:var(--bulma-pagination-disabled-border-color);box-shadow:none;color:var(--bulma-pagination-disabled-color);opacity:.5}.pagination-previous,.pagination-next{padding-left:var(--bulma-pagination-nav-padding-left);padding-right:var(--bulma-pagination-nav-padding-right);white-space:nowrap}.pagination-link.is-current,.pagination-link.is-selected{--bulma-pagination-item-h: var(--bulma-pagination-selected-item-h);--bulma-pagination-item-s: var(--bulma-pagination-selected-item-s);--bulma-pagination-item-l: var(--bulma-pagination-selected-item-l);--bulma-pagination-item-background-l: var(--bulma-pagination-selected-item-background-l);--bulma-pagination-item-border-l: var(--bulma-pagination-selected-item-border-l);--bulma-pagination-item-color-l: var(--bulma-pagination-selected-item-color-l)}.pagination-ellipsis{color:var(--bulma-pagination-ellipsis-color);pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next,.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{--bulma-panel-margin: var(--bulma-block-spacing);--bulma-panel-item-border: 1px solid var(--bulma-border-weak);--bulma-panel-radius: var(--bulma-radius-large);--bulma-panel-shadow: var(--bulma-shadow);--bulma-panel-heading-line-height: 1.25;--bulma-panel-heading-padding: 1em 1.25em;--bulma-panel-heading-radius: var(--bulma-radius);--bulma-panel-heading-size: 1.25em;--bulma-panel-heading-weight: var(--bulma-weight-bold);--bulma-panel-tabs-font-size: 1em;--bulma-panel-tab-border-bottom-color: var(--bulma-border);--bulma-panel-tab-border-bottom-style: solid;--bulma-panel-tab-border-bottom-width: 1px;--bulma-panel-tab-active-color: var(--bulma-link-active);--bulma-panel-list-item-color: var(--bulma-text);--bulma-panel-list-item-hover-color: var(--bulma-link);--bulma-panel-block-color: var(--bulma-text-strong);--bulma-panel-block-hover-background-color: var(--bulma-background);--bulma-panel-block-active-border-left-color: var(--bulma-link);--bulma-panel-block-active-color: var(--bulma-link-active);--bulma-panel-block-active-icon-color: var(--bulma-link);--bulma-panel-icon-color: var(--bulma-text-weak)}.panel{--bulma-panel-h: var(--bulma-scheme-h);--bulma-panel-s: var(--bulma-scheme-s);--bulma-panel-color-l: var(--bulma-text-l);--bulma-panel-heading-background-l: var(--bulma-text-l);--bulma-panel-heading-color-l: var(--bulma-text-invert-l);border-radius:var(--bulma-panel-radius);box-shadow:var(--bulma-panel-shadow);font-size:var(--bulma-size-normal)}.panel:not(:last-child){margin-bottom:var(--bulma-panel-margin)}.panel.is-white{--bulma-panel-h: var(--bulma-white-h);--bulma-panel-s: var(--bulma-white-s);--bulma-panel-color-l: var(--bulma-white-l);--bulma-panel-heading-background-l: var(--bulma-white-l);--bulma-panel-heading-color-l: var(--bulma-white-invert-l)}.panel.is-black{--bulma-panel-h: var(--bulma-black-h);--bulma-panel-s: var(--bulma-black-s);--bulma-panel-color-l: var(--bulma-black-l);--bulma-panel-heading-background-l: var(--bulma-black-l);--bulma-panel-heading-color-l: var(--bulma-black-invert-l)}.panel.is-light{--bulma-panel-h: var(--bulma-light-h);--bulma-panel-s: var(--bulma-light-s);--bulma-panel-color-l: var(--bulma-light-l);--bulma-panel-heading-background-l: var(--bulma-light-l);--bulma-panel-heading-color-l: var(--bulma-light-invert-l)}.panel.is-dark{--bulma-panel-h: var(--bulma-dark-h);--bulma-panel-s: var(--bulma-dark-s);--bulma-panel-color-l: var(--bulma-dark-l);--bulma-panel-heading-background-l: var(--bulma-dark-l);--bulma-panel-heading-color-l: var(--bulma-dark-invert-l)}.panel.is-text{--bulma-panel-h: var(--bulma-text-h);--bulma-panel-s: var(--bulma-text-s);--bulma-panel-color-l: var(--bulma-text-l);--bulma-panel-heading-background-l: var(--bulma-text-l);--bulma-panel-heading-color-l: var(--bulma-text-invert-l)}.panel.is-primary{--bulma-panel-h: var(--bulma-primary-h);--bulma-panel-s: var(--bulma-primary-s);--bulma-panel-color-l: var(--bulma-primary-l);--bulma-panel-heading-background-l: var(--bulma-primary-l);--bulma-panel-heading-color-l: var(--bulma-primary-invert-l)}.panel.is-link{--bulma-panel-h: var(--bulma-link-h);--bulma-panel-s: var(--bulma-link-s);--bulma-panel-color-l: var(--bulma-link-l);--bulma-panel-heading-background-l: var(--bulma-link-l);--bulma-panel-heading-color-l: var(--bulma-link-invert-l)}.panel.is-info{--bulma-panel-h: var(--bulma-info-h);--bulma-panel-s: var(--bulma-info-s);--bulma-panel-color-l: var(--bulma-info-l);--bulma-panel-heading-background-l: var(--bulma-info-l);--bulma-panel-heading-color-l: var(--bulma-info-invert-l)}.panel.is-success{--bulma-panel-h: var(--bulma-success-h);--bulma-panel-s: var(--bulma-success-s);--bulma-panel-color-l: var(--bulma-success-l);--bulma-panel-heading-background-l: var(--bulma-success-l);--bulma-panel-heading-color-l: var(--bulma-success-invert-l)}.panel.is-warning{--bulma-panel-h: var(--bulma-warning-h);--bulma-panel-s: var(--bulma-warning-s);--bulma-panel-color-l: var(--bulma-warning-l);--bulma-panel-heading-background-l: var(--bulma-warning-l);--bulma-panel-heading-color-l: var(--bulma-warning-invert-l)}.panel.is-danger{--bulma-panel-h: var(--bulma-danger-h);--bulma-panel-s: var(--bulma-danger-s);--bulma-panel-color-l: var(--bulma-danger-l);--bulma-panel-heading-background-l: var(--bulma-danger-l);--bulma-panel-heading-color-l: var(--bulma-danger-invert-l)}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:var(--bulma-panel-item-border)}.panel-heading{background-color:hsl(var(--bulma-panel-h),var(--bulma-panel-s),var(--bulma-panel-heading-background-l));border-radius:var(--bulma-panel-radius) var(--bulma-panel-radius) 0 0;color:hsl(var(--bulma-panel-h),var(--bulma-panel-s),var(--bulma-panel-heading-color-l));font-size:var(--bulma-panel-heading-size);font-weight:var(--bulma-panel-heading-weight);line-height:var(--bulma-panel-heading-line-height);padding:var(--bulma-panel-heading-padding)}.panel-tabs{align-items:flex-end;display:flex;font-size:var(--bulma-panel-tabs-font-size);justify-content:center}.panel-tabs a{border-bottom-color:var(--bulma-panel-tab-border-bottom-color);border-bottom-style:var(--bulma-panel-tab-border-bottom-style);border-bottom-width:var(--bulma-panel-tab-border-bottom-width);margin-bottom:-1px;padding:.75em}.panel-tabs a.is-active{border-bottom-color:hsl(var(--bulma-panel-h),var(--bulma-panel-s),var(--bulma-panel-color-l));color:var(--bulma-panel-tab-active-color)}.panel-list a{color:var(--bulma-panel-list-item-color)}.panel-list a:hover{color:var(--bulma-panel-list-item-hover-color)}.panel-block{align-items:center;color:var(--bulma-panel-block-color);display:flex;justify-content:flex-start;padding:.75em 1em}.panel-block input[type=checkbox]{margin-inline-end:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:var(--bulma-panel-block-active-border-left-color);color:var(--bulma-panel-block-active-color)}.panel-block.is-active .panel-icon{color:hsl(var(--bulma-panel-h),var(--bulma-panel-s),var(--bulma-panel-color-l))}.panel-block:last-child{border-end-start-radius:var(--bulma-panel-radius);border-end-end-radius:var(--bulma-panel-radius)}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:var(--bulma-panel-block-hover-background-color)}.panel-icon{display:inline-block;font-size:1em;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:var(--bulma-panel-icon-color);margin-inline-end:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{--bulma-tabs-border-bottom-color: var(--bulma-border);--bulma-tabs-border-bottom-style: solid;--bulma-tabs-border-bottom-width: 1px;--bulma-tabs-link-color: var(--bulma-text);--bulma-tabs-link-hover-border-bottom-color: var(--bulma-text-strong);--bulma-tabs-link-hover-color: var(--bulma-text-strong);--bulma-tabs-link-active-border-bottom-color: var(--bulma-link-text);--bulma-tabs-link-active-color: var(--bulma-link-text);--bulma-tabs-link-padding: .5em 1em;--bulma-tabs-boxed-link-radius: var(--bulma-radius);--bulma-tabs-boxed-link-hover-background-color: var(--bulma-background);--bulma-tabs-boxed-link-hover-border-bottom-color: var(--bulma-border);--bulma-tabs-boxed-link-active-background-color: var(--bulma-scheme-main);--bulma-tabs-boxed-link-active-border-color: var(--bulma-border);--bulma-tabs-boxed-link-active-border-bottom-color: transparent;--bulma-tabs-toggle-link-border-color: var(--bulma-border);--bulma-tabs-toggle-link-border-style: solid;--bulma-tabs-toggle-link-border-width: 1px;--bulma-tabs-toggle-link-hover-background-color: var(--bulma-background);--bulma-tabs-toggle-link-hover-border-color: var(--bulma-border-hover);--bulma-tabs-toggle-link-radius: var(--bulma-radius);--bulma-tabs-toggle-link-active-background-color: var(--bulma-link);--bulma-tabs-toggle-link-active-border-color: var(--bulma-link);--bulma-tabs-toggle-link-active-color: var(--bulma-link-invert)}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:var(--bulma-size-normal);justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:var(--bulma-tabs-border-bottom-color);border-bottom-style:var(--bulma-tabs-border-bottom-style);border-bottom-width:var(--bulma-tabs-border-bottom-width);color:var(--bulma-tabs-link-color);display:flex;justify-content:center;margin-bottom:calc(-1 * var(--bulma-tabs-border-bottom-width));padding:var(--bulma-tabs-link-padding);transition-duration:var(--bulma-duration);transition-property:background-color,border-color,color;vertical-align:top}.tabs a:hover{border-bottom-color:var(--bulma-tabs-link-hover-border-bottom-color);color:var(--bulma-tabs-link-hover-color)}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:var(--bulma-tabs-link-active-border-bottom-color);color:var(--bulma-tabs-link-active-color)}.tabs ul{align-items:center;border-bottom-color:var(--bulma-tabs-border-bottom-color);border-bottom-style:var(--bulma-tabs-border-bottom-style);border-bottom-width:var(--bulma-tabs-border-bottom-width);display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-inline-end:.5em}.tabs .icon:last-child{margin-inline-start:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-start-start-radius:var(--bulma-tabs-boxed-link-radius);border-start-end-radius:var(--bulma-tabs-boxed-link-radius)}.tabs.is-boxed a:hover{background-color:var(--bulma-tabs-boxed-link-hover-background-color);border-bottom-color:var(--bulma-tabs-boxed-link-hover-border-bottom-color)}.tabs.is-boxed li.is-active a{background-color:var(--bulma-tabs-boxed-link-active-background-color);border-color:var(--bulma-tabs-boxed-link-active-border-color);border-bottom-color:var(--bulma-tabs-boxed-link-active-border-bottom-color)!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:var(--bulma-tabs-toggle-link-border-color);border-style:var(--bulma-tabs-toggle-link-border-style);border-width:var(--bulma-tabs-toggle-link-border-width);margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:var(--bulma-tabs-toggle-link-hover-background-color);border-color:var(--bulma-tabs-toggle-link-hover-border-color);z-index:2}.tabs.is-toggle li+li{margin-inline-start:calc(-1 * var(--bulma-tabs-toggle-link-border-width))}.tabs.is-toggle li:first-child a{border-start-start-radius:var(--bulma-tabs-toggle-link-radius);border-end-start-radius:var(--bulma-tabs-toggle-link-radius)}.tabs.is-toggle li:last-child a{border-start-end-radius:var(--bulma-tabs-toggle-link-radius);border-end-end-radius:var(--bulma-tabs-toggle-link-radius)}.tabs.is-toggle li.is-active a{background-color:var(--bulma-tabs-toggle-link-active-background-color);border-color:var(--bulma-tabs-toggle-link-active-border-color);color:var(--bulma-tabs-toggle-link-active-color);z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-start-start-radius:var(--bulma-radius-rounded);border-end-start-radius:var(--bulma-radius-rounded);padding-inline-start:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-start-end-radius:var(--bulma-radius-rounded);border-end-end-radius:var(--bulma-radius-rounded);padding-inline-end:1.25em}.tabs.is-small{font-size:var(--bulma-size-small)}.tabs.is-medium{font-size:var(--bulma-size-medium)}.tabs.is-large{font-size:var(--bulma-size-large)}:root{--bulma-column-gap: .75rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:var(--bulma-column-gap)}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-inline-start:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-inline-start:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-inline-start:50%}.columns.is-mobile>.column.is-offset-one-third{margin-inline-start:.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-inline-start:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-inline-start:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-inline-start:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-inline-start:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-inline-start:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-inline-start:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>.column.is-offset-1{margin-inline-start:8.3333333333%}.columns.is-mobile>.column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>.column.is-offset-2{margin-inline-start:16.6666666667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-inline-start:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>.column.is-offset-4{margin-inline-start:33.3333333333%}.columns.is-mobile>.column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>.column.is-offset-5{margin-inline-start:41.6666666667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-inline-start:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>.column.is-offset-7{margin-inline-start:58.3333333333%}.columns.is-mobile>.column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>.column.is-offset-8{margin-inline-start:66.6666666667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-inline-start:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>.column.is-offset-10{margin-inline-start:83.3333333333%}.columns.is-mobile>.column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>.column.is-offset-11{margin-inline-start:91.6666666667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-inline-start:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-inline-start:75%}.column.is-offset-two-thirds-mobile{margin-inline-start:66.6666%}.column.is-offset-half-mobile{margin-inline-start:50%}.column.is-offset-one-third-mobile{margin-inline-start:.3333%}.column.is-offset-one-quarter-mobile{margin-inline-start:25%}.column.is-offset-one-fifth-mobile{margin-inline-start:20%}.column.is-offset-two-fifths-mobile{margin-inline-start:40%}.column.is-offset-three-fifths-mobile{margin-inline-start:60%}.column.is-offset-four-fifths-mobile{margin-inline-start:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-inline-start:0%}.column.is-1-mobile{flex:none;width:8.3333333333%}.column.is-offset-1-mobile{margin-inline-start:8.3333333333%}.column.is-2-mobile{flex:none;width:16.6666666667%}.column.is-offset-2-mobile{margin-inline-start:16.6666666667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-inline-start:25%}.column.is-4-mobile{flex:none;width:33.3333333333%}.column.is-offset-4-mobile{margin-inline-start:33.3333333333%}.column.is-5-mobile{flex:none;width:41.6666666667%}.column.is-offset-5-mobile{margin-inline-start:41.6666666667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-inline-start:50%}.column.is-7-mobile{flex:none;width:58.3333333333%}.column.is-offset-7-mobile{margin-inline-start:58.3333333333%}.column.is-8-mobile{flex:none;width:66.6666666667%}.column.is-offset-8-mobile{margin-inline-start:66.6666666667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-inline-start:75%}.column.is-10-mobile{flex:none;width:83.3333333333%}.column.is-offset-10-mobile{margin-inline-start:83.3333333333%}.column.is-11-mobile{flex:none;width:91.6666666667%}.column.is-offset-11-mobile{margin-inline-start:91.6666666667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-inline-start:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-inline-start:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-inline-start:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-inline-start:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-inline-start:.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-inline-start:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-inline-start:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-inline-start:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-inline-start:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-inline-start:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-inline-start:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.3333333333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-inline-start:8.3333333333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.6666666667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-inline-start:16.6666666667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-inline-start:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.3333333333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-inline-start:33.3333333333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.6666666667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-inline-start:41.6666666667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-inline-start:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.3333333333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-inline-start:58.3333333333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.6666666667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-inline-start:66.6666666667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-inline-start:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.3333333333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-inline-start:83.3333333333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.6666666667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-inline-start:91.6666666667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-inline-start:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-inline-start:75%}.column.is-offset-two-thirds-touch{margin-inline-start:66.6666%}.column.is-offset-half-touch{margin-inline-start:50%}.column.is-offset-one-third-touch{margin-inline-start:.3333%}.column.is-offset-one-quarter-touch{margin-inline-start:25%}.column.is-offset-one-fifth-touch{margin-inline-start:20%}.column.is-offset-two-fifths-touch{margin-inline-start:40%}.column.is-offset-three-fifths-touch{margin-inline-start:60%}.column.is-offset-four-fifths-touch{margin-inline-start:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-inline-start:0%}.column.is-1-touch{flex:none;width:8.3333333333%}.column.is-offset-1-touch{margin-inline-start:8.3333333333%}.column.is-2-touch{flex:none;width:16.6666666667%}.column.is-offset-2-touch{margin-inline-start:16.6666666667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-inline-start:25%}.column.is-4-touch{flex:none;width:33.3333333333%}.column.is-offset-4-touch{margin-inline-start:33.3333333333%}.column.is-5-touch{flex:none;width:41.6666666667%}.column.is-offset-5-touch{margin-inline-start:41.6666666667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-inline-start:50%}.column.is-7-touch{flex:none;width:58.3333333333%}.column.is-offset-7-touch{margin-inline-start:58.3333333333%}.column.is-8-touch{flex:none;width:66.6666666667%}.column.is-offset-8-touch{margin-inline-start:66.6666666667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-inline-start:75%}.column.is-10-touch{flex:none;width:83.3333333333%}.column.is-offset-10-touch{margin-inline-start:83.3333333333%}.column.is-11-touch{flex:none;width:91.6666666667%}.column.is-offset-11-touch{margin-inline-start:91.6666666667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-inline-start:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-inline-start:75%}.column.is-offset-two-thirds-desktop{margin-inline-start:66.6666%}.column.is-offset-half-desktop{margin-inline-start:50%}.column.is-offset-one-third-desktop{margin-inline-start:.3333%}.column.is-offset-one-quarter-desktop{margin-inline-start:25%}.column.is-offset-one-fifth-desktop{margin-inline-start:20%}.column.is-offset-two-fifths-desktop{margin-inline-start:40%}.column.is-offset-three-fifths-desktop{margin-inline-start:60%}.column.is-offset-four-fifths-desktop{margin-inline-start:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-inline-start:0%}.column.is-1-desktop{flex:none;width:8.3333333333%}.column.is-offset-1-desktop{margin-inline-start:8.3333333333%}.column.is-2-desktop{flex:none;width:16.6666666667%}.column.is-offset-2-desktop{margin-inline-start:16.6666666667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-inline-start:25%}.column.is-4-desktop{flex:none;width:33.3333333333%}.column.is-offset-4-desktop{margin-inline-start:33.3333333333%}.column.is-5-desktop{flex:none;width:41.6666666667%}.column.is-offset-5-desktop{margin-inline-start:41.6666666667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-inline-start:50%}.column.is-7-desktop{flex:none;width:58.3333333333%}.column.is-offset-7-desktop{margin-inline-start:58.3333333333%}.column.is-8-desktop{flex:none;width:66.6666666667%}.column.is-offset-8-desktop{margin-inline-start:66.6666666667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-inline-start:75%}.column.is-10-desktop{flex:none;width:83.3333333333%}.column.is-offset-10-desktop{margin-inline-start:83.3333333333%}.column.is-11-desktop{flex:none;width:91.6666666667%}.column.is-offset-11-desktop{margin-inline-start:91.6666666667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-inline-start:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-inline-start:75%}.column.is-offset-two-thirds-widescreen{margin-inline-start:66.6666%}.column.is-offset-half-widescreen{margin-inline-start:50%}.column.is-offset-one-third-widescreen{margin-inline-start:.3333%}.column.is-offset-one-quarter-widescreen{margin-inline-start:25%}.column.is-offset-one-fifth-widescreen{margin-inline-start:20%}.column.is-offset-two-fifths-widescreen{margin-inline-start:40%}.column.is-offset-three-fifths-widescreen{margin-inline-start:60%}.column.is-offset-four-fifths-widescreen{margin-inline-start:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-inline-start:0%}.column.is-1-widescreen{flex:none;width:8.3333333333%}.column.is-offset-1-widescreen{margin-inline-start:8.3333333333%}.column.is-2-widescreen{flex:none;width:16.6666666667%}.column.is-offset-2-widescreen{margin-inline-start:16.6666666667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-inline-start:25%}.column.is-4-widescreen{flex:none;width:33.3333333333%}.column.is-offset-4-widescreen{margin-inline-start:33.3333333333%}.column.is-5-widescreen{flex:none;width:41.6666666667%}.column.is-offset-5-widescreen{margin-inline-start:41.6666666667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-inline-start:50%}.column.is-7-widescreen{flex:none;width:58.3333333333%}.column.is-offset-7-widescreen{margin-inline-start:58.3333333333%}.column.is-8-widescreen{flex:none;width:66.6666666667%}.column.is-offset-8-widescreen{margin-inline-start:66.6666666667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-inline-start:75%}.column.is-10-widescreen{flex:none;width:83.3333333333%}.column.is-offset-10-widescreen{margin-inline-start:83.3333333333%}.column.is-11-widescreen{flex:none;width:91.6666666667%}.column.is-offset-11-widescreen{margin-inline-start:91.6666666667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-inline-start:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-inline-start:75%}.column.is-offset-two-thirds-fullhd{margin-inline-start:66.6666%}.column.is-offset-half-fullhd{margin-inline-start:50%}.column.is-offset-one-third-fullhd{margin-inline-start:33.3333%}.column.is-offset-one-quarter-fullhd{margin-inline-start:25%}.column.is-offset-one-fifth-fullhd{margin-inline-start:20%}.column.is-offset-two-fifths-fullhd{margin-inline-start:40%}.column.is-offset-three-fifths-fullhd{margin-inline-start:60%}.column.is-offset-four-fifths-fullhd{margin-inline-start:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-inline-start:0%}.column.is-1-fullhd{flex:none;width:8.3333333333%}.column.is-offset-1-fullhd{margin-inline-start:8.3333333333%}.column.is-2-fullhd{flex:none;width:16.6666666667%}.column.is-offset-2-fullhd{margin-inline-start:16.6666666667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-inline-start:25%}.column.is-4-fullhd{flex:none;width:33.3333333333%}.column.is-offset-4-fullhd{margin-inline-start:33.3333333333%}.column.is-5-fullhd{flex:none;width:41.6666666667%}.column.is-offset-5-fullhd{margin-inline-start:41.6666666667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-inline-start:50%}.column.is-7-fullhd{flex:none;width:58.3333333333%}.column.is-offset-7-fullhd{margin-inline-start:58.3333333333%}.column.is-8-fullhd{flex:none;width:66.6666666667%}.column.is-offset-8-fullhd{margin-inline-start:66.6666666667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-inline-start:75%}.column.is-10-fullhd{flex:none;width:83.3333333333%}.column.is-offset-10-fullhd{margin-inline-start:83.3333333333%}.column.is-11-fullhd{flex:none;width:91.6666666667%}.column.is-offset-11-fullhd{margin-inline-start:91.6666666667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-inline-start:100%}}.columns{margin-inline-start:calc(-1 * var(--bulma-column-gap));margin-inline-end:calc(-1 * var(--bulma-column-gap));margin-top:calc(-1 * var(--bulma-column-gap))}.columns:last-child{margin-bottom:calc(-1 * var(--bulma-column-gap))}.columns:not(:last-child){margin-bottom:calc(var(--bulma-block-spacing) - var(--bulma-column-gap))}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-inline-start:0;margin-inline-end:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-0{--bulma-column-gap: 0rem}@media screen and (max-width:768px){.columns.is-0-mobile{--bulma-column-gap: 0rem}}@media screen and (min-width:769px),print{.columns.is-0-tablet{--bulma-column-gap: 0rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-0-tablet-only{--bulma-column-gap: 0rem}}@media screen and (max-width:1023px){.columns.is-0-touch{--bulma-column-gap: 0rem}}@media screen and (min-width:1024px){.columns.is-0-desktop{--bulma-column-gap: 0rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-0-desktop-only{--bulma-column-gap: 0rem}}@media screen and (min-width:1216px){.columns.is-0-widescreen{--bulma-column-gap: 0rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-0-widescreen-only{--bulma-column-gap: 0rem}}@media screen and (min-width:1408px){.columns.is-0-fullhd{--bulma-column-gap: 0rem}}.columns.is-1{--bulma-column-gap: .25rem}@media screen and (max-width:768px){.columns.is-1-mobile{--bulma-column-gap: .25rem}}@media screen and (min-width:769px),print{.columns.is-1-tablet{--bulma-column-gap: .25rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-1-tablet-only{--bulma-column-gap: .25rem}}@media screen and (max-width:1023px){.columns.is-1-touch{--bulma-column-gap: .25rem}}@media screen and (min-width:1024px){.columns.is-1-desktop{--bulma-column-gap: .25rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-1-desktop-only{--bulma-column-gap: .25rem}}@media screen and (min-width:1216px){.columns.is-1-widescreen{--bulma-column-gap: .25rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-1-widescreen-only{--bulma-column-gap: .25rem}}@media screen and (min-width:1408px){.columns.is-1-fullhd{--bulma-column-gap: .25rem}}.columns.is-2{--bulma-column-gap: .5rem}@media screen and (max-width:768px){.columns.is-2-mobile{--bulma-column-gap: .5rem}}@media screen and (min-width:769px),print{.columns.is-2-tablet{--bulma-column-gap: .5rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-2-tablet-only{--bulma-column-gap: .5rem}}@media screen and (max-width:1023px){.columns.is-2-touch{--bulma-column-gap: .5rem}}@media screen and (min-width:1024px){.columns.is-2-desktop{--bulma-column-gap: .5rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-2-desktop-only{--bulma-column-gap: .5rem}}@media screen and (min-width:1216px){.columns.is-2-widescreen{--bulma-column-gap: .5rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-2-widescreen-only{--bulma-column-gap: .5rem}}@media screen and (min-width:1408px){.columns.is-2-fullhd{--bulma-column-gap: .5rem}}.columns.is-3{--bulma-column-gap: .75rem}@media screen and (max-width:768px){.columns.is-3-mobile{--bulma-column-gap: .75rem}}@media screen and (min-width:769px),print{.columns.is-3-tablet{--bulma-column-gap: .75rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-3-tablet-only{--bulma-column-gap: .75rem}}@media screen and (max-width:1023px){.columns.is-3-touch{--bulma-column-gap: .75rem}}@media screen and (min-width:1024px){.columns.is-3-desktop{--bulma-column-gap: .75rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-3-desktop-only{--bulma-column-gap: .75rem}}@media screen and (min-width:1216px){.columns.is-3-widescreen{--bulma-column-gap: .75rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-3-widescreen-only{--bulma-column-gap: .75rem}}@media screen and (min-width:1408px){.columns.is-3-fullhd{--bulma-column-gap: .75rem}}.columns.is-4{--bulma-column-gap: 1rem}@media screen and (max-width:768px){.columns.is-4-mobile{--bulma-column-gap: 1rem}}@media screen and (min-width:769px),print{.columns.is-4-tablet{--bulma-column-gap: 1rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-4-tablet-only{--bulma-column-gap: 1rem}}@media screen and (max-width:1023px){.columns.is-4-touch{--bulma-column-gap: 1rem}}@media screen and (min-width:1024px){.columns.is-4-desktop{--bulma-column-gap: 1rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-4-desktop-only{--bulma-column-gap: 1rem}}@media screen and (min-width:1216px){.columns.is-4-widescreen{--bulma-column-gap: 1rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-4-widescreen-only{--bulma-column-gap: 1rem}}@media screen and (min-width:1408px){.columns.is-4-fullhd{--bulma-column-gap: 1rem}}.columns.is-5{--bulma-column-gap: 1.25rem}@media screen and (max-width:768px){.columns.is-5-mobile{--bulma-column-gap: 1.25rem}}@media screen and (min-width:769px),print{.columns.is-5-tablet{--bulma-column-gap: 1.25rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-5-tablet-only{--bulma-column-gap: 1.25rem}}@media screen and (max-width:1023px){.columns.is-5-touch{--bulma-column-gap: 1.25rem}}@media screen and (min-width:1024px){.columns.is-5-desktop{--bulma-column-gap: 1.25rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-5-desktop-only{--bulma-column-gap: 1.25rem}}@media screen and (min-width:1216px){.columns.is-5-widescreen{--bulma-column-gap: 1.25rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-5-widescreen-only{--bulma-column-gap: 1.25rem}}@media screen and (min-width:1408px){.columns.is-5-fullhd{--bulma-column-gap: 1.25rem}}.columns.is-6{--bulma-column-gap: 1.5rem}@media screen and (max-width:768px){.columns.is-6-mobile{--bulma-column-gap: 1.5rem}}@media screen and (min-width:769px),print{.columns.is-6-tablet{--bulma-column-gap: 1.5rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-6-tablet-only{--bulma-column-gap: 1.5rem}}@media screen and (max-width:1023px){.columns.is-6-touch{--bulma-column-gap: 1.5rem}}@media screen and (min-width:1024px){.columns.is-6-desktop{--bulma-column-gap: 1.5rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-6-desktop-only{--bulma-column-gap: 1.5rem}}@media screen and (min-width:1216px){.columns.is-6-widescreen{--bulma-column-gap: 1.5rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-6-widescreen-only{--bulma-column-gap: 1.5rem}}@media screen and (min-width:1408px){.columns.is-6-fullhd{--bulma-column-gap: 1.5rem}}.columns.is-7{--bulma-column-gap: 1.75rem}@media screen and (max-width:768px){.columns.is-7-mobile{--bulma-column-gap: 1.75rem}}@media screen and (min-width:769px),print{.columns.is-7-tablet{--bulma-column-gap: 1.75rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-7-tablet-only{--bulma-column-gap: 1.75rem}}@media screen and (max-width:1023px){.columns.is-7-touch{--bulma-column-gap: 1.75rem}}@media screen and (min-width:1024px){.columns.is-7-desktop{--bulma-column-gap: 1.75rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-7-desktop-only{--bulma-column-gap: 1.75rem}}@media screen and (min-width:1216px){.columns.is-7-widescreen{--bulma-column-gap: 1.75rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-7-widescreen-only{--bulma-column-gap: 1.75rem}}@media screen and (min-width:1408px){.columns.is-7-fullhd{--bulma-column-gap: 1.75rem}}.columns.is-8{--bulma-column-gap: 2rem}@media screen and (max-width:768px){.columns.is-8-mobile{--bulma-column-gap: 2rem}}@media screen and (min-width:769px),print{.columns.is-8-tablet{--bulma-column-gap: 2rem}}@media screen and (min-width:769px)and (max-width:1023px){.columns.is-8-tablet-only{--bulma-column-gap: 2rem}}@media screen and (max-width:1023px){.columns.is-8-touch{--bulma-column-gap: 2rem}}@media screen and (min-width:1024px){.columns.is-8-desktop{--bulma-column-gap: 2rem}}@media screen and (min-width:1024px)and (max-width:1215px){.columns.is-8-desktop-only{--bulma-column-gap: 2rem}}@media screen and (min-width:1216px){.columns.is-8-widescreen{--bulma-column-gap: 2rem}}@media screen and (min-width:1216px)and (max-width:1407px){.columns.is-8-widescreen-only{--bulma-column-gap: 2rem}}@media screen and (min-width:1408px){.columns.is-8-fullhd{--bulma-column-gap: 2rem}}.fixed-grid{container-name:bulma-fixed-grid;container-type:inline-size}.fixed-grid>.grid{--bulma-grid-gap-count: calc(var(--bulma-grid-column-count) - 1);--bulma-grid-column-count: 2;grid-template-columns:repeat(var(--bulma-grid-column-count),1fr)}.fixed-grid.has-1-cols>.grid{--bulma-grid-column-count: 1}.fixed-grid.has-2-cols>.grid{--bulma-grid-column-count: 2}.fixed-grid.has-3-cols>.grid{--bulma-grid-column-count: 3}.fixed-grid.has-4-cols>.grid{--bulma-grid-column-count: 4}.fixed-grid.has-5-cols>.grid{--bulma-grid-column-count: 5}.fixed-grid.has-6-cols>.grid{--bulma-grid-column-count: 6}.fixed-grid.has-7-cols>.grid{--bulma-grid-column-count: 7}.fixed-grid.has-8-cols>.grid{--bulma-grid-column-count: 8}.fixed-grid.has-9-cols>.grid{--bulma-grid-column-count: 9}.fixed-grid.has-10-cols>.grid{--bulma-grid-column-count: 10}.fixed-grid.has-11-cols>.grid{--bulma-grid-column-count: 11}.fixed-grid.has-12-cols>.grid{--bulma-grid-column-count: 12}@container bulma-fixed-grid (max-width: 768px){.fixed-grid.has-1-cols-mobile>.grid{--bulma-grid-column-count: 1}.fixed-grid.has-2-cols-mobile>.grid{--bulma-grid-column-count: 2}.fixed-grid.has-3-cols-mobile>.grid{--bulma-grid-column-count: 3}.fixed-grid.has-4-cols-mobile>.grid{--bulma-grid-column-count: 4}.fixed-grid.has-5-cols-mobile>.grid{--bulma-grid-column-count: 5}.fixed-grid.has-6-cols-mobile>.grid{--bulma-grid-column-count: 6}.fixed-grid.has-7-cols-mobile>.grid{--bulma-grid-column-count: 7}.fixed-grid.has-8-cols-mobile>.grid{--bulma-grid-column-count: 8}.fixed-grid.has-9-cols-mobile>.grid{--bulma-grid-column-count: 9}.fixed-grid.has-10-cols-mobile>.grid{--bulma-grid-column-count: 10}.fixed-grid.has-11-cols-mobile>.grid{--bulma-grid-column-count: 11}.fixed-grid.has-12-cols-mobile>.grid{--bulma-grid-column-count: 12}}@container bulma-fixed-grid (min-width: 769px){.fixed-grid.has-1-cols-tablet>.grid{--bulma-grid-column-count: 1}.fixed-grid.has-2-cols-tablet>.grid{--bulma-grid-column-count: 2}.fixed-grid.has-3-cols-tablet>.grid{--bulma-grid-column-count: 3}.fixed-grid.has-4-cols-tablet>.grid{--bulma-grid-column-count: 4}.fixed-grid.has-5-cols-tablet>.grid{--bulma-grid-column-count: 5}.fixed-grid.has-6-cols-tablet>.grid{--bulma-grid-column-count: 6}.fixed-grid.has-7-cols-tablet>.grid{--bulma-grid-column-count: 7}.fixed-grid.has-8-cols-tablet>.grid{--bulma-grid-column-count: 8}.fixed-grid.has-9-cols-tablet>.grid{--bulma-grid-column-count: 9}.fixed-grid.has-10-cols-tablet>.grid{--bulma-grid-column-count: 10}.fixed-grid.has-11-cols-tablet>.grid{--bulma-grid-column-count: 11}.fixed-grid.has-12-cols-tablet>.grid{--bulma-grid-column-count: 12}}@container bulma-fixed-grid (min-width: 1024px){.fixed-grid.has-1-cols-desktop>.grid{--bulma-grid-column-count: 1}.fixed-grid.has-2-cols-desktop>.grid{--bulma-grid-column-count: 2}.fixed-grid.has-3-cols-desktop>.grid{--bulma-grid-column-count: 3}.fixed-grid.has-4-cols-desktop>.grid{--bulma-grid-column-count: 4}.fixed-grid.has-5-cols-desktop>.grid{--bulma-grid-column-count: 5}.fixed-grid.has-6-cols-desktop>.grid{--bulma-grid-column-count: 6}.fixed-grid.has-7-cols-desktop>.grid{--bulma-grid-column-count: 7}.fixed-grid.has-8-cols-desktop>.grid{--bulma-grid-column-count: 8}.fixed-grid.has-9-cols-desktop>.grid{--bulma-grid-column-count: 9}.fixed-grid.has-10-cols-desktop>.grid{--bulma-grid-column-count: 10}.fixed-grid.has-11-cols-desktop>.grid{--bulma-grid-column-count: 11}.fixed-grid.has-12-cols-desktop>.grid{--bulma-grid-column-count: 12}}@container bulma-fixed-grid (min-width: 1216px){.fixed-grid.has-1-cols-widescreen>.grid{--bulma-grid-column-count: 1}.fixed-grid.has-2-cols-widescreen>.grid{--bulma-grid-column-count: 2}.fixed-grid.has-3-cols-widescreen>.grid{--bulma-grid-column-count: 3}.fixed-grid.has-4-cols-widescreen>.grid{--bulma-grid-column-count: 4}.fixed-grid.has-5-cols-widescreen>.grid{--bulma-grid-column-count: 5}.fixed-grid.has-6-cols-widescreen>.grid{--bulma-grid-column-count: 6}.fixed-grid.has-7-cols-widescreen>.grid{--bulma-grid-column-count: 7}.fixed-grid.has-8-cols-widescreen>.grid{--bulma-grid-column-count: 8}.fixed-grid.has-9-cols-widescreen>.grid{--bulma-grid-column-count: 9}.fixed-grid.has-10-cols-widescreen>.grid{--bulma-grid-column-count: 10}.fixed-grid.has-11-cols-widescreen>.grid{--bulma-grid-column-count: 11}.fixed-grid.has-12-cols-widescreen>.grid{--bulma-grid-column-count: 12}}@container bulma-fixed-grid (min-width: 1408px){.fixed-grid.has-1-cols-fullhd>.grid{--bulma-grid-column-count: 1}.fixed-grid.has-2-cols-fullhd>.grid{--bulma-grid-column-count: 2}.fixed-grid.has-3-cols-fullhd>.grid{--bulma-grid-column-count: 3}.fixed-grid.has-4-cols-fullhd>.grid{--bulma-grid-column-count: 4}.fixed-grid.has-5-cols-fullhd>.grid{--bulma-grid-column-count: 5}.fixed-grid.has-6-cols-fullhd>.grid{--bulma-grid-column-count: 6}.fixed-grid.has-7-cols-fullhd>.grid{--bulma-grid-column-count: 7}.fixed-grid.has-8-cols-fullhd>.grid{--bulma-grid-column-count: 8}.fixed-grid.has-9-cols-fullhd>.grid{--bulma-grid-column-count: 9}.fixed-grid.has-10-cols-fullhd>.grid{--bulma-grid-column-count: 10}.fixed-grid.has-11-cols-fullhd>.grid{--bulma-grid-column-count: 11}.fixed-grid.has-12-cols-fullhd>.grid{--bulma-grid-column-count: 12}}@container bulma-fixed-grid (max-width: 768px){.fixed-grid.has-auto-count .grid{--bulma-grid-column-count: 2}}@container bulma-fixed-grid (min-width: 769px){.fixed-grid.has-auto-count .grid{--bulma-grid-column-count: 4}}@container bulma-fixed-grid (min-width: 1024px){.fixed-grid.has-auto-count .grid{--bulma-grid-column-count: 8}}@container bulma-fixed-grid (min-width: 1216px){.fixed-grid.has-auto-count .grid{--bulma-grid-column-count: 12}}@container bulma-fixed-grid (min-width: 1408px){.fixed-grid.has-auto-count .grid{--bulma-grid-column-count: 16}}.grid{--bulma-grid-gap: .75rem;--bulma-grid-column-min: 9rem;--bulma-grid-cell-column-span: 1;--bulma-grid-cell-row-span: 1;display:grid;gap:var(--bulma-grid-gap);column-gap:var(--bulma-grid-column-gap, var(--bulma-grid-gap));row-gap:var(--bulma-grid-row-gap, var(--bulma-grid-gap));grid-template-columns:repeat(auto-fit,minmax(var(--bulma-grid-column-min),1fr));grid-template-rows:auto}.grid.is-auto-fill{grid-template-columns:repeat(auto-fill,minmax(var(--bulma-grid-column-min),1fr))}.grid.is-col-min-1{--bulma-grid-column-min: 1.5rem}.grid.is-col-min-2{--bulma-grid-column-min: 3rem}.grid.is-col-min-3{--bulma-grid-column-min: 4.5rem}.grid.is-col-min-4{--bulma-grid-column-min: 6rem}.grid.is-col-min-5{--bulma-grid-column-min: 7.5rem}.grid.is-col-min-6{--bulma-grid-column-min: 9rem}.grid.is-col-min-7{--bulma-grid-column-min: 10.5rem}.grid.is-col-min-8{--bulma-grid-column-min: 12rem}.grid.is-col-min-9{--bulma-grid-column-min: 13.5rem}.grid.is-col-min-10{--bulma-grid-column-min: 15rem}.grid.is-col-min-11{--bulma-grid-column-min: 16.5rem}.grid.is-col-min-12{--bulma-grid-column-min: 18rem}.grid.is-col-min-13{--bulma-grid-column-min: 19.5rem}.grid.is-col-min-14{--bulma-grid-column-min: 21rem}.grid.is-col-min-15{--bulma-grid-column-min: 22.5rem}.grid.is-col-min-16{--bulma-grid-column-min: 24rem}.grid.is-col-min-17{--bulma-grid-column-min: 25.5rem}.grid.is-col-min-18{--bulma-grid-column-min: 27rem}.grid.is-col-min-19{--bulma-grid-column-min: 28.5rem}.grid.is-col-min-20{--bulma-grid-column-min: 30rem}.grid.is-col-min-21{--bulma-grid-column-min: 31.5rem}.grid.is-col-min-22{--bulma-grid-column-min: 33rem}.grid.is-col-min-23{--bulma-grid-column-min: 34.5rem}.grid.is-col-min-24{--bulma-grid-column-min: 36rem}.grid.is-col-min-25{--bulma-grid-column-min: 37.5rem}.grid.is-col-min-26{--bulma-grid-column-min: 39rem}.grid.is-col-min-27{--bulma-grid-column-min: 40.5rem}.grid.is-col-min-28{--bulma-grid-column-min: 42rem}.grid.is-col-min-29{--bulma-grid-column-min: 43.5rem}.grid.is-col-min-30{--bulma-grid-column-min: 45rem}.grid.is-col-min-31{--bulma-grid-column-min: 46.5rem}.grid.is-col-min-32{--bulma-grid-column-min: 48rem}.cell{grid-column-end:span var(--bulma-grid-cell-column-span);grid-column-start:var(--bulma-grid-cell-column-start);grid-row-end:span var(--bulma-grid-cell-row-span);grid-row-start:var(--bulma-grid-cell-row-start)}.cell.is-col-start-end{--bulma-grid-cell-column-start: -1}.cell.is-row-start-end{--bulma-grid-cell-row-start: -1}.cell.is-col-start-1{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12{--bulma-grid-cell-row-span: 12}@media screen and (max-width:768px){.cell.is-col-start-1-mobile{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-mobile{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-mobile{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-mobile{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-mobile{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-mobile{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-mobile{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-mobile{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-mobile{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-mobile{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-mobile{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-mobile{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-mobile{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-mobile{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-mobile{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-mobile{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-mobile{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-mobile{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-mobile{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-mobile{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-mobile{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-mobile{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-mobile{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-mobile{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-mobile{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-mobile{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-mobile{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-mobile{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-mobile{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-mobile{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-mobile{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-mobile{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-mobile{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-mobile{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-mobile{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-mobile{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-mobile{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-mobile{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-mobile{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-mobile{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-mobile{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-mobile{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-mobile{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-mobile{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-mobile{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-mobile{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-mobile{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-mobile{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-mobile{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-mobile{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-mobile{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-mobile{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-mobile{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-mobile{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-mobile{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-mobile{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-mobile{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-mobile{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-mobile{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-mobile{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-mobile{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-mobile{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-mobile{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-mobile{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-mobile{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-mobile{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-mobile{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-mobile{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-mobile{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-mobile{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-mobile{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-mobile{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-mobile{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-mobile{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-mobile{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-mobile{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-mobile{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-mobile{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-mobile{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-mobile{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-mobile{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-mobile{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-mobile{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-mobile{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-mobile{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-mobile{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-mobile{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-mobile{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-mobile{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-mobile{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-mobile{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-mobile{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-mobile{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-mobile{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-mobile{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-mobile{--bulma-grid-cell-row-span: 12}}@media screen and (min-width:769px),print{.cell.is-col-start-1-tablet{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-tablet{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-tablet{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-tablet{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-tablet{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-tablet{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-tablet{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-tablet{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-tablet{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-tablet{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-tablet{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-tablet{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-tablet{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-tablet{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-tablet{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-tablet{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-tablet{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-tablet{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-tablet{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-tablet{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-tablet{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-tablet{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-tablet{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-tablet{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-tablet{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-tablet{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-tablet{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-tablet{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-tablet{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-tablet{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-tablet{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-tablet{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-tablet{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-tablet{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-tablet{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-tablet{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-tablet{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-tablet{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-tablet{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-tablet{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-tablet{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-tablet{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-tablet{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-tablet{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-tablet{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-tablet{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-tablet{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-tablet{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-tablet{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-tablet{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-tablet{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-tablet{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-tablet{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-tablet{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-tablet{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-tablet{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-tablet{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-tablet{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-tablet{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-tablet{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-tablet{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-tablet{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-tablet{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-tablet{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-tablet{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-tablet{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-tablet{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-tablet{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-tablet{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-tablet{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-tablet{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-tablet{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-tablet{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-tablet{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-tablet{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-tablet{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-tablet{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-tablet{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-tablet{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-tablet{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-tablet{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-tablet{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-tablet{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-tablet{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-tablet{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-tablet{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-tablet{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-tablet{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-tablet{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-tablet{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-tablet{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-tablet{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-tablet{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-tablet{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-tablet{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-tablet{--bulma-grid-cell-row-span: 12}}@media screen and (min-width:769px)and (max-width:1023px){.cell.is-col-start-1-tablet-only{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-tablet-only{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-tablet-only{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-tablet-only{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-tablet-only{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-tablet-only{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-tablet-only{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-tablet-only{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-tablet-only{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-tablet-only{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-tablet-only{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-tablet-only{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-tablet-only{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-tablet-only{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-tablet-only{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-tablet-only{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-tablet-only{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-tablet-only{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-tablet-only{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-tablet-only{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-tablet-only{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-tablet-only{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-tablet-only{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-tablet-only{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-tablet-only{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-tablet-only{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-tablet-only{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-tablet-only{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-tablet-only{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-tablet-only{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-tablet-only{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-tablet-only{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-tablet-only{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-tablet-only{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-tablet-only{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-tablet-only{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-tablet-only{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-tablet-only{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-tablet-only{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-tablet-only{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-tablet-only{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-tablet-only{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-tablet-only{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-tablet-only{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-tablet-only{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-tablet-only{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-tablet-only{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-tablet-only{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-tablet-only{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-tablet-only{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-tablet-only{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-tablet-only{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-tablet-only{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-tablet-only{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-tablet-only{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-tablet-only{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-tablet-only{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-tablet-only{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-tablet-only{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-tablet-only{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-tablet-only{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-tablet-only{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-tablet-only{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-tablet-only{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-tablet-only{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-tablet-only{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-tablet-only{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-tablet-only{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-tablet-only{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-tablet-only{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-tablet-only{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-tablet-only{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-tablet-only{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-tablet-only{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-tablet-only{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-tablet-only{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-tablet-only{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-tablet-only{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-tablet-only{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-tablet-only{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-tablet-only{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-tablet-only{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-tablet-only{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-tablet-only{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-tablet-only{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-tablet-only{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-tablet-only{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-tablet-only{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-tablet-only{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-tablet-only{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-tablet-only{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-tablet-only{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-tablet-only{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-tablet-only{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-tablet-only{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-tablet-only{--bulma-grid-cell-row-span: 12}}@media screen and (min-width:1024px){.cell.is-col-start-1-desktop{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-desktop{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-desktop{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-desktop{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-desktop{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-desktop{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-desktop{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-desktop{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-desktop{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-desktop{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-desktop{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-desktop{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-desktop{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-desktop{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-desktop{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-desktop{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-desktop{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-desktop{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-desktop{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-desktop{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-desktop{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-desktop{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-desktop{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-desktop{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-desktop{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-desktop{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-desktop{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-desktop{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-desktop{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-desktop{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-desktop{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-desktop{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-desktop{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-desktop{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-desktop{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-desktop{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-desktop{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-desktop{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-desktop{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-desktop{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-desktop{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-desktop{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-desktop{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-desktop{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-desktop{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-desktop{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-desktop{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-desktop{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-desktop{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-desktop{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-desktop{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-desktop{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-desktop{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-desktop{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-desktop{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-desktop{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-desktop{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-desktop{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-desktop{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-desktop{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-desktop{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-desktop{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-desktop{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-desktop{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-desktop{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-desktop{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-desktop{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-desktop{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-desktop{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-desktop{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-desktop{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-desktop{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-desktop{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-desktop{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-desktop{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-desktop{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-desktop{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-desktop{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-desktop{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-desktop{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-desktop{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-desktop{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-desktop{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-desktop{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-desktop{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-desktop{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-desktop{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-desktop{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-desktop{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-desktop{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-desktop{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-desktop{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-desktop{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-desktop{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-desktop{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-desktop{--bulma-grid-cell-row-span: 12}}@media screen and (min-width:1024px)and (max-width:1215px){.cell.is-col-start-1-desktop-only{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-desktop-only{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-desktop-only{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-desktop-only{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-desktop-only{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-desktop-only{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-desktop-only{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-desktop-only{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-desktop-only{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-desktop-only{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-desktop-only{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-desktop-only{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-desktop-only{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-desktop-only{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-desktop-only{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-desktop-only{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-desktop-only{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-desktop-only{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-desktop-only{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-desktop-only{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-desktop-only{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-desktop-only{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-desktop-only{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-desktop-only{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-desktop-only{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-desktop-only{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-desktop-only{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-desktop-only{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-desktop-only{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-desktop-only{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-desktop-only{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-desktop-only{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-desktop-only{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-desktop-only{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-desktop-only{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-desktop-only{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-desktop-only{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-desktop-only{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-desktop-only{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-desktop-only{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-desktop-only{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-desktop-only{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-desktop-only{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-desktop-only{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-desktop-only{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-desktop-only{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-desktop-only{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-desktop-only{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-desktop-only{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-desktop-only{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-desktop-only{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-desktop-only{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-desktop-only{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-desktop-only{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-desktop-only{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-desktop-only{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-desktop-only{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-desktop-only{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-desktop-only{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-desktop-only{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-desktop-only{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-desktop-only{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-desktop-only{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-desktop-only{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-desktop-only{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-desktop-only{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-desktop-only{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-desktop-only{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-desktop-only{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-desktop-only{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-desktop-only{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-desktop-only{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-desktop-only{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-desktop-only{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-desktop-only{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-desktop-only{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-desktop-only{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-desktop-only{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-desktop-only{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-desktop-only{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-desktop-only{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-desktop-only{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-desktop-only{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-desktop-only{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-desktop-only{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-desktop-only{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-desktop-only{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-desktop-only{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-desktop-only{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-desktop-only{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-desktop-only{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-desktop-only{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-desktop-only{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-desktop-only{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-desktop-only{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-desktop-only{--bulma-grid-cell-row-span: 12}}@media screen and (min-width:1216px){.cell.is-col-start-1-widescreen{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-widescreen{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-widescreen{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-widescreen{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-widescreen{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-widescreen{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-widescreen{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-widescreen{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-widescreen{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-widescreen{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-widescreen{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-widescreen{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-widescreen{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-widescreen{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-widescreen{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-widescreen{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-widescreen{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-widescreen{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-widescreen{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-widescreen{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-widescreen{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-widescreen{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-widescreen{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-widescreen{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-widescreen{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-widescreen{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-widescreen{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-widescreen{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-widescreen{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-widescreen{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-widescreen{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-widescreen{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-widescreen{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-widescreen{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-widescreen{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-widescreen{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-widescreen{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-widescreen{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-widescreen{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-widescreen{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-widescreen{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-widescreen{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-widescreen{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-widescreen{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-widescreen{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-widescreen{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-widescreen{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-widescreen{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-widescreen{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-widescreen{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-widescreen{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-widescreen{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-widescreen{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-widescreen{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-widescreen{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-widescreen{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-widescreen{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-widescreen{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-widescreen{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-widescreen{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-widescreen{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-widescreen{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-widescreen{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-widescreen{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-widescreen{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-widescreen{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-widescreen{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-widescreen{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-widescreen{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-widescreen{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-widescreen{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-widescreen{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-widescreen{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-widescreen{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-widescreen{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-widescreen{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-widescreen{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-widescreen{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-widescreen{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-widescreen{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-widescreen{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-widescreen{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-widescreen{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-widescreen{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-widescreen{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-widescreen{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-widescreen{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-widescreen{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-widescreen{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-widescreen{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-widescreen{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-widescreen{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-widescreen{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-widescreen{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-widescreen{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-widescreen{--bulma-grid-cell-row-span: 12}}@media screen and (min-width:1216px)and (max-width:1407px){.cell.is-col-start-1-widescreen-only{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-widescreen-only{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-widescreen-only{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-widescreen-only{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-widescreen-only{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-widescreen-only{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-widescreen-only{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-widescreen-only{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-widescreen-only{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-widescreen-only{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-widescreen-only{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-widescreen-only{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-widescreen-only{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-widescreen-only{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-widescreen-only{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-widescreen-only{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-widescreen-only{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-widescreen-only{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-widescreen-only{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-widescreen-only{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-widescreen-only{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-widescreen-only{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-widescreen-only{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-widescreen-only{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-widescreen-only{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-widescreen-only{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-widescreen-only{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-widescreen-only{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-widescreen-only{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-widescreen-only{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-widescreen-only{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-widescreen-only{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-widescreen-only{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-widescreen-only{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-widescreen-only{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-widescreen-only{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-widescreen-only{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-widescreen-only{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-widescreen-only{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-widescreen-only{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-widescreen-only{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-widescreen-only{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-widescreen-only{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-widescreen-only{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-widescreen-only{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-widescreen-only{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-widescreen-only{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-widescreen-only{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-widescreen-only{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-widescreen-only{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-widescreen-only{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-widescreen-only{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-widescreen-only{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-widescreen-only{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-widescreen-only{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-widescreen-only{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-widescreen-only{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-widescreen-only{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-widescreen-only{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-widescreen-only{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-widescreen-only{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-widescreen-only{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-widescreen-only{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-widescreen-only{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-widescreen-only{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-widescreen-only{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-widescreen-only{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-widescreen-only{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-widescreen-only{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-widescreen-only{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-widescreen-only{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-widescreen-only{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-widescreen-only{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-widescreen-only{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-widescreen-only{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-widescreen-only{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-widescreen-only{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-widescreen-only{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-widescreen-only{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-widescreen-only{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-widescreen-only{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-widescreen-only{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-widescreen-only{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-widescreen-only{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-widescreen-only{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-widescreen-only{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-widescreen-only{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-widescreen-only{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-widescreen-only{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-widescreen-only{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-widescreen-only{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-widescreen-only{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-widescreen-only{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-widescreen-only{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-widescreen-only{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-widescreen-only{--bulma-grid-cell-row-span: 12}}@media screen and (min-width:1408px){.cell.is-col-start-1-fullhd{--bulma-grid-cell-column-start: 1}.cell.is-col-end-1-fullhd{--bulma-grid-cell-column-end: 1}.cell.is-col-from-end-1-fullhd{--bulma-grid-cell-column-start: -1}.cell.is-col-span-1-fullhd{--bulma-grid-cell-column-span: 1}.cell.is-row-start-1-fullhd{--bulma-grid-cell-row-start: 1}.cell.is-row-end-1-fullhd{--bulma-grid-cell-row-end: 1}.cell.is-row-from-end-1-fullhd{--bulma-grid-cell-row-start: -1}.cell.is-row-span-1-fullhd{--bulma-grid-cell-row-span: 1}.cell.is-col-start-2-fullhd{--bulma-grid-cell-column-start: 2}.cell.is-col-end-2-fullhd{--bulma-grid-cell-column-end: 2}.cell.is-col-from-end-2-fullhd{--bulma-grid-cell-column-start: -2}.cell.is-col-span-2-fullhd{--bulma-grid-cell-column-span: 2}.cell.is-row-start-2-fullhd{--bulma-grid-cell-row-start: 2}.cell.is-row-end-2-fullhd{--bulma-grid-cell-row-end: 2}.cell.is-row-from-end-2-fullhd{--bulma-grid-cell-row-start: -2}.cell.is-row-span-2-fullhd{--bulma-grid-cell-row-span: 2}.cell.is-col-start-3-fullhd{--bulma-grid-cell-column-start: 3}.cell.is-col-end-3-fullhd{--bulma-grid-cell-column-end: 3}.cell.is-col-from-end-3-fullhd{--bulma-grid-cell-column-start: -3}.cell.is-col-span-3-fullhd{--bulma-grid-cell-column-span: 3}.cell.is-row-start-3-fullhd{--bulma-grid-cell-row-start: 3}.cell.is-row-end-3-fullhd{--bulma-grid-cell-row-end: 3}.cell.is-row-from-end-3-fullhd{--bulma-grid-cell-row-start: -3}.cell.is-row-span-3-fullhd{--bulma-grid-cell-row-span: 3}.cell.is-col-start-4-fullhd{--bulma-grid-cell-column-start: 4}.cell.is-col-end-4-fullhd{--bulma-grid-cell-column-end: 4}.cell.is-col-from-end-4-fullhd{--bulma-grid-cell-column-start: -4}.cell.is-col-span-4-fullhd{--bulma-grid-cell-column-span: 4}.cell.is-row-start-4-fullhd{--bulma-grid-cell-row-start: 4}.cell.is-row-end-4-fullhd{--bulma-grid-cell-row-end: 4}.cell.is-row-from-end-4-fullhd{--bulma-grid-cell-row-start: -4}.cell.is-row-span-4-fullhd{--bulma-grid-cell-row-span: 4}.cell.is-col-start-5-fullhd{--bulma-grid-cell-column-start: 5}.cell.is-col-end-5-fullhd{--bulma-grid-cell-column-end: 5}.cell.is-col-from-end-5-fullhd{--bulma-grid-cell-column-start: -5}.cell.is-col-span-5-fullhd{--bulma-grid-cell-column-span: 5}.cell.is-row-start-5-fullhd{--bulma-grid-cell-row-start: 5}.cell.is-row-end-5-fullhd{--bulma-grid-cell-row-end: 5}.cell.is-row-from-end-5-fullhd{--bulma-grid-cell-row-start: -5}.cell.is-row-span-5-fullhd{--bulma-grid-cell-row-span: 5}.cell.is-col-start-6-fullhd{--bulma-grid-cell-column-start: 6}.cell.is-col-end-6-fullhd{--bulma-grid-cell-column-end: 6}.cell.is-col-from-end-6-fullhd{--bulma-grid-cell-column-start: -6}.cell.is-col-span-6-fullhd{--bulma-grid-cell-column-span: 6}.cell.is-row-start-6-fullhd{--bulma-grid-cell-row-start: 6}.cell.is-row-end-6-fullhd{--bulma-grid-cell-row-end: 6}.cell.is-row-from-end-6-fullhd{--bulma-grid-cell-row-start: -6}.cell.is-row-span-6-fullhd{--bulma-grid-cell-row-span: 6}.cell.is-col-start-7-fullhd{--bulma-grid-cell-column-start: 7}.cell.is-col-end-7-fullhd{--bulma-grid-cell-column-end: 7}.cell.is-col-from-end-7-fullhd{--bulma-grid-cell-column-start: -7}.cell.is-col-span-7-fullhd{--bulma-grid-cell-column-span: 7}.cell.is-row-start-7-fullhd{--bulma-grid-cell-row-start: 7}.cell.is-row-end-7-fullhd{--bulma-grid-cell-row-end: 7}.cell.is-row-from-end-7-fullhd{--bulma-grid-cell-row-start: -7}.cell.is-row-span-7-fullhd{--bulma-grid-cell-row-span: 7}.cell.is-col-start-8-fullhd{--bulma-grid-cell-column-start: 8}.cell.is-col-end-8-fullhd{--bulma-grid-cell-column-end: 8}.cell.is-col-from-end-8-fullhd{--bulma-grid-cell-column-start: -8}.cell.is-col-span-8-fullhd{--bulma-grid-cell-column-span: 8}.cell.is-row-start-8-fullhd{--bulma-grid-cell-row-start: 8}.cell.is-row-end-8-fullhd{--bulma-grid-cell-row-end: 8}.cell.is-row-from-end-8-fullhd{--bulma-grid-cell-row-start: -8}.cell.is-row-span-8-fullhd{--bulma-grid-cell-row-span: 8}.cell.is-col-start-9-fullhd{--bulma-grid-cell-column-start: 9}.cell.is-col-end-9-fullhd{--bulma-grid-cell-column-end: 9}.cell.is-col-from-end-9-fullhd{--bulma-grid-cell-column-start: -9}.cell.is-col-span-9-fullhd{--bulma-grid-cell-column-span: 9}.cell.is-row-start-9-fullhd{--bulma-grid-cell-row-start: 9}.cell.is-row-end-9-fullhd{--bulma-grid-cell-row-end: 9}.cell.is-row-from-end-9-fullhd{--bulma-grid-cell-row-start: -9}.cell.is-row-span-9-fullhd{--bulma-grid-cell-row-span: 9}.cell.is-col-start-10-fullhd{--bulma-grid-cell-column-start: 10}.cell.is-col-end-10-fullhd{--bulma-grid-cell-column-end: 10}.cell.is-col-from-end-10-fullhd{--bulma-grid-cell-column-start: -10}.cell.is-col-span-10-fullhd{--bulma-grid-cell-column-span: 10}.cell.is-row-start-10-fullhd{--bulma-grid-cell-row-start: 10}.cell.is-row-end-10-fullhd{--bulma-grid-cell-row-end: 10}.cell.is-row-from-end-10-fullhd{--bulma-grid-cell-row-start: -10}.cell.is-row-span-10-fullhd{--bulma-grid-cell-row-span: 10}.cell.is-col-start-11-fullhd{--bulma-grid-cell-column-start: 11}.cell.is-col-end-11-fullhd{--bulma-grid-cell-column-end: 11}.cell.is-col-from-end-11-fullhd{--bulma-grid-cell-column-start: -11}.cell.is-col-span-11-fullhd{--bulma-grid-cell-column-span: 11}.cell.is-row-start-11-fullhd{--bulma-grid-cell-row-start: 11}.cell.is-row-end-11-fullhd{--bulma-grid-cell-row-end: 11}.cell.is-row-from-end-11-fullhd{--bulma-grid-cell-row-start: -11}.cell.is-row-span-11-fullhd{--bulma-grid-cell-row-span: 11}.cell.is-col-start-12-fullhd{--bulma-grid-cell-column-start: 12}.cell.is-col-end-12-fullhd{--bulma-grid-cell-column-end: 12}.cell.is-col-from-end-12-fullhd{--bulma-grid-cell-column-start: -12}.cell.is-col-span-12-fullhd{--bulma-grid-cell-column-span: 12}.cell.is-row-start-12-fullhd{--bulma-grid-cell-row-start: 12}.cell.is-row-end-12-fullhd{--bulma-grid-cell-row-end: 12}.cell.is-row-from-end-12-fullhd{--bulma-grid-cell-row-start: -12}.cell.is-row-span-12-fullhd{--bulma-grid-cell-row-span: 12}}.container{flex-grow:1;margin:0 auto;position:relative;width:100%}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}.container.is-max-tablet{max-width:369px}@media screen and (min-width:1024px){.container{max-width:624px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-tablet):not(.is-max-desktop){max-width:613px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-tablet):not(.is-max-desktop):not(.is-max-widescreen){max-width:613px}}@media screen and (min-width:1216px){.container:not(.is-max-tablet):not(.is-max-desktop){max-width:613px}}@media screen and (min-width:1408px){.container:not(.is-max-tablet):not(.is-max-desktop):not(.is-max-widescreen){max-width:613px}}.footer{--bulma-footer-background-color: var(--bulma-scheme-main-bis);--bulma-footer-color: false;--bulma-footer-padding: 3rem 1.5rem 6rem;background-color:var(--bulma-footer-background-color);padding:var(--bulma-footer-padding)}.hero{--bulma-hero-body-padding: 3rem 1.5rem;--bulma-hero-body-padding-tablet: 3rem 3rem;--bulma-hero-body-padding-small: 1.5rem;--bulma-hero-body-padding-medium: 9rem 4.5rem;--bulma-hero-body-padding-large: 18rem 6rem;--bulma-hero-gradient-h-offset: 5deg;--bulma-hero-gradient-s-offset: 10%;--bulma-hero-gradient-l-offset: 5%}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{--bulma-hero-h: var(--bulma-white-h);--bulma-hero-s: var(--bulma-white-s);--bulma-hero-background-l: var(--bulma-white-l);--bulma-hero-color-l: var(--bulma-white-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-white .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-white .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-white .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-white .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-white.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-black{--bulma-hero-h: var(--bulma-black-h);--bulma-hero-s: var(--bulma-black-s);--bulma-hero-background-l: var(--bulma-black-l);--bulma-hero-color-l: var(--bulma-black-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-black .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-black .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-black .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-black .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-black.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-light{--bulma-hero-h: var(--bulma-light-h);--bulma-hero-s: var(--bulma-light-s);--bulma-hero-background-l: var(--bulma-light-l);--bulma-hero-color-l: var(--bulma-light-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-light .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-light .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-light .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-light .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-light.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-dark{--bulma-hero-h: var(--bulma-dark-h);--bulma-hero-s: var(--bulma-dark-s);--bulma-hero-background-l: var(--bulma-dark-l);--bulma-hero-color-l: var(--bulma-dark-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-dark .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-dark .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-dark .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-dark .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-text{--bulma-hero-h: var(--bulma-text-h);--bulma-hero-s: var(--bulma-text-s);--bulma-hero-background-l: var(--bulma-text-l);--bulma-hero-color-l: var(--bulma-text-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-text .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-text .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-text .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-text .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-text.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-text.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-primary{--bulma-hero-h: var(--bulma-primary-h);--bulma-hero-s: var(--bulma-primary-s);--bulma-hero-background-l: var(--bulma-primary-l);--bulma-hero-color-l: var(--bulma-primary-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-primary .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-primary .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-primary .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-primary .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-link{--bulma-hero-h: var(--bulma-link-h);--bulma-hero-s: var(--bulma-link-s);--bulma-hero-background-l: var(--bulma-link-l);--bulma-hero-color-l: var(--bulma-link-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-link .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-link .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-link .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-link .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-link.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-info{--bulma-hero-h: var(--bulma-info-h);--bulma-hero-s: var(--bulma-info-s);--bulma-hero-background-l: var(--bulma-info-l);--bulma-hero-color-l: var(--bulma-info-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-info .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-info .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-info .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-info .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-info.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-success{--bulma-hero-h: var(--bulma-success-h);--bulma-hero-s: var(--bulma-success-s);--bulma-hero-background-l: var(--bulma-success-l);--bulma-hero-color-l: var(--bulma-success-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-success .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-success .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-success .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-success .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-success.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-warning{--bulma-hero-h: var(--bulma-warning-h);--bulma-hero-s: var(--bulma-warning-s);--bulma-hero-background-l: var(--bulma-warning-l);--bulma-hero-color-l: var(--bulma-warning-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-warning .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-warning .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-warning .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-warning .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-danger{--bulma-hero-h: var(--bulma-danger-h);--bulma-hero-s: var(--bulma-danger-s);--bulma-hero-background-l: var(--bulma-danger-l);--bulma-hero-color-l: var(--bulma-danger-invert-l);background-color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l));color:hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l))}.hero.is-danger .navbar{--bulma-navbar-item-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-hover-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-navbar-item-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-navbar-item-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-danger .tabs{--bulma-tabs-link-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-background-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-tabs-boxed-link-active-border-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l));--bulma-tabs-link-active-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-background-l))}.hero.is-danger .subtitle{--bulma-subtitle-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-subtitle-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-danger .title{--bulma-title-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l));--bulma-title-strong-color: hsl(var(--bulma-hero-h), var(--bulma-hero-s), var(--bulma-hero-color-l))}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-background-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,hsl(calc(var(--bulma-hero-h) - 5deg),calc(var(--bulma-hero-s) + 10%),calc(var(--bulma-hero-background-l) + 5%)),hsl(var(--bulma-hero-h),var(--bulma-hero-s),var(--bulma-hero-color-l)) 71%,hsl(calc(var(--bulma-hero-h) + 5deg),calc(var(--bulma-hero-s) - 10%),calc(var(--bulma-hero-background-l) - 5%)))}}.hero.is-small .hero-body{padding:var(--bulma-hero-body-padding-small)}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:var(--bulma-hero-body-padding-medium)}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:var(--bulma-hero-body-padding-large)}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-inline-end:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:var(--bulma-hero-body-padding)}@media screen and (min-width:769px),print{.hero-body{padding:var(--bulma-hero-body-padding-tablet)}}.level{--bulma-level-item-spacing: calc(var(--bulma-block-spacing) * .5);align-items:center;display:flex;flex-direction:column;justify-content:space-between;gap:var(--bulma-level-item-spacing)}.level code{border-radius:var(--bulma-radius)}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex;flex-direction:row}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex;flex-direction:row}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0;gap:calc(var(--bulma-block-spacing) * .5)}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}.level-left{align-items:center;display:flex;flex-direction:column;justify-content:flex-start}@media screen and (min-width:769px),print{.level-left{flex-direction:row}}.level-right{align-items:center;display:flex;flex-direction:column;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{flex-direction:row}}.media{--bulma-media-border-color: hsla(var(--bulma-scheme-h), var(--bulma-scheme-s), var(--bulma-border-l), .5);--bulma-media-border-size: 1px;--bulma-media-spacing: 1rem;--bulma-media-spacing-large: 1.5rem;--bulma-media-content-spacing: .75rem;--bulma-media-level-1-spacing: .75rem;--bulma-media-level-1-content-spacing: .5rem;--bulma-media-level-2-spacing: .5rem;align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:var(--bulma-media-content-spacing)}.media .media{border-top-color:var(--bulma-media-border-color);border-top-style:solid;border-top-width:var(--bulma-media-border-size);display:flex;padding-top:var(--bulma-media-level-1-spacing)}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:var(--bulma-media-level-1-content-spacing)}.media .media .media{padding-top:var(--bulma-media-level-2-spacing)}.media .media .media+.media{margin-top:var(--bulma-media-level-2-spacing)}.media+.media{border-top-color:var(--bulma-media-border-color);border-top-style:solid;border-top-width:var(--bulma-media-border-size);margin-top:var(--bulma-media-spacing);padding-top:var(--bulma-media-spacing)}.media.is-large+.media{margin-top:var(--bulma-media-spacing-large);padding-top:var(--bulma-media-spacing-large)}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-inline-end:var(--bulma-media-spacing)}.media-right{margin-inline-start:var(--bulma-media-spacing)}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.section{--bulma-section-padding: 3rem 1.5rem;--bulma-section-padding-desktop: 3rem 3rem;--bulma-section-padding-medium: 9rem 4.5rem;--bulma-section-padding-large: 18rem 6rem;padding:var(--bulma-section-padding)}@media screen and (min-width:1024px){.section{padding:var(--bulma-section-padding-desktop)}.section.is-medium{padding:var(--bulma-section-padding-medium)}.section.is-large{padding:var(--bulma-section-padding-large)}}.section.is-fullheight{min-height:100vh}:root{--bulma-skeleton-background: var(--bulma-border);--bulma-skeleton-radius: var(--bulma-radius-small);--bulma-skeleton-block-min-height: 4.5em;--bulma-skeleton-lines-gap: .75em;--bulma-skeleton-line-height: .75em}.skeleton-lines>div,.skeleton-block,.has-skeleton:after,.is-skeleton{animation-duration:2s;animation-iteration-count:infinite;animation-name:pulsate;animation-timing-function:cubic-bezier(.4,0,.6,1);background-color:var(--bulma-skeleton-background);border-radius:var(--bulma-skeleton-radius);box-shadow:none;pointer-events:none}.is-skeleton{color:transparent!important}.is-skeleton em,.is-skeleton strong{color:inherit}.is-skeleton img{visibility:hidden}.is-skeleton.checkbox input{opacity:0}.is-skeleton.delete{border-radius:var(--bulma-radius-rounded)}.is-skeleton.delete:before,.is-skeleton.delete:after{display:none}input.is-skeleton,textarea.is-skeleton{resize:none}input.is-skeleton::-moz-placeholder,textarea.is-skeleton::-moz-placeholder{color:transparent!important}input.is-skeleton::-webkit-input-placeholder,textarea.is-skeleton::-webkit-input-placeholder{color:transparent!important}input.is-skeleton:-moz-placeholder,textarea.is-skeleton:-moz-placeholder{color:transparent!important}input.is-skeleton:-ms-input-placeholder,textarea.is-skeleton:-ms-input-placeholder{color:transparent!important}.has-skeleton{color:transparent!important;position:relative}.has-skeleton:after{content:"";display:block;height:100%;left:0;max-width:100%;min-width:10%;position:absolute;top:0;width:7em}.skeleton-block{color:transparent!important;min-height:var(--bulma-skeleton-block-min-height)}.skeleton-lines{color:transparent!important;display:flex;flex-direction:column;gap:var(--bulma-skeleton-lines-gap);position:relative}.skeleton-lines>div{height:var(--bulma-skeleton-line-height)}.skeleton-lines>div:last-child{min-width:4em;width:30%}.is-aspect-ratio-1by1{aspect-ratio:1/1}.is-aspect-ratio-5by4{aspect-ratio:5/4}.is-aspect-ratio-4by3{aspect-ratio:4/3}.is-aspect-ratio-3by2{aspect-ratio:3/2}.is-aspect-ratio-5by3{aspect-ratio:5/3}.is-aspect-ratio-16by9{aspect-ratio:16/9}.is-aspect-ratio-2by1{aspect-ratio:2/1}.is-aspect-ratio-3by1{aspect-ratio:3/1}.is-aspect-ratio-4by5{aspect-ratio:4/5}.is-aspect-ratio-3by4{aspect-ratio:3/4}.is-aspect-ratio-2by3{aspect-ratio:2/3}.is-aspect-ratio-3by5{aspect-ratio:3/5}.is-aspect-ratio-9by16{aspect-ratio:9/16}.is-aspect-ratio-1by2{aspect-ratio:1/2}.is-aspect-ratio-1by3{aspect-ratio:1/3}.has-radius-small{border-radius:var(--bulma-radius-small)}.has-radius-normal{border-radius:var(--bulma-radius)}.has-radius-large{border-radius:var(--bulma-radius-large)}.has-radius-rounded{border-radius:var(--bulma-radius-rounded)}.has-background{background-color:var(--bulma-background)}.has-text-white{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-l))!important}.has-background-white{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-l))!important}.has-text-white-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-invert-l))!important}.has-background-white-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-invert-l))!important}.has-text-white-on-scheme{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-on-scheme-l))!important}.has-background-white-on-scheme{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-on-scheme-l))!important}.has-text-white-light{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-light-l))!important}.has-background-white-light{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-light-l))!important}.has-text-white-light-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-light-invert-l))!important}.has-background-white-light-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-light-invert-l))!important}.has-text-white-dark{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-dark-l))!important}.has-background-white-dark{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-dark-l))!important}.has-text-white-dark-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-dark-invert-l))!important}.has-background-white-dark-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-dark-invert-l))!important}.has-text-white-soft{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-soft-l))!important}.has-background-white-soft{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-soft-l))!important}.has-text-white-bold{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-bold-l))!important}.has-background-white-bold{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-bold-l))!important}.has-text-white-soft-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-soft-invert-l))!important}.has-background-white-soft-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-soft-invert-l))!important}.has-text-white-bold-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-bold-invert-l))!important}.has-background-white-bold-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-bold-invert-l))!important}.has-text-white-00{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-00-l))!important}.has-background-white-00{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-00-l))!important}.has-text-white-00-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-00-invert-l))!important}.has-background-white-00-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-00-invert-l))!important}.has-text-white-05{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-05-l))!important}.has-background-white-05{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-05-l))!important}.has-text-white-05-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-05-invert-l))!important}.has-background-white-05-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-05-invert-l))!important}.has-text-white-10{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-10-l))!important}.has-background-white-10{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-10-l))!important}.has-text-white-10-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-10-invert-l))!important}.has-background-white-10-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-10-invert-l))!important}.has-text-white-15{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-15-l))!important}.has-background-white-15{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-15-l))!important}.has-text-white-15-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-15-invert-l))!important}.has-background-white-15-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-15-invert-l))!important}.has-text-white-20{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-20-l))!important}.has-background-white-20{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-20-l))!important}.has-text-white-20-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-20-invert-l))!important}.has-background-white-20-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-20-invert-l))!important}.has-text-white-25{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-25-l))!important}.has-background-white-25{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-25-l))!important}.has-text-white-25-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-25-invert-l))!important}.has-background-white-25-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-25-invert-l))!important}.has-text-white-30{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-30-l))!important}.has-background-white-30{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-30-l))!important}.has-text-white-30-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-30-invert-l))!important}.has-background-white-30-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-30-invert-l))!important}.has-text-white-35{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-35-l))!important}.has-background-white-35{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-35-l))!important}.has-text-white-35-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-35-invert-l))!important}.has-background-white-35-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-35-invert-l))!important}.has-text-white-40{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-40-l))!important}.has-background-white-40{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-40-l))!important}.has-text-white-40-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-40-invert-l))!important}.has-background-white-40-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-40-invert-l))!important}.has-text-white-45{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-45-l))!important}.has-background-white-45{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-45-l))!important}.has-text-white-45-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-45-invert-l))!important}.has-background-white-45-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-45-invert-l))!important}.has-text-white-50{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-50-l))!important}.has-background-white-50{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-50-l))!important}.has-text-white-50-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-50-invert-l))!important}.has-background-white-50-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-50-invert-l))!important}.has-text-white-55{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-55-l))!important}.has-background-white-55{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-55-l))!important}.has-text-white-55-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-55-invert-l))!important}.has-background-white-55-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-55-invert-l))!important}.has-text-white-60{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-60-l))!important}.has-background-white-60{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-60-l))!important}.has-text-white-60-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-60-invert-l))!important}.has-background-white-60-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-60-invert-l))!important}.has-text-white-65{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-65-l))!important}.has-background-white-65{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-65-l))!important}.has-text-white-65-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-65-invert-l))!important}.has-background-white-65-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-65-invert-l))!important}.has-text-white-70{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-70-l))!important}.has-background-white-70{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-70-l))!important}.has-text-white-70-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-70-invert-l))!important}.has-background-white-70-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-70-invert-l))!important}.has-text-white-75{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-75-l))!important}.has-background-white-75{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-75-l))!important}.has-text-white-75-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-75-invert-l))!important}.has-background-white-75-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-75-invert-l))!important}.has-text-white-80{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-80-l))!important}.has-background-white-80{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-80-l))!important}.has-text-white-80-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-80-invert-l))!important}.has-background-white-80-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-80-invert-l))!important}.has-text-white-85{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-85-l))!important}.has-background-white-85{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-85-l))!important}.has-text-white-85-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-85-invert-l))!important}.has-background-white-85-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-85-invert-l))!important}.has-text-white-90{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-90-l))!important}.has-background-white-90{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-90-l))!important}.has-text-white-90-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-90-invert-l))!important}.has-background-white-90-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-90-invert-l))!important}.has-text-white-95{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-95-l))!important}.has-background-white-95{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-95-l))!important}.has-text-white-95-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-95-invert-l))!important}.has-background-white-95-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-95-invert-l))!important}.has-text-white-100{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-100-l))!important}.has-background-white-100{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-100-l))!important}.has-text-white-100-invert{color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-100-invert-l))!important}.has-background-white-100-invert{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),var(--bulma-white-100-invert-l))!important}a.has-text-white:hover,a.has-text-white:focus-visible,button.has-text-white:hover,button.has-text-white:focus-visible,has-text-white.is-hoverable:hover,has-text-white.is-hoverable:focus-visible{color:hsl(var(--bulma-white-h),var(--bulma-white-s),calc(var(--bulma-white-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-white:active,button.has-text-white:active,has-text-white.is-hoverable:active{color:hsl(var(--bulma-white-h),var(--bulma-white-s),calc(var(--bulma-white-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-white:hover,a.has-background-white:focus-visible,button.has-background-white:hover,button.has-background-white:focus-visible,has-background-white.is-hoverable:hover,has-background-white.is-hoverable:focus-visible{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),calc(var(--bulma-white-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-white:active,button.has-background-white:active,has-background-white.is-hoverable:active{background-color:hsl(var(--bulma-white-h),var(--bulma-white-s),calc(var(--bulma-white-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-white{--h: var(--bulma-white-h);--s: var(--bulma-white-s);--l: var(--bulma-white-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-white-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-white-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-white-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-white-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-white-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-white-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-white-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-white-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-white-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-white-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-white-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-white-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-white-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-white-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-white-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-white-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-white-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-white-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-white-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-white-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-white-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-black{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-l))!important}.has-background-black{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-l))!important}.has-text-black-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-invert-l))!important}.has-background-black-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-invert-l))!important}.has-text-black-on-scheme{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-on-scheme-l))!important}.has-background-black-on-scheme{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-on-scheme-l))!important}.has-text-black-light{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-light-l))!important}.has-background-black-light{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-light-l))!important}.has-text-black-light-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-light-invert-l))!important}.has-background-black-light-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-light-invert-l))!important}.has-text-black-dark{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-dark-l))!important}.has-background-black-dark{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-dark-l))!important}.has-text-black-dark-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-dark-invert-l))!important}.has-background-black-dark-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-dark-invert-l))!important}.has-text-black-soft{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-soft-l))!important}.has-background-black-soft{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-soft-l))!important}.has-text-black-bold{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-bold-l))!important}.has-background-black-bold{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-bold-l))!important}.has-text-black-soft-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-soft-invert-l))!important}.has-background-black-soft-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-soft-invert-l))!important}.has-text-black-bold-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-bold-invert-l))!important}.has-background-black-bold-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-bold-invert-l))!important}.has-text-black-00{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-00-l))!important}.has-background-black-00{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-00-l))!important}.has-text-black-00-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-00-invert-l))!important}.has-background-black-00-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-00-invert-l))!important}.has-text-black-05{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-05-l))!important}.has-background-black-05{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-05-l))!important}.has-text-black-05-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-05-invert-l))!important}.has-background-black-05-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-05-invert-l))!important}.has-text-black-10{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-10-l))!important}.has-background-black-10{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-10-l))!important}.has-text-black-10-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-10-invert-l))!important}.has-background-black-10-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-10-invert-l))!important}.has-text-black-15{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-15-l))!important}.has-background-black-15{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-15-l))!important}.has-text-black-15-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-15-invert-l))!important}.has-background-black-15-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-15-invert-l))!important}.has-text-black-20{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-20-l))!important}.has-background-black-20{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-20-l))!important}.has-text-black-20-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-20-invert-l))!important}.has-background-black-20-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-20-invert-l))!important}.has-text-black-25{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-25-l))!important}.has-background-black-25{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-25-l))!important}.has-text-black-25-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-25-invert-l))!important}.has-background-black-25-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-25-invert-l))!important}.has-text-black-30{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-30-l))!important}.has-background-black-30{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-30-l))!important}.has-text-black-30-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-30-invert-l))!important}.has-background-black-30-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-30-invert-l))!important}.has-text-black-35{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-35-l))!important}.has-background-black-35{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-35-l))!important}.has-text-black-35-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-35-invert-l))!important}.has-background-black-35-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-35-invert-l))!important}.has-text-black-40{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-40-l))!important}.has-background-black-40{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-40-l))!important}.has-text-black-40-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-40-invert-l))!important}.has-background-black-40-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-40-invert-l))!important}.has-text-black-45{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-45-l))!important}.has-background-black-45{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-45-l))!important}.has-text-black-45-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-45-invert-l))!important}.has-background-black-45-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-45-invert-l))!important}.has-text-black-50{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-50-l))!important}.has-background-black-50{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-50-l))!important}.has-text-black-50-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-50-invert-l))!important}.has-background-black-50-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-50-invert-l))!important}.has-text-black-55{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-55-l))!important}.has-background-black-55{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-55-l))!important}.has-text-black-55-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-55-invert-l))!important}.has-background-black-55-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-55-invert-l))!important}.has-text-black-60{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-60-l))!important}.has-background-black-60{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-60-l))!important}.has-text-black-60-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-60-invert-l))!important}.has-background-black-60-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-60-invert-l))!important}.has-text-black-65{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-65-l))!important}.has-background-black-65{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-65-l))!important}.has-text-black-65-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-65-invert-l))!important}.has-background-black-65-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-65-invert-l))!important}.has-text-black-70{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-70-l))!important}.has-background-black-70{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-70-l))!important}.has-text-black-70-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-70-invert-l))!important}.has-background-black-70-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-70-invert-l))!important}.has-text-black-75{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-75-l))!important}.has-background-black-75{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-75-l))!important}.has-text-black-75-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-75-invert-l))!important}.has-background-black-75-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-75-invert-l))!important}.has-text-black-80{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-80-l))!important}.has-background-black-80{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-80-l))!important}.has-text-black-80-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-80-invert-l))!important}.has-background-black-80-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-80-invert-l))!important}.has-text-black-85{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-85-l))!important}.has-background-black-85{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-85-l))!important}.has-text-black-85-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-85-invert-l))!important}.has-background-black-85-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-85-invert-l))!important}.has-text-black-90{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-90-l))!important}.has-background-black-90{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-90-l))!important}.has-text-black-90-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-90-invert-l))!important}.has-background-black-90-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-90-invert-l))!important}.has-text-black-95{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-95-l))!important}.has-background-black-95{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-95-l))!important}.has-text-black-95-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-95-invert-l))!important}.has-background-black-95-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-95-invert-l))!important}.has-text-black-100{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-100-l))!important}.has-background-black-100{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-100-l))!important}.has-text-black-100-invert{color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-100-invert-l))!important}.has-background-black-100-invert{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),var(--bulma-black-100-invert-l))!important}a.has-text-black:hover,a.has-text-black:focus-visible,button.has-text-black:hover,button.has-text-black:focus-visible,has-text-black.is-hoverable:hover,has-text-black.is-hoverable:focus-visible{color:hsl(var(--bulma-black-h),var(--bulma-black-s),calc(var(--bulma-black-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-black:active,button.has-text-black:active,has-text-black.is-hoverable:active{color:hsl(var(--bulma-black-h),var(--bulma-black-s),calc(var(--bulma-black-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-black:hover,a.has-background-black:focus-visible,button.has-background-black:hover,button.has-background-black:focus-visible,has-background-black.is-hoverable:hover,has-background-black.is-hoverable:focus-visible{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),calc(var(--bulma-black-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-black:active,button.has-background-black:active,has-background-black.is-hoverable:active{background-color:hsl(var(--bulma-black-h),var(--bulma-black-s),calc(var(--bulma-black-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-black{--h: var(--bulma-black-h);--s: var(--bulma-black-s);--l: var(--bulma-black-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-black-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-black-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-black-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-black-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-black-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-black-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-black-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-black-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-black-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-black-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-black-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-black-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-black-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-black-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-black-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-black-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-black-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-black-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-black-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-black-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-black-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-light{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-l))!important}.has-background-light{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-l))!important}.has-text-light-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-invert-l))!important}.has-background-light-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-invert-l))!important}.has-text-light-on-scheme{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-on-scheme-l))!important}.has-background-light-on-scheme{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-on-scheme-l))!important}.has-text-light-light{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-light-l))!important}.has-background-light-light{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-light-l))!important}.has-text-light-light-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-light-invert-l))!important}.has-background-light-light-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-light-invert-l))!important}.has-text-light-dark{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-dark-l))!important}.has-background-light-dark{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-dark-l))!important}.has-text-light-dark-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-dark-invert-l))!important}.has-background-light-dark-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-dark-invert-l))!important}.has-text-light-soft{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-soft-l))!important}.has-background-light-soft{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-soft-l))!important}.has-text-light-bold{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-bold-l))!important}.has-background-light-bold{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-bold-l))!important}.has-text-light-soft-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-soft-invert-l))!important}.has-background-light-soft-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-soft-invert-l))!important}.has-text-light-bold-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-bold-invert-l))!important}.has-background-light-bold-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-bold-invert-l))!important}.has-text-light-00{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-00-l))!important}.has-background-light-00{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-00-l))!important}.has-text-light-00-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-00-invert-l))!important}.has-background-light-00-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-00-invert-l))!important}.has-text-light-05{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-05-l))!important}.has-background-light-05{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-05-l))!important}.has-text-light-05-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-05-invert-l))!important}.has-background-light-05-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-05-invert-l))!important}.has-text-light-10{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-10-l))!important}.has-background-light-10{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-10-l))!important}.has-text-light-10-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-10-invert-l))!important}.has-background-light-10-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-10-invert-l))!important}.has-text-light-15{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-15-l))!important}.has-background-light-15{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-15-l))!important}.has-text-light-15-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-15-invert-l))!important}.has-background-light-15-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-15-invert-l))!important}.has-text-light-20{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-20-l))!important}.has-background-light-20{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-20-l))!important}.has-text-light-20-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-20-invert-l))!important}.has-background-light-20-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-20-invert-l))!important}.has-text-light-25{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-25-l))!important}.has-background-light-25{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-25-l))!important}.has-text-light-25-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-25-invert-l))!important}.has-background-light-25-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-25-invert-l))!important}.has-text-light-30{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-30-l))!important}.has-background-light-30{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-30-l))!important}.has-text-light-30-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-30-invert-l))!important}.has-background-light-30-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-30-invert-l))!important}.has-text-light-35{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-35-l))!important}.has-background-light-35{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-35-l))!important}.has-text-light-35-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-35-invert-l))!important}.has-background-light-35-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-35-invert-l))!important}.has-text-light-40{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-40-l))!important}.has-background-light-40{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-40-l))!important}.has-text-light-40-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-40-invert-l))!important}.has-background-light-40-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-40-invert-l))!important}.has-text-light-45{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-45-l))!important}.has-background-light-45{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-45-l))!important}.has-text-light-45-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-45-invert-l))!important}.has-background-light-45-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-45-invert-l))!important}.has-text-light-50{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-50-l))!important}.has-background-light-50{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-50-l))!important}.has-text-light-50-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-50-invert-l))!important}.has-background-light-50-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-50-invert-l))!important}.has-text-light-55{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-55-l))!important}.has-background-light-55{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-55-l))!important}.has-text-light-55-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-55-invert-l))!important}.has-background-light-55-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-55-invert-l))!important}.has-text-light-60{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-60-l))!important}.has-background-light-60{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-60-l))!important}.has-text-light-60-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-60-invert-l))!important}.has-background-light-60-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-60-invert-l))!important}.has-text-light-65{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-65-l))!important}.has-background-light-65{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-65-l))!important}.has-text-light-65-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-65-invert-l))!important}.has-background-light-65-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-65-invert-l))!important}.has-text-light-70{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-70-l))!important}.has-background-light-70{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-70-l))!important}.has-text-light-70-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-70-invert-l))!important}.has-background-light-70-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-70-invert-l))!important}.has-text-light-75{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-75-l))!important}.has-background-light-75{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-75-l))!important}.has-text-light-75-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-75-invert-l))!important}.has-background-light-75-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-75-invert-l))!important}.has-text-light-80{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-80-l))!important}.has-background-light-80{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-80-l))!important}.has-text-light-80-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-80-invert-l))!important}.has-background-light-80-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-80-invert-l))!important}.has-text-light-85{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-85-l))!important}.has-background-light-85{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-85-l))!important}.has-text-light-85-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-85-invert-l))!important}.has-background-light-85-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-85-invert-l))!important}.has-text-light-90{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-90-l))!important}.has-background-light-90{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-90-l))!important}.has-text-light-90-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-90-invert-l))!important}.has-background-light-90-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-90-invert-l))!important}.has-text-light-95{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-95-l))!important}.has-background-light-95{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-95-l))!important}.has-text-light-95-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-95-invert-l))!important}.has-background-light-95-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-95-invert-l))!important}.has-text-light-100{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-100-l))!important}.has-background-light-100{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-100-l))!important}.has-text-light-100-invert{color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-100-invert-l))!important}.has-background-light-100-invert{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),var(--bulma-light-100-invert-l))!important}a.has-text-light:hover,a.has-text-light:focus-visible,button.has-text-light:hover,button.has-text-light:focus-visible,has-text-light.is-hoverable:hover,has-text-light.is-hoverable:focus-visible{color:hsl(var(--bulma-light-h),var(--bulma-light-s),calc(var(--bulma-light-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-light:active,button.has-text-light:active,has-text-light.is-hoverable:active{color:hsl(var(--bulma-light-h),var(--bulma-light-s),calc(var(--bulma-light-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-light:hover,a.has-background-light:focus-visible,button.has-background-light:hover,button.has-background-light:focus-visible,has-background-light.is-hoverable:hover,has-background-light.is-hoverable:focus-visible{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),calc(var(--bulma-light-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-light:active,button.has-background-light:active,has-background-light.is-hoverable:active{background-color:hsl(var(--bulma-light-h),var(--bulma-light-s),calc(var(--bulma-light-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-light{--h: var(--bulma-light-h);--s: var(--bulma-light-s);--l: var(--bulma-light-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-light-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-light-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-light-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-light-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-light-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-light-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-light-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-light-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-light-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-light-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-light-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-light-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-light-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-light-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-light-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-light-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-light-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-light-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-light-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-light-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-light-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-dark{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-l))!important}.has-background-dark{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-l))!important}.has-text-dark-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-invert-l))!important}.has-background-dark-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-invert-l))!important}.has-text-dark-on-scheme{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-on-scheme-l))!important}.has-background-dark-on-scheme{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-on-scheme-l))!important}.has-text-dark-light{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-light-l))!important}.has-background-dark-light{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-light-l))!important}.has-text-dark-light-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-light-invert-l))!important}.has-background-dark-light-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-light-invert-l))!important}.has-text-dark-dark{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-dark-l))!important}.has-background-dark-dark{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-dark-l))!important}.has-text-dark-dark-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-dark-invert-l))!important}.has-background-dark-dark-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-dark-invert-l))!important}.has-text-dark-soft{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-soft-l))!important}.has-background-dark-soft{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-soft-l))!important}.has-text-dark-bold{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-bold-l))!important}.has-background-dark-bold{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-bold-l))!important}.has-text-dark-soft-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-soft-invert-l))!important}.has-background-dark-soft-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-soft-invert-l))!important}.has-text-dark-bold-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-bold-invert-l))!important}.has-background-dark-bold-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-bold-invert-l))!important}.has-text-dark-00{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-00-l))!important}.has-background-dark-00{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-00-l))!important}.has-text-dark-00-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-00-invert-l))!important}.has-background-dark-00-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-00-invert-l))!important}.has-text-dark-05{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-05-l))!important}.has-background-dark-05{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-05-l))!important}.has-text-dark-05-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-05-invert-l))!important}.has-background-dark-05-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-05-invert-l))!important}.has-text-dark-10{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-10-l))!important}.has-background-dark-10{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-10-l))!important}.has-text-dark-10-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-10-invert-l))!important}.has-background-dark-10-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-10-invert-l))!important}.has-text-dark-15{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-15-l))!important}.has-background-dark-15{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-15-l))!important}.has-text-dark-15-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-15-invert-l))!important}.has-background-dark-15-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-15-invert-l))!important}.has-text-dark-20{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-20-l))!important}.has-background-dark-20{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-20-l))!important}.has-text-dark-20-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-20-invert-l))!important}.has-background-dark-20-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-20-invert-l))!important}.has-text-dark-25{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-25-l))!important}.has-background-dark-25{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-25-l))!important}.has-text-dark-25-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-25-invert-l))!important}.has-background-dark-25-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-25-invert-l))!important}.has-text-dark-30{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-30-l))!important}.has-background-dark-30{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-30-l))!important}.has-text-dark-30-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-30-invert-l))!important}.has-background-dark-30-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-30-invert-l))!important}.has-text-dark-35{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-35-l))!important}.has-background-dark-35{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-35-l))!important}.has-text-dark-35-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-35-invert-l))!important}.has-background-dark-35-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-35-invert-l))!important}.has-text-dark-40{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-40-l))!important}.has-background-dark-40{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-40-l))!important}.has-text-dark-40-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-40-invert-l))!important}.has-background-dark-40-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-40-invert-l))!important}.has-text-dark-45{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-45-l))!important}.has-background-dark-45{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-45-l))!important}.has-text-dark-45-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-45-invert-l))!important}.has-background-dark-45-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-45-invert-l))!important}.has-text-dark-50{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-50-l))!important}.has-background-dark-50{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-50-l))!important}.has-text-dark-50-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-50-invert-l))!important}.has-background-dark-50-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-50-invert-l))!important}.has-text-dark-55{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-55-l))!important}.has-background-dark-55{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-55-l))!important}.has-text-dark-55-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-55-invert-l))!important}.has-background-dark-55-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-55-invert-l))!important}.has-text-dark-60{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-60-l))!important}.has-background-dark-60{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-60-l))!important}.has-text-dark-60-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-60-invert-l))!important}.has-background-dark-60-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-60-invert-l))!important}.has-text-dark-65{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-65-l))!important}.has-background-dark-65{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-65-l))!important}.has-text-dark-65-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-65-invert-l))!important}.has-background-dark-65-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-65-invert-l))!important}.has-text-dark-70{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-70-l))!important}.has-background-dark-70{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-70-l))!important}.has-text-dark-70-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-70-invert-l))!important}.has-background-dark-70-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-70-invert-l))!important}.has-text-dark-75{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-75-l))!important}.has-background-dark-75{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-75-l))!important}.has-text-dark-75-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-75-invert-l))!important}.has-background-dark-75-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-75-invert-l))!important}.has-text-dark-80{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-80-l))!important}.has-background-dark-80{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-80-l))!important}.has-text-dark-80-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-80-invert-l))!important}.has-background-dark-80-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-80-invert-l))!important}.has-text-dark-85{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-85-l))!important}.has-background-dark-85{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-85-l))!important}.has-text-dark-85-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-85-invert-l))!important}.has-background-dark-85-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-85-invert-l))!important}.has-text-dark-90{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-90-l))!important}.has-background-dark-90{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-90-l))!important}.has-text-dark-90-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-90-invert-l))!important}.has-background-dark-90-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-90-invert-l))!important}.has-text-dark-95{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-95-l))!important}.has-background-dark-95{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-95-l))!important}.has-text-dark-95-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-95-invert-l))!important}.has-background-dark-95-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-95-invert-l))!important}.has-text-dark-100{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-100-l))!important}.has-background-dark-100{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-100-l))!important}.has-text-dark-100-invert{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-100-invert-l))!important}.has-background-dark-100-invert{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),var(--bulma-dark-100-invert-l))!important}a.has-text-dark:hover,a.has-text-dark:focus-visible,button.has-text-dark:hover,button.has-text-dark:focus-visible,has-text-dark.is-hoverable:hover,has-text-dark.is-hoverable:focus-visible{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),calc(var(--bulma-dark-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-dark:active,button.has-text-dark:active,has-text-dark.is-hoverable:active{color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),calc(var(--bulma-dark-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-dark:hover,a.has-background-dark:focus-visible,button.has-background-dark:hover,button.has-background-dark:focus-visible,has-background-dark.is-hoverable:hover,has-background-dark.is-hoverable:focus-visible{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),calc(var(--bulma-dark-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-dark:active,button.has-background-dark:active,has-background-dark.is-hoverable:active{background-color:hsl(var(--bulma-dark-h),var(--bulma-dark-s),calc(var(--bulma-dark-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-dark{--h: var(--bulma-dark-h);--s: var(--bulma-dark-s);--l: var(--bulma-dark-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-dark-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-dark-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-dark-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-dark-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-dark-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-dark-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-dark-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-dark-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-dark-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-dark-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-dark-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-dark-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-dark-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-dark-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-dark-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-dark-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-dark-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-dark-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-dark-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-dark-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-dark-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-text{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-l))!important}.has-background-text{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-l))!important}.has-text-text-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-invert-l))!important}.has-background-text-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-invert-l))!important}.has-text-text-on-scheme{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-on-scheme-l))!important}.has-background-text-on-scheme{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-on-scheme-l))!important}.has-text-text-light{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-light-l))!important}.has-background-text-light{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-light-l))!important}.has-text-text-light-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-light-invert-l))!important}.has-background-text-light-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-light-invert-l))!important}.has-text-text-dark{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-dark-l))!important}.has-background-text-dark{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-dark-l))!important}.has-text-text-dark-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-dark-invert-l))!important}.has-background-text-dark-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-dark-invert-l))!important}.has-text-text-soft{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-soft-l))!important}.has-background-text-soft{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-soft-l))!important}.has-text-text-bold{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-bold-l))!important}.has-background-text-bold{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-bold-l))!important}.has-text-text-soft-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-soft-invert-l))!important}.has-background-text-soft-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-soft-invert-l))!important}.has-text-text-bold-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-bold-invert-l))!important}.has-background-text-bold-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-bold-invert-l))!important}.has-text-text-00{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-00-l))!important}.has-background-text-00{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-00-l))!important}.has-text-text-00-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-00-invert-l))!important}.has-background-text-00-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-00-invert-l))!important}.has-text-text-05{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-05-l))!important}.has-background-text-05{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-05-l))!important}.has-text-text-05-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-05-invert-l))!important}.has-background-text-05-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-05-invert-l))!important}.has-text-text-10{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-10-l))!important}.has-background-text-10{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-10-l))!important}.has-text-text-10-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-10-invert-l))!important}.has-background-text-10-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-10-invert-l))!important}.has-text-text-15{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-15-l))!important}.has-background-text-15{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-15-l))!important}.has-text-text-15-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-15-invert-l))!important}.has-background-text-15-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-15-invert-l))!important}.has-text-text-20{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-20-l))!important}.has-background-text-20{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-20-l))!important}.has-text-text-20-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-20-invert-l))!important}.has-background-text-20-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-20-invert-l))!important}.has-text-text-25{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-25-l))!important}.has-background-text-25{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-25-l))!important}.has-text-text-25-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-25-invert-l))!important}.has-background-text-25-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-25-invert-l))!important}.has-text-text-30{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-30-l))!important}.has-background-text-30{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-30-l))!important}.has-text-text-30-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-30-invert-l))!important}.has-background-text-30-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-30-invert-l))!important}.has-text-text-35{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-35-l))!important}.has-background-text-35{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-35-l))!important}.has-text-text-35-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-35-invert-l))!important}.has-background-text-35-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-35-invert-l))!important}.has-text-text-40{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-40-l))!important}.has-background-text-40{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-40-l))!important}.has-text-text-40-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-40-invert-l))!important}.has-background-text-40-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-40-invert-l))!important}.has-text-text-45{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-45-l))!important}.has-background-text-45{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-45-l))!important}.has-text-text-45-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-45-invert-l))!important}.has-background-text-45-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-45-invert-l))!important}.has-text-text-50{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-50-l))!important}.has-background-text-50{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-50-l))!important}.has-text-text-50-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-50-invert-l))!important}.has-background-text-50-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-50-invert-l))!important}.has-text-text-55{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-55-l))!important}.has-background-text-55{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-55-l))!important}.has-text-text-55-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-55-invert-l))!important}.has-background-text-55-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-55-invert-l))!important}.has-text-text-60{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-60-l))!important}.has-background-text-60{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-60-l))!important}.has-text-text-60-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-60-invert-l))!important}.has-background-text-60-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-60-invert-l))!important}.has-text-text-65{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-65-l))!important}.has-background-text-65{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-65-l))!important}.has-text-text-65-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-65-invert-l))!important}.has-background-text-65-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-65-invert-l))!important}.has-text-text-70{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-70-l))!important}.has-background-text-70{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-70-l))!important}.has-text-text-70-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-70-invert-l))!important}.has-background-text-70-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-70-invert-l))!important}.has-text-text-75{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-75-l))!important}.has-background-text-75{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-75-l))!important}.has-text-text-75-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-75-invert-l))!important}.has-background-text-75-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-75-invert-l))!important}.has-text-text-80{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-80-l))!important}.has-background-text-80{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-80-l))!important}.has-text-text-80-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-80-invert-l))!important}.has-background-text-80-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-80-invert-l))!important}.has-text-text-85{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-85-l))!important}.has-background-text-85{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-85-l))!important}.has-text-text-85-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-85-invert-l))!important}.has-background-text-85-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-85-invert-l))!important}.has-text-text-90{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-90-l))!important}.has-background-text-90{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-90-l))!important}.has-text-text-90-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-90-invert-l))!important}.has-background-text-90-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-90-invert-l))!important}.has-text-text-95{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-95-l))!important}.has-background-text-95{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-95-l))!important}.has-text-text-95-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-95-invert-l))!important}.has-background-text-95-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-95-invert-l))!important}.has-text-text-100{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-100-l))!important}.has-background-text-100{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-100-l))!important}.has-text-text-100-invert{color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-100-invert-l))!important}.has-background-text-100-invert{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),var(--bulma-text-100-invert-l))!important}a.has-text-text:hover,a.has-text-text:focus-visible,button.has-text-text:hover,button.has-text-text:focus-visible,has-text-text.is-hoverable:hover,has-text-text.is-hoverable:focus-visible{color:hsl(var(--bulma-text-h),var(--bulma-text-s),calc(var(--bulma-text-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-text:active,button.has-text-text:active,has-text-text.is-hoverable:active{color:hsl(var(--bulma-text-h),var(--bulma-text-s),calc(var(--bulma-text-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-text:hover,a.has-background-text:focus-visible,button.has-background-text:hover,button.has-background-text:focus-visible,has-background-text.is-hoverable:hover,has-background-text.is-hoverable:focus-visible{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),calc(var(--bulma-text-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-text:active,button.has-background-text:active,has-background-text.is-hoverable:active{background-color:hsl(var(--bulma-text-h),var(--bulma-text-s),calc(var(--bulma-text-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-text{--h: var(--bulma-text-h);--s: var(--bulma-text-s);--l: var(--bulma-text-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-text-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-text-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-text-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-text-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-text-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-text-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-text-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-text-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-text-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-text-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-text-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-text-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-text-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-text-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-text-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-text-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-text-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-text-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-text-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-text-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-text-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-primary{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-l))!important}.has-background-primary{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-l))!important}.has-text-primary-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-invert-l))!important}.has-background-primary-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-invert-l))!important}.has-text-primary-on-scheme{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-on-scheme-l))!important}.has-background-primary-on-scheme{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-on-scheme-l))!important}.has-text-primary-light{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-light-l))!important}.has-background-primary-light{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-light-l))!important}.has-text-primary-light-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-light-invert-l))!important}.has-background-primary-light-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-light-invert-l))!important}.has-text-primary-dark{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-dark-l))!important}.has-background-primary-dark{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-dark-l))!important}.has-text-primary-dark-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-dark-invert-l))!important}.has-background-primary-dark-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-dark-invert-l))!important}.has-text-primary-soft{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-soft-l))!important}.has-background-primary-soft{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-soft-l))!important}.has-text-primary-bold{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-bold-l))!important}.has-background-primary-bold{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-bold-l))!important}.has-text-primary-soft-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-soft-invert-l))!important}.has-background-primary-soft-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-soft-invert-l))!important}.has-text-primary-bold-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-bold-invert-l))!important}.has-background-primary-bold-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-bold-invert-l))!important}.has-text-primary-00{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-00-l))!important}.has-background-primary-00{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-00-l))!important}.has-text-primary-00-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-00-invert-l))!important}.has-background-primary-00-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-00-invert-l))!important}.has-text-primary-05{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-05-l))!important}.has-background-primary-05{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-05-l))!important}.has-text-primary-05-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-05-invert-l))!important}.has-background-primary-05-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-05-invert-l))!important}.has-text-primary-10{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-10-l))!important}.has-background-primary-10{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-10-l))!important}.has-text-primary-10-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-10-invert-l))!important}.has-background-primary-10-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-10-invert-l))!important}.has-text-primary-15{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-15-l))!important}.has-background-primary-15{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-15-l))!important}.has-text-primary-15-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-15-invert-l))!important}.has-background-primary-15-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-15-invert-l))!important}.has-text-primary-20{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-20-l))!important}.has-background-primary-20{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-20-l))!important}.has-text-primary-20-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-20-invert-l))!important}.has-background-primary-20-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-20-invert-l))!important}.has-text-primary-25{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-25-l))!important}.has-background-primary-25{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-25-l))!important}.has-text-primary-25-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-25-invert-l))!important}.has-background-primary-25-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-25-invert-l))!important}.has-text-primary-30{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-30-l))!important}.has-background-primary-30{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-30-l))!important}.has-text-primary-30-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-30-invert-l))!important}.has-background-primary-30-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-30-invert-l))!important}.has-text-primary-35{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-35-l))!important}.has-background-primary-35{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-35-l))!important}.has-text-primary-35-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-35-invert-l))!important}.has-background-primary-35-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-35-invert-l))!important}.has-text-primary-40{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-40-l))!important}.has-background-primary-40{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-40-l))!important}.has-text-primary-40-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-40-invert-l))!important}.has-background-primary-40-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-40-invert-l))!important}.has-text-primary-45{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-45-l))!important}.has-background-primary-45{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-45-l))!important}.has-text-primary-45-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-45-invert-l))!important}.has-background-primary-45-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-45-invert-l))!important}.has-text-primary-50{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-50-l))!important}.has-background-primary-50{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-50-l))!important}.has-text-primary-50-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-50-invert-l))!important}.has-background-primary-50-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-50-invert-l))!important}.has-text-primary-55{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-55-l))!important}.has-background-primary-55{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-55-l))!important}.has-text-primary-55-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-55-invert-l))!important}.has-background-primary-55-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-55-invert-l))!important}.has-text-primary-60{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-60-l))!important}.has-background-primary-60{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-60-l))!important}.has-text-primary-60-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-60-invert-l))!important}.has-background-primary-60-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-60-invert-l))!important}.has-text-primary-65{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-65-l))!important}.has-background-primary-65{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-65-l))!important}.has-text-primary-65-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-65-invert-l))!important}.has-background-primary-65-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-65-invert-l))!important}.has-text-primary-70{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-70-l))!important}.has-background-primary-70{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-70-l))!important}.has-text-primary-70-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-70-invert-l))!important}.has-background-primary-70-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-70-invert-l))!important}.has-text-primary-75{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-75-l))!important}.has-background-primary-75{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-75-l))!important}.has-text-primary-75-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-75-invert-l))!important}.has-background-primary-75-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-75-invert-l))!important}.has-text-primary-80{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-80-l))!important}.has-background-primary-80{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-80-l))!important}.has-text-primary-80-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-80-invert-l))!important}.has-background-primary-80-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-80-invert-l))!important}.has-text-primary-85{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-85-l))!important}.has-background-primary-85{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-85-l))!important}.has-text-primary-85-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-85-invert-l))!important}.has-background-primary-85-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-85-invert-l))!important}.has-text-primary-90{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-90-l))!important}.has-background-primary-90{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-90-l))!important}.has-text-primary-90-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-90-invert-l))!important}.has-background-primary-90-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-90-invert-l))!important}.has-text-primary-95{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-95-l))!important}.has-background-primary-95{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-95-l))!important}.has-text-primary-95-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-95-invert-l))!important}.has-background-primary-95-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-95-invert-l))!important}.has-text-primary-100{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-100-l))!important}.has-background-primary-100{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-100-l))!important}.has-text-primary-100-invert{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-100-invert-l))!important}.has-background-primary-100-invert{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),var(--bulma-primary-100-invert-l))!important}a.has-text-primary:hover,a.has-text-primary:focus-visible,button.has-text-primary:hover,button.has-text-primary:focus-visible,has-text-primary.is-hoverable:hover,has-text-primary.is-hoverable:focus-visible{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),calc(var(--bulma-primary-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-primary:active,button.has-text-primary:active,has-text-primary.is-hoverable:active{color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),calc(var(--bulma-primary-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-primary:hover,a.has-background-primary:focus-visible,button.has-background-primary:hover,button.has-background-primary:focus-visible,has-background-primary.is-hoverable:hover,has-background-primary.is-hoverable:focus-visible{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),calc(var(--bulma-primary-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-primary:active,button.has-background-primary:active,has-background-primary.is-hoverable:active{background-color:hsl(var(--bulma-primary-h),var(--bulma-primary-s),calc(var(--bulma-primary-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-primary{--h: var(--bulma-primary-h);--s: var(--bulma-primary-s);--l: var(--bulma-primary-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-primary-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-primary-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-primary-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-primary-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-primary-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-primary-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-primary-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-primary-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-primary-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-primary-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-primary-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-primary-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-primary-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-primary-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-primary-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-primary-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-primary-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-primary-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-primary-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-primary-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-primary-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-link{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-l))!important}.has-background-link{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-l))!important}.has-text-link-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-invert-l))!important}.has-background-link-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-invert-l))!important}.has-text-link-on-scheme{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-on-scheme-l))!important}.has-background-link-on-scheme{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-on-scheme-l))!important}.has-text-link-light{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-light-l))!important}.has-background-link-light{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-light-l))!important}.has-text-link-light-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-light-invert-l))!important}.has-background-link-light-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-light-invert-l))!important}.has-text-link-dark{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-dark-l))!important}.has-background-link-dark{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-dark-l))!important}.has-text-link-dark-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-dark-invert-l))!important}.has-background-link-dark-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-dark-invert-l))!important}.has-text-link-soft{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-soft-l))!important}.has-background-link-soft{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-soft-l))!important}.has-text-link-bold{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-bold-l))!important}.has-background-link-bold{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-bold-l))!important}.has-text-link-soft-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-soft-invert-l))!important}.has-background-link-soft-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-soft-invert-l))!important}.has-text-link-bold-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-bold-invert-l))!important}.has-background-link-bold-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-bold-invert-l))!important}.has-text-link-00{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-00-l))!important}.has-background-link-00{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-00-l))!important}.has-text-link-00-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-00-invert-l))!important}.has-background-link-00-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-00-invert-l))!important}.has-text-link-05{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-05-l))!important}.has-background-link-05{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-05-l))!important}.has-text-link-05-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-05-invert-l))!important}.has-background-link-05-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-05-invert-l))!important}.has-text-link-10{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-10-l))!important}.has-background-link-10{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-10-l))!important}.has-text-link-10-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-10-invert-l))!important}.has-background-link-10-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-10-invert-l))!important}.has-text-link-15{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-15-l))!important}.has-background-link-15{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-15-l))!important}.has-text-link-15-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-15-invert-l))!important}.has-background-link-15-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-15-invert-l))!important}.has-text-link-20{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-20-l))!important}.has-background-link-20{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-20-l))!important}.has-text-link-20-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-20-invert-l))!important}.has-background-link-20-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-20-invert-l))!important}.has-text-link-25{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-25-l))!important}.has-background-link-25{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-25-l))!important}.has-text-link-25-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-25-invert-l))!important}.has-background-link-25-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-25-invert-l))!important}.has-text-link-30{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-30-l))!important}.has-background-link-30{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-30-l))!important}.has-text-link-30-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-30-invert-l))!important}.has-background-link-30-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-30-invert-l))!important}.has-text-link-35{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-35-l))!important}.has-background-link-35{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-35-l))!important}.has-text-link-35-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-35-invert-l))!important}.has-background-link-35-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-35-invert-l))!important}.has-text-link-40{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-40-l))!important}.has-background-link-40{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-40-l))!important}.has-text-link-40-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-40-invert-l))!important}.has-background-link-40-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-40-invert-l))!important}.has-text-link-45{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-45-l))!important}.has-background-link-45{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-45-l))!important}.has-text-link-45-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-45-invert-l))!important}.has-background-link-45-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-45-invert-l))!important}.has-text-link-50{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-50-l))!important}.has-background-link-50{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-50-l))!important}.has-text-link-50-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-50-invert-l))!important}.has-background-link-50-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-50-invert-l))!important}.has-text-link-55{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-55-l))!important}.has-background-link-55{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-55-l))!important}.has-text-link-55-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-55-invert-l))!important}.has-background-link-55-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-55-invert-l))!important}.has-text-link-60{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-60-l))!important}.has-background-link-60{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-60-l))!important}.has-text-link-60-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-60-invert-l))!important}.has-background-link-60-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-60-invert-l))!important}.has-text-link-65{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-65-l))!important}.has-background-link-65{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-65-l))!important}.has-text-link-65-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-65-invert-l))!important}.has-background-link-65-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-65-invert-l))!important}.has-text-link-70{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-70-l))!important}.has-background-link-70{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-70-l))!important}.has-text-link-70-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-70-invert-l))!important}.has-background-link-70-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-70-invert-l))!important}.has-text-link-75{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-75-l))!important}.has-background-link-75{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-75-l))!important}.has-text-link-75-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-75-invert-l))!important}.has-background-link-75-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-75-invert-l))!important}.has-text-link-80{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-80-l))!important}.has-background-link-80{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-80-l))!important}.has-text-link-80-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-80-invert-l))!important}.has-background-link-80-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-80-invert-l))!important}.has-text-link-85{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-85-l))!important}.has-background-link-85{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-85-l))!important}.has-text-link-85-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-85-invert-l))!important}.has-background-link-85-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-85-invert-l))!important}.has-text-link-90{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-90-l))!important}.has-background-link-90{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-90-l))!important}.has-text-link-90-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-90-invert-l))!important}.has-background-link-90-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-90-invert-l))!important}.has-text-link-95{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-95-l))!important}.has-background-link-95{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-95-l))!important}.has-text-link-95-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-95-invert-l))!important}.has-background-link-95-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-95-invert-l))!important}.has-text-link-100{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-100-l))!important}.has-background-link-100{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-100-l))!important}.has-text-link-100-invert{color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-100-invert-l))!important}.has-background-link-100-invert{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-100-invert-l))!important}a.has-text-link:hover,a.has-text-link:focus-visible,button.has-text-link:hover,button.has-text-link:focus-visible,has-text-link.is-hoverable:hover,has-text-link.is-hoverable:focus-visible{color:hsl(var(--bulma-link-h),var(--bulma-link-s),calc(var(--bulma-link-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-link:active,button.has-text-link:active,has-text-link.is-hoverable:active{color:hsl(var(--bulma-link-h),var(--bulma-link-s),calc(var(--bulma-link-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-link:hover,a.has-background-link:focus-visible,button.has-background-link:hover,button.has-background-link:focus-visible,has-background-link.is-hoverable:hover,has-background-link.is-hoverable:focus-visible{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),calc(var(--bulma-link-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-link:active,button.has-background-link:active,has-background-link.is-hoverable:active{background-color:hsl(var(--bulma-link-h),var(--bulma-link-s),calc(var(--bulma-link-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-link{--h: var(--bulma-link-h);--s: var(--bulma-link-s);--l: var(--bulma-link-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-link-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-link-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-link-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-link-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-link-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-link-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-link-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-link-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-link-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-link-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-link-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-link-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-link-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-link-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-link-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-link-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-link-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-link-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-link-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-link-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-link-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-info{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-l))!important}.has-background-info{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-l))!important}.has-text-info-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-invert-l))!important}.has-background-info-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-invert-l))!important}.has-text-info-on-scheme{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-on-scheme-l))!important}.has-background-info-on-scheme{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-on-scheme-l))!important}.has-text-info-light{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-light-l))!important}.has-background-info-light{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-light-l))!important}.has-text-info-light-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-light-invert-l))!important}.has-background-info-light-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-light-invert-l))!important}.has-text-info-dark{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-dark-l))!important}.has-background-info-dark{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-dark-l))!important}.has-text-info-dark-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-dark-invert-l))!important}.has-background-info-dark-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-dark-invert-l))!important}.has-text-info-soft{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-soft-l))!important}.has-background-info-soft{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-soft-l))!important}.has-text-info-bold{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-bold-l))!important}.has-background-info-bold{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-bold-l))!important}.has-text-info-soft-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-soft-invert-l))!important}.has-background-info-soft-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-soft-invert-l))!important}.has-text-info-bold-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-bold-invert-l))!important}.has-background-info-bold-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-bold-invert-l))!important}.has-text-info-00{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-00-l))!important}.has-background-info-00{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-00-l))!important}.has-text-info-00-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-00-invert-l))!important}.has-background-info-00-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-00-invert-l))!important}.has-text-info-05{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-05-l))!important}.has-background-info-05{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-05-l))!important}.has-text-info-05-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-05-invert-l))!important}.has-background-info-05-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-05-invert-l))!important}.has-text-info-10{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-10-l))!important}.has-background-info-10{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-10-l))!important}.has-text-info-10-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-10-invert-l))!important}.has-background-info-10-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-10-invert-l))!important}.has-text-info-15{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-15-l))!important}.has-background-info-15{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-15-l))!important}.has-text-info-15-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-15-invert-l))!important}.has-background-info-15-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-15-invert-l))!important}.has-text-info-20{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-20-l))!important}.has-background-info-20{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-20-l))!important}.has-text-info-20-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-20-invert-l))!important}.has-background-info-20-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-20-invert-l))!important}.has-text-info-25{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-25-l))!important}.has-background-info-25{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-25-l))!important}.has-text-info-25-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-25-invert-l))!important}.has-background-info-25-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-25-invert-l))!important}.has-text-info-30{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-30-l))!important}.has-background-info-30{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-30-l))!important}.has-text-info-30-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-30-invert-l))!important}.has-background-info-30-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-30-invert-l))!important}.has-text-info-35{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-35-l))!important}.has-background-info-35{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-35-l))!important}.has-text-info-35-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-35-invert-l))!important}.has-background-info-35-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-35-invert-l))!important}.has-text-info-40{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-40-l))!important}.has-background-info-40{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-40-l))!important}.has-text-info-40-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-40-invert-l))!important}.has-background-info-40-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-40-invert-l))!important}.has-text-info-45{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-45-l))!important}.has-background-info-45{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-45-l))!important}.has-text-info-45-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-45-invert-l))!important}.has-background-info-45-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-45-invert-l))!important}.has-text-info-50{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-50-l))!important}.has-background-info-50{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-50-l))!important}.has-text-info-50-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-50-invert-l))!important}.has-background-info-50-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-50-invert-l))!important}.has-text-info-55{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-55-l))!important}.has-background-info-55{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-55-l))!important}.has-text-info-55-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-55-invert-l))!important}.has-background-info-55-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-55-invert-l))!important}.has-text-info-60{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-60-l))!important}.has-background-info-60{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-60-l))!important}.has-text-info-60-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-60-invert-l))!important}.has-background-info-60-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-60-invert-l))!important}.has-text-info-65{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-65-l))!important}.has-background-info-65{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-65-l))!important}.has-text-info-65-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-65-invert-l))!important}.has-background-info-65-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-65-invert-l))!important}.has-text-info-70{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-70-l))!important}.has-background-info-70{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-70-l))!important}.has-text-info-70-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-70-invert-l))!important}.has-background-info-70-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-70-invert-l))!important}.has-text-info-75{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-75-l))!important}.has-background-info-75{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-75-l))!important}.has-text-info-75-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-75-invert-l))!important}.has-background-info-75-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-75-invert-l))!important}.has-text-info-80{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-80-l))!important}.has-background-info-80{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-80-l))!important}.has-text-info-80-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-80-invert-l))!important}.has-background-info-80-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-80-invert-l))!important}.has-text-info-85{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-85-l))!important}.has-background-info-85{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-85-l))!important}.has-text-info-85-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-85-invert-l))!important}.has-background-info-85-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-85-invert-l))!important}.has-text-info-90{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-90-l))!important}.has-background-info-90{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-90-l))!important}.has-text-info-90-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-90-invert-l))!important}.has-background-info-90-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-90-invert-l))!important}.has-text-info-95{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-95-l))!important}.has-background-info-95{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-95-l))!important}.has-text-info-95-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-95-invert-l))!important}.has-background-info-95-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-95-invert-l))!important}.has-text-info-100{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-100-l))!important}.has-background-info-100{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-100-l))!important}.has-text-info-100-invert{color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-100-invert-l))!important}.has-background-info-100-invert{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),var(--bulma-info-100-invert-l))!important}a.has-text-info:hover,a.has-text-info:focus-visible,button.has-text-info:hover,button.has-text-info:focus-visible,has-text-info.is-hoverable:hover,has-text-info.is-hoverable:focus-visible{color:hsl(var(--bulma-info-h),var(--bulma-info-s),calc(var(--bulma-info-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-info:active,button.has-text-info:active,has-text-info.is-hoverable:active{color:hsl(var(--bulma-info-h),var(--bulma-info-s),calc(var(--bulma-info-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-info:hover,a.has-background-info:focus-visible,button.has-background-info:hover,button.has-background-info:focus-visible,has-background-info.is-hoverable:hover,has-background-info.is-hoverable:focus-visible{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),calc(var(--bulma-info-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-info:active,button.has-background-info:active,has-background-info.is-hoverable:active{background-color:hsl(var(--bulma-info-h),var(--bulma-info-s),calc(var(--bulma-info-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-info{--h: var(--bulma-info-h);--s: var(--bulma-info-s);--l: var(--bulma-info-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-info-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-info-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-info-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-info-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-info-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-info-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-info-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-info-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-info-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-info-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-info-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-info-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-info-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-info-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-info-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-info-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-info-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-info-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-info-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-info-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-info-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-success{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-l))!important}.has-background-success{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-l))!important}.has-text-success-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-invert-l))!important}.has-background-success-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-invert-l))!important}.has-text-success-on-scheme{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-on-scheme-l))!important}.has-background-success-on-scheme{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-on-scheme-l))!important}.has-text-success-light{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-light-l))!important}.has-background-success-light{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-light-l))!important}.has-text-success-light-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-light-invert-l))!important}.has-background-success-light-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-light-invert-l))!important}.has-text-success-dark{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-dark-l))!important}.has-background-success-dark{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-dark-l))!important}.has-text-success-dark-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-dark-invert-l))!important}.has-background-success-dark-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-dark-invert-l))!important}.has-text-success-soft{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-soft-l))!important}.has-background-success-soft{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-soft-l))!important}.has-text-success-bold{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-bold-l))!important}.has-background-success-bold{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-bold-l))!important}.has-text-success-soft-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-soft-invert-l))!important}.has-background-success-soft-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-soft-invert-l))!important}.has-text-success-bold-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-bold-invert-l))!important}.has-background-success-bold-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-bold-invert-l))!important}.has-text-success-00{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-00-l))!important}.has-background-success-00{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-00-l))!important}.has-text-success-00-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-00-invert-l))!important}.has-background-success-00-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-00-invert-l))!important}.has-text-success-05{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-05-l))!important}.has-background-success-05{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-05-l))!important}.has-text-success-05-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-05-invert-l))!important}.has-background-success-05-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-05-invert-l))!important}.has-text-success-10{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-10-l))!important}.has-background-success-10{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-10-l))!important}.has-text-success-10-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-10-invert-l))!important}.has-background-success-10-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-10-invert-l))!important}.has-text-success-15{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-15-l))!important}.has-background-success-15{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-15-l))!important}.has-text-success-15-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-15-invert-l))!important}.has-background-success-15-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-15-invert-l))!important}.has-text-success-20{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-20-l))!important}.has-background-success-20{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-20-l))!important}.has-text-success-20-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-20-invert-l))!important}.has-background-success-20-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-20-invert-l))!important}.has-text-success-25{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-25-l))!important}.has-background-success-25{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-25-l))!important}.has-text-success-25-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-25-invert-l))!important}.has-background-success-25-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-25-invert-l))!important}.has-text-success-30{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-30-l))!important}.has-background-success-30{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-30-l))!important}.has-text-success-30-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-30-invert-l))!important}.has-background-success-30-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-30-invert-l))!important}.has-text-success-35{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-35-l))!important}.has-background-success-35{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-35-l))!important}.has-text-success-35-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-35-invert-l))!important}.has-background-success-35-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-35-invert-l))!important}.has-text-success-40{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-40-l))!important}.has-background-success-40{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-40-l))!important}.has-text-success-40-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-40-invert-l))!important}.has-background-success-40-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-40-invert-l))!important}.has-text-success-45{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-45-l))!important}.has-background-success-45{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-45-l))!important}.has-text-success-45-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-45-invert-l))!important}.has-background-success-45-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-45-invert-l))!important}.has-text-success-50{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-50-l))!important}.has-background-success-50{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-50-l))!important}.has-text-success-50-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-50-invert-l))!important}.has-background-success-50-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-50-invert-l))!important}.has-text-success-55{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-55-l))!important}.has-background-success-55{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-55-l))!important}.has-text-success-55-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-55-invert-l))!important}.has-background-success-55-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-55-invert-l))!important}.has-text-success-60{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-60-l))!important}.has-background-success-60{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-60-l))!important}.has-text-success-60-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-60-invert-l))!important}.has-background-success-60-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-60-invert-l))!important}.has-text-success-65{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-65-l))!important}.has-background-success-65{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-65-l))!important}.has-text-success-65-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-65-invert-l))!important}.has-background-success-65-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-65-invert-l))!important}.has-text-success-70{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-70-l))!important}.has-background-success-70{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-70-l))!important}.has-text-success-70-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-70-invert-l))!important}.has-background-success-70-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-70-invert-l))!important}.has-text-success-75{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-75-l))!important}.has-background-success-75{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-75-l))!important}.has-text-success-75-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-75-invert-l))!important}.has-background-success-75-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-75-invert-l))!important}.has-text-success-80{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-80-l))!important}.has-background-success-80{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-80-l))!important}.has-text-success-80-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-80-invert-l))!important}.has-background-success-80-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-80-invert-l))!important}.has-text-success-85{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-85-l))!important}.has-background-success-85{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-85-l))!important}.has-text-success-85-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-85-invert-l))!important}.has-background-success-85-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-85-invert-l))!important}.has-text-success-90{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-90-l))!important}.has-background-success-90{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-90-l))!important}.has-text-success-90-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-90-invert-l))!important}.has-background-success-90-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-90-invert-l))!important}.has-text-success-95{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-95-l))!important}.has-background-success-95{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-95-l))!important}.has-text-success-95-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-95-invert-l))!important}.has-background-success-95-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-95-invert-l))!important}.has-text-success-100{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-100-l))!important}.has-background-success-100{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-100-l))!important}.has-text-success-100-invert{color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-100-invert-l))!important}.has-background-success-100-invert{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),var(--bulma-success-100-invert-l))!important}a.has-text-success:hover,a.has-text-success:focus-visible,button.has-text-success:hover,button.has-text-success:focus-visible,has-text-success.is-hoverable:hover,has-text-success.is-hoverable:focus-visible{color:hsl(var(--bulma-success-h),var(--bulma-success-s),calc(var(--bulma-success-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-success:active,button.has-text-success:active,has-text-success.is-hoverable:active{color:hsl(var(--bulma-success-h),var(--bulma-success-s),calc(var(--bulma-success-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-success:hover,a.has-background-success:focus-visible,button.has-background-success:hover,button.has-background-success:focus-visible,has-background-success.is-hoverable:hover,has-background-success.is-hoverable:focus-visible{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),calc(var(--bulma-success-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-success:active,button.has-background-success:active,has-background-success.is-hoverable:active{background-color:hsl(var(--bulma-success-h),var(--bulma-success-s),calc(var(--bulma-success-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-success{--h: var(--bulma-success-h);--s: var(--bulma-success-s);--l: var(--bulma-success-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-success-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-success-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-success-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-success-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-success-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-success-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-success-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-success-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-success-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-success-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-success-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-success-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-success-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-success-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-success-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-success-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-success-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-success-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-success-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-success-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-success-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-warning{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-l))!important}.has-background-warning{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-l))!important}.has-text-warning-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-invert-l))!important}.has-background-warning-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-invert-l))!important}.has-text-warning-on-scheme{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-on-scheme-l))!important}.has-background-warning-on-scheme{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-on-scheme-l))!important}.has-text-warning-light{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-light-l))!important}.has-background-warning-light{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-light-l))!important}.has-text-warning-light-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-light-invert-l))!important}.has-background-warning-light-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-light-invert-l))!important}.has-text-warning-dark{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-dark-l))!important}.has-background-warning-dark{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-dark-l))!important}.has-text-warning-dark-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-dark-invert-l))!important}.has-background-warning-dark-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-dark-invert-l))!important}.has-text-warning-soft{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-soft-l))!important}.has-background-warning-soft{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-soft-l))!important}.has-text-warning-bold{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-bold-l))!important}.has-background-warning-bold{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-bold-l))!important}.has-text-warning-soft-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-soft-invert-l))!important}.has-background-warning-soft-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-soft-invert-l))!important}.has-text-warning-bold-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-bold-invert-l))!important}.has-background-warning-bold-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-bold-invert-l))!important}.has-text-warning-00{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-00-l))!important}.has-background-warning-00{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-00-l))!important}.has-text-warning-00-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-00-invert-l))!important}.has-background-warning-00-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-00-invert-l))!important}.has-text-warning-05{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-05-l))!important}.has-background-warning-05{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-05-l))!important}.has-text-warning-05-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-05-invert-l))!important}.has-background-warning-05-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-05-invert-l))!important}.has-text-warning-10{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-10-l))!important}.has-background-warning-10{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-10-l))!important}.has-text-warning-10-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-10-invert-l))!important}.has-background-warning-10-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-10-invert-l))!important}.has-text-warning-15{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-15-l))!important}.has-background-warning-15{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-15-l))!important}.has-text-warning-15-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-15-invert-l))!important}.has-background-warning-15-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-15-invert-l))!important}.has-text-warning-20{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-20-l))!important}.has-background-warning-20{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-20-l))!important}.has-text-warning-20-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-20-invert-l))!important}.has-background-warning-20-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-20-invert-l))!important}.has-text-warning-25{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-25-l))!important}.has-background-warning-25{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-25-l))!important}.has-text-warning-25-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-25-invert-l))!important}.has-background-warning-25-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-25-invert-l))!important}.has-text-warning-30{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-30-l))!important}.has-background-warning-30{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-30-l))!important}.has-text-warning-30-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-30-invert-l))!important}.has-background-warning-30-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-30-invert-l))!important}.has-text-warning-35{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-35-l))!important}.has-background-warning-35{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-35-l))!important}.has-text-warning-35-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-35-invert-l))!important}.has-background-warning-35-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-35-invert-l))!important}.has-text-warning-40{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-40-l))!important}.has-background-warning-40{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-40-l))!important}.has-text-warning-40-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-40-invert-l))!important}.has-background-warning-40-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-40-invert-l))!important}.has-text-warning-45{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-45-l))!important}.has-background-warning-45{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-45-l))!important}.has-text-warning-45-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-45-invert-l))!important}.has-background-warning-45-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-45-invert-l))!important}.has-text-warning-50{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-50-l))!important}.has-background-warning-50{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-50-l))!important}.has-text-warning-50-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-50-invert-l))!important}.has-background-warning-50-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-50-invert-l))!important}.has-text-warning-55{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-55-l))!important}.has-background-warning-55{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-55-l))!important}.has-text-warning-55-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-55-invert-l))!important}.has-background-warning-55-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-55-invert-l))!important}.has-text-warning-60{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-60-l))!important}.has-background-warning-60{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-60-l))!important}.has-text-warning-60-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-60-invert-l))!important}.has-background-warning-60-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-60-invert-l))!important}.has-text-warning-65{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-65-l))!important}.has-background-warning-65{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-65-l))!important}.has-text-warning-65-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-65-invert-l))!important}.has-background-warning-65-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-65-invert-l))!important}.has-text-warning-70{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-70-l))!important}.has-background-warning-70{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-70-l))!important}.has-text-warning-70-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-70-invert-l))!important}.has-background-warning-70-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-70-invert-l))!important}.has-text-warning-75{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-75-l))!important}.has-background-warning-75{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-75-l))!important}.has-text-warning-75-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-75-invert-l))!important}.has-background-warning-75-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-75-invert-l))!important}.has-text-warning-80{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-80-l))!important}.has-background-warning-80{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-80-l))!important}.has-text-warning-80-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-80-invert-l))!important}.has-background-warning-80-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-80-invert-l))!important}.has-text-warning-85{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-85-l))!important}.has-background-warning-85{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-85-l))!important}.has-text-warning-85-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-85-invert-l))!important}.has-background-warning-85-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-85-invert-l))!important}.has-text-warning-90{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-90-l))!important}.has-background-warning-90{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-90-l))!important}.has-text-warning-90-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-90-invert-l))!important}.has-background-warning-90-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-90-invert-l))!important}.has-text-warning-95{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-95-l))!important}.has-background-warning-95{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-95-l))!important}.has-text-warning-95-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-95-invert-l))!important}.has-background-warning-95-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-95-invert-l))!important}.has-text-warning-100{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-100-l))!important}.has-background-warning-100{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-100-l))!important}.has-text-warning-100-invert{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-100-invert-l))!important}.has-background-warning-100-invert{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),var(--bulma-warning-100-invert-l))!important}a.has-text-warning:hover,a.has-text-warning:focus-visible,button.has-text-warning:hover,button.has-text-warning:focus-visible,has-text-warning.is-hoverable:hover,has-text-warning.is-hoverable:focus-visible{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),calc(var(--bulma-warning-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-warning:active,button.has-text-warning:active,has-text-warning.is-hoverable:active{color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),calc(var(--bulma-warning-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-warning:hover,a.has-background-warning:focus-visible,button.has-background-warning:hover,button.has-background-warning:focus-visible,has-background-warning.is-hoverable:hover,has-background-warning.is-hoverable:focus-visible{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),calc(var(--bulma-warning-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-warning:active,button.has-background-warning:active,has-background-warning.is-hoverable:active{background-color:hsl(var(--bulma-warning-h),var(--bulma-warning-s),calc(var(--bulma-warning-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-warning{--h: var(--bulma-warning-h);--s: var(--bulma-warning-s);--l: var(--bulma-warning-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-warning-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-warning-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-warning-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-warning-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-warning-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-warning-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-warning-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-warning-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-warning-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-warning-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-warning-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-warning-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-warning-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-warning-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-warning-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-warning-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-warning-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-warning-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-warning-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-warning-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-warning-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-danger{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-l))!important}.has-background-danger{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-l))!important}.has-text-danger-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-invert-l))!important}.has-background-danger-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-invert-l))!important}.has-text-danger-on-scheme{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-on-scheme-l))!important}.has-background-danger-on-scheme{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-on-scheme-l))!important}.has-text-danger-light{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-light-l))!important}.has-background-danger-light{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-light-l))!important}.has-text-danger-light-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-light-invert-l))!important}.has-background-danger-light-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-light-invert-l))!important}.has-text-danger-dark{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-dark-l))!important}.has-background-danger-dark{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-dark-l))!important}.has-text-danger-dark-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-dark-invert-l))!important}.has-background-danger-dark-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-dark-invert-l))!important}.has-text-danger-soft{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-soft-l))!important}.has-background-danger-soft{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-soft-l))!important}.has-text-danger-bold{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-bold-l))!important}.has-background-danger-bold{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-bold-l))!important}.has-text-danger-soft-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-soft-invert-l))!important}.has-background-danger-soft-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-soft-invert-l))!important}.has-text-danger-bold-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-bold-invert-l))!important}.has-background-danger-bold-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-bold-invert-l))!important}.has-text-danger-00{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-00-l))!important}.has-background-danger-00{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-00-l))!important}.has-text-danger-00-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-00-invert-l))!important}.has-background-danger-00-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-00-invert-l))!important}.has-text-danger-05{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-05-l))!important}.has-background-danger-05{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-05-l))!important}.has-text-danger-05-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-05-invert-l))!important}.has-background-danger-05-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-05-invert-l))!important}.has-text-danger-10{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-10-l))!important}.has-background-danger-10{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-10-l))!important}.has-text-danger-10-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-10-invert-l))!important}.has-background-danger-10-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-10-invert-l))!important}.has-text-danger-15{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-15-l))!important}.has-background-danger-15{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-15-l))!important}.has-text-danger-15-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-15-invert-l))!important}.has-background-danger-15-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-15-invert-l))!important}.has-text-danger-20{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-20-l))!important}.has-background-danger-20{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-20-l))!important}.has-text-danger-20-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-20-invert-l))!important}.has-background-danger-20-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-20-invert-l))!important}.has-text-danger-25{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-25-l))!important}.has-background-danger-25{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-25-l))!important}.has-text-danger-25-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-25-invert-l))!important}.has-background-danger-25-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-25-invert-l))!important}.has-text-danger-30{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-30-l))!important}.has-background-danger-30{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-30-l))!important}.has-text-danger-30-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-30-invert-l))!important}.has-background-danger-30-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-30-invert-l))!important}.has-text-danger-35{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-35-l))!important}.has-background-danger-35{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-35-l))!important}.has-text-danger-35-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-35-invert-l))!important}.has-background-danger-35-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-35-invert-l))!important}.has-text-danger-40{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-40-l))!important}.has-background-danger-40{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-40-l))!important}.has-text-danger-40-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-40-invert-l))!important}.has-background-danger-40-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-40-invert-l))!important}.has-text-danger-45{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-45-l))!important}.has-background-danger-45{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-45-l))!important}.has-text-danger-45-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-45-invert-l))!important}.has-background-danger-45-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-45-invert-l))!important}.has-text-danger-50{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-50-l))!important}.has-background-danger-50{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-50-l))!important}.has-text-danger-50-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-50-invert-l))!important}.has-background-danger-50-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-50-invert-l))!important}.has-text-danger-55{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-55-l))!important}.has-background-danger-55{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-55-l))!important}.has-text-danger-55-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-55-invert-l))!important}.has-background-danger-55-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-55-invert-l))!important}.has-text-danger-60{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-60-l))!important}.has-background-danger-60{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-60-l))!important}.has-text-danger-60-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-60-invert-l))!important}.has-background-danger-60-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-60-invert-l))!important}.has-text-danger-65{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-65-l))!important}.has-background-danger-65{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-65-l))!important}.has-text-danger-65-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-65-invert-l))!important}.has-background-danger-65-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-65-invert-l))!important}.has-text-danger-70{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-70-l))!important}.has-background-danger-70{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-70-l))!important}.has-text-danger-70-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-70-invert-l))!important}.has-background-danger-70-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-70-invert-l))!important}.has-text-danger-75{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-75-l))!important}.has-background-danger-75{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-75-l))!important}.has-text-danger-75-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-75-invert-l))!important}.has-background-danger-75-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-75-invert-l))!important}.has-text-danger-80{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-80-l))!important}.has-background-danger-80{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-80-l))!important}.has-text-danger-80-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-80-invert-l))!important}.has-background-danger-80-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-80-invert-l))!important}.has-text-danger-85{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-85-l))!important}.has-background-danger-85{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-85-l))!important}.has-text-danger-85-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-85-invert-l))!important}.has-background-danger-85-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-85-invert-l))!important}.has-text-danger-90{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-90-l))!important}.has-background-danger-90{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-90-l))!important}.has-text-danger-90-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-90-invert-l))!important}.has-background-danger-90-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-90-invert-l))!important}.has-text-danger-95{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-95-l))!important}.has-background-danger-95{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-95-l))!important}.has-text-danger-95-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-95-invert-l))!important}.has-background-danger-95-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-95-invert-l))!important}.has-text-danger-100{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-100-l))!important}.has-background-danger-100{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-100-l))!important}.has-text-danger-100-invert{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-100-invert-l))!important}.has-background-danger-100-invert{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),var(--bulma-danger-100-invert-l))!important}a.has-text-danger:hover,a.has-text-danger:focus-visible,button.has-text-danger:hover,button.has-text-danger:focus-visible,has-text-danger.is-hoverable:hover,has-text-danger.is-hoverable:focus-visible{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),calc(var(--bulma-danger-l) + var(--bulma-hover-color-l-delta)))!important}a.has-text-danger:active,button.has-text-danger:active,has-text-danger.is-hoverable:active{color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),calc(var(--bulma-danger-l) + var(--bulma-active-color-l-delta)))!important}a.has-background-danger:hover,a.has-background-danger:focus-visible,button.has-background-danger:hover,button.has-background-danger:focus-visible,has-background-danger.is-hoverable:hover,has-background-danger.is-hoverable:focus-visible{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),calc(var(--bulma-danger-l) + var(--bulma-hover-background-l-delta)))!important}a.has-background-danger:active,button.has-background-danger:active,has-background-danger.is-hoverable:active{background-color:hsl(var(--bulma-danger-h),var(--bulma-danger-s),calc(var(--bulma-danger-l) + var(--bulma-active-background-l-delta)))!important}.is-palette-danger{--h: var(--bulma-danger-h);--s: var(--bulma-danger-s);--l: var(--bulma-danger-l);--color: hsl(var(--h), var(--s), var(--l));--00-l: var(--bulma-danger-00-l);--color-00: hsl(var(--h), var(--s), var(--00-l));--05-l: var(--bulma-danger-05-l);--color-05: hsl(var(--h), var(--s), var(--05-l));--10-l: var(--bulma-danger-10-l);--color-10: hsl(var(--h), var(--s), var(--10-l));--15-l: var(--bulma-danger-15-l);--color-15: hsl(var(--h), var(--s), var(--15-l));--20-l: var(--bulma-danger-20-l);--color-20: hsl(var(--h), var(--s), var(--20-l));--25-l: var(--bulma-danger-25-l);--color-25: hsl(var(--h), var(--s), var(--25-l));--30-l: var(--bulma-danger-30-l);--color-30: hsl(var(--h), var(--s), var(--30-l));--35-l: var(--bulma-danger-35-l);--color-35: hsl(var(--h), var(--s), var(--35-l));--40-l: var(--bulma-danger-40-l);--color-40: hsl(var(--h), var(--s), var(--40-l));--45-l: var(--bulma-danger-45-l);--color-45: hsl(var(--h), var(--s), var(--45-l));--50-l: var(--bulma-danger-50-l);--color-50: hsl(var(--h), var(--s), var(--50-l));--55-l: var(--bulma-danger-55-l);--color-55: hsl(var(--h), var(--s), var(--55-l));--60-l: var(--bulma-danger-60-l);--color-60: hsl(var(--h), var(--s), var(--60-l));--65-l: var(--bulma-danger-65-l);--color-65: hsl(var(--h), var(--s), var(--65-l));--70-l: var(--bulma-danger-70-l);--color-70: hsl(var(--h), var(--s), var(--70-l));--75-l: var(--bulma-danger-75-l);--color-75: hsl(var(--h), var(--s), var(--75-l));--80-l: var(--bulma-danger-80-l);--color-80: hsl(var(--h), var(--s), var(--80-l));--85-l: var(--bulma-danger-85-l);--color-85: hsl(var(--h), var(--s), var(--85-l));--90-l: var(--bulma-danger-90-l);--color-90: hsl(var(--h), var(--s), var(--90-l));--95-l: var(--bulma-danger-95-l);--color-95: hsl(var(--h), var(--s), var(--95-l));--100-l: var(--bulma-danger-100-l);--color-100: hsl(var(--h), var(--s), var(--100-l))}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.has-text-current{color:currentColor!important}.has-text-inherit{color:inherit!important}.has-background-current{background-color:currentColor!important}.has-background-inherit{background-color:inherit!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix:after{clear:both;content:" ";display:table}.is-float-left,.is-pulled-left{float:left!important}.is-float-right,.is-pulled-right{float:right!important}.is-float-none{float:none!important}.is-clear-both{clear:both!important}.is-clear-left{clear:left!important}.is-clear-none{clear:none!important}.is-clear-right{clear:right!important}.is-gapless{gap:0!important}.is-gap-0{gap:0rem!important}.is-gap-0\.5{gap:.25rem!important}.is-gap-1{gap:.5rem!important}.is-gap-1\.5{gap:.75rem!important}.is-gap-2{gap:1rem!important}.is-gap-2\.5{gap:1.25rem!important}.is-gap-3{gap:1.5rem!important}.is-gap-3\.5{gap:1.75rem!important}.is-gap-4{gap:2rem!important}.is-gap-4\.5{gap:2.25rem!important}.is-gap-5{gap:2.5rem!important}.is-gap-5\.5{gap:2.75rem!important}.is-gap-6{gap:3rem!important}.is-gap-6\.5{gap:3.25rem!important}.is-gap-7{gap:3.5rem!important}.is-gap-7\.5{gap:3.75rem!important}.is-gap-8{gap:4rem!important}.is-column-gap-0{column-gap:0rem!important}.is-column-gap-0\.5{column-gap:.25rem!important}.is-column-gap-1{column-gap:.5rem!important}.is-column-gap-1\.5{column-gap:.75rem!important}.is-column-gap-2{column-gap:1rem!important}.is-column-gap-2\.5{column-gap:1.25rem!important}.is-column-gap-3{column-gap:1.5rem!important}.is-column-gap-3\.5{column-gap:1.75rem!important}.is-column-gap-4{column-gap:2rem!important}.is-column-gap-4\.5{column-gap:2.25rem!important}.is-column-gap-5{column-gap:2.5rem!important}.is-column-gap-5\.5{column-gap:2.75rem!important}.is-column-gap-6{column-gap:3rem!important}.is-column-gap-6\.5{column-gap:3.25rem!important}.is-column-gap-7{column-gap:3.5rem!important}.is-column-gap-7\.5{column-gap:3.75rem!important}.is-column-gap-8{column-gap:4rem!important}.is-row-gap-0{row-gap:0rem!important}.is-row-gap-0\.5{row-gap:.25rem!important}.is-row-gap-1{row-gap:.5rem!important}.is-row-gap-1\.5{row-gap:.75rem!important}.is-row-gap-2{row-gap:1rem!important}.is-row-gap-2\.5{row-gap:1.25rem!important}.is-row-gap-3{row-gap:1.5rem!important}.is-row-gap-3\.5{row-gap:1.75rem!important}.is-row-gap-4{row-gap:2rem!important}.is-row-gap-4\.5{row-gap:2.25rem!important}.is-row-gap-5{row-gap:2.5rem!important}.is-row-gap-5\.5{row-gap:2.75rem!important}.is-row-gap-6{row-gap:3rem!important}.is-row-gap-6\.5{row-gap:3.25rem!important}.is-row-gap-7{row-gap:3.5rem!important}.is-row-gap-7\.5{row-gap:3.75rem!important}.is-row-gap-8{row-gap:4rem!important}.is-clipped{overflow:hidden!important}.is-overflow-auto{overflow:auto!important}.is-overflow-x-auto{overflow-x:auto!important}.is-overflow-y-auto{overflow-y:auto!important}.is-overflow-clip{overflow:clip!important}.is-overflow-x-clip{overflow-x:clip!important}.is-overflow-y-clip{overflow-y:clip!important}.is-overflow-hidden{overflow:hidden!important}.is-overflow-x-hidden{overflow-x:hidden!important}.is-overflow-y-hidden{overflow-y:hidden!important}.is-overflow-scroll{overflow:scroll!important}.is-overflow-x-scroll{overflow-x:scroll!important}.is-overflow-y-scroll{overflow-y:scroll!important}.is-overflow-visible{overflow:visible!important}.is-overflow-x-visible{overflow-x:visible!important}.is-overflow-y-visible{overflow-y:visible!important}.is-relative{position:relative!important}.is-position-absolute{position:absolute!important}.is-position-fixed{position:fixed!important}.is-position-relative{position:relative!important}.is-position-static{position:static!important}.is-position-sticky{position:sticky!important}.marginless{margin:0!important}.paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px)and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px)and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px)and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px)and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px)and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px)and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px)and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px)and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px)and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px)and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px)and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px)and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.has-text-weight-extrabold{font-weight:800!important}.is-family-primary,.is-family-secondary,.is-family-sans-serif{font-family:Inter,SF Pro,Segoe UI,Roboto,Oxygen,Ubuntu,Helvetica Neue,Helvetica,Arial,sans-serif!important}.is-family-monospace,.is-family-code{font-family:Inconsolata,Hack,SF Mono,Roboto Mono,Source Code Pro,Ubuntu Mono,monospace!important}.is-display-none,.is-hidden{display:none!important}.is-display-block,.is-block{display:block!important}@media screen and (max-width:768px){.is-display-block-mobile,.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-display-block-tablet,.is-block-tablet{display:block!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-display-block-tablet-only,.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-display-block-touch,.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-display-block-desktop,.is-block-desktop{display:block!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-display-block-desktop-only,.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-display-block-widescreen,.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-display-block-widescreen-only,.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-display-block-fullhd,.is-block-fullhd{display:block!important}}.is-display-flex,.is-flex{display:flex!important}@media screen and (max-width:768px){.is-display-flex-mobile,.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-display-flex-tablet,.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-display-flex-tablet-only,.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-display-flex-touch,.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-display-flex-desktop,.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-display-flex-desktop-only,.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-display-flex-widescreen,.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-display-flex-widescreen-only,.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-display-flex-fullhd,.is-flex-fullhd{display:flex!important}}.is-display-inline,.is-inline{display:inline!important}@media screen and (max-width:768px){.is-display-inline-mobile,.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-display-inline-tablet,.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-display-inline-tablet-only,.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-display-inline-touch,.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-display-inline-desktop,.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-display-inline-desktop-only,.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-display-inline-widescreen,.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-display-inline-widescreen-only,.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-display-inline-fullhd,.is-inline-fullhd{display:inline!important}}.is-display-inline-block,.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-display-inline-block-mobile,.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-display-inline-block-tablet,.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-display-inline-block-tablet-only,.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-display-inline-block-touch,.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-display-inline-block-desktop,.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-display-inline-block-desktop-only,.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-display-inline-block-widescreen,.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-display-inline-block-widescreen-only,.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-display-inline-block-fullhd,.is-inline-block-fullhd{display:inline-block!important}}.is-display-inline-flex,.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-display-inline-flex-mobile,.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-display-inline-flex-tablet,.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-display-inline-flex-tablet-only,.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-display-inline-flex-touch,.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-display-inline-flex-desktop,.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-display-inline-flex-desktop-only,.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-display-inline-flex-widescreen,.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-display-inline-flex-widescreen-only,.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-display-inline-flex-fullhd,.is-inline-flex-fullhd{display:inline-flex!important}}.is-display-grid,.is-grid{display:grid!important}@media screen and (max-width:768px){.is-display-grid-mobile,.is-grid-mobile{display:grid!important}}@media screen and (min-width:769px),print{.is-display-grid-tablet,.is-grid-tablet{display:grid!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-display-grid-tablet-only,.is-grid-tablet-only{display:grid!important}}@media screen and (max-width:1023px){.is-display-grid-touch,.is-grid-touch{display:grid!important}}@media screen and (min-width:1024px){.is-display-grid-desktop,.is-grid-desktop{display:grid!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-display-grid-desktop-only,.is-grid-desktop-only{display:grid!important}}@media screen and (min-width:1216px){.is-display-grid-widescreen,.is-grid-widescreen{display:grid!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-display-grid-widescreen-only,.is-grid-widescreen-only{display:grid!important}}@media screen and (min-width:1408px){.is-display-grid-fullhd,.is-grid-fullhd{display:grid!important}}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-display-none-mobile,.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-display-none-tablet,.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-display-none-tablet-only,.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-display-none-touch,.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-display-none-desktop,.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-display-none-desktop-only,.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-display-none-widescreen,.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-display-none-widescreen-only,.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-display-none-fullhd,.is-hidden-fullhd{display:none!important}}.is-visibility-hidden,.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-visibility-hidden-mobile,.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-visibility-hidden-tablet,.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px)and (max-width:1023px){.is-visibility-hidden-tablet-only,.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-visibility-hidden-touch,.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-visibility-hidden-desktop,.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px)and (max-width:1215px){.is-visibility-hidden-desktop-only,.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-visibility-hidden-widescreen,.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px)and (max-width:1407px){.is-visibility-hidden-widescreen-only,.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-visibility-hidden-fullhd,.is-invisible-fullhd{visibility:hidden!important}}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-checkradio[type=checkbox],.is-checkradio[type=radio]{outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;position:absolute;opacity:0}.is-checkradio[type=checkbox]+label,.is-checkradio[type=radio]+label{position:relative;display:initial;cursor:pointer;vertical-align:middle;margin:.5em;padding:.2rem .5rem .2rem 0;border-radius:4px}.is-checkradio[type=checkbox]+label:first-of-type,.is-checkradio[type=radio]+label:first-of-type{margin-left:0}.is-checkradio[type=checkbox]+label:hover:before,.is-checkradio[type=radio]+label:hover:before{-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:hover-color;animation-name:hover-color}.is-checkradio[type=checkbox]+label:before,.is-checkradio[type=radio]+label:before{position:absolute;left:0;top:0;content:"";border:.1rem solid #dbdbdb}.is-checkradio[type=checkbox]+label:after,.is-checkradio[type=radio]+label:after{position:absolute;display:none;content:"";top:0}.is-checkradio[type=checkbox].is-rtl+label,.is-checkradio[type=radio].is-rtl+label{margin-right:0;margin-left:.5rem}.is-checkradio[type=checkbox].is-rtl+label:before,.is-checkradio[type=radio].is-rtl+label:before{left:auto;right:0}.is-checkradio[type=checkbox]:focus+label:before,.is-checkradio[type=radio]:focus+label:before{outline:1px dotted #b5b5b5}.is-checkradio[type=checkbox]:hover:not([disabled])+label:before,.is-checkradio[type=radio]:hover:not([disabled])+label:before{border-color:#00d1b2!important}.is-checkradio[type=checkbox]:checked+label:before,.is-checkradio[type=radio]:checked+label:before{border:.1rem solid #dbdbdb}.is-checkradio[type=checkbox]:checked[disabled],.is-checkradio[type=radio]:checked[disabled]{cursor:not-allowed}.is-checkradio[type=checkbox]:checked[disabled]+label,.is-checkradio[type=radio]:checked[disabled]+label{opacity:.5}.is-checkradio[type=checkbox]:checked+label:before,.is-checkradio[type=radio]:checked+label:before{-webkit-animation-name:none;animation-name:none}.is-checkradio[type=checkbox]:checked+label:after,.is-checkradio[type=radio]:checked+label:after{display:inline-block}.is-checkradio[type=checkbox][disabled],.is-checkradio[type=radio][disabled]{cursor:not-allowed}.is-checkradio[type=checkbox][disabled]+label,.is-checkradio[type=radio][disabled]+label{opacity:.5;cursor:not-allowed}.is-checkradio[type=checkbox][disabled]+label:after,.is-checkradio[type=checkbox][disabled]+label:before,.is-checkradio[type=checkbox][disabled]+label:hover,.is-checkradio[type=radio][disabled]+label:after,.is-checkradio[type=radio][disabled]+label:before,.is-checkradio[type=radio][disabled]+label:hover{cursor:not-allowed}.is-checkradio[type=checkbox][disabled]:hover,.is-checkradio[type=radio][disabled]:hover{cursor:not-allowed}.is-checkradio[type=checkbox][disabled]:hover:before,.is-checkradio[type=radio][disabled]:hover:before{-webkit-animation-name:none;animation-name:none}.is-checkradio[type=checkbox][disabled]:before,.is-checkradio[type=radio][disabled]:before{cursor:not-allowed}.is-checkradio[type=checkbox][disabled]:after,.is-checkradio[type=radio][disabled]:after{cursor:not-allowed}.is-checkradio[type=checkbox].has-no-border+label:before,.is-checkradio[type=radio].has-no-border+label:before{border:none!important}.is-checkradio[type=checkbox].is-block,.is-checkradio[type=radio].is-block{display:none!important}.is-checkradio[type=checkbox].is-block+label,.is-checkradio[type=radio].is-block+label{width:100%!important;background:#f5f5f5;color:#000000b3;padding-right:.75em}.is-checkradio[type=checkbox].is-block:hover:not([disabled])+label,.is-checkradio[type=radio].is-block:hover:not([disabled])+label{background:#e8e8e8}.is-checkradio[type=checkbox]+label:before{border-radius:4px}.is-checkradio[type=checkbox]+label:after{box-sizing:border-box;transform:translateY(0) rotate(45deg);border-width:.1rem;border-style:solid;border-color:#00d1b2;border-top:0;border-left:0}.is-checkradio[type=checkbox].is-circle+label:before{border-radius:50%}.is-checkradio[type=checkbox]+label{font-size:1rem;padding-left:2rem}.is-checkradio[type=checkbox]+label:before{width:1.5rem;height:1.5rem}.is-checkradio[type=checkbox]+label:after{width:.375rem;height:.6rem;top:.405rem;left:.6rem}.is-checkradio[type=checkbox].is-block+label:before{width:1.25rem;height:1.25rem;left:.175rem;top:.175rem}.is-checkradio[type=checkbox].is-block+label:after{top:.325rem;left:.65rem}.is-checkradio[type=checkbox].is-rtl+label{padding-left:0;padding-right:2rem}.is-checkradio[type=checkbox].is-rtl+label:after{left:auto;right:.6rem}.is-checkradio[type=checkbox].is-small+label{font-size:.75rem;padding-left:1.5rem}.is-checkradio[type=checkbox].is-small+label:before{width:1.125rem;height:1.125rem}.is-checkradio[type=checkbox].is-small+label:after{width:.28125rem;height:.45rem;top:.30375rem;left:.45rem}.is-checkradio[type=checkbox].is-small.is-block+label:before{width:.9375rem;height:.9375rem;left:.175rem;top:.175rem}.is-checkradio[type=checkbox].is-small.is-block+label:after{top:.29375rem;left:.5375rem}.is-checkradio[type=checkbox].is-small.is-rtl+label{padding-left:0;padding-right:1.5rem}.is-checkradio[type=checkbox].is-small.is-rtl+label:after{left:auto;right:.45rem}.is-checkradio[type=checkbox].is-medium+label{font-size:1.25rem;padding-left:2.5rem}.is-checkradio[type=checkbox].is-medium+label:before{width:1.875rem;height:1.875rem}.is-checkradio[type=checkbox].is-medium+label:after{width:.46875rem;height:.75rem;top:.50625rem;left:.75rem}.is-checkradio[type=checkbox].is-medium.is-block+label:before{width:1.5625rem;height:1.5625rem;left:.175rem;top:.175rem}.is-checkradio[type=checkbox].is-medium.is-block+label:after{top:.35625rem;left:.7625rem}.is-checkradio[type=checkbox].is-medium.is-rtl+label{padding-left:0;padding-right:2.5rem}.is-checkradio[type=checkbox].is-medium.is-rtl+label:after{left:auto;right:.75rem}.is-checkradio[type=checkbox].is-large+label{font-size:1.5rem;padding-left:3rem}.is-checkradio[type=checkbox].is-large+label:before{width:2.25rem;height:2.25rem}.is-checkradio[type=checkbox].is-large+label:after{width:.5625rem;height:.9rem;top:.6075rem;left:.9rem}.is-checkradio[type=checkbox].is-large.is-block+label:before{width:1.875rem;height:1.875rem;left:.175rem;top:.175rem}.is-checkradio[type=checkbox].is-large.is-block+label:after{top:.3875rem;left:.875rem}.is-checkradio[type=checkbox].is-large.is-rtl+label{padding-left:0;padding-right:3rem}.is-checkradio[type=checkbox].is-large.is-rtl+label:after{left:auto;right:.9rem}.is-checkradio[type=checkbox].is-white.has-background-color+label:before{border-color:transparent!important;background-color:#fff!important}.is-checkradio[type=checkbox].is-white:hover:not([disabled])+label:before{border-color:#fff!important}.is-checkradio[type=checkbox].is-white:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-white:checked.has-background-color+label:before{border-color:transparent!important;background-color:#fff!important}.is-checkradio[type=checkbox].is-white:checked.has-background-color+label:after{border-color:#0a0a0a!important;background-color:#fff!important}.is-checkradio[type=checkbox].is-white.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-white.is-block:hover:not([disabled])+label:before{border-color:#fff!important}.is-checkradio[type=checkbox].is-white.is-block:checked+label{color:#0a0a0a;border-color:#fff!important;background:#fff}.is-checkradio[type=checkbox].is-white.is-block:checked+label:after{border-color:#0a0a0a!important}.is-checkradio[type=checkbox].is-white.is-block:checked:hover:not([disabled])+label{background:#f2f2f2}.is-checkradio[type=checkbox].is-white.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-white.is-block:checked:hover:not([disabled])+label:before{border-color:#000!important}.is-checkradio[type=checkbox].is-black.has-background-color+label:before{border-color:transparent!important;background-color:#0a0a0a!important}.is-checkradio[type=checkbox].is-black:hover:not([disabled])+label:before{border-color:#0a0a0a!important}.is-checkradio[type=checkbox].is-black:checked+label:after{border-color:#0a0a0a!important}.is-checkradio[type=checkbox].is-black:checked.has-background-color+label:before{border-color:transparent!important;background-color:#0a0a0a!important}.is-checkradio[type=checkbox].is-black:checked.has-background-color+label:after{border-color:#fff!important;background-color:#0a0a0a!important}.is-checkradio[type=checkbox].is-black.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-black.is-block:hover:not([disabled])+label:before{border-color:#0a0a0a!important}.is-checkradio[type=checkbox].is-black.is-block:checked+label{color:#fff;border-color:#0a0a0a!important;background:#0a0a0a}.is-checkradio[type=checkbox].is-black.is-block:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-black.is-block:checked:hover:not([disabled])+label{background:#000}.is-checkradio[type=checkbox].is-black.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-black.is-block:checked:hover:not([disabled])+label:before{border-color:#f2f2f2!important}.is-checkradio[type=checkbox].is-light.has-background-color+label:before{border-color:transparent!important;background-color:#f5f5f5!important}.is-checkradio[type=checkbox].is-light:hover:not([disabled])+label:before{border-color:#f5f5f5!important}.is-checkradio[type=checkbox].is-light:checked+label:after{border-color:#f5f5f5!important}.is-checkradio[type=checkbox].is-light:checked.has-background-color+label:before{border-color:transparent!important;background-color:#f5f5f5!important}.is-checkradio[type=checkbox].is-light:checked.has-background-color+label:after{border-color:#000000b3!important;background-color:#f5f5f5!important}.is-checkradio[type=checkbox].is-light.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-light.is-block:hover:not([disabled])+label:before{border-color:#f5f5f5!important}.is-checkradio[type=checkbox].is-light.is-block:checked+label{color:#000000b3;border-color:#f5f5f5!important;background:#f5f5f5}.is-checkradio[type=checkbox].is-light.is-block:checked+label:after{border-color:#000000b3!important}.is-checkradio[type=checkbox].is-light.is-block:checked:hover:not([disabled])+label{background:#e8e8e8}.is-checkradio[type=checkbox].is-light.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-light.is-block:checked:hover:not([disabled])+label:before{border-color:#000000b3!important}.is-checkradio[type=checkbox].is-dark.has-background-color+label:before{border-color:transparent!important;background-color:#363636!important}.is-checkradio[type=checkbox].is-dark:hover:not([disabled])+label:before{border-color:#363636!important}.is-checkradio[type=checkbox].is-dark:checked+label:after{border-color:#363636!important}.is-checkradio[type=checkbox].is-dark:checked.has-background-color+label:before{border-color:transparent!important;background-color:#363636!important}.is-checkradio[type=checkbox].is-dark:checked.has-background-color+label:after{border-color:#fff!important;background-color:#363636!important}.is-checkradio[type=checkbox].is-dark.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-dark.is-block:hover:not([disabled])+label:before{border-color:#363636!important}.is-checkradio[type=checkbox].is-dark.is-block:checked+label{color:#fff;border-color:#363636!important;background:#363636}.is-checkradio[type=checkbox].is-dark.is-block:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-dark.is-block:checked:hover:not([disabled])+label{background:#292929}.is-checkradio[type=checkbox].is-dark.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-dark.is-block:checked:hover:not([disabled])+label:before{border-color:#f2f2f2!important}.is-checkradio[type=checkbox].is-primary.has-background-color+label:before{border-color:transparent!important;background-color:#00d1b2!important}.is-checkradio[type=checkbox].is-primary:hover:not([disabled])+label:before{border-color:#00d1b2!important}.is-checkradio[type=checkbox].is-primary:checked+label:after{border-color:#00d1b2!important}.is-checkradio[type=checkbox].is-primary:checked.has-background-color+label:before{border-color:transparent!important;background-color:#00d1b2!important}.is-checkradio[type=checkbox].is-primary:checked.has-background-color+label:after{border-color:#fff!important;background-color:#00d1b2!important}.is-checkradio[type=checkbox].is-primary.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-primary.is-block:hover:not([disabled])+label:before{border-color:#00d1b2!important}.is-checkradio[type=checkbox].is-primary.is-block:checked+label{color:#fff;border-color:#00d1b2!important;background:#00d1b2}.is-checkradio[type=checkbox].is-primary.is-block:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-primary.is-block:checked:hover:not([disabled])+label{background:#00b89c}.is-checkradio[type=checkbox].is-primary.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-primary.is-block:checked:hover:not([disabled])+label:before{border-color:#f2f2f2!important}.is-checkradio[type=checkbox].is-link.has-background-color+label:before{border-color:transparent!important;background-color:#485fc7!important}.is-checkradio[type=checkbox].is-link:hover:not([disabled])+label:before{border-color:#485fc7!important}.is-checkradio[type=checkbox].is-link:checked+label:after{border-color:#485fc7!important}.is-checkradio[type=checkbox].is-link:checked.has-background-color+label:before{border-color:transparent!important;background-color:#485fc7!important}.is-checkradio[type=checkbox].is-link:checked.has-background-color+label:after{border-color:#fff!important;background-color:#485fc7!important}.is-checkradio[type=checkbox].is-link.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-link.is-block:hover:not([disabled])+label:before{border-color:#485fc7!important}.is-checkradio[type=checkbox].is-link.is-block:checked+label{color:#fff;border-color:#485fc7!important;background:#485fc7}.is-checkradio[type=checkbox].is-link.is-block:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-link.is-block:checked:hover:not([disabled])+label{background:#3a51bb}.is-checkradio[type=checkbox].is-link.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-link.is-block:checked:hover:not([disabled])+label:before{border-color:#f2f2f2!important}.is-checkradio[type=checkbox].is-info.has-background-color+label:before{border-color:transparent!important;background-color:#3e8ed0!important}.is-checkradio[type=checkbox].is-info:hover:not([disabled])+label:before{border-color:#3e8ed0!important}.is-checkradio[type=checkbox].is-info:checked+label:after{border-color:#3e8ed0!important}.is-checkradio[type=checkbox].is-info:checked.has-background-color+label:before{border-color:transparent!important;background-color:#3e8ed0!important}.is-checkradio[type=checkbox].is-info:checked.has-background-color+label:after{border-color:#fff!important;background-color:#3e8ed0!important}.is-checkradio[type=checkbox].is-info.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-info.is-block:hover:not([disabled])+label:before{border-color:#3e8ed0!important}.is-checkradio[type=checkbox].is-info.is-block:checked+label{color:#fff;border-color:#3e8ed0!important;background:#3e8ed0}.is-checkradio[type=checkbox].is-info.is-block:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-info.is-block:checked:hover:not([disabled])+label{background:#3082c5}.is-checkradio[type=checkbox].is-info.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-info.is-block:checked:hover:not([disabled])+label:before{border-color:#f2f2f2!important}.is-checkradio[type=checkbox].is-success.has-background-color+label:before{border-color:transparent!important;background-color:#48c78e!important}.is-checkradio[type=checkbox].is-success:hover:not([disabled])+label:before{border-color:#48c78e!important}.is-checkradio[type=checkbox].is-success:checked+label:after{border-color:#48c78e!important}.is-checkradio[type=checkbox].is-success:checked.has-background-color+label:before{border-color:transparent!important;background-color:#48c78e!important}.is-checkradio[type=checkbox].is-success:checked.has-background-color+label:after{border-color:#fff!important;background-color:#48c78e!important}.is-checkradio[type=checkbox].is-success.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-success.is-block:hover:not([disabled])+label:before{border-color:#48c78e!important}.is-checkradio[type=checkbox].is-success.is-block:checked+label{color:#fff;border-color:#48c78e!important;background:#48c78e}.is-checkradio[type=checkbox].is-success.is-block:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-success.is-block:checked:hover:not([disabled])+label{background:#3abb81}.is-checkradio[type=checkbox].is-success.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-success.is-block:checked:hover:not([disabled])+label:before{border-color:#f2f2f2!important}.is-checkradio[type=checkbox].is-warning.has-background-color+label:before{border-color:transparent!important;background-color:#ffe08a!important}.is-checkradio[type=checkbox].is-warning:hover:not([disabled])+label:before{border-color:#ffe08a!important}.is-checkradio[type=checkbox].is-warning:checked+label:after{border-color:#ffe08a!important}.is-checkradio[type=checkbox].is-warning:checked.has-background-color+label:before{border-color:transparent!important;background-color:#ffe08a!important}.is-checkradio[type=checkbox].is-warning:checked.has-background-color+label:after{border-color:#000000b3!important;background-color:#ffe08a!important}.is-checkradio[type=checkbox].is-warning.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-warning.is-block:hover:not([disabled])+label:before{border-color:#ffe08a!important}.is-checkradio[type=checkbox].is-warning.is-block:checked+label{color:#000000b3;border-color:#ffe08a!important;background:#ffe08a}.is-checkradio[type=checkbox].is-warning.is-block:checked+label:after{border-color:#000000b3!important}.is-checkradio[type=checkbox].is-warning.is-block:checked:hover:not([disabled])+label{background:#ffd970}.is-checkradio[type=checkbox].is-warning.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-warning.is-block:checked:hover:not([disabled])+label:before{border-color:#000000b3!important}.is-checkradio[type=checkbox].is-danger.has-background-color+label:before{border-color:transparent!important;background-color:#f14668!important}.is-checkradio[type=checkbox].is-danger:hover:not([disabled])+label:before{border-color:#f14668!important}.is-checkradio[type=checkbox].is-danger:checked+label:after{border-color:#f14668!important}.is-checkradio[type=checkbox].is-danger:checked.has-background-color+label:before{border-color:transparent!important;background-color:#f14668!important}.is-checkradio[type=checkbox].is-danger:checked.has-background-color+label:after{border-color:#fff!important;background-color:#f14668!important}.is-checkradio[type=checkbox].is-danger.is-block:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-danger.is-block:hover:not([disabled])+label:before{border-color:#f14668!important}.is-checkradio[type=checkbox].is-danger.is-block:checked+label{color:#fff;border-color:#f14668!important;background:#f14668}.is-checkradio[type=checkbox].is-danger.is-block:checked+label:after{border-color:#fff!important}.is-checkradio[type=checkbox].is-danger.is-block:checked:hover:not([disabled])+label{background:#ef2e55}.is-checkradio[type=checkbox].is-danger.is-block:checked:hover:not([disabled])+label:after,.is-checkradio[type=checkbox].is-danger.is-block:checked:hover:not([disabled])+label:before{border-color:#f2f2f2!important}.is-checkradio[type=checkbox]:indeterminate+label:after{display:inline-block;transform:rotate(90deg);border-bottom:none}.is-checkradio[type=checkbox]:indeterminate.is-white+label:after{border-color:#fff}.is-checkradio[type=checkbox]:indeterminate.is-black+label:after{border-color:#0a0a0a}.is-checkradio[type=checkbox]:indeterminate.is-light+label:after{border-color:#f5f5f5}.is-checkradio[type=checkbox]:indeterminate.is-dark+label:after{border-color:#363636}.is-checkradio[type=checkbox]:indeterminate.is-primary+label:after{border-color:#00d1b2}.is-checkradio[type=checkbox]:indeterminate.is-link+label:after{border-color:#485fc7}.is-checkradio[type=checkbox]:indeterminate.is-info+label:after{border-color:#3e8ed0}.is-checkradio[type=checkbox]:indeterminate.is-success+label:after{border-color:#48c78e}.is-checkradio[type=checkbox]:indeterminate.is-warning+label:after{border-color:#ffe08a}.is-checkradio[type=checkbox]:indeterminate.is-danger+label:after{border-color:#f14668}.is-checkradio[type=radio]+label:before{border-radius:50%}.is-checkradio[type=radio]+label:after{border-radius:50%;background:#00d1b2;left:0;transform:scale(.5)}.is-checkradio[type=radio]:checked.has-background-color+label:before{border-color:#4a4a4a!important;background-color:#4a4a4a!important}.is-checkradio[type=radio]:checked.has-background-color+label:after{border-color:#4a4a4a!important;background-color:#4a4a4a!important}.is-checkradio[type=radio].is-rtl+label{padding-left:0}.is-checkradio[type=radio].is-rtl+label:after{left:auto;right:0}.is-checkradio[type=radio]+label{font-size:1rem;line-height:1.5rem;padding-left:2rem}.is-checkradio[type=radio]+label:after,.is-checkradio[type=radio]+label:before{width:1.5rem;height:1.5rem}.is-checkradio[type=radio].is-rtl+label{padding-right:2rem}.is-checkradio[type=radio].is-small+label{font-size:.75rem;line-height:1.125rem;padding-left:1.5rem}.is-checkradio[type=radio].is-small+label:after,.is-checkradio[type=radio].is-small+label:before{width:1.125rem;height:1.125rem}.is-checkradio[type=radio].is-small.is-rtl+label{padding-right:1.5rem}.is-checkradio[type=radio].is-medium+label{font-size:1.25rem;line-height:1.875rem;padding-left:2.5rem}.is-checkradio[type=radio].is-medium+label:after,.is-checkradio[type=radio].is-medium+label:before{width:1.875rem;height:1.875rem}.is-checkradio[type=radio].is-medium.is-rtl+label{padding-right:2.5rem}.is-checkradio[type=radio].is-large+label{font-size:1.5rem;line-height:2.25rem;padding-left:3rem}.is-checkradio[type=radio].is-large+label:after,.is-checkradio[type=radio].is-large+label:before{width:2.25rem;height:2.25rem}.is-checkradio[type=radio].is-large.is-rtl+label{padding-right:3rem}.is-checkradio[type=radio].is-white.has-background-color+label:before{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-white:hover:not([disabled])+label:before{border-color:#fff!important}.is-checkradio[type=radio].is-white:checked+label:after{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-white:checked.has-background-color+label:before{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-white:checked.has-background-color+label:after{border-color:#0a0a0a!important;background-color:#0a0a0a!important}.is-checkradio[type=radio].is-black.has-background-color+label:before{border-color:#0a0a0a!important;background-color:#0a0a0a!important}.is-checkradio[type=radio].is-black:hover:not([disabled])+label:before{border-color:#0a0a0a!important}.is-checkradio[type=radio].is-black:checked+label:after{border-color:#0a0a0a!important;background-color:#0a0a0a!important}.is-checkradio[type=radio].is-black:checked.has-background-color+label:before{border-color:#0a0a0a!important;background-color:#0a0a0a!important}.is-checkradio[type=radio].is-black:checked.has-background-color+label:after{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-light.has-background-color+label:before{border-color:#f5f5f5!important;background-color:#f5f5f5!important}.is-checkradio[type=radio].is-light:hover:not([disabled])+label:before{border-color:#f5f5f5!important}.is-checkradio[type=radio].is-light:checked+label:after{border-color:#f5f5f5!important;background-color:#f5f5f5!important}.is-checkradio[type=radio].is-light:checked.has-background-color+label:before{border-color:#f5f5f5!important;background-color:#f5f5f5!important}.is-checkradio[type=radio].is-light:checked.has-background-color+label:after{border-color:#000000b3!important;background-color:#000000b3!important}.is-checkradio[type=radio].is-dark.has-background-color+label:before{border-color:#363636!important;background-color:#363636!important}.is-checkradio[type=radio].is-dark:hover:not([disabled])+label:before{border-color:#363636!important}.is-checkradio[type=radio].is-dark:checked+label:after{border-color:#363636!important;background-color:#363636!important}.is-checkradio[type=radio].is-dark:checked.has-background-color+label:before{border-color:#363636!important;background-color:#363636!important}.is-checkradio[type=radio].is-dark:checked.has-background-color+label:after{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-primary.has-background-color+label:before{border-color:#00d1b2!important;background-color:#00d1b2!important}.is-checkradio[type=radio].is-primary:hover:not([disabled])+label:before{border-color:#00d1b2!important}.is-checkradio[type=radio].is-primary:checked+label:after{border-color:#00d1b2!important;background-color:#00d1b2!important}.is-checkradio[type=radio].is-primary:checked.has-background-color+label:before{border-color:#00d1b2!important;background-color:#00d1b2!important}.is-checkradio[type=radio].is-primary:checked.has-background-color+label:after{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-link.has-background-color+label:before{border-color:#485fc7!important;background-color:#485fc7!important}.is-checkradio[type=radio].is-link:hover:not([disabled])+label:before{border-color:#485fc7!important}.is-checkradio[type=radio].is-link:checked+label:after{border-color:#485fc7!important;background-color:#485fc7!important}.is-checkradio[type=radio].is-link:checked.has-background-color+label:before{border-color:#485fc7!important;background-color:#485fc7!important}.is-checkradio[type=radio].is-link:checked.has-background-color+label:after{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-info.has-background-color+label:before{border-color:#3e8ed0!important;background-color:#3e8ed0!important}.is-checkradio[type=radio].is-info:hover:not([disabled])+label:before{border-color:#3e8ed0!important}.is-checkradio[type=radio].is-info:checked+label:after{border-color:#3e8ed0!important;background-color:#3e8ed0!important}.is-checkradio[type=radio].is-info:checked.has-background-color+label:before{border-color:#3e8ed0!important;background-color:#3e8ed0!important}.is-checkradio[type=radio].is-info:checked.has-background-color+label:after{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-success.has-background-color+label:before{border-color:#48c78e!important;background-color:#48c78e!important}.is-checkradio[type=radio].is-success:hover:not([disabled])+label:before{border-color:#48c78e!important}.is-checkradio[type=radio].is-success:checked+label:after{border-color:#48c78e!important;background-color:#48c78e!important}.is-checkradio[type=radio].is-success:checked.has-background-color+label:before{border-color:#48c78e!important;background-color:#48c78e!important}.is-checkradio[type=radio].is-success:checked.has-background-color+label:after{border-color:#fff!important;background-color:#fff!important}.is-checkradio[type=radio].is-warning.has-background-color+label:before{border-color:#ffe08a!important;background-color:#ffe08a!important}.is-checkradio[type=radio].is-warning:hover:not([disabled])+label:before{border-color:#ffe08a!important}.is-checkradio[type=radio].is-warning:checked+label:after{border-color:#ffe08a!important;background-color:#ffe08a!important}.is-checkradio[type=radio].is-warning:checked.has-background-color+label:before{border-color:#ffe08a!important;background-color:#ffe08a!important}.is-checkradio[type=radio].is-warning:checked.has-background-color+label:after{border-color:#000000b3!important;background-color:#000000b3!important}.is-checkradio[type=radio].is-danger.has-background-color+label:before{border-color:#f14668!important;background-color:#f14668!important}.is-checkradio[type=radio].is-danger:hover:not([disabled])+label:before{border-color:#f14668!important}.is-checkradio[type=radio].is-danger:checked+label:after{border-color:#f14668!important;background-color:#f14668!important}.is-checkradio[type=radio].is-danger:checked.has-background-color+label:before{border-color:#f14668!important;background-color:#f14668!important}.is-checkradio[type=radio].is-danger:checked.has-background-color+label:after{border-color:#fff!important;background-color:#fff!important}:root{--bulma-link-h: 229deg;--bulma-link-s: 53%;--bulma-link-l: 53%;--bulma-link-on-scheme-l: 53%;--bulma-info-h: 204deg;--bulma-info-s: 86%;--bulma-info-l: 53%;--bulma-success-h: 153deg;--bulma-warning-h: 44deg;--bulma-warning-l: 77%;--bulma-danger-s: 86%;--bulma-danger-l: 61%;--bulma-scheme-h: 0;--bulma-scheme-s: 0%;--bulma-dark-l: 21%;--bulma-family-primary: BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;--bulma-family-secondary: BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;--bulma-family-code: monospace;--bulma-body-color: hsl(0,0%,29%);--bulma-code-family: monospace;--bulma-title-weight: 600}:root .title{color:#4a4a4a}:root.dark .title{color:#b5b5b5}:root.dark h1.title{color:#4a4a4a}*{scrollbar-width:thin}@media(prefers-color-scheme:dark){*{scrollbar-color:hsl(0,0%,29%) hsl(0,0%,14%)}}.notification.is-primary,.notification.is-link,.notification.is-info,.notification.is-success,.notification.is-danger{--bulma-notification-color-l: 100%}:root,footer,footer .submenu,.header,.modal-background,.modal-slot,.options-header{background-color:#f5f5f5}:root.dark,:root.dark footer,:root.dark footer .submenu,:root.dark .header,:root.dark .modal-background,:root.dark .modal-slot,:root.dark .options-header{background-color:#242424}:root.dark .about-debug{background-color:#121212}a.is-link:hover{color:#209cee}:root{--bulma-hover-background-l-delta: 5%}@media(prefers-color-scheme:dark){:root{--bulma-hover-background-l-delta: -3%}}a.tag:hover{text-decoration:underline}.buttons{gap:.5rem}#app{min-height:100vh}@supports (padding-top: env(safe-area-inset-top)){#app{padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-left)}}@supports (padding-top: constant(safe-area-inset-top)){#app{padding:constant(safe-area-inset-top) constant(safe-area-inset-right) constant(safe-area-inset-left)}}.main-section{padding:0}.header{padding-top:1rem;padding-bottom:1rem;width:100%}@supports (padding-top: env(safe-area-inset-top)){.header{--safe-area-inset-top: env(safe-area-inset-top);padding-top:calc(1rem + var(--safe-area-inset-top))}}@supports (padding-top: constant(safe-area-inset-top)){.header{--safe-area-inset-top: constant(safe-area-inset-top);padding-top:calc(1rem + var(--safe-area-inset-top))}}.toolbar button{background-color:#f5f5f5}:root.dark .toolbar button{background-color:#242424}.toolbar button.delete{background-color:#7a7a7a}.toolbar button.delete:before,.toolbar button.delete:after{background-color:#fff}.toolbar button.delete:hover,.toolbar button.delete:focus{background-color:#7a7a7a}:root.dark .toolbar button.delete:before,:root.dark .toolbar button.delete:after{background-color:#fff}:root.dark .toolbar button.delete:hover,:root.dark .toolbar button.delete:focus{background-color:#0a0a0a4d}@media(prefers-color-scheme:dark){:root.dark .toolbar button.delete:before,:root.dark .toolbar button.delete:after{background-color:#fff}}.modal-card{max-height:100vh}.menu-list a:hover,.menu-list button:hover,.menu-list .menu-item:hover{color:#3273dc}.menu-list a,.menu-list button,.menu-list .menu-item{background-color:#f5f5f5}:root.dark .menu-list a,:root.dark .menu-list button,:root.dark .menu-list .menu-item{background-color:#242424}.settings-menu{position:fixed;margin-left:-200px;width:200px}.modal-otp{z-index:2000}@media screen and (max-height:700px){.modal-with-footer{margin-bottom:9rem;max-height:none!important}}.otp:focus-visible{outline-offset:3px;outline:2px dotted hsl(0,0%,21%);border-radius:.75rem}.otp:focus:not(:focus-visible){outline:none}.group-item,.list-item{border-bottom:1px solid hsl(0,0%,86%);padding:.75rem 0}:root.dark .group-item,:root.dark .list-item{border-color:#363636;color:#f5f5f5}:root.dark .list-item{color:#dbdbdb}.group-item:first-of-type{margin-top:2.5rem}.group-item span{display:block}.group-item .tags:not(:last-child){margin-bottom:inherit}#groupSwitch button.is-fullwidth{white-space:wrap!important}#groupChips button{max-width:120px}#groupChips .chip-label{overflow:hidden;text-overflow:ellipsis}.search{margin-bottom:0!important}.manage-buttons{justify-content:center}.nav-links{padding-top:1.5rem}.nav-links p{margin-bottom:.25rem;padding-top:.25rem}.pull-down-header{background-color:#363636!important}img.qrcode{max-width:320px}@media screen and (max-height:500px){img.qrcode{max-height:50vh}}.tfa-grid{border-radius:6px;text-align:center;background-color:#fff;padding:.75rem 3rem;margin:.5rem}:root.dark .tfa-grid{background-color:#1a1a1a}.tfa-list{text-align:inherit;border-bottom:1px solid hsl(0,0%,86%);margin:0 1%;padding:.5rem;width:31.3%!important}:root.dark .tfa-list{background-color:#242424;border-bottom:1px solid hsl(0,0%,21%)}@media screen and (max-width:1217px){.tfa-list{width:48%!important}}@media screen and (max-width:769px){.tfa-list{border-radius:unset;text-align:inherit;margin:0;max-width:none;width:auto!important}}.tfa-container{align-items:center;display:flex;justify-content:left}.tfa-grid .tfa-container{flex-direction:column}.tfa-list .tfa-container{flex-direction:row;padding:0}.tfa-cell{display:flex}.tfa-grid .tfa-checkbox,.tfa-grid .tfa-dots,.tfa-grid .tfa-edit{align-items:center;padding:.5rem 0 0}.tfa-grid .tfa-checkbox{padding:0}.tfa-list .tfa-checkbox,.tfa-list .tfa-dots,.tfa-list .tfa-edit{align-items:center;padding:0}.tfa-list .tfa-dots{margin-left:1rem}.tfa-content{flex-grow:1;overflow:hidden;min-height:60px}.tfa-content:focus-visible{outline:1px solid hsl(0,0%,48%);border:none;outline-offset:7px;border-radius:3px}.tfa-content:focus:not(:focus-visible){outline:none}.is-edit-mode .tfa-list .tfa-content{margin-right:1rem}.tfa-dots,.is-draggable{cursor:grab}.tfa-grid .is-checkradio[type=checkbox]+label,.tfa-grid .is-checkradio[type=radio]+label{padding-left:0!important;margin-top:0!important;margin-bottom:0!important}.action-container{min-width:86px;text-align:right}.tfa-grid .action-container{text-align:center}.tfa-text{display:block}:root.dark .tfa-text{color:#fff}.tfa-container img{height:.75em;width:.75em;margin-right:.1em}.import-icon{height:1em;width:1em;margin-right:.2em;vertical-align:sub}.fullscreen-streamer{position:fixed;top:7%;left:0;width:100%;height:65%;padding:2%}.overlay{background:linear-gradient(to right,white 1px,transparent 1px) 0 0,linear-gradient(to right,white 1px,transparent 1px) 0 100%,linear-gradient(to left,white 1px,transparent 1px) 100% 0,linear-gradient(to left,white 1px,transparent 1px) 100% 100%,linear-gradient(to bottom,white 1px,transparent 1px) 0 0,linear-gradient(to bottom,white 1px,transparent 1px) 100% 0,linear-gradient(to top,white 1px,transparent 1px) 0 100%,linear-gradient(to top,white 1px,transparent 1px) 100% 100%;background-repeat:no-repeat;background-size:20px 20px}.fullscreen-alert{position:fixed;top:37.5vh;left:0;width:100%;padding:.75rem}.has-ellipsis{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.has-nowrap{white-space:nowrap}.has-no-background{background:none!important}.is-left-bordered-link,.is-left-bordered-warning,.is-left-bordered-danger{border:none;border-left-style:solid;border-left-width:3px;padding-left:1rem}.is-left-bordered-link{border-left-color:#3273dc}.is-left-bordered-warning{border-left-color:#ffe08a}.is-left-bordered-danger{border-left-color:#f14668}.add-icon-button{height:64px;width:64px;position:absolute;margin-left:-32px;z-index:40}.add-icon-button:focus svg,.add-icon-button:focus-visible svg,.add-icon-button:focus-within svg{border-color:transparent;border-radius:3px;outline-offset:3px;outline-style:solid;outline-width:2px;outline-color:#0a0a0a}.delete-icon-button{position:absolute;margin-left:37px}figure.no-icon{border:1px dashed hsl(0,0%,7%)}.file-input{cursor:pointer}:root.dark .add-icon-button,:root.dark .add-icon-button:hover{color:#121212}.dots{list-style:none;padding:0}.dots li{display:inline-block;margin:0 5px;width:4px;height:4px;border-radius:50%;background:#ff3860}.dots.condensed{line-height:.9}.dots.condensed li{margin:0 2px;width:3px;height:3px}.dots li[data-is-active]~li{background:#b5b5b5}:root.dark .dots li[data-is-active]~li{background:#121212}.dots li:nth-child(-n+9){background:#ffdd57}.dots li:nth-child(-n+6){background:#23d160}.dots.off li{background:#b5b5b5}:root.dark .dots.off li{background:#121212}:root.dark .input,:root.dark .select select,:root.dark .textarea{background-color:#363636;border-color:#4a4a4a;color:#fff}:root.dark .select select::placeholder,:root.dark .textarea::placeholder,:root.dark .input::placeholder{color:#7a7a7a}.select select[disabled],[disabled].textarea,[disabled].input,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input{border-color:#dbdbdb;background-color:#fff;opacity:.5}:root.dark .select select[disabled],:root.dark [disabled].textarea,:root.dark [disabled].input,:root.dark fieldset[disabled] .select select,:root.dark .select fieldset[disabled] select,:root.dark fieldset[disabled] .textarea,:root.dark fieldset[disabled] .input{background-color:#1a1a1a;border-color:#363636;box-shadow:none;color:#363636}:root.dark .select select[disabled]::placeholder,:root.dark [disabled].textarea::placeholder,:root.dark [disabled].input::placeholder,:root.dark fieldset[disabled] .select select::placeholder,:root.dark .select fieldset[disabled] select::placeholder,:root.dark fieldset[disabled] .textarea::placeholder,:root.dark fieldset[disabled] .input::placeholder{color:#363636}.button.has-line-height{height:inherit!important}.button.has-line-height span{display:inline-block;line-height:1rem}.button.is-multiline{min-height:2.25em;white-space:unset;height:auto;flex-direction:column}.button.is-multiline span{color:#7a7a7a}.button.is-link.is-multiline span{color:#dbdbdb}.button.is-dark.field-lock,.button.is-dark.field-unlock{color:#7a7a7a}.button.is-dark.field-unlock{border-color:#4a4a4a;border-left:none;border-width:var(--bulma-control-border-width);padding-top:calc(var(--bulma-button-padding-vertical) - var(--bulma-control-border-width));padding-bottom:calc(var(--bulma-button-padding-vertical) - var(--bulma-control-border-width))}.button.is-like-text{line-height:inherit!important;padding:0!important;margin:0!important;height:auto;text-decoration:none}.button.copy-text:hover,.button.copy-text:active,.button.copy-text:focus,.button.copy-text:focus-visible,.button.copy-text:focus-within,.button.is-like-text:hover,.button.is-like-text:active,.button.is-like-text:focus,.button.is-like-text:focus-visible,.button.is-like-text:focus-within{background:inherit;color:inherit}.button:focus-visible,.button.is-focused,.file[role=button]:focus-visible{border-color:transparent;outline-offset:3px;outline-style:solid;outline-width:2px}.button:focus:not(:focus-visible),.file[role=button]:focus:not(:focus-visible){outline:none}.button:focus:not(:active),.button.is-focused:not(:active),.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active),.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active),.button.is-dark:focus:not(:active),.button.is-dark.is-focused:not(:active),.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active),.button.is-text:focus:not(:active),.button.is-text.is-focused:not(:active),.button.is-ghost:focus:not(:active),.button.is-ghost.is-focused:not(:active),.button.is-primary:focus:not(:active),.button.is-primary.is-focused:not(:active),.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active),.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active),.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active),.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active),.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:none}.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636}.button.is-white:focus,.button.is-white:focus-visible,.button.is-white.is-focused{outline-color:#fff}.button.is-light:focus,.button.is-light:focus-visible,.button.is-light.is-focused{outline-color:#ededed}.button.is-dark:focus,.button.is-dark:focus-visible,.button.is-dark.is-focused,.file[role=button].is-dark:focus,.file[role=button].is-dark:focus-visible{outline-color:#363636}.button.is-black:focus,.button.is-black:focus-visible,.button.is-black.is-focused,.file[role=button].is-black:focus,.file[role=button].is-black:focus-visible{outline-color:#0a0a0a}.button.is-text:focus,.button.is-text:focus-visible,.button.is-text.is-focused{outline-color:#4a4a4a}.button.is-ghost:focus,.button.is-ghost:focus-visible,.button.is-ghost.is-focused{outline-color:#4a4a4a}.button.is-primary:focus,.button.is-primary:focus-visible,.button.is-primary.is-focused{outline-color:#00d1b2}.button.is-link:focus,.button.is-link:focus-visible,.button.is-link.is-focused{outline-color:#3273dc}.button.is-info:focus,.button.is-info:focus-visible,.button.is-info.is-focused{outline-color:#209cee}.button.is-success:focus,.button.is-success:focus-visible,.button.is-success.is-focused{outline-color:#48c78e}.button.is-warning:focus,.button.is-warning:focus-visible,.button.is-warning.is-focused{outline-color:#ffe08a}.button.is-danger:focus,.button.is-danger:focus-visible,.button.is-danger.is-focused{outline-color:#f14668}button.is-main{box-shadow:0 0 0 .125em hsla(var(--bulma-link-h),var(--bulma-link-s),var(--bulma-link-on-scheme-l),.25)}.button.has-normal-radius{border-radius:.375rem!important}.file[role=button]:focus-visible{border-radius:.375rem}.file[role=button].is-small:focus-visible{border-radius:.25rem}.tag-button:focus-visible{border-color:transparent;border-radius:3px;outline-width:1px;outline-style:solid;outline-offset:3px}.tag-button:focus:not(:focus-visible){outline:none}.tag-button-link:focus-visible{outline-color:#3273dc}.tag-button-danger:focus-visible{outline-color:#f14668}.clear-selection{vertical-align:text-bottom}.clear-selection:focus-visible{border-color:transparent;outline-offset:1px;outline:2px solid hsl(0,0%,29%)}.clear-selection:focus:not(:focus-visible){outline:none}a:focus-visible{outline-offset:2px;border-radius:3px;outline:1px dashed hsl(217,71%,53%)}a:focus:not(:focus-visible){outline:none}a.has-text-black-bis:focus,a.has-text-black-bis:focus-visible{outline-color:#121212}a.has-text-black-ter:focus,a.has-text-black-ter:focus-visible{outline-color:#242424}a.has-text-grey-darker:focus,a.has-text-grey-darker:focus-visible{outline-color:#363636}a.has-text-grey-dark:focus,a.has-text-grey-dark:focus-visible{outline-color:#4a4a4a}a.has-text-grey:focus,a.has-text-grey:focus-visible{outline-color:#7a7a7a}a.has-text-grey-light:focus,a.has-text-grey-light:focus-visible{outline-color:#b5b5b5}a.has-text-grey-lighter:focus,a.has-text-grey-lighter:focus-visible{outline-color:#dbdbdb}a.has-text-white-ter:focus,a.has-text-white-ter:focus-visible{outline-color:#f5f5f5}a.has-text-white-bis:focus,a.has-text-white-bis:focus-visible{outline-color:#fafafa}a.tag.is-dark.is-rounded:focus-visible{outline-offset:1px;outline:1px solid hsl(0,0%,48%)}a.tag.is-dark.is-rounded:focus:not(:focus-visible){outline:none}button.button.tag.is-white,.tfa-cell .tag.is-white{border-color:#dbdbdb}button.button.tag.is-white,.tfa-cell .tag.is-white{border-style:solid;border-width:1px}.tabs a:focus-visible{outline-offset:-4px}.tabs a:focus:not(:focus-visible){outline:none}.control.has-icons-right>span.icon:focus-visible,.control.has-icons-left>span.icon:focus-visible{outline:none;box-shadow:var(--bulma-focus-shadow-size) var(--bulma-focus-shadow-alpha)}.control.has-icons-right>span.icon:focus:not(:focus-visible),.control.has-icons-left>span.icon:focus:not(:focus-visible){outline:none}.is-checkradio[type=checkbox]+label:focus,.is-checkradio[type=checkbox]+label:focus-visible{outline:none;border:none}.is-checkradio[type=checkbox]+label:focus:before,.is-checkradio[type=checkbox]+label:focus-visible:before{outline-offset:2px;outline:1px solid hsl(0,0%,21%)}:root.dark .is-checkradio[type=checkbox]+label:focus:before,:root.dark .is-checkradio[type=checkbox]+label:focus-visible:before{outline:1px solid hsl(0,0%,71%)}.is-checkradio[type=checkbox]+label:before{border-color:#b5b5b5;border-width:1px!important;background-color:#fff}.tfa-checkbox .is-checkradio[type=checkbox]+label:before{border-color:#7a7a7a}:root.dark .is-checkradio[type=checkbox]+label:before{border-color:#7a7a7a;background:none}.is-checkradio[type=checkbox]:checked+label:before{border-color:#7a7a7a}:root.dark .is-checkradio[type=checkbox]:checked+label:before{border-color:#dbdbdb}.label{color:#7a7a7a}.select select:focus,.select select:focus-visible{outline:2px solid hsl(0,0%,29%);outline-offset:3px;box-shadow:none}:root.dark .select select:focus,:root.dark .select select:focus-visible{outline:2px solid hsl(0,0%,29%)}.is-underscored{border-bottom:1px solid hsl(0,0%,29%);height:.6rem;width:.6rem;display:inline-block;margin-right:5px}.is-underscored.is-dot{border:none;border-radius:50%;background-color:#48c78e}:root.dark .is-underscored.is-dot{background-color:#257953}.is-mid-width-field,.is-half-width-field{width:50%!important}.is-third-width-field{width:33%!important}.is-toggle.buttons,.is-toggle.buttons a.button{margin-bottom:0!important}.has-uppercased-button .is-toggle{text-transform:uppercase!important}:root.dark .control.has-icons-left .icon,:root.dark .control.has-icons-right .icon{color:inherit}:root.dark.is-search{border-color:#363636}.modal .field.is-grouped:last-child{justify-content:center}footer.main{padding:0 0 25px;z-index:30;position:relative}@supports (-webkit-touch-callout: none){@media(display-mode:standalone){footer.main{padding-bottom:env(safe-area-inset-bottom)}}}footer.main .field.is-grouped{justify-content:center}footer.menu{box-shadow:0 3px 10px 5px #0000000d}:root.dark footer.menu{box-shadow:0 3px 10px 5px #00000040}.footer-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;opacity:.03}footer .submenu{position:fixed;left:0;bottom:-16px;width:100%;box-shadow:0 3px 10px 5px #00000040;padding-bottom:70px}.notification{padding:.4rem 1.5rem}@supports (padding-top: env(safe-area-inset-top)){.notification-banner{--safe-area-inset-top: env(safe-area-inset-top);padding-top:calc(.4rem + var(--safe-area-inset-top))}}@supports (padding-top: constant(safe-area-inset-top)){.notification-banner{--safe-area-inset-top: constant(safe-area-inset-top);padding-top:calc(.4rem + var(--safe-area-inset-top))}}.notification .notification-content{text-align:center}.options-header{padding:0 1rem .5rem;z-index:1000}@supports (padding-top: env(safe-area-inset-top)){.options-header{padding-top:env(safe-area-inset-top)}}@supports (padding-top: constant(safe-area-inset-top)){.options-header{padding-top:constant(safe-area-inset-top)}}.file .tag{margin-left:.75rem}.icon-preview{height:24px;width:24px}.field.with-offset{padding-top:1.5rem}.field.is-grouped:last-child{padding-top:.75rem}.help-for-file{margin-top:-.5rem;margin-bottom:.75rem}.error-message>p{margin-bottom:.5rem}.preview{margin-top:20vh}.quick-uploader-wrapper{position:relative}.quick-uploader-background{content:"";position:absolute;left:0;top:0;width:100%;height:256px;opacity:.1;background-repeat:no-repeat;background-position:top left 50%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AEHFAMrfQhDEgAACgdJREFUeNrt3aFvW1cbB+DTTwEGlWYQYGBwow0YGg406i0LjDSToDnaH9ANTC2rDYuS/AW1UUgntWzMnhIQ6LGASs4kA4MCTyowiOQP7BuaOr/+dr3r2M8jXXZ07j3X17/mWm/P+2ixWCwSsJP+4xaAAAAEACAAAAEACABAAAACABAAgAAABAAgAAABAAgAQAAAAgAQAIAAADbAXpGTvX//Po1GI3f1M7IsS99++20p5767u0v9fn/j131xcZFms5mH5TOePn2a8jwvbsJFgdrt9iKl5PjMkef5oiyDweBBrDvLMs/K3xydTqfQ58IrAPgNABAAgAAABAAgAAABAAgAYHvslXHSWq2WGo3G1tzE29vbNJ1ON/oaq9VqsRVk6Y/qwru7u1LWk2VZyrJsa56h0WhUSgVkKQFwdHSU3rx5szUf3unpaer1eht9jc1mMw0Gg0Ln7Ha7qdPplLKedrudXr16tTXP0LNnz9JwOPQKAAgAQAAAAgAQAIAAAAQAIAAAAQCsbm/TL/Dg4KC0c4/H49LOfXh4mCaTSSnnvrq6SvV6fem458+fhzb7rFQqpd3HyWSSDg8PSzl3vV5PV1dXAuCfKKvWvGyTyaS0td/f34fGVavVVK1WN/o+3t/f7+wz5BUAEACAAAAEACAAAAEAAgAQAMBu2XMLHrbj4+PUbDaXjru7uwvvW3hxcREq8Cm8VTUCgNUDIFKOOxwOwwFwfn4eGtfpdASAVwBAAAACABAAgAAABAAgAAABAGwIhUD8Rb1eT3t7sUcjst1WpVJJtVrNjRUAPARXV1cpy7Kl47rdbmjT1jzPC29NjlcAQAAAAgAQAIAAAAQAIAAAAQAIAOB/Nr4SsMwW3bvq8PAwVArcbrdDn0+Z7cHr9Xppz1C0nFoA/I1ISSrFmkwmW/P57O3teYa8AgACABAAgAAAAeAWgAAABAAgAICdUEoh0Gg0St1ud2tu4mg02qqH4vvvvw+1B08phT7HLMtCHYxXMRwOt+qeRzZX3aoA2LYvzTZ5/vx5eFPQTqezdFye52sJgG0LAa8AgAAABAAgAAABAAgAQAAAAgD4JwotBNrf37f90t/YthbZ1Wo19Hmvsu56ve5BWXLPi/RosVgs3NbNc3BwECoP7fV6oSq74XCYnj17Fjr3eDwW5F4BAAEACABAAAACABAAgAAABAAgAICHotBKwNevX6eff/556bijo6P04sWL0JzR6rWHoNlsprOzs9DYm5ubNJ/Pl45rNBqhUtvZbBbeh/Hi4iLNZrOl49rtduF7/Z2cnKTpdLoVn3etVkuXl5cbfY2F/l+A29vb0EaNq5SZ7urGj19//XWh81Wr1ZTneWjs6elpqAw5Ot8qbm5uStsht2gPoZzaKwD4DQAQAIAAAAQAIAAAAQAIAGB7FFoIdHx8HCp+aDabpS04y7LUbrdDYyOdb/9cd3RNZbVFL7NF9zrOned5qBBpNpul8/Pz0JyrtEWPWGWufr8fKoB6+vRpsQVYiw2XUir0yPO88HP3er3QfIPBoPD1rGPdWZZt/Lk7nU5ovvF4HL7O8Xhc2nOe53mh647yCgB+AwAEACAAAAEACABAAAACANgee7u24Pl8Ht5yKrqlU3TO33//PTznZDJJ9/f3paw72s57NpuF9g5ch9lsFlrPdDoN3/O9vb3S1h1ttV50e/CdqwRc5Yhqt9sbX423yhGtiOt0Ohu/7izLCn8mo+te5RgMBqV8v7wCgN8AAAEACABAAAACABAAgAAABACwBQotBV5He/DBYFDouVcRbU1+fHwcus7ffvstPGeZLbJPTk5SpVJZOm4dXXwvLy9DbdH7/X7q9Xpb80X84YcfQmW+Rbdk3/j24NEdUPv9fuEfSnTX23a7HbrO4XD4INqd39zclHbuaFv0X375Zav+JR6NRoV+H7wCAAIAEACAAAAEACAAQAAAAgDYPaVsCvrhw4fCC3dqtVqo7fd0Og1XDEbbiE+n09B6ZrNZeM6irbLuVquVHj9+vHTcaDQKF7BE/fTTT+nTp0+hc5el2WyGPsdPnz6lt2/fbnYCFLnBYHRzzHUc62jRXeamoEVbZd02BS3GKq3Jo4f24IDfAAABAAgAQAAAAgAQAIAAAD6n0ErA/f39lbb7KlKkci2llCqVSuHXGF13tO12SvH24Pv7+6G1r7LuaJvsh+D+/j68d2G9Xg+tPdoefJXW5FE71x58V0Ur4qIVkOvwECoBU4lt0cusQlQJCPgNABAAgAAABAAgAEAAAAIAEADADimlPfiuajab6ezsLDQ22ib7/fv3oTbZq5z75OQk1J48z/PC26Kfn5+nL774Yum4aHvwWq2WLi8vQ+depVQ7Yjqdhtd9dnaWms3mww6AaHtwlou2ye73+4Xf85ubm1D9fJ7nhbdFf/PmTah+PtoevFKpFN5SO2o+n4fXHfm/BV4BAAEACABAAAACABAAgAAABADwd0rZ/fGrr75KT5482ZqbeH19nT58+FDonNE22dG26I1GI3zuVquVPn78uHRctHIteo0pxTd3jbbo3t/fL/yel9mavHBltAdvt9tbtYHnOtqDP4RNQXd1I9Z1HIPBwKaggN8AAAEACABAAAACABAAgAAABACwpQHw6NGj0o5tMhwOC78/3W63tPV0u93QNR4cHITnHI/HabFYlHJE11P0PfcXAPgLABAAgAAABAAgAAABAAgAQAAAW2DPLeD/1ev1SusGHelenNJqLbovLy8LbxEedXZ2FuoQHOmcLAD4176E0S9iWVZp0T2fz0u7zugOy14BAAEACABAAAACABAAgAAABADwOQqBHrjr6+vQuNvb2/CcrVYr1KZ7NBqFWmXXarV0dHQUOvfbt29DLbqjHj9+nFqtVnhsxGg0Sr/++mtovm+++WazH6BNbw+eSmrXvMqtKbM9+DqO8XgcusZOp7Px686yrPCW2tF1r+Pc2oMDfgMABAAgAAABAAgAQAAAAgAQAMBfbHwp8B/FgLtnPB6Xdu6Dg4NC9/r7szV5kTqdTnr16tVGr9tfAIAAAAQAIAAAAQAIAEAAAAIAEADAv6KUSsDr6+t0enq6NTcxujHnKn788cf08ePHpeO+++679OTJk6Xjbm9v0+vXr0PnfvnyZapUKkvHvXv3Lr17927puEajkV6+fFno/bm7uyv8GYquO2o+n4ev8cWLF6nRaPz7D28Zm4Lu6rGOzTF7vV5ovsFg8CA2BS16Y860hs1Qo8bjcfjcg8HApqCA3wAAAQAIAEAAAAIAEACAAAD+kUIrASMVabtslUqvVqsVqgT88ssvQ/PVarXUbrdDY6NtspvNZmjOdVS4Rc+9iui6V5kveo21Wq2UZ/LRYld33QS8AoAAAAQAIAAAAQAIAEAAAAIAEACAAAAEACAAAAEACABAAAACABAAgAAANsJ/Ad2wTVz5gosXAAAAAElFTkSuQmCC)}:root.dark quick-uploader-background{opacity:.05}.quick-uploader-button{height:256px;opacity:1}.error-404,.error-generic,.too-bad{display:block;margin-bottom:1rem;opacity:.1;height:256px;background-repeat:no-repeat;background-position:top left 50%}.error-generic,.too-bad{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAUh0lEQVR4nO3de5CX1X3H8TcsLLjIRUB0UAkoSsao0IkaiU5JvDu5yUxGJe2MGmv/MLWJTlNNnGqj/aPGIGqcNBobm0xN0wQbJ5PWtN5aRUSMRqE6sYgSFQzLVUGQ5bL947srCLiwu8/nnOfyec2c4Q9mvr/f+Z3vc/Y8z3MuYGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmSQ3I/QWscMOA8cDBwNiuMgYYDQwFhgCtu/wLsKWrdHT9uxlYC6zuKmuAVcBy4L1E9bAE3AFU03DgOOB4YDIwEZjU9e9Y4ed2Au3Aa8CyrrIEWAz8L9FxWIW4Ayi/kcD0rjIVOIG40MvWdjuApcAi4HlgPvA08G7OL2U9K1sSGRwKnAmcBpwKHAsMzPqN+m4b8ALwJDAPeIS4tbCScAeQ3yDir/t5XWUq9W2X7cAzwINd5TfEbYVZo7QCnwV+DKwnLoImlpXAXcAZQEu/flGzkmsBzgXuBdaR/+IrW1kJ/AMwg/qOgKyBJgDfAt4g/0VWlbIEuAY4pA+/t1l2A4HPA/9B3PfmvqCqWjqAucRDUbPSawO+QvwFy33x1K0sAi5h5+Qls9I4BPg7YsZc7gul7mUFcB1w0H61jJnQWODbxGSX3BdG08p64AZgxD5byaxgo4CbgHfIfyE0vawBvkGsgTCTagGuxK/xylhWApfiV4gmcgrwHPkT3aXnMo9YL2FWiDHAD4jFLrmT22X/ylZgDrFq0qxPBgB/RqyHz53QLn0ry4GLdm9Ys32ZBjxF/gR2KaY8DEzBbB+GEkPHbeRPWpdiyxbgRmL1pdkejiE2ssidqC7a8iRwBGa7mIXf6TeprCaWYzde09+ZDgXuAC7P/UWEthG78KwD3gY2EHv3dRAXA0QetAIHEE/ORxJTbUdT3yFzJ3ArMYloa+bvkk2TO4ApwM+oxzvj5cBLwO+IffleBV4n5s13v8XoiwHEdOfxxLLmI4GjgI8SW5Ud1q9vXQ4LgAuJ38sa4kvEX8LcQ9G+lE3EU+3rgNOJv9K5jO76Dtd1fadN5P99+lLWEsu3reZagbvJn3C9KR3AE8SmIjOI/fzLagjwKeK7PsHO24yqlFvx1mS1NZz4K5U7yfanrABmA2cTewxUVRtRh9lEnXL/rvtTHiCeDVmNjGPnDrRlLe8C/wycQz3/CrUQdbuP8i+ffpxY8Wk1MIny7tCzA3iU2OmmSfPWhxN1fpTyrrFYRDz8tAqbSjmHnuuI/QQm6KpeGROI36KMS6yX4SnElTWD8u25vxK4Fu9iszcjiN+mnfzttGtZBZwsrLcJzCQmu+ROnu7yBvCXxEQb61kb8FXgTfK3W3fZSDy/sAq4lPIs5llKzDL0Tra910r8dkvJ346dxCvNC6Q1tn6bSTku/o3A14HB2uo2wmDit9xI/nbtwCOB0poBvEf+JPk5cLi4rk10BHFISO723YifCZTOVPI/8FuC/zqkcA75X+uuwm8HSmMS8Bb5kmEz8DeUe4pu3QwBrifvg97fU4/FUJU2jrx/DRYSq+Msj6OINsjV/ovxCUXZDAeeJV/j34af7pdBK3A7+fJgHn69m1wr+Rb2rAXO11fRemkm+WYT/pL6bpxSSveQp6EXAB9JUD/rm4nA0+TJjdv01TOAPyVPA9+K3+tXwWCirXLkiEeGYlNIv5PPFmLTUKuWWaTfkGQtHiHKDAVeIG2DbgDOSlE5kziL9H8wFuCRosRdpG3IduDEJDUzpZOIiTspc2d2kpo1yEWkbcDXiINCrB6OIdb2p8yhz6WoWBMcTdpDO7wTTD2NJ9o2VR6twRu+9NsQ4Leka7Qn8V5wdTYKmE+6fJqP5wf0S8rXOYvwxd8Eo4gpvKny6qY01aqfaaRb2/8aHvY3yXjSPRPYglcO9toA0g3V2vEDvyaaQrq3Aw8nqlNtXEaahtmAX/U12UmkmyfgyWT7aQw7D7RUD808ycfOIs2MwRV4N+j9kursPvfI1m0WaXKudAuGynY8+CeAp9B/rznA1eLPyGk6xe9Ws5xom7qaA3xN/BnbgY8TU9ptNy3Ac+h74SbM1VZsnjk3aQ3SG0yapcTzKdEf3oG5v8AurgD+SPwZ64lpxVvFn2PVsxW4kMgRpenEQ27bxUhiKaW6923Kem2PAPrufPR52A4cmKpCPSnLCOBq9Jsr3k6c/W7WkweAO8SfcTBwpfgzKmM08DbaHnchzdrA0yOA/mkFnkGbk2sowWvBMowA/grtD/EeO3eHMdsfHUTOvCf8jNHAVcL4lTAW/Uys65PVpjw8AijGDWhzcz2ZzxXIPQL4C7QPQ14BbhbGt3q7mcghlZHE269GOoB4GqrsYZt6Vp9HAMU5F22OvkXGY+VyjgAuJp6GqtwP/KcwvjXDr4F/E8Y/lNjqvlEGAi+j61U30Owjuj0CKNYRxLHgqnx9kUyzA3ONAD6Ddg3+jcCbwvjWLG8QOaVyLHGr0Ri/QtebLqX+c/33xSOA4g0mckuVt79IV5WdcowADkfb2/09nutvxduK9o3SZ4nnAUnl6AC+TKz8U3gT+JEottk/EcuiFQYBl4pif6jUHcBAogNQuQXP+DOdDiLHVC6jREuFFc5Adw+1kphbYH4GoNSGdv7KjHRVST8CuEgYew6wWRjfDGATkWsqymskq0HoNvtcRwlWVpWIRwBaI4icU+RyO7pnZHtIOQI4k9jxV+FO4vxAsxTeIXJO4WDgdFHsPaTsAC4Qxe0kdhI2S+kHRO4pXCiKu4dUHUAL8AVR7P8mZmqZpfQ68D+i2DNJdBuQqgP4BLEBgsKPRXHN9kWVe6OBk0WxPyBVB3CeKO4m/HDK8pmL7s2T6pr5gFQdgGrq7wPEKi2zHDag22g2yeKgFB3AOOI0FAUP/y03VQ6eiHa/DCBNB3AGmumNK/Cxy5bfQ8SuPkUbQLw6l0rRAZwmivtT4qw1s5y2A/8iin2qKO77UnQAqkp4uy8ri/8Sxa18BzAcOF4QtwOYJ4hr1hfz0OxBcTxxDcmoO4BTRJ+xkHgFaFYG7xI5WbQWYg6NjLoDmC6K+6gorllfqXLyk6K4gL4DmCaK+5gorllfqXJyqiguoO8AThDE3Aw8JYhr1h/z0ZwlqLiG3qfsAIYBRwrizge2COKa9ccWIjeLdiRxLUkoO4Dj0EwA8vDfykrxHGAg8DFB3PeDqyhe/4GH/1ZeqtxUXUvSDuBoUdznRXHN+kuVm6prSdoBTBTEXA6sFcQ1K8JaNOcGTBTEBKrXAbwkiGlWJEWOThTEBKrXAfxOENOsSC8LYk4UxAR0HcABxD4ARVsqiGlWpFcEMQ9BdOiNqgM4TBT3VVFcs6KocnS8IqiqAxgrivu6KK5ZUVQ5KrmmqtYBrBDFNSuKKkcb3wFsI44WMyuz1USuFq3xHcBadCexmBWlE81clUp1AIpDQNYJYpopKHJVcrCO8jVg0d4WxDRTUORqpV4DtgpibhDENFNQ5KrimpJ1AEMEMVVHMJkVTZGrimuqUiOADkFMMwVFrjZ+BOA3AFYVilyt1AjAzCpA1QEo9uxTbC9mpqDIVck+mKoOoDL3QGYClXkGVqURgOQ9qJmAIlcbPwKQnpFmViBFrlZqBKB4DzpSENNMQZGrknkwqg5AsRjiIEFMMwVFrko2w1V1AIplu6PxmwArvwFoFu5IlsJXqQMYhG6jEbOijCVytWiN7wBAtC+aWYFUOSq5phQ9Feg6gAnAC6LYdbKgIjHraIIobqU6AMXpKKA5bbiOvpP7CzSYKkclew0qXwO2C+IeJYhpVqTJgpgrqdhrQIBlgpgfFcQ0K9IUQcxlgphA9TqAYwUxzYqkyNFlgphA9TqAwxBtjmhWgNFoTsVaJogJaDuAJaK400RxzfpLlZuqa0naASwWxZ0uimvWX6rcVF1LUsOAHcT2SEWWh1NWwqwXHqH4fN9OXEuV9ArF/yCbEO2PZtYPQ4hXdUXnu2z4D/o9ARcJYh6AbwOsfD4JDBXEVVxD71N3AM+L4n5aFNesr1Q5KZ36ru4AnhLFPV0U16yvVDk5XxQ3ieHEQ4yi74u2AG0J62HWk2HEll1F5/k2xFvhqUcAG9C8wmgFThPENeuL04DBgriLEZ+JmeJgkCdFcc8RxTXrrbNFcVXXTlKzKH5o1Eksj2xJWA+zvWkhclGR47MS1kNmHJoJQZ14FGD5nYsmt3cAByesh9QzaH6k+1JWwmwvfoImtxem+PKpDgf9tSju+cCBothm+zKcyEEF1TXzAak6gAdFcduAL4pim+3LF9EdWae6ZrJoAdagGSo9mrAeZrt6DE1Or6GGD7h/iO5hiWon1qqaS/G/89ykNSi/Cegebt+TqhKpbgEAfiaKOwC4XBTb7MNcju6kqn8Vxc1qELG3uaLHXAeMSFeV0vMIQGsEkXOKXG4n4fA/5QhgG/ALUexRwBWi2Ga7+wqRcwr3E+tnkkjZAQD8VBj7KnRPZM26tRG5pqK8RvaQugN4DPi9KPY4/CzA9C5HN0NvKfC4KPZepe4AdhBvA1S+TqwUNFNoJXJM5R+J5wDJpO4AIDoA1T3O4cDFothml6DZ9x/iGdm9otgfKkcH8CbaaY7Xolmbbc02GLhGGP9XwB+E8fcqRwcAcJcw9pHA14TxrZmuQns69d3C2KUzEHgZzXvUTmAjcTvQVJ4HUKwjiJxS5euL6CYV9SjXCGAHMEcYfxhwmzC+NcttaA/nuJXED//K4ABi1pOqV+2kuRuGeARQHNWGH93lLTIedJNrBABxisr3xJ9xJz5FyPpuKJFDSncSu1xnkbMDAPgucW+lMhntk1urt2uAo4Tx30b/R7BHuTuANUQnoPQNtI1o9TSZeKWsNIdYVNRoo4meUHmftZBmzRD0M4D+aUW3j2V3WUMJVrDmHgEArEX/xP4k4Nviz7D6uAU4UfwZ3wHeEX9GZYwkOgJlj9uJbgPHsvEIoO9mos/DdkqymW0ZRgAQtwA3JPice4GJCT7Hqmki2sVq3b6J9uF3JbUAz6LvfZ+m/msFPALovcFEbqjzbz6ZZv3tTWm+SJeTiSPF1SOTOcDV4s/IaTrFr1pbju649zKYg34NyXbg48AL4s+ptLvQ98Kd1OTcNSuE6vzK3Yunp++H0cAq9I2xBTgrUZ2svM4GOtDn2wpK8NqvKr5Mmh55A/GK0JrpJCIHPOIsmQHAPNI0zCrgmDTVshKZQpqRZifwcKI61crxwFbSNNAyYHySWlkZHEa0eYrc2kJ0NtYHt5CmkTqBRej2erfyGAUsJl1e3ZSmWvU0hDRzA7rLfNwJ1Nkooo1T5tOgJDWrsaPQLxbafSTg24H6GU/av/xriK3ErAAXkq7hOon7Qz8YrI8ppLvn7y6fS1GxJvk+aRuwHf2KMNM7iXRP+7vL7CQ1a5ihwPOkbcgNeLJQlZ1Nuvf83WUB9V9rks0xpG/QDjyJo4pmkWaG365lLfCRFJVrsj8hbaN2lzm4Z6+CwURb5ciRLySonwH3kKeBn8b7CZTZRNIs6d1b8UKfhFqJ6ZU5GnodzdlZqEpmEm2TIyd+SexnYQkNB35DngbvBG6nWRuNllUrcAf58uAJ4pAby2AcsIR8jf8M3nI8p8nod+/tqSzGM0ezm0Qcr5QrCTYD1+MTiFIaQuwhuZl87b4MzxgtjanAevIlQycxEjlXXVHjXPKO+jqJiUVe4VcyM8j7F6G7zKXZR5OrHAHcT/723UjsXWklNBPYRjmS5K/xvIEiDCZ+y43kb9cOYnahldgllKMT6ASWAn+O3xb0RSvx2y0lfzt2X/wXSGtshZlJOW4HussbwFeBNmWla6KN2J77TfK3W3fZCJyjrLQV74/J/2Bw99JOnFbs3WH3NIL4bdrJ3067llX4nr+yTiC2Y86dRLuXdcRWURN0Va+MCcRvkWsWX09lGd4XovImAf9H/mTaW9kBPAZcSsxsbIrhRJ0fI36D3O2wt+KdoWpkHHmnDe9PeRe4j3jPXcd55S1E3X4CbCL/791TeRzP8Kud4cBD5E+u/SkriF1lzqHaDw7biDrMppy3YnsrDxCbz1gNtQJ3kz/JelM6iENSbgQ+RbmnHA8BPk1813mk35Cjv2U29Rx92W6+RPqdhYoqm4FHgOuA04mzFHMZ3fUdruv6TmV69dqbshb4fMG/TSWU7XjwlI4Bfk68Kai65cBLwMvAK8CrwOvEsHs1keR9MQAYSzwMmwAcSazAmwIcS/FHkOewgNh1+vXcXySHJncAEPd6txMzzupqG/EXbh1xvsIG4i919/AcIg9aiXXtw4GRwEHEX/i6HmzRPeT/JnEEnTXYRcA75B+KuqQpq4HPYLaLo4Hfkj85XbRlHl6taR9iKLGjbFkWE7kUV7YA36K+tzRWoGmkPUTSRVsewlN6rZcGAJex8ym6S/XKcuIJv1mfjSEmD5V1zrrLnmUrcCvNWl9hYqcAz5E/uV16Lk8Ax39IG5r1SwtwJeVcutr0spLYDarpc1ssgVHEfHfPHchf1gDXAsN6bDEzgTHAzcRS3twXQtPKeuI8Bu+uZNkdQuxq4zcG+rKCmL570H61jFlCbcAV5D+4oo5lEXAx3mHZKmAgsbz034Ht5L94qlo6iBWbZ/bu5zcrjwnA3xJbg+e+oKpSlhCHgYzr/c9tVk4txPZYPySW5+a+yMpW/gB8j9jO3a/yrNZaieWoP6LZcwpWAt8ndhXyVlwZuKfNbxAxy/C8rjKN+rbLdmAh8GBXeZboCCyTuiZalR1KPPQ6tat8jHioWEXbgOeBJ7vKI8Ttj5WEO4DyG0mMEKYDU4k9DCdRvrbbQexHuIi46OcTf+3fzfmlrGdlSyLbPwcCxxGLXiYDE4lOYSJwsPBzu+/bXyOOzVpGPLFfDLxI7DVoFeIOoH7aiN16x+5SxhAbfA4l9u5v3eVfiN1yOrr+3QK8R8yxX91V1hCHZK7o+j8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzPri/8HlebCuRQTbPoAAAAASUVORK5CYII=)}.error-404{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAxwSURBVHhe7d15rFxlHcbxjhVQQCu4tBY0omIE0RZBwSURTBSFgMS4JCbGmhjrH0b5B8JfYjQaBRORf6SJURMSQwgoAapiosaNTZDFBSVhMdDSKotQyiK01+c5772my7n3znv6vnfOmd/3kzy577R3mXPufZ+ZOTPvmdHMzMwyADE9b/YjgIAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqMAgMAoACAwCgAIjAIAAqtyUtDRaNR8UA5WjlM+oZymrFIoHWB+O5UtykblR8otyhOKpmqFuVqpADz5Pdk/p6xXVioA8mxVNigXK1tqNECtW2Pf8nvyf1Fh8gPdeO54DvlG1HOquFoF4Lv9vtIrmksAuvIc8o2p51RxtQrAj/m55QfK8FzynCqu1jGATfqwOl0CUMBmzdXDZsfF1CqAHfrA0X6gnJ2aq8tnx8XUmqRMfqCsKnOKiQoERgEAgVEAQGAUABAYBQAEVutpwC7f9HvKH9IQmGrvUj6ThuPTXG1W2RXlAigdf9sOWacAEfhvvW0OLJg951mJ8BAACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAKjAIDAKAAgMAoACIwCAAIbzczMzA7LGY1GXb7pp5UfpmERH1BOSMOxbVUuTsO9nKS8Jw3H9phyYRp2dqByjLJGWaksVybNv99typ3KTcojymJeo3wqDbN8R/lPGu5mlbI+DbNsULak4cSsU36QhuPTXB3NDstxAZSOv22HeKeU9G2l7ecslFuV+ZyntH3NQrlX6cq/7Fcr31T+pDys7FDafs5SZ6eyXblLuUR5t7JYMblA277XYnFxtFmrtH3+YvHXTZr/1tuu24LZc56VCA8B+uulyneVzyvHKocqffl9uZx8z+RI5eOKb6Xfq/D3NDD8wvppf8X3YE5VPNH6bD/lrcrXlaP9DxgOCqCfTlROT8PBOF45Q3EhYCAogH7y5H9hGg7Kh5QD0hBDQAH001HKEG9J/RCgD89SYEwUQD8dpJR/yqe+oV7vsCgAlMTkHxgKAAiMAgACowCAwCgAIDAKYHo8odxXMP9SMOUogOlxuXJEwXRZaYeBoQCAwCgAIDAKAAiMAgACowCAwKb5nIA+ocZZaTi2Tcq30nAvpyg+z2AOnyvvq2m4F59+7DdpuJdfKz6FVg7vO+/DUs5UfpKGWQ5R2s7h5+3xduX6ivJoGu5mtXJ2Gma5QNmchrt5XPl+GlbHOQFb0odzAi5lfP3m44nS9jULJfsPahEugLafs1heorTpek7Apcq+nL8xF+cEBDB5FAAQGAUABEYBAIFRAEBg01wAc0dP0Q/+XfgdhdAj01wADylPpSF6wL8L/07QI9NcAH4/vQfTED3g8wvcnIboi2kugBuVG5TnmkuYNJfxRqXtVX2YkGkuAP+h+U0r/9xcwqQ9o1yjXKnw0KwnprkA7BblC8r1zSVM2v3K1xSvW3AhYMKmvQB81Pk65aPKZ5VrFS/48WKV3Dyt5PLPb/teTulbQb+jsF+HXyp+l5/S/EzAPco5it//8FLlbsX31tr20ULZpnThr2v7fl4MFE/bAoF9jb9th5ReDFTaeUrb9V4oXReYdFkM1Je4PJbCWqXt5y8Wf92ksRgIwORRAEBgFAAQGAUABEYBAIFRAP3ko75DNNTrHRYF0E9+TnqIK+ceUyiBAaEA+ukO5dk0HJTbFNZeDAgF0E9XKH633yHxPZbLFF7iOyAUQD/drlykDGXRjO+t+D0EvNiHewADQgH0l1cyetHMv5tL/fWk4jUW5ysP+B8wHBRAf/mA2peVLylXK55cfbl19YE+Xz8vtPLEP1fxyT44ADgw0/zWYKW9cTY5fOv4izTszKv8DldepaxQ+lDa/v16daTfYsur+7YrS8374uQ0zOKFVi6vSeKtwVrS99WAQCmsBgQweRQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAAQ28nuElzYajbp8028o16YhMNVOUc5Nw/Fpro5mh8X0qQAALKBGAfAQAAiMAgACowCAwCgAIDAKAAiMAgACowCAwCgAIDAKAAiMAgACowCAwCgAILA+LQY6W7k8DYGp9hHlgjQcX43FQP6mxeNv2yHrFCAC/623zYEFs+c8KxEeAgCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEFifFgNdqdyWhsvmFj3MfR9f3nVsvjz37/P9/67aPtfavtb2/Ny5/1vsa+e+znI/d+5zFvtoHtuul+fGtuv/L/S5c/83NLtuV46uX5droZ+zRjkzDcenuVr8evPWYMBA1CgAHgIAgVEAQGAUABAYBQAERgEAgdUqgB2zHwGUUWVO1SqAe2Y/AiijypyqVQA/nf0IoIwqc6pWAVyq/DMNAewjzyXPqeJqFcAdykXKw80lAF15DnkueU4VV+ulwP5wiPJJ5RzlMP8DgCyblPOVS5RHq8zVigVgy5UjlI8ppymrlFr3OobgAMX7IPc13c8oDynPNpf6bz/lZYq3N4f/GLco3t6odireBxuVy5R7leYZgBpz9f/vEFIymNepypOKd1JOfq68ThkKX1df57ZtWSjeNx9U0KJtru1rIt8aLzXf6p+u7N9cGp/b/wbFtwpD4et6o5L73LX3jfdR8VVvaEcBLB0fB3mb4odFOR5Uble2N5eGwbfkPreDr3sO7xvvo9XNJVRHASydE5VXpmGWvyt/TcPB8N15X2df91ye/O9IQ9RGASwNHxQ7WXlFc2l8/1VuVe5uLg2Lr7PvBXgbcrxc8b7yPkNlFMDSOFI5Rnl+c2l8fiz9e2WIayt8nX+n5B678MT3vvI+Q2UUQH0+oPUWJfcP2nejH1Buai4N0x8Vb4O3JYf31ZsVDgZWRgHUd7CyVsm9+/+c4iPpW5tLw+RbfxeYtyWH99WxivcdKqIA6vNBrS5H/59WvAAk99azT3zd/YIWb0sOng1YIhRAXb4L+3rl7c2lPH4Z6G/TcNB8HMDbkssF4H3Hw4CKKIC6DlROUrrclf2xknsEvY/8sl5vS64XKd533oeohAKo68XK+9Mwiyf+1Wk4Fa5RupTZ+xTvQ1RCAdR1tHJUGmb5i3JXGk6Ffyjeplzed132H8ZEAdTl17V3eUHLzxS/nHZaeFu8Tbnm1gagEgqgnhcoH07DLI8rv1SmaUmst+VXyrbmUh7vQ+9LVEAB1OMDWCvTMMv1ik8BNeSn//bkbblPua65lMfnT/C+RAUUQB1+6uoMJfe5f7981gUw5Bf/zMfb5GXNuS9r9j70vuTpwAoogDr8Ahav/sstgCEu/R3X3BLh3LUB3ocnKF1WUmIRFEAdXs7qu6657lT+loZTxw8DvG1dts+T/51piJIogPK84s/LWX1OvBx+nty3/tP8pio+v53Pbpt7bkPvSx8HyF1NiUVQAOW9QfFKttyn/3z33y+bzV04MySe+H558+bm0vi8L7usqMQiKICyfKBqjeLXsOfw3eP7FS+fnXY3K12WCHufelUlBwMLogDK8mv+vYw1d+mvbxk9+XMPkA2R7+l4W3MfBnifugAOai6hCAqgLJ/48zgl9+j/U4pfKTdNz/3Px9vobfU25/A+PV45vLmEIiiAcnzX1OfD9x9prrnH/1F4W7vc23G5vlbhYUAhFEA5vmvqI9VdVq9doeSeNGPIfOvvbc61QvE+5mFAIbXfGmxoDlX8qrMuvH59vfKm5lKeCxU/BRiJD5aelYZZfLrxDUqXdQV2lfJIGg5LlblKAezGB5l8Gm5MLx+k9SsSB6fGXOUhABAYBQAERgEAgVEAQGAUABAYBQAERgEAgVEAQGAUABAYBQAERgEAgVEAQGBVFgMBGAbuAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAARGAQCBUQBAYBQAEBgFAIS1bNn/ABMRUfm704XyAAAAAElFTkSuQmCC)}@media screen and (max-width:769px){.too-bad{height:128px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAJQUlEQVR4nO2dW4yV1RXHf3OO2mHASxHqWMdoTUUbXxRStF4YFVRaBBpbEiPGFwXUWChqqyY+eEvERk1ERDGolUA0Jt6ItLVe4oMXoAiCUeMTES/tCzdNZBwGvj6sb4jinDN7fd+3b+fsX7JeTmZO/nvtdb5v77X3XhsSiUQikUgkEolEIpFIJBKJRKKVGAUcD5wKTACmADNzm5x/dgrQA3R50piogKOBacBNwOPAW8D/gExpXwJvAo8BC4GpwFHumpEwZSTya14EbAD2oe9sU9sHfAQsA2YBRzpoX2IIuoDZwL+AAex1+HDWD6xGgqHTaosTdADnA08BX+Ov0xvZTuTJcI6l9rctNWA6sB7/nWxqG5GnQocFf7QNNcSJH+O/Q4vaFuAqoF6xb1qei4BP8d+BVQbCpEo91KIcC6zAf4fZsueAYyrzVgtRB24kzMFd1bYTuJ40PjjAWGQ657tjXNtrpKcBkymWpdPYPmAr8CqwGLgLuAWYC1yR29z8s7uAh/O/3YrdpFIGfA6cW9qLEVID7sSOg7cDzwM3AKdTLkHTmX/Hn4AX8u+uWu9e4Dba6JVwGPAs1TrxC+A+YDwSXLaoIYtGf0PWCqpsw9+BQyxqD4JRyLuvCof1AyuRKaPNTm9EHbgYWJVrqaJNr9DCK5GjgXcp76TvkKniL93Kb8oJwEPAt5Rv3zpgjFv59hkLfEL5d+VioNuxdg0/B5ZQfoFqC/KDaQm6KP/L3wD82rXwEpxO+TavRZa6o+Yw4N8Ud8Ju4BriHCHXkOllmeTWK0Q8MOwAnqZ44zcS1nu+KCcDmyjuh5XE+QPgDoo3egnwE+eK7dEJLKW4P251L7kcF1JsILQXuNqDXlfMobhfoskY/gz4Cn0j+4A/etDrmhkUmy5+TgTTwxrFEj27aK/18l6kzVo/rSHw8cBC9I36lvbq/EF6gT3o/XW9D7EmdKOP6gHgMh9iA2E68n7X+Gw3snEmOJ5BH82tPOAzZQ56vz3tRWkTJqNvxBLHGs9CtmSZ2FmOtT2Kznf7gfMca2zIIejz/O/jfp4/S6FvlmNtneiTRVvwswr6I65EJ/wb5BCma0IOAJCs526FRl86f0ANOSunEX2NF6XhBwDI2oHGl5vwPC28bAhRzWwd/h5bMQRADf0q4qVelOb8p4GooWwAWSb1RQwBALKtTZMuXutHpiQyNJG62I/MA8QSACAzJI1vvRxIfVIhcA+yW8YnMQVAN7os4TLXAkegy/q5nvMPRUwBAFKZxFTvLqRPnHGFQlw/cKJLcQ2ILQB+gS5N7HQl9Z8KYStdCmtCbAEAuvT6aleijkAXmRe5EjYMMQbAJZhr/g5Hm0gvVYj6knCKI8QYAHV0m2sucSHqAYWgRS4EGRJjAECA/t6oEDTehSBDYg2AiZjrXm9bzGjMT/RuJ5DVqpxYA6AO7MBM9wDwU5tifmcoJEOOaIdErAEA8BKBjANuVAi5waaQAsQcAAsw177AppBlCiE+F36GIuYAGI+59qU2hbxlKGIfjlOTBsQcAF2Yj73esCnkv4YittoUUZCYAwBgG2bav7AlYJShgAyp+hUasQeA6Snr/ViqMtJjKCBDKm2FRuwB8Ajm+q0svf9KIeBOGwJKEnsA3I25/nE2BGgyUjfbEFCS2APgr5jrn2BDwIUKAfNsCChJ7AFwHeb6z7chYKZCwGwbAkoSewBozl/MsCEgBYBfvAdAegX4xfsrIA0C/eJ9EJimgX7xPg3UJIJC2AZ+MLEHgPdEkCYV/KoNASXpQTrWxHo8aWyGae0la6lgiHsxKHa8LwZB3MvBMTMS+WWb+P51m0I0x5VC2xASM8FsCIl5S1jM/Blzv8+3KUSzKfQFm0LajJcx97vVTaExbwuPlTpy16CJzweAo2wLet9QTIaljFSbcSbm/l7nQtD9CkH3uRDU4jyIub/vdSFomkJQSIdDY6SOee4lQ24xs87h6K5JcyKqRZmKuZ/7cHjl3BqFsFWuRA1DjGsBmgIRL7kUdrlCWD9S7sQ3sQXASegKcTitut6J+dQkw3J2ypDYAkBzDG8HHu5YWq4Q2Acc51rgQcQUAD2Iz0z1PupD5CSFwAz/ewRiCgBt+fiz/ciUihSmIgeAM/zIBOIJgAlEUioW4PcNRDWy9aRi0c2oAe8Zahy0aV6U5nQAHw4hqpnN9aI0jgC4VqExQ+o1eb9FTFM1NEMujDjVg87QA+Bk9BdG/MGDzh9RR39pxCZkKumSkANgBLBZoS8DPiCg1dYL0InPcJ8bCPnSKM2cP0O2h3kpEd+MVeiDYI4XpWExD73fnvSidBi60WUHM2S60w73BTdiBvrLpHcg9zMHyXz00bwHuX2k3eil2NWxIZ67PEANORSibdQu2isIetGP+DOkJLz3ad9wjEU2gmgb14f/FKwLZlLs+vhtRHB9/CC96N9tg2OCVh4YXksxv/QDv/GgtxS3o2/ooC3FfZ7AJiPQT/W+b39xL7k8HcBTFG/0R8BpzlVXzzgkaVPUDyuI4L3fiEORopFFG/81snYQTMZLQQ155H9D8fa/jFzOHTVdwDsUd0KGnEWY6Fp4Cc5Av6p3sL2HozuAXDAG+JhyDhlANpX4voCyGT3IZg7T01ONbDOWL37wwWjKPwky5HasFcjqWSicCDxEscTOwbaWiKZ7WkZRbkzwfduLbJueip/DJ3Xgt7kGze7d4d75LV9X4VCKLRw1s6+Q27UmYjcY6shZvQfRndgxseW0wIDPlA4kT1AkKTKc7UQOScxHCiuUOS3TlX/HAuTXqbkv2dT6kbJ60U71ytBLsbSxxvYDnyH19pcA9wC3IIsqs3Obl392T/43r+X/Y1qWpah9RoQZvqoZA/wDu44O0VYjA+MEkjSZj51HbGi2HUluteUjfzi6kSme7UevD9ufty3YzRwhcQH6jaYh20Y8nt6JlRowHV1JmtBsM3AVqUhGKTqQQFiL/w41tXdyzek9XzGTgCcIc7C4HVkHaPtpnQtGIEUq1qArV1O19QEvIsUZnJ/PTwgjgSnAIuBtqsvLD2UDwAZk4WcWcISD9iWUjEYWiBYitY3fRNYKtJ29DSm8vBTJUVwMHOmwHYmKGYlUKTkFOYM/BdmhOwOYnH82Dtlv4KzaViKRSCQSiUQikUgkEolEIpFI2Of/IVVGlDw9PEEAAAAASUVORK5CYII=)}}.pat{overflow-wrap:break-word}.release-flag{height:.5rem;width:.5rem;display:inline-block;border:none;border-radius:50%;background-color:#ffe08a;vertical-align:middle;margin:0 5px;box-shadow:0 0 2px #000}:root.dark .release-flag{background-color:#ffe08a;box-shadow:none}.about-logo{height:32px;filter:invert(1)}:root.dark .about-logo{filter:none}.spinner{display:block}.spinner-container,.spinner-overlay-container{text-align:center;z-index:100000;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.spinner-overlay-container{top:25%;height:50%}.spinner-container{background-color:#f5f5f5}.spinner-container .spinner{color:#b5b5b5}:root.dark .spinner-container{background-color:#242424}:root.dark .spinner-container .spinner{color:#4a4a4a}.spinner-overlay-container{background:none}.spinning{animation-name:spin;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.fadeInOut-enter-active{animation:fadeIn .5s}.fadeInOut-leave-active{animation:fadeOut 0}.popLater-enter-active{transition:opacity .2s linear .5s;transition-delay:.5s}.popLater-enter-from,.popLater-leave-active{opacity:0}.tfa-grid .slideCheckbox-enter-active{animation:enterFromTop .5s}.tfa-grid .slideCheckbox-enter-active+.tfa-content{animation:addTopOffset .5s}.tfa-grid .slideCheckbox-leave-active{animation:leaveToTop .5s}.tfa-grid .slideCheckbox-leave-active+.tfa-content{animation:removeTopOffset .5s}.tfa-list .slideCheckbox-enter-active{animation:enterFromLeft .5s}.tfa-list .slideCheckbox-enter-active+.tfa-content{animation:addLeftOffset .5s}.tfa-list .slideCheckbox-leave-active{animation:leaveToLeft .5s}.tfa-list .slideCheckbox-leave-active+.tfa-content{animation:removeLeftOffset .5s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@media screen and (max-width:768px){@keyframes fadeIn{0%{opacity:0}75%{opacity:0}to{opacity:1}}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes enterFromLeft{0%{transform:translate(-100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes addLeftOffset{0%{transform:translate(-2.375rem)}to{transform:translate(0)}}@keyframes enterFromTop{0%{transform:translateY(-50%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes addTopOffset{0%{transform:translateY(-2rem)}to{transform:translateY(0)}}@keyframes leaveToLeft{0%{transform:translate(0)}to{transform:translate(-100%);opacity:0}}@keyframes removeLeftOffset{0%{transform:translate(0)}to{transform:translate(-2.375rem)}}@keyframes leaveToTop{0%{transform:translateY(0)}to{transform:translateY(-50%);opacity:0}}@keyframes removeTopOffset{0%{transform:translateY(0)}to{transform:translateY(-2rem)}}.is-opacity-0{opacity:0}.is-opacity-1{opacity:.1}.is-opacity-2{opacity:.2}.is-opacity-3{opacity:.3}.is-opacity-4{opacity:.4}.is-opacity-5{opacity:.5}.is-opacity-6{opacity:.6}.is-opacity-7{opacity:.7}.is-opacity-8{opacity:.8}.is-opacity-9{opacity:.9}.is-opacity-10{opacity:1}.p-1-5{padding:.375rem!important}:root.dark .table{background-color:#242424;color:#fafafa}:root.dark .table th,:root.dark .table thead th{color:#7a7a7a}:root.dark .table td,:root.dark .table th{border:1px solid hsl(0,0%,21%);border-width:0 0 1px}.card{background-color:none;border:1px solid hsl(0,0%,86%);box-shadow:none}:root.dark .card{background-color:#242424;border:1px solid hsl(0,0%,21%)}.card-footer{border-top:1px solid hsl(0,0%,86%)}:root.dark .card-footer{border-top:1px solid hsl(0,0%,21%)}.card-footer-item:not(:last-child){border-right:1px solid hsl(0,0%,86%)}:root.dark .card-footer-item:not(:last-child){border-right:1px solid hsl(0,0%,21%)}.addressbar{padding:6px;border:1px solid hsl(0,0%,71%);background-color:#fff;border-radius:.375rem;position:relative}:root.dark .addressbar{background-color:#121212;border:none}.circled:before{display:block;content:"";position:absolute;border-radius:50%;border:2px solid hsl(348,86%,61%);left:35px;top:4px;width:29px;height:29px}.light-or-darker{color:#363636}:root.dark .light-or-darker{color:#b5b5b5}.width-1-5x{width:1.5em}.lucide{width:1.25rem;height:1.25rem}.lucide-default-size{width:auto;height:auto}.icon-size-0-75{width:.75rem;height:.75rem}.icon-size-0-9{width:.9rem;height:.9rem}.icon-size-1{width:1rem;height:1rem}.icon-size-1-15{width:1.15rem;height:1.15rem}.icon-size-1-35{width:1.35rem;height:1.35rem}.icon-size-1-5{width:1.5rem;height:1.5rem}.icon-size-2{width:2rem;height:2rem}.icon-size-3{width:3rem;height:3rem}.rotate-135{transform:rotate(135deg)}.rotate-90{transform:rotate(90deg)}.log-icon-bg{width:3em;height:3em}.log-icon-mark{position:absolute;margin:.65em auto auto;width:1.25em;height:1.25em;inset:0}.log-icon-wrapper{display:inline-block;position:relative;text-align:center}a>svg.lucide,svg.lucide.inline{vertical-align:text-bottom}.stack-subheader{min-height:30px}.stack.is-max-height{height:100vh!important}.stack-content-wrapper{overflow-y:auto}.stack-content{padding:0}@media screen and (max-width:1023px){.stack-content{padding-left:1rem;padding-right:1rem}}.accounts-container{flex-grow:1;margin:0 auto;position:relative;width:100%}.accounts-container.is-max-tablet{max-width:705px}@media screen and (min-width:1024px){.accounts-container{max-width:960px}}@media screen and (max-width:1215px){.accounts-container.is-widescreen:not(.is-max-tablet):not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.accounts-container.is-fullhd:not(.is-max-tablet):not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.accounts-container:not(.is-max-tablet):not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.accounts-container:not(.is-max-tablet):not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.vue-notification-template.is-info{background-color:#209cee!important}.vue-notification-template.is-success{background-color:#48c78e!important}.vue-notification-template.is-warning{background-color:#ffe08a!important}.vue-notification-template.is-danger{background-color:#f14668!important}.toggle-wrapper{border-radius:9px}.toggle{position:relative}.toggle-buttons{display:flex;gap:.25rem}.toggle-buttons .button{flex:1;text-align:center;z-index:1}.toggle-active{position:absolute;top:0;left:0;height:100%;z-index:2;transition:transform .3s ease;box-shadow:0 0 3px #0000004d}.toggle-active .button{width:100%;height:100%} diff --git a/public/build/assets/app-dvJP63FL.js b/public/build/assets/app-dvJP63FL.js new file mode 100644 index 0000000..29c2bd6 --- /dev/null +++ b/public/build/assets/app-dvJP63FL.js @@ -0,0 +1,20 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Start-Dnu4qWlC.js","./Form-ZbAUhXmz.js","./bus-ChE1sp8V.js","./Capture-BG6QMHLW.js","./QrContentDisplay-DiIjf7a_.js","./external-link-CqpXNovN.js","./createLucideIcon-DsaEAGzP.js","./index-BJsmINgd.js","./Accounts-znshhaJC.js","./shareService-BU7jlLil.js","./useSortable-6hRbxhTj.js","./circle-x-AvUNZzwX.js","./users-CLZI37iw.js","./qr-code-eSL1bq0j.js","./x-DQVIq0xP.js","./CreateUpdate-tvLQ26rU.js","./iconService-rm6LRV4U.js","./Import-C0sC5CLD.js","./check-CPGWPXZa.js","./AccountSharing-kU7yk02h.js","./TwofaccountMedia-DzLyeBxh.js","./helpers-B2oe4lHy.js","./circle-plus-BM92Iipr.js","./Share-DkTnn1jz.js","./TransferOwnership-BsVNwpBY.js","./OtpLogs-CAP6rwu6.js","./tablet-DYUfDfjC.js","./Groups-Ccrpwp-O.js","./CreateUpdate-CbOB1O7q.js","./Options-Bun4hDR8.js","./tabs-Btun2NN0.js","./breakpoints-CyLcIEOu.js","./Account-CvhJGfLO.js","./OAuth-aXCqlLPs.js","./Edit-Ba84j7PP.js","./WebAuthn-C_HU0Xj8.js","./webauthnService-D363et0U.js","./AppSetup-9GPB7B-I.js","./tabs-BVx9tg1F.js","./appSettingsUpdater-D1Bq_3WB.js","./CopyButton-CgxgBp0c.js","./Auth-DslSg1a9.js","./Users-DyNCDMUg.js","./Create-Vv-BwDWf.js","./Manage-B1CTWqgo.js","./AccessLogViewer-D5ke4CwJ.js","./Access-BQVm4alb.js","./Login-XfEMUKl8.js","./Register-DffuLlzx.js","./RequestReset-w8-YSMaH.js","./Reset-RiTuOlH9.js","./Recover-CEob990V.js","./About-DlWJhNxo.js","./Error-DG0pgQA2.js"])))=>i.map(i=>d[i]); +function r0(t,e){typeof console<"u"&&(console.warn("[intlify] "+t),e&&console.warn(e.stack))}const Bo=typeof window<"u",ns=(t,e=!1)=>e?Symbol.for(t):Symbol(t),n0=(t,e,i)=>l0({l:t,k:e,s:i}),l0=t=>JSON.stringify(t).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),ce=t=>typeof t=="number"&&isFinite(t),hb=t=>Ol(t)==="[object Date]",$o=t=>Ol(t)==="[object RegExp]",br=t=>zt(t)&&Object.keys(t).length===0,pe=Object.assign,u0=Object.create,Ht=(t=null)=>u0(t);let Tu;const Pl=()=>Tu||(Tu=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:Ht());function Su(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/=/g,"=")}function d0(t){return t.replace(/&(?![a-zA-Z0-9#]{2,6};)/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}const c0=/^\s*javascript\s*(?::|�*58;?|�*3a;?|:?)/i,b0=/^(?:href|src|action|formaction)$/i;function El(t){return c0.test(t)}function _0(t){const e=/url\s*\(/gi;let i="",s=0,a;for(;(a=e.exec(t))!==null;){const o=a.index,r=e.lastIndex-1;let n=r+1,l=1,u=null;for(;n`${s}="${Fu(s,a)}"`),t=t.replace(/([\w:-]+)\s*=\s*'([^']*)'/g,(i,s,a)=>`${s}='${Fu(s,a)}'`),/\s*on\w+\s*=\s*["']?[^"'>]+["']?/gi.test(t)&&(t=t.replace(/(\s+)(on)(\w+\s*=)/gi,"$1on$3")),t=t.replace(/(\s+(?:href|src|action|formaction)\s*=\s*)([^\s"'=<>`]+)/gi,(i,s,a)=>El(a)?`${s}about:blank`:i),t}const p0=Object.prototype.hasOwnProperty;function Ze(t,e){return p0.call(t,e)}const le=Array.isArray,re=t=>typeof t=="function",dt=t=>typeof t=="string",se=t=>typeof t=="boolean",Ct=t=>t!==null&&typeof t=="object",m0=t=>Ct(t)&&re(t.then)&&re(t.catch),pb=Object.prototype.toString,Ol=t=>pb.call(t),zt=t=>Ol(t)==="[object Object]",g0=t=>t==null?"":le(t)||zt(t)&&t.toString===pb?JSON.stringify(t,null,2):String(t);function Rl(t,e=""){return t.reduce((i,s,a)=>a===0?i+s:i+e+s,"")}const _o=t=>!Ct(t)||le(t);function Co(t,e){if(_o(t)||_o(e))throw new Error("Invalid value");const i=[{src:t,des:e}];for(;i.length;){const{src:s,des:a}=i.pop();Object.keys(s).forEach(o=>{o!=="__proto__"&&(Ct(s[o])&&!Ct(a[o])&&(a[o]=Array.isArray(s[o])?[]:Ht()),_o(a[o])||_o(s[o])?a[o]=s[o]:i.push({src:s[o],des:a[o]}))})}}function f0(t,e,i){return{line:t,column:e,offset:i}}function Ln(t,e,i){return{start:t,end:e}}const jt={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14},v0=17;function _r(t,e,i={}){const{domain:s,messages:a,args:o}=i,r=t,n=new SyntaxError(String(r));return n.code=t,e&&(n.location=e),n.domain=s,n}function w0(t){throw t}const di=" ",y0="\r",ye=` +`,k0="\u2028",A0="\u2029";function x0(t){const e=t;let i=0,s=1,a=1,o=0;const r=F=>e[F]===y0&&e[F+1]===ye,n=F=>e[F]===ye,l=F=>e[F]===A0,u=F=>e[F]===k0,d=F=>r(F)||n(F)||l(F)||u(F),c=()=>i,_=()=>s,p=()=>a,v=()=>o,g=F=>r(F)||l(F)||u(F)?ye:e[F],y=()=>g(i),m=()=>g(i+o);function w(){return o=0,d(i)&&(s++,a=0),r(i)&&i++,i++,a++,e[i]}function x(){return r(i+o)&&o++,o++,e[i+o]}function f(){i=0,s=1,a=1,o=0}function T(F=0){o=F}function P(){const F=i+o;for(;F!==i;)w();o=0}return{index:c,line:_,column:p,peekOffset:v,charAt:g,currentChar:y,currentPeek:m,next:w,peek:x,reset:f,resetPeek:T,skipToPeek:P}}const Si=void 0,T0=".",Pu="'",S0="tokenizer";function F0(t,e={}){const i=e.location!==!1,s=x0(t),a=()=>s.index(),o=()=>f0(s.line(),s.column(),s.index()),r=o(),n=a(),l={currentType:13,offset:n,startLoc:r,endLoc:r,lastType:13,lastOffset:n,lastStartLoc:r,lastEndLoc:r,braceNest:0,inLinked:!1,text:""},u=()=>l,{onError:d}=e;function c(b,h,A,...E){const Y=u();if(h.column+=A,h.offset+=A,d){const U=i?Ln(Y.startLoc,h):null,k=_r(b,U,{domain:S0,args:E});d(k)}}function _(b,h,A){b.endLoc=o(),b.currentType=h;const E={type:h};return i&&(E.loc=Ln(b.startLoc,b.endLoc)),A!=null&&(E.value=A),E}const p=b=>_(b,13);function v(b,h){return b.currentChar()===h?(b.next(),h):(c(jt.EXPECTED_TOKEN,o(),0,h),"")}function g(b){let h="";for(;b.currentPeek()===di||b.currentPeek()===ye;)h+=b.currentPeek(),b.peek();return h}function y(b){const h=g(b);return b.skipToPeek(),h}function m(b){if(b===Si)return!1;const h=b.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h===95}function w(b){if(b===Si)return!1;const h=b.charCodeAt(0);return h>=48&&h<=57}function x(b,h){const{currentType:A}=h;if(A!==2)return!1;g(b);const E=m(b.currentPeek());return b.resetPeek(),E}function f(b,h){const{currentType:A}=h;if(A!==2)return!1;g(b);const E=b.currentPeek()==="-"?b.peek():b.currentPeek(),Y=w(E);return b.resetPeek(),Y}function T(b,h){const{currentType:A}=h;if(A!==2)return!1;g(b);const E=b.currentPeek()===Pu;return b.resetPeek(),E}function P(b,h){const{currentType:A}=h;if(A!==7)return!1;g(b);const E=b.currentPeek()===".";return b.resetPeek(),E}function F(b,h){const{currentType:A}=h;if(A!==8)return!1;g(b);const E=m(b.currentPeek());return b.resetPeek(),E}function B(b,h){const{currentType:A}=h;if(!(A===7||A===11))return!1;g(b);const E=b.currentPeek()===":";return b.resetPeek(),E}function q(b,h){const{currentType:A}=h;if(A!==9)return!1;const E=()=>{const U=b.currentPeek();return U==="{"?m(b.peek()):U==="@"||U==="|"||U===":"||U==="."||U===di||!U?!1:U===ye?(b.peek(),E()):Q(b,!1)},Y=E();return b.resetPeek(),Y}function N(b){g(b);const h=b.currentPeek()==="|";return b.resetPeek(),h}function Q(b,h=!0){const A=(Y=!1,U="")=>{const k=b.currentPeek();return k==="{"||k==="@"||!k?Y:k==="|"?!(U===di||U===ye):k===di?(b.peek(),A(!0,di)):k===ye?(b.peek(),A(!0,ye)):!0},E=A();return h&&b.resetPeek(),E}function z(b,h){const A=b.currentChar();return A===Si?Si:h(A)?(b.next(),A):null}function X(b){const h=b.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h>=48&&h<=57||h===95||h===36}function L(b){return z(b,X)}function tt(b){const h=b.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h>=48&&h<=57||h===95||h===36||h===45}function et(b){return z(b,tt)}function ht(b){const h=b.charCodeAt(0);return h>=48&&h<=57}function mt(b){return z(b,ht)}function yt(b){const h=b.charCodeAt(0);return h>=48&&h<=57||h>=65&&h<=70||h>=97&&h<=102}function Pt(b){return z(b,yt)}function _t(b){let h="",A="";for(;h=mt(b);)A+=h;return A}function lt(b){let h="";for(;;){const A=b.currentChar();if(A==="\\"){const E=b.peek();E==="{"||E==="}"||E==="@"||E==="|"||E==="\\"?(h+=A+E,b.next(),b.next()):(b.resetPeek(),h+=A,b.next())}else{if(A==="{"||A==="}"||A==="@"||A==="|"||!A)break;if(A===di||A===ye)if(Q(b))h+=A,b.next();else{if(N(b))break;h+=A,b.next()}else h+=A,b.next()}}return h}function gt(b){y(b);let h="",A="";for(;h=et(b);)A+=h;const E=b.currentChar();if(E&&E!=="}"&&E!==Si&&E!==di&&E!==ye&&E!==" "){const Y=ut(b);return c(jt.INVALID_TOKEN_IN_PLACEHOLDER,o(),0,A+Y),A+Y}return b.currentChar()===Si&&c(jt.UNTERMINATED_CLOSING_BRACE,o(),0),A}function Qt(b){y(b);let h="";return b.currentChar()==="-"?(b.next(),h+=`-${_t(b)}`):h+=_t(b),b.currentChar()===Si&&c(jt.UNTERMINATED_CLOSING_BRACE,o(),0),h}function Xt(b){return b!==Pu&&b!==ye}function te(b){y(b),v(b,"'");let h="",A="";for(;h=z(b,Xt);)h==="\\"?A+=j(b):A+=h;const E=b.currentChar();return E===ye||E===Si?(c(jt.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,o(),0),E===ye&&(b.next(),v(b,"'")),A):(v(b,"'"),A)}function j(b){const h=b.currentChar();switch(h){case"\\":case"'":return b.next(),`\\${h}`;case"u":return K(b,h,4);case"U":return K(b,h,6);default:return c(jt.UNKNOWN_ESCAPE_SEQUENCE,o(),0,h),""}}function K(b,h,A){v(b,h);let E="";for(let Y=0;Y{const E=b.currentChar();return E==="{"||E==="@"||E==="|"||E==="("||E===")"||!E||E===di?A:(A+=E,b.next(),h(A))};return h("")}function O(b){y(b);const h=v(b,"|");return y(b),h}function C(b,h){let A=null;switch(b.currentChar()){case"{":return h.braceNest>=1&&c(jt.NOT_ALLOW_NEST_PLACEHOLDER,o(),0),b.next(),A=_(h,2,"{"),y(b),h.braceNest++,A;case"}":return h.braceNest>0&&h.currentType===2&&c(jt.EMPTY_PLACEHOLDER,o(),0),b.next(),A=_(h,3,"}"),h.braceNest--,h.braceNest>0&&y(b),h.inLinked&&h.braceNest===0&&(h.inLinked=!1),A;case"@":return h.braceNest>0&&c(jt.UNTERMINATED_CLOSING_BRACE,o(),0),A=M(b,h)||p(h),h.braceNest=0,A;default:{let Y=!0,U=!0,k=!0;if(N(b))return h.braceNest>0&&c(jt.UNTERMINATED_CLOSING_BRACE,o(),0),A=_(h,1,O(b)),h.braceNest=0,h.inLinked=!1,A;if(h.braceNest>0&&(h.currentType===4||h.currentType===5||h.currentType===6))return c(jt.UNTERMINATED_CLOSING_BRACE,o(),0),h.braceNest=0,H(b,h);if(Y=x(b,h))return A=_(h,4,gt(b)),y(b),A;if(U=f(b,h))return A=_(h,5,Qt(b)),y(b),A;if(k=T(b,h))return A=_(h,6,te(b)),y(b),A;if(!Y&&!U&&!k)return A=_(h,12,ut(b)),c(jt.INVALID_TOKEN_IN_PLACEHOLDER,o(),0,A.value),y(b),A;break}}return A}function M(b,h){const{currentType:A}=h;let E=null;const Y=b.currentChar();switch((A===7||A===8||A===11||A===9)&&(Y===ye||Y===di)&&c(jt.INVALID_LINKED_FORMAT,o(),0),Y){case"@":return b.next(),E=_(h,7,"@"),h.inLinked=!0,E;case".":return y(b),b.next(),_(h,8,".");case":":return y(b),b.next(),_(h,9,":");default:return N(b)?(E=_(h,1,O(b)),h.braceNest=0,h.inLinked=!1,E):P(b,h)||B(b,h)?(y(b),M(b,h)):F(b,h)?(y(b),_(h,11,ft(b))):q(b,h)?(y(b),Y==="{"?C(b,h)||E:_(h,10,S(b))):(A===7&&c(jt.INVALID_LINKED_FORMAT,o(),0),h.braceNest=0,h.inLinked=!1,H(b,h))}}function H(b,h){let A={type:13};if(h.braceNest>0)return C(b,h)||p(h);if(h.inLinked)return M(b,h)||p(h);switch(b.currentChar()){case"{":return C(b,h)||p(h);case"}":return c(jt.UNBALANCED_CLOSING_BRACE,o(),0),b.next(),_(h,3,"}");case"@":return M(b,h)||p(h);default:{if(N(b))return A=_(h,1,O(b)),h.braceNest=0,h.inLinked=!1,A;if(Q(b))return _(h,0,lt(b));break}}return A}function $(){const{currentType:b,offset:h,startLoc:A,endLoc:E}=l;return l.lastType=b,l.lastOffset=h,l.lastStartLoc=A,l.lastEndLoc=E,l.offset=a(),l.startLoc=o(),s.currentChar()===Si?_(l,13):H(s,l)}return{nextToken:$,currentOffset:a,currentPosition:o,context:u}}const P0="parser",E0=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g,O0=/\\([\\@{}|])/g;function R0(t,e){return e}function q0(t,e,i){switch(t){case"\\\\":return"\\";case"\\'":return"'";default:{const s=parseInt(e||i,16);return s<=55295||s>=57344?String.fromCodePoint(s):"�"}}}function C0(t={}){const e=t.location!==!1,{onError:i}=t;function s(m,w,x,f,...T){const P=m.currentPosition();if(P.offset+=f,P.column+=f,i){const F=e?Ln(x,P):null,B=_r(w,F,{domain:P0,args:T});i(B)}}function a(m,w,x){const f={type:m};return e&&(f.start=w,f.end=w,f.loc={start:x,end:x}),f}function o(m,w,x,f){e&&(m.end=w,m.loc&&(m.loc.end=x))}function r(m,w){const x=m.context(),f=a(3,x.offset,x.startLoc);return f.value=w.replace(O0,R0),o(f,m.currentOffset(),m.currentPosition()),f}function n(m,w){const x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(5,f,T);return P.index=parseInt(w,10),m.nextToken(),o(P,m.currentOffset(),m.currentPosition()),P}function l(m,w){const x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(4,f,T);return P.key=w,m.nextToken(),o(P,m.currentOffset(),m.currentPosition()),P}function u(m,w){const x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(9,f,T);return P.value=w.replace(E0,q0),m.nextToken(),o(P,m.currentOffset(),m.currentPosition()),P}function d(m){const w=m.nextToken(),x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(8,f,T);return w.type!==11?(s(m,jt.UNEXPECTED_EMPTY_LINKED_MODIFIER,x.lastStartLoc,0),P.value="",o(P,f,T),{nextConsumeToken:w,node:P}):(w.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,ci(w)),P.value=w.value||"",o(P,m.currentOffset(),m.currentPosition()),{node:P})}function c(m,w){const x=m.context(),f=a(7,x.offset,x.startLoc);return f.value=w,o(f,m.currentOffset(),m.currentPosition()),f}function _(m){const w=m.context(),x=a(6,w.offset,w.startLoc);let f=m.nextToken();if(f.type===8){const T=d(m);x.modifier=T.node,f=T.nextConsumeToken||m.nextToken()}switch(f.type!==9&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(f)),f=m.nextToken(),f.type===2&&(f=m.nextToken()),f.type){case 10:f.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(f)),x.key=c(m,f.value||"");break;case 4:f.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(f)),x.key=l(m,f.value||"");break;case 5:f.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(f)),x.key=n(m,f.value||"");break;case 6:f.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(f)),x.key=u(m,f.value||"");break;default:{s(m,jt.UNEXPECTED_EMPTY_LINKED_KEY,w.lastStartLoc,0);const T=m.context(),P=a(7,T.offset,T.startLoc);return P.value="",o(P,T.offset,T.startLoc),x.key=P,o(x,T.offset,T.startLoc),{nextConsumeToken:f,node:x}}}return o(x,m.currentOffset(),m.currentPosition()),{node:x}}function p(m){const w=m.context(),x=w.currentType===1?m.currentOffset():w.offset,f=w.currentType===1?w.endLoc:w.startLoc,T=a(2,x,f);T.items=[];let P=null;do{const q=P||m.nextToken();switch(P=null,q.type){case 0:q.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(q)),T.items.push(r(m,q.value||""));break;case 5:q.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(q)),T.items.push(n(m,q.value||""));break;case 4:q.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(q)),T.items.push(l(m,q.value||""));break;case 6:q.value==null&&s(m,jt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,ci(q)),T.items.push(u(m,q.value||""));break;case 7:{const N=_(m);T.items.push(N.node),P=N.nextConsumeToken||null;break}}}while(w.currentType!==13&&w.currentType!==1);const F=w.currentType===1?w.lastOffset:m.currentOffset(),B=w.currentType===1?w.lastEndLoc:m.currentPosition();return o(T,F,B),T}function v(m,w,x,f){const T=m.context();let P=f.items.length===0;const F=a(1,w,x);F.cases=[],F.cases.push(f);do{const B=p(m);P||(P=B.items.length===0),F.cases.push(B)}while(T.currentType!==13);return P&&s(m,jt.MUST_HAVE_MESSAGES_IN_PLURAL,x,0),o(F,m.currentOffset(),m.currentPosition()),F}function g(m){const w=m.context(),{offset:x,startLoc:f}=w,T=p(m);return w.currentType===13?T:v(m,x,f,T)}function y(m){const w=F0(m,pe({},t)),x=w.context(),f=a(0,x.offset,x.startLoc);return e&&f.loc&&(f.loc.source=m),f.body=g(w),t.onCacheKey&&(f.cacheKey=t.onCacheKey(m)),x.currentType!==13&&s(w,jt.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,m[x.offset]||""),o(f,w.currentOffset(),w.currentPosition()),f}return{parse:y}}function ci(t){if(t.type===13)return"EOF";const e=(t.value||"").replace(/\r?\n/gu,"\\n");return e.length>10?e.slice(0,9)+"…":e}function I0(t,e={}){const i={ast:t,helpers:new Set};return{context:()=>i,helper:o=>(i.helpers.add(o),o)}}function Eu(t,e){for(let i=0;iOu(i)),t}function Ou(t){if(t.items.length===1){const e=t.items[0];(e.type===3||e.type===9)&&(t.static=e.value,delete e.value)}else{const e=[];for(let i=0;ir;function l(g,y){r.code+=g}function u(g,y=!0){const m=y?s:"";l(a?m+" ".repeat(g):m)}function d(g=!0){const y=++r.indentLevel;g&&u(y)}function c(g=!0){const y=--r.indentLevel;g&&u(y)}function _(){u(r.indentLevel)}return{context:n,push:l,indent:d,deindent:c,newline:_,helper:g=>`_${g}`,needIndent:()=>r.needIndent}}function L0(t,e){const{helper:i}=t;t.push(`${i("linked")}(`),Xs(t,e.key),e.modifier?(t.push(", "),Xs(t,e.modifier),t.push(", _type")):t.push(", undefined, _type"),t.push(")")}function U0(t,e){const{helper:i,needIndent:s}=t;t.push(`${i("normalize")}([`),t.indent(s());const a=e.items.length;for(let o=0;o1){t.push(`${i("plural")}([`),t.indent(s());const a=e.cases.length;for(let o=0;o{const i=dt(e.mode)?e.mode:"normal",s=dt(e.filename)?e.filename:"message.intl";e.sourceMap;const a=e.breakLineCode!=null?e.breakLineCode:i==="arrow"?";":` +`,o=e.needIndent?e.needIndent:i!=="arrow",r=t.helpers||[],n=N0(t,{filename:s,breakLineCode:a,needIndent:o});n.push(i==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),n.indent(o),r.length>0&&(n.push(`const { ${Rl(r.map(d=>`${d}: _${d}`),", ")} } = ctx`),n.newline()),n.push("return "),Xs(n,t),n.deindent(o),n.push("}"),delete t.helpers;const{code:l,map:u}=n.context();return{ast:t,code:l,map:u?u.toJSON():void 0}};function B0(t,e={}){const i=pe({},e),s=!!i.jit,a=!!i.minify,o=i.optimize==null?!0:i.optimize,n=C0(i).parse(t);return s?(o&&D0(n),a&&js(n),{ast:n,code:""}):(z0(n,i),W0(n,i))}function $0(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Pl().__INTLIFY_PROD_DEVTOOLS__=!1)}function yi(t){return Ct(t)&&Cl(t)===0&&(Ze(t,"b")||Ze(t,"body"))}const mb=["b","body"];function H0(t){return ls(t,mb)}const gb=["c","cases"];function G0(t){return ls(t,gb,[])}const fb=["s","static"];function V0(t){return ls(t,fb)}const vb=["i","items"];function Q0(t){return ls(t,vb,[])}const wb=["t","type"];function Cl(t){return ls(t,wb)}const yb=["v","value"];function ho(t,e){const i=ls(t,yb);if(i!=null)return i;throw Da(e)}const kb=["m","modifier"];function K0(t){return ls(t,kb)}const Ab=["k","key"];function Y0(t){const e=ls(t,Ab);if(e)return e;throw Da(6)}function ls(t,e,i){for(let s=0;sJ0(i,t)}function J0(t,e){const i=H0(e);if(i==null)throw Da(0);if(Cl(i)===1){const o=G0(i);return t.plural(o.reduce((r,n)=>[...r,Ru(t,n)],[]))}else return Ru(t,i)}function Ru(t,e){const i=V0(e);if(i!=null)return t.type==="text"?i:t.normalize([i]);{const s=Q0(e).reduce((a,o)=>[...a,Un(t,o)],[]);return t.normalize(s)}}function Un(t,e){const i=Cl(e);switch(i){case 3:return ho(e,i);case 9:return ho(e,i);case 4:{const s=e;if(Ze(s,"k")&&s.k)return t.interpolate(t.named(s.k));if(Ze(s,"key")&&s.key)return t.interpolate(t.named(s.key));throw Da(i)}case 5:{const s=e;if(Ze(s,"i")&&ce(s.i))return t.interpolate(t.list(s.i));if(Ze(s,"index")&&ce(s.index))return t.interpolate(t.list(s.index));throw Da(i)}case 6:{const s=e,a=K0(s),o=Y0(s);return t.linked(Un(t,o),a?Un(t,a):void 0,t.type)}case 7:return ho(e,i);case 8:return ho(e,i);default:throw new Error(`unhandled node on format message part: ${i}`)}}const Z0=t=>t;let po=Ht();function X0(t,e={}){let i=!1;const s=e.onError||w0;return e.onError=a=>{i=!0,s(a)},{...B0(t,e),detectError:i}}function t2(t,e){if(dt(t)){se(e.warnHtmlMessage)&&e.warnHtmlMessage;const s=(e.onCacheKey||Z0)(t),a=po[s];if(a)return a;const{ast:o,detectError:r}=X0(t,{...e,location:!1,jit:!0}),n=Jr(o);return r?n:po[s]=n}else{const i=t.cacheKey;if(i){const s=po[i];return s||(po[i]=Jr(t))}else return Jr(t)}}let Na=null;function e2(t){Na=t}function i2(t,e,i){Na&&Na.emit("i18n:init",{timestamp:Date.now(),i18n:t,version:e,meta:i})}const s2=a2("function:translate");function a2(t){return e=>Na&&Na.emit(t,e)}const Ii={INVALID_ARGUMENT:v0,INVALID_DATE_ARGUMENT:18,INVALID_ISO_DATE_ARGUMENT:19,NOT_SUPPORT_LOCALE_PROMISE_VALUE:21,NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:22,NOT_SUPPORT_LOCALE_TYPE:23},o2=24;function zi(t){return _r(t,null,void 0)}function Il(t,e){return e.locale!=null?qu(e.locale):qu(t.locale)}let Zr;function qu(t){if(dt(t))return t;if(re(t)){if(t.resolvedOnce&&Zr!=null)return Zr;if(t.constructor.name==="Function"){const e=t();if(m0(e))throw zi(Ii.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return Zr=e}else throw zi(Ii.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw zi(Ii.NOT_SUPPORT_LOCALE_TYPE)}function r2(t,e,i){return[...new Set([i,...le(e)?e:Ct(e)?Object.keys(e):dt(e)?[e]:[i]])]}function jn(t,e,i){const s=dt(i)?i:Ho,a=t;a.__localeChainCache||(a.__localeChainCache=new Map);let o=a.__localeChainCache.get(s);if(!o){o=[];let r=[i];for(;le(r);)r=Cu(o,r,e);const n=le(e)||!zt(e)?e:e.default?e.default:null;r=dt(n)?[n]:n,le(r)&&Cu(o,r,!1),a.__localeChainCache.set(s,o)}return o}function Cu(t,e,i){let s=!0;for(let a=0;a{r===void 0?r=n:r+=n},_[1]=()=>{r!==void 0&&(e.push(r),r=void 0)},_[2]=()=>{_[0](),a++},_[3]=()=>{if(a>0)a--,s=4,_[0]();else{if(a=0,r===void 0||(r=_2(r),r===!1))return!1;_[1]()}};function p(){const v=t[i+1];if(s===5&&v==="'"||s===6&&v==='"')return i++,n="\\"+v,_[0](),!0}for(;s!==null;)if(i++,o=t[i],!(o==="\\"&&p())){if(l=b2(o),c=us[s],u=c[l]||c.l||8,u===8||(s=u[0],u[1]!==void 0&&(d=_[u[1]],d&&(n=o,d()===!1))))return;if(s===7)return e}}const Iu=new Map;function p2(t,e){return Ct(t)?t[e]:null}function m2(t,e){if(!Ct(t))return null;let i=Iu.get(e);if(i||(i=h2(e),i&&Iu.set(e,i)),!i)return null;const s=i.length;let a=t,o=0;for(;o`${t.charAt(0).toLocaleUpperCase()}${t.substr(1)}`;function f2(){return{upper:(t,e)=>e==="text"&&dt(t)?t.toUpperCase():e==="vnode"&&Ct(t)&&"__v_isVNode"in t?t.children.toUpperCase():t,lower:(t,e)=>e==="text"&&dt(t)?t.toLowerCase():e==="vnode"&&Ct(t)&&"__v_isVNode"in t?t.children.toLowerCase():t,capitalize:(t,e)=>e==="text"&&dt(t)?zu(t):e==="vnode"&&Ct(t)&&"__v_isVNode"in t?zu(t.children):t}}let Tb;function v2(t){Tb=t}let Sb;function w2(t){Sb=t}let Fb;function y2(t){Fb=t}let Pb=null;const k2=t=>{Pb=t},A2=()=>Pb;let Eb=null;const Du=t=>{Eb=t},x2=()=>Eb;let Nu=0;function T2(t={}){const e=re(t.onWarn)?t.onWarn:r0,i=dt(t.version)?t.version:g2,s=dt(t.locale)||re(t.locale)?t.locale:Ho,a=re(s)?Ho:s,o=le(t.fallbackLocale)||zt(t.fallbackLocale)||dt(t.fallbackLocale)||t.fallbackLocale===!1?t.fallbackLocale:a,r=zt(t.messages)?t.messages:Xr(a),n=zt(t.datetimeFormats)?t.datetimeFormats:Xr(a),l=zt(t.numberFormats)?t.numberFormats:Xr(a),u=pe(Ht(),t.modifiers,f2()),d=t.pluralRules||Ht(),c=re(t.missing)?t.missing:null,_=se(t.missingWarn)||$o(t.missingWarn)?t.missingWarn:!0,p=se(t.fallbackWarn)||$o(t.fallbackWarn)?t.fallbackWarn:!0,v=!!t.fallbackFormat,g=!!t.unresolving,y=re(t.postTranslation)?t.postTranslation:null,m=zt(t.processor)?t.processor:null,w=se(t.warnHtmlMessage)?t.warnHtmlMessage:!0,x=!!t.escapeParameter,f=re(t.messageCompiler)?t.messageCompiler:Tb,T=re(t.messageResolver)?t.messageResolver:Sb||p2,P=re(t.localeFallbacker)?t.localeFallbacker:Fb||r2,F=Ct(t.fallbackContext)?t.fallbackContext:void 0,B=t,q=Ct(B.__datetimeFormatters)?B.__datetimeFormatters:new Map,N=Ct(B.__numberFormatters)?B.__numberFormatters:new Map,Q=Ct(B.__meta)?B.__meta:{};Nu++;const z={version:i,cid:Nu,locale:s,fallbackLocale:o,messages:r,modifiers:u,pluralRules:d,missing:c,missingWarn:_,fallbackWarn:p,fallbackFormat:v,unresolving:g,postTranslation:y,processor:m,warnHtmlMessage:w,escapeParameter:x,messageCompiler:f,messageResolver:T,localeFallbacker:P,fallbackContext:F,onWarn:e,__meta:Q};return z.datetimeFormats=n,z.numberFormats=l,z.__datetimeFormatters=q,z.__numberFormatters=N,__INTLIFY_PROD_DEVTOOLS__&&i2(z,i,Q),z}const Xr=t=>({[t]:Ht()});function zl(t,e,i,s,a){const{missing:o,onWarn:r}=t;if(o!==null){const n=o(t,i,e,a);return dt(n)?n:e}else return e}function pa(t,e,i){const s=t;s.__localeChainCache=new Map,t.localeFallbacker(t,i,e)}function S2(t,e){return t===e?!1:t.split("-")[0]===e.split("-")[0]}function F2(t,e){const i=e.indexOf(t);if(i===-1)return!1;for(let s=i+1;s{Ob.includes(l)?r[l]=i[l]:o[l]=i[l]}),dt(s)?o.locale=s:zt(s)&&(r=s),zt(a)&&(r=a),[o.key||"",n,o,r]}function Uu(t,e,i){const s=t;for(const a in i){const o=`${e}__${a}`;s.__datetimeFormatters.has(o)&&s.__datetimeFormatters.delete(o)}}function ju(t,...e){const{numberFormats:i,unresolving:s,fallbackLocale:a,onWarn:o,localeFallbacker:r}=t,{__numberFormatters:n}=t;if(!ce(e[0]))return Go;const[l,u,d,c]=Wn(...e),_=se(d.missingWarn)?d.missingWarn:t.missingWarn;se(d.fallbackWarn)?d.fallbackWarn:t.fallbackWarn;const p=!!d.part,v=Il(t,d),g=r(t,a,v);if(!dt(l)||l==="")return new Intl.NumberFormat(v.replace(/!/g,""),c).format(u);let y={},m,w=null;const x="number format";for(let P=0;P{Rb.includes(l)?r[l]=i[l]:o[l]=i[l]}),dt(s)?o.locale=s:zt(s)&&(r=s),zt(a)&&(r=a),[o.key||"",n,o,r]}function Mu(t,e,i){const s=t;for(const a in i){const o=`${e}__${a}`;s.__numberFormatters.has(o)&&s.__numberFormatters.delete(o)}}const P2=t=>t,E2=t=>"",O2="text",R2=t=>t.length===0?"":Rl(t),q2=g0;function tn(t,e){return t=Math.abs(t),e===2?t===1?0:1:Math.min(t,2)}function C2(t){const e=ce(t.pluralIndex)?t.pluralIndex:-1;return ce(t.named?.count)?t.named.count:ce(t.named?.n)?t.named.n:e}function I2(t={}){const e=t.locale,i=C2(t),s=dt(e)&&re(t.pluralRules?.[e])?t.pluralRules[e]:tn,a=s===tn?void 0:tn,o=m=>m[s(i,m.length,a)],r=t.list||[],n=m=>r[m],l=t.named||Ht();ce(t.pluralIndex)&&(l.count||=t.pluralIndex,l.n||=t.pluralIndex);const u=m=>l[m];function d(m,w){const x=re(t.messages)?t.messages(m,!!w):Ct(t.messages)?t.messages[m]:!1;return x||(t.parent?t.parent.message(m):E2)}const c=m=>t.modifiers?t.modifiers[m]:P2,_=re(t.processor?.normalize)?t.processor.normalize:R2,p=re(t.processor?.interpolate)?t.processor.interpolate:q2,v=dt(t.processor?.type)?t.processor.type:O2,y={list:n,named:u,plural:o,linked:(m,...w)=>{const[x,f]=w;let T="text",P="";w.length===1?Ct(x)?(P=x.modifier||P,T=x.type||T):dt(x)&&(P=x||P):w.length===2&&(dt(x)&&(P=x||P),dt(f)&&(T=f||T));const F=d(m,!0)(y),B=F===""||F===void 0?m:F,q=T==="vnode"&&le(B)&&P?B[0]:B;return P?c(P)(q,T):q},message:d,type:v,interpolate:p,normalize:_,values:pe(Ht(),r,l)};return y}const Wu=()=>"",Ye=t=>re(t);function Bu(t,...e){const{fallbackFormat:i,postTranslation:s,unresolving:a,messageCompiler:o,fallbackLocale:r,messages:n}=t,[l,u]=Bn(...e),d=se(u.missingWarn)?u.missingWarn:t.missingWarn,c=se(u.fallbackWarn)?u.fallbackWarn:t.fallbackWarn,_=se(u.escapeParameter)?u.escapeParameter:t.escapeParameter,p=!!u.resolvedMessage,v=dt(u.default)||se(u.default)?se(u.default)?o?l:()=>l:u.default:i?o?l:()=>l:null,g=i||v!=null&&(dt(v)||re(v)),y=Il(t,u);_&&z2(u);let[m,w,x]=p?[l,y,n[y]||Ht()]:qb(t,l,y,r,c,d),f=m,T=l;if(!p&&!(dt(f)||yi(f)||Ye(f))&&g&&(f=v,T=f),!p&&(!(dt(f)||yi(f)||Ye(f))||!dt(w)))return a?hr:l;let P=!1;const F=()=>{P=!0},B=Ye(f)?f:Cb(t,l,w,f,T,F);if(P)return f;const q=L2(t,w,x,u),N=I2(q),Q=D2(t,B,N);let z=s?s(Q,l):Q;if(_&&dt(z)&&(z=h0(z)),__INTLIFY_PROD_DEVTOOLS__){const X={timestamp:Date.now(),key:dt(l)?l:Ye(f)?f.key:"",locale:w||(Ye(f)?f.locale:""),format:dt(f)?f:Ye(f)?f.source:"",message:z};X.meta=pe({},t.__meta,A2()||{}),s2(X)}return z}function z2(t){le(t.list)?t.list=t.list.map(e=>dt(e)?Su(e):e):Ct(t.named)&&Object.keys(t.named).forEach(e=>{dt(t.named[e])&&(t.named[e]=Su(t.named[e]))})}function qb(t,e,i,s,a,o){const{messages:r,onWarn:n,messageResolver:l,localeFallbacker:u}=t,d=u(t,s,i);let c=Ht(),_,p=null;const v="translate";for(let g=0;gs);return u.locale=i,u.key=e,u}const l=r(s,N2(t,i,a,s,n,o));return l.locale=i,l.key=e,l.source=s,l}function D2(t,e,i){return e(i)}function Bn(...t){const[e,i,s]=t,a=Ht();if(!dt(e)&&!ce(e)&&!Ye(e)&&!yi(e))throw zi(Ii.INVALID_ARGUMENT);const o=ce(e)?String(e):(Ye(e),e);return ce(i)?a.plural=i:dt(i)?a.default=i:zt(i)&&!br(i)?a.named=i:le(i)&&(a.list=i),ce(s)?a.plural=s:dt(s)?a.default=s:zt(s)&&pe(a,s),[o,a]}function N2(t,e,i,s,a,o){return{locale:e,key:i,warnHtmlMessage:a,onError:r=>{throw o&&o(r),r},onCacheKey:r=>n0(e,i,r)}}function L2(t,e,i,s){const{modifiers:a,pluralRules:o,messageResolver:r,fallbackLocale:n,fallbackWarn:l,missingWarn:u,fallbackContext:d}=t,_={locale:e,modifiers:a,pluralRules:o,messages:(p,v)=>{let g=r(i,p);if(g==null&&(d||v)){const[y,,m]=qb(d||t,p,e,n,l,u);g=y??r(m,p)}if(dt(g)||yi(g)){let y=!1;const w=Cb(t,p,e,g,p,()=>{y=!0});return y?Wu:w}else return Ye(g)?g:Wu}};return t.processor&&(_.processor=t.processor),s.list&&(_.list=s.list),s.named&&(_.named=s.named),ce(s.plural)&&(_.pluralIndex=s.plural),_}$0();function Dl(t){const e=Object.create(null);for(const i of t.split(","))e[i]=1;return i=>i in e}const qt={},Ks=[],ki=()=>{},Ib=()=>!1,pr=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),mr=t=>t.startsWith("onUpdate:"),de=Object.assign,Nl=(t,e)=>{const i=t.indexOf(e);i>-1&&t.splice(i,1)},U2=Object.prototype.hasOwnProperty,Wt=(t,e)=>U2.call(t,e),pt=Array.isArray,Ys=t=>Ja(t)==="[object Map]",la=t=>Ja(t)==="[object Set]",$u=t=>Ja(t)==="[object Date]",wt=t=>typeof t=="function",ie=t=>typeof t=="string",He=t=>typeof t=="symbol",Lt=t=>t!==null&&typeof t=="object",zb=t=>(Lt(t)||wt(t))&&wt(t.then)&&wt(t.catch),Db=Object.prototype.toString,Ja=t=>Db.call(t),j2=t=>Ja(t).slice(8,-1),Nb=t=>Ja(t)==="[object Object]",gr=t=>ie(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,Fa=Dl(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),fr=t=>{const e=Object.create(null);return(i=>e[i]||(e[i]=t(i)))},M2=/-\w/g,Pe=fr(t=>t.replace(M2,e=>e.slice(1).toUpperCase())),W2=/\B([A-Z])/g,Hi=fr(t=>t.replace(W2,"-$1").toLowerCase()),vr=fr(t=>t.charAt(0).toUpperCase()+t.slice(1)),en=fr(t=>t?`on${vr(t)}`:""),Ae=(t,e)=>!Object.is(t,e),Io=(t,...e)=>{for(let i=0;i{Object.defineProperty(t,e,{configurable:!0,enumerable:!1,writable:s,value:i})},wr=t=>{const e=parseFloat(t);return isNaN(e)?t:e},B2=t=>{const e=ie(t)?Number(t):NaN;return isNaN(e)?t:e};let Hu;const yr=()=>Hu||(Hu=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ll(t){if(pt(t)){const e={};for(let i=0;i{if(i){const s=i.split(H2);s.length>1&&(e[s[0].trim()]=s[1].trim())}}),e}function nt(t){let e="";if(ie(t))e=t;else if(pt(t))for(let i=0;iua(i,e))}const jb=t=>!!(t&&t.__v_isRef===!0),at=t=>ie(t)?t:t==null?"":pt(t)||Lt(t)&&(t.toString===Db||!wt(t.toString))?jb(t)?at(t.value):JSON.stringify(t,Mb,2):String(t),Mb=(t,e)=>jb(e)?Mb(t,e.value):Ys(e)?{[`Map(${e.size})`]:[...e.entries()].reduce((i,[s,a],o)=>(i[sn(s,o)+" =>"]=a,i),{})}:la(e)?{[`Set(${e.size})`]:[...e.values()].map(i=>sn(i))}:He(e)?sn(e):Lt(e)&&!pt(e)&&!Nb(e)?String(e):e,sn=(t,e="")=>{var i;return He(t)?`Symbol(${(i=t.description)!=null?i:e})`:t};let he;class Wb{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&he&&(he.active?(this.parent=he,this.index=(he.scopes||(he.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,i;if(this.scopes)for(e=0,i=this.scopes.length;e0&&--this._on===0){if(he===this)he=this.prevScope;else{let e=he;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let i,s;for(i=0,s=this.effects.length;i0)return;if(Ea){let e=Ea;for(Ea=void 0;e;){const i=e.next;e.next=void 0,e.flags&=-9,e=i}}let t;for(;Pa;){let e=Pa;for(Pa=void 0;e;){const i=e.next;if(e.next=void 0,e.flags&=-9,e.flags&1)try{e.trigger()}catch(s){t||(t=s)}e=i}}if(t)throw t}function Gb(t){for(let e=t.deps;e;e=e.nextDep)e.version=-1,e.prevActiveLink=e.dep.activeLink,e.dep.activeLink=e}function Vb(t){let e,i=t.depsTail,s=i;for(;s;){const a=s.prevDep;s.version===-1?(s===i&&(i=a),Wl(s),J2(s)):e=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=a}t.deps=e,t.depsTail=i}function $n(t){for(let e=t.deps;e;e=e.nextDep)if(e.dep.version!==e.version||e.dep.computed&&(Qb(e.dep.computed)||e.dep.version!==e.version))return!0;return!!t._dirty}function Qb(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===La)||(t.globalVersion=La,!t.isSSR&&t.flags&128&&(!t.deps&&!t._dirty||!$n(t))))return;t.flags|=2;const e=t.dep,i=Vt,s=ai;Vt=t,ai=!0;try{Gb(t);const a=t.fn(t._value);(e.version===0||Ae(a,t._value))&&(t.flags|=128,t._value=a,e.version++)}catch(a){throw e.version++,a}finally{Vt=i,ai=s,Vb(t),t.flags&=-3}}function Wl(t,e=!1){const{dep:i,prevSub:s,nextSub:a}=t;if(s&&(s.nextSub=a,t.prevSub=void 0),a&&(a.prevSub=s,t.nextSub=void 0),i.subs===t&&(i.subs=s,!s&&i.computed)){i.computed.flags&=-5;for(let o=i.computed.deps;o;o=o.nextDep)Wl(o,!0)}!e&&!--i.sc&&i.map&&i.map.delete(i.key)}function J2(t){const{prevDep:e,nextDep:i}=t;e&&(e.nextDep=i,t.prevDep=void 0),i&&(i.prevDep=e,t.nextDep=void 0)}let ai=!0;const Kb=[];function ji(){Kb.push(ai),ai=!1}function Mi(){const t=Kb.pop();ai=t===void 0?!0:t}function Gu(t){const{cleanup:e}=t;if(t.cleanup=void 0,e){const i=Vt;Vt=void 0;try{e()}finally{Vt=i}}}let La=0;class Z2{constructor(e,i){this.sub=e,this.dep=i,this.version=i.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ar{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!Vt||!ai||Vt===this.computed)return;let i=this.activeLink;if(i===void 0||i.sub!==Vt)i=this.activeLink=new Z2(Vt,this),Vt.deps?(i.prevDep=Vt.depsTail,Vt.depsTail.nextDep=i,Vt.depsTail=i):Vt.deps=Vt.depsTail=i,Yb(i);else if(i.version===-1&&(i.version=this.version,i.nextDep)){const s=i.nextDep;s.prevDep=i.prevDep,i.prevDep&&(i.prevDep.nextDep=s),i.prevDep=Vt.depsTail,i.nextDep=void 0,Vt.depsTail.nextDep=i,Vt.depsTail=i,Vt.deps===i&&(Vt.deps=s)}return i}trigger(e){this.version++,La++,this.notify(e)}notify(e){jl();try{for(let i=this.subs;i;i=i.prevSub)i.sub.notify()&&i.sub.dep.notify()}finally{Ml()}}}function Yb(t){if(t.dep.sc++,t.sub.flags&4){const e=t.dep.computed;if(e&&!t.dep.subs){e.flags|=20;for(let s=e.deps;s;s=s.nextDep)Yb(s)}const i=t.dep.subs;i!==t&&(t.prevSub=i,i&&(i.nextSub=t)),t.dep.subs=t}}const Vo=new WeakMap,ys=Symbol(""),Hn=Symbol(""),Ua=Symbol("");function xe(t,e,i){if(ai&&Vt){let s=Vo.get(t);s||Vo.set(t,s=new Map);let a=s.get(i);a||(s.set(i,a=new Ar),a.map=s,a.key=i),a.track()}}function qi(t,e,i,s,a,o){const r=Vo.get(t);if(!r){La++;return}const n=l=>{l&&l.trigger()};if(jl(),e==="clear")r.forEach(n);else{const l=pt(t),u=l&&gr(i);if(l&&i==="length"){const d=Number(s);r.forEach((c,_)=>{(_==="length"||_===Ua||!He(_)&&_>=d)&&n(c)})}else switch((i!==void 0||r.has(void 0))&&n(r.get(i)),u&&n(r.get(Ua)),e){case"add":l?u&&n(r.get("length")):(n(r.get(ys)),Ys(t)&&n(r.get(Hn)));break;case"delete":l||(n(r.get(ys)),Ys(t)&&n(r.get(Hn)));break;case"set":Ys(t)&&n(r.get(ys));break}}Ml()}function X2(t,e){const i=Vo.get(t);return i&&i.get(e)}function qs(t){const e=St(t);return e===t?e:(xe(e,"iterate",Ua),Me(t)?e:e.map(oi))}function xr(t){return xe(t=St(t),"iterate",Ua),t}function fi(t,e){return Wi(t)?ta(Li(t)?oi(e):e):oi(e)}const tm={__proto__:null,[Symbol.iterator](){return on(this,Symbol.iterator,t=>fi(this,t))},concat(...t){return qs(this).concat(...t.map(e=>pt(e)?qs(e):e))},entries(){return on(this,"entries",t=>(t[1]=fi(this,t[1]),t))},every(t,e){return Fi(this,"every",t,e,void 0,arguments)},filter(t,e){return Fi(this,"filter",t,e,i=>i.map(s=>fi(this,s)),arguments)},find(t,e){return Fi(this,"find",t,e,i=>fi(this,i),arguments)},findIndex(t,e){return Fi(this,"findIndex",t,e,void 0,arguments)},findLast(t,e){return Fi(this,"findLast",t,e,i=>fi(this,i),arguments)},findLastIndex(t,e){return Fi(this,"findLastIndex",t,e,void 0,arguments)},forEach(t,e){return Fi(this,"forEach",t,e,void 0,arguments)},includes(...t){return rn(this,"includes",t)},indexOf(...t){return rn(this,"indexOf",t)},join(t){return qs(this).join(t)},lastIndexOf(...t){return rn(this,"lastIndexOf",t)},map(t,e){return Fi(this,"map",t,e,void 0,arguments)},pop(){return ma(this,"pop")},push(...t){return ma(this,"push",t)},reduce(t,...e){return Vu(this,"reduce",t,e)},reduceRight(t,...e){return Vu(this,"reduceRight",t,e)},shift(){return ma(this,"shift")},some(t,e){return Fi(this,"some",t,e,void 0,arguments)},splice(...t){return ma(this,"splice",t)},toReversed(){return qs(this).toReversed()},toSorted(t){return qs(this).toSorted(t)},toSpliced(...t){return qs(this).toSpliced(...t)},unshift(...t){return ma(this,"unshift",t)},values(){return on(this,"values",t=>fi(this,t))}};function on(t,e,i){const s=xr(t),a=s[e]();return s!==t&&!Me(t)&&(a._next=a.next,a.next=()=>{const o=a._next();return o.done||(o.value=i(o.value)),o}),a}const em=Array.prototype;function Fi(t,e,i,s,a,o){const r=xr(t),n=r!==t&&!Me(t),l=r[e];if(l!==em[e]){const c=l.apply(t,o);return n?oi(c):c}let u=i;r!==t&&(n?u=function(c,_){return i.call(this,fi(t,c),_,t)}:i.length>2&&(u=function(c,_){return i.call(this,c,_,t)}));const d=l.call(r,u,s);return n&&a?a(d):d}function Vu(t,e,i,s){const a=xr(t),o=a!==t&&!Me(t);let r=i,n=!1;a!==t&&(o?(n=s.length===0,r=function(u,d,c){return n&&(n=!1,u=fi(t,u)),i.call(this,u,fi(t,d),c,t)}):i.length>3&&(r=function(u,d,c){return i.call(this,u,d,c,t)}));const l=a[e](r,...s);return n?fi(t,l):l}function rn(t,e,i){const s=St(t);xe(s,"iterate",Ua);const a=s[e](...i);return(a===-1||a===!1)&&Fr(i[0])?(i[0]=St(i[0]),s[e](...i)):a}function ma(t,e,i=[]){ji(),jl();const s=St(t)[e].apply(t,i);return Ml(),Mi(),s}const im=Dl("__proto__,__v_isRef,__isVue"),Jb=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(He));function sm(t){He(t)||(t=String(t));const e=St(this);return xe(e,"has",t),e.hasOwnProperty(t)}class Zb{constructor(e=!1,i=!1){this._isReadonly=e,this._isShallow=i}get(e,i,s){if(i==="__v_skip")return e.__v_skip;const a=this._isReadonly,o=this._isShallow;if(i==="__v_isReactive")return!a;if(i==="__v_isReadonly")return a;if(i==="__v_isShallow")return o;if(i==="__v_raw")return s===(a?o?a_:s_:o?i_:e_).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(s)?e:void 0;const r=pt(e);if(!a){let l;if(r&&(l=tm[i]))return l;if(i==="hasOwnProperty")return sm}const n=Reflect.get(e,i,Yt(e)?e:s);if((He(i)?Jb.has(i):im(i))||(a||xe(e,"get",i),o))return n;if(Yt(n)){const l=r&&gr(i)?n:n.value;return a&&Lt(l)?ss(l):l}return Lt(n)?a?ss(n):Ps(n):n}}class Xb extends Zb{constructor(e=!1){super(!1,e)}set(e,i,s,a){let o=e[i];const r=pt(e)&&gr(i);if(!this._isShallow){const u=Wi(o);if(!Me(s)&&!Wi(s)&&(o=St(o),s=St(s)),!r&&Yt(o)&&!Yt(s))return u||(o.value=s),!0}const n=r?Number(i)t,mo=t=>Reflect.getPrototypeOf(t);function lm(t,e,i){return function(...s){const a=this.__v_raw,o=St(a),r=Ys(o),n=t==="entries"||t===Symbol.iterator&&r,l=t==="keys"&&r,u=a[t](...s),d=i?Gn:e?ta:oi;return!e&&xe(o,"iterate",l?Hn:ys),de(Object.create(u),{next(){const{value:c,done:_}=u.next();return _?{value:c,done:_}:{value:n?[d(c[0]),d(c[1])]:d(c),done:_}}})}}function go(t){return function(...e){return t==="delete"?!1:t==="clear"?void 0:this}}function um(t,e){const i={get(a){const o=this.__v_raw,r=St(o),n=St(a);t||(Ae(a,n)&&xe(r,"get",a),xe(r,"get",n));const{has:l}=mo(r),u=e?Gn:t?ta:oi;if(l.call(r,a))return u(o.get(a));if(l.call(r,n))return u(o.get(n));o!==r&&o.get(a)},get size(){const a=this.__v_raw;return!t&&xe(St(a),"iterate",ys),a.size},has(a){const o=this.__v_raw,r=St(o),n=St(a);return t||(Ae(a,n)&&xe(r,"has",a),xe(r,"has",n)),a===n?o.has(a):o.has(a)||o.has(n)},forEach(a,o){const r=this,n=r.__v_raw,l=St(n),u=e?Gn:t?ta:oi;return!t&&xe(l,"iterate",ys),n.forEach((d,c)=>a.call(o,u(d),u(c),r))}};return de(i,t?{add:go("add"),set:go("set"),delete:go("delete"),clear:go("clear")}:{add(a){const o=St(this),r=mo(o),n=St(a),l=!e&&!Me(a)&&!Wi(a)?n:a;return r.has.call(o,l)||Ae(a,l)&&r.has.call(o,a)||Ae(n,l)&&r.has.call(o,n)||(o.add(l),qi(o,"add",l,l)),this},set(a,o){!e&&!Me(o)&&!Wi(o)&&(o=St(o));const r=St(this),{has:n,get:l}=mo(r);let u=n.call(r,a);u||(a=St(a),u=n.call(r,a));const d=l.call(r,a);return r.set(a,o),u?Ae(o,d)&&qi(r,"set",a,o):qi(r,"add",a,o),this},delete(a){const o=St(this),{has:r,get:n}=mo(o);let l=r.call(o,a);l||(a=St(a),l=r.call(o,a)),n&&n.call(o,a);const u=o.delete(a);return l&&qi(o,"delete",a,void 0),u},clear(){const a=St(this),o=a.size!==0,r=a.clear();return o&&qi(a,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(a=>{i[a]=lm(a,t,e)}),i}function Tr(t,e){const i=um(t,e);return(s,a,o)=>a==="__v_isReactive"?!t:a==="__v_isReadonly"?t:a==="__v_raw"?s:Reflect.get(Wt(i,a)&&a in s?i:s,a,o)}const dm={get:Tr(!1,!1)},cm={get:Tr(!1,!0)},bm={get:Tr(!0,!1)},_m={get:Tr(!0,!0)},e_=new WeakMap,i_=new WeakMap,s_=new WeakMap,a_=new WeakMap;function hm(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ps(t){return Wi(t)?t:Sr(t,!1,am,dm,e_)}function o_(t){return Sr(t,!1,rm,cm,i_)}function ss(t){return Sr(t,!0,om,bm,s_)}function Ai(t){return Sr(t,!0,nm,_m,a_)}function Sr(t,e,i,s,a){if(!Lt(t)||t.__v_raw&&!(e&&t.__v_isReactive)||t.__v_skip||!Object.isExtensible(t))return t;const o=a.get(t);if(o)return o;const r=hm(j2(t));if(r===0)return t;const n=new Proxy(t,r===2?s:i);return a.set(t,n),n}function Li(t){return Wi(t)?Li(t.__v_raw):!!(t&&t.__v_isReactive)}function Wi(t){return!!(t&&t.__v_isReadonly)}function Me(t){return!!(t&&t.__v_isShallow)}function Fr(t){return t?!!t.__v_raw:!1}function St(t){const e=t&&t.__v_raw;return e?St(e):t}function Pr(t){return!Wt(t,"__v_skip")&&Object.isExtensible(t)&&Lb(t,"__v_skip",!0),t}const oi=t=>Lt(t)?Ps(t):t,ta=t=>Lt(t)?ss(t):t;function Yt(t){return t?t.__v_isRef===!0:!1}function vt(t){return r_(t,!1)}function Rt(t){return r_(t,!0)}function r_(t,e){return Yt(t)?t:new pm(t,e)}class pm{constructor(e,i){this.dep=new Ar,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=i?e:St(e),this._value=i?e:oi(e),this.__v_isShallow=i}get value(){return this.dep.track(),this._value}set value(e){const i=this._rawValue,s=this.__v_isShallow||Me(e)||Wi(e);e=s?e:St(e),Ae(e,i)&&(this._rawValue=e,this._value=s?e:oi(e),this.dep.trigger())}}function G(t){return Yt(t)?t.value:t}function Ft(t){return wt(t)?t():G(t)}const mm={get:(t,e,i)=>e==="__v_raw"?t:G(Reflect.get(t,e,i)),set:(t,e,i,s)=>{const a=t[e];return Yt(a)&&!Yt(i)?(a.value=i,!0):Reflect.set(t,e,i,s)}};function n_(t){return Li(t)?t:new Proxy(t,mm)}class gm{constructor(e){this.__v_isRef=!0,this._value=void 0;const i=this.dep=new Ar,{get:s,set:a}=e(i.track.bind(i),i.trigger.bind(i));this._get=s,this._set=a}get value(){return this._value=this._get()}set value(e){this._set(e)}}function Er(t){return new gm(t)}function fm(t){const e=pt(t)?new Array(t.length):{};for(const i in t)e[i]=l_(t,i);return e}class vm{constructor(e,i,s){this._object=e,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=He(i)?i:String(i),this._raw=St(e);let a=!0,o=e;if(!pt(e)||He(this._key)||!gr(this._key))do a=!Fr(o)||Me(o);while(a&&(o=o.__v_raw));this._shallow=a}get value(){let e=this._object[this._key];return this._shallow&&(e=G(e)),this._value=e===void 0?this._defaultValue:e}set value(e){if(this._shallow&&Yt(this._raw[this._key])){const i=this._object[this._key];if(Yt(i)){i.value=e;return}}this._object[this._key]=e}get dep(){return X2(this._raw,this._key)}}class wm{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Bl(t,e,i){return Yt(t)?t:wt(t)?new wm(t):Lt(t)&&arguments.length>1?l_(t,e,i):vt(t)}function l_(t,e,i){return new vm(t,e,i)}class ym{constructor(e,i,s){this.fn=e,this.setter=i,this._value=void 0,this.dep=new Ar(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=La-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!i,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Vt!==this)return Hb(this,!0),!0}get value(){const e=this.dep.track();return Qb(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}function km(t,e,i=!1){let s,a;return wt(t)?s=t:(s=t.get,a=t.set),new ym(s,a,i)}const fo={},Qo=new WeakMap;let ms;function Am(t,e=!1,i=ms){if(i){let s=Qo.get(i);s||Qo.set(i,s=[]),s.push(t)}}function xm(t,e,i=qt){const{immediate:s,deep:a,once:o,scheduler:r,augmentJob:n,call:l}=i,u=f=>a?f:Me(f)||a===!1||a===0?Ci(f,1):Ci(f);let d,c,_,p,v=!1,g=!1;if(Yt(t)?(c=()=>t.value,v=Me(t)):Li(t)?(c=()=>u(t),v=!0):pt(t)?(g=!0,v=t.some(f=>Li(f)||Me(f)),c=()=>t.map(f=>{if(Yt(f))return f.value;if(Li(f))return u(f);if(wt(f))return l?l(f,2):f()})):wt(t)?e?c=l?()=>l(t,2):t:c=()=>{if(_){ji();try{_()}finally{Mi()}}const f=ms;ms=d;try{return l?l(t,3,[p]):t(p)}finally{ms=f}}:c=ki,e&&a){const f=c,T=a===!0?1/0:a;c=()=>Ci(f(),T)}const y=Gi(),m=()=>{d.stop(),y&&y.active&&Nl(y.effects,d)};if(o&&e){const f=e;e=(...T)=>{f(...T),m()}}let w=g?new Array(t.length).fill(fo):fo;const x=f=>{if(!(!(d.flags&1)||!d.dirty&&!f))if(e){const T=d.run();if(a||v||(g?T.some((P,F)=>Ae(P,w[F])):Ae(T,w))){_&&_();const P=ms;ms=d;try{const F=[T,w===fo?void 0:g&&w[0]===fo?[]:w,p];w=T,l?l(e,3,F):e(...F)}finally{ms=P}}}else d.run()};return n&&n(x),d=new Bb(c),d.scheduler=r?()=>r(x,!1):x,p=f=>Am(f,!1,d),_=d.onStop=()=>{const f=Qo.get(d);if(f){if(l)l(f,4);else for(const T of f)T();Qo.delete(d)}},e?s?x(!0):w=d.run():r?r(x.bind(null,!0),!0):d.run(),m.pause=d.pause.bind(d),m.resume=d.resume.bind(d),m.stop=m,m}function Ci(t,e=1/0,i){if(e<=0||!Lt(t)||t.__v_skip||(i=i||new Map,(i.get(t)||0)>=e))return t;if(i.set(t,e),e--,Yt(t))Ci(t.value,e,i);else if(pt(t))for(let s=0;s{Ci(s,e,i)});else if(Nb(t)){for(const s in t)Ci(t[s],e,i);for(const s of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,s)&&Ci(t[s],e,i)}return t}function Xa(t,e,i,s){try{return s?t(...s):t()}catch(a){Or(a,e,i)}}function ii(t,e,i,s){if(wt(t)){const a=Xa(t,e,i,s);return a&&zb(a)&&a.catch(o=>{Or(o,e,i)}),a}if(pt(t)){const a=[];for(let o=0;o>>1,a=Re[s],o=ja(a);o=ja(i)?Re.push(t):Re.splice(Sm(e),0,t),t.flags|=1,d_()}}function d_(){Ko||(Ko=u_.then(b_))}function Fm(t){pt(t)?Js.push(...t):ts&&t.id===-1?ts.splice(Ms+1,0,t):t.flags&1||(Js.push(t),t.flags|=1),d_()}function Qu(t,e,i=gi+1){for(;ija(i)-ja(s));if(Js.length=0,ts){ts.push(...e);return}for(ts=e,Ms=0;Mst.id==null?t.flags&2?-1:1/0:t.id;function b_(t){try{for(gi=0;gi{s._d&&tr(-1);const o=Yo(e);let r;try{r=t(...a)}finally{Yo(o),s._d&&tr(1)}return r};return s._n=!0,s._c=!0,s._d=!0,s}function Ma(t,e){if(ve===null)return t;const i=zr(ve),s=t.dirs||(t.dirs=[]);for(let a=0;a1)return i&&wt(e)?e.call(s&&s.proxy):e}}function Es(){return!!(ge()||ks)}const Pm=Symbol.for("v-scx"),Em=()=>Jt(Pm);function Hl(t,e){return Rr(t,null,e)}function Om(t,e){return Rr(t,null,{flush:"sync"})}function Bt(t,e,i){return Rr(t,e,i)}function Rr(t,e,i=qt){const{immediate:s,deep:a,flush:o,once:r}=i,n=de({},i),l=e&&s||!e&&o!=="post";let u;if($a){if(o==="sync"){const p=Em();u=p.__watcherHandles||(p.__watcherHandles=[])}else if(!l){const p=()=>{};return p.stop=ki,p.resume=ki,p.pause=ki,p}}const d=Se;n.call=(p,v,g)=>ii(p,d,v,g);let c=!1;o==="post"?n.scheduler=p=>{De(p,d&&d.suspense)}:o!=="sync"&&(c=!0,n.scheduler=(p,v)=>{v?p():$l(p)}),n.augmentJob=p=>{e&&(p.flags|=4),c&&(p.flags|=2,d&&(p.id=d.uid,p.i=d))};const _=xm(t,e,n);return $a&&(u?u.push(_):l&&_()),_}function Rm(t,e,i){const s=this.proxy,a=ie(t)?t.includes(".")?h_(s,t):()=>s[t]:t.bind(s,s);let o;wt(e)?o=e:(o=e.handler,i=e);const r=eo(this),n=Rr(a,o.bind(s),i);return r(),n}function h_(t,e){const i=e.split(".");return()=>{let s=t;for(let a=0;at.__isTeleport,Ke=Symbol("_leaveCb"),ga=Symbol("_enterCb");function m_(){const t={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ie(()=>{t.isMounted=!0}),S_(()=>{t.isUnmounting=!0}),t}const Ve=[Function,Array],g_={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ve,onEnter:Ve,onAfterEnter:Ve,onEnterCancelled:Ve,onBeforeLeave:Ve,onLeave:Ve,onAfterLeave:Ve,onLeaveCancelled:Ve,onBeforeAppear:Ve,onAppear:Ve,onAfterAppear:Ve,onAppearCancelled:Ve},f_=t=>{const e=t.subTree;return e.component?f_(e.component):e},Cm={name:"BaseTransition",props:g_,setup(t,{slots:e}){const i=ge(),s=m_();return()=>{const a=e.default&&Gl(e.default(),!0),o=a&&a.length?v_(a):i.subTree?it():void 0;if(!o)return;const r=St(t),{mode:n}=r;if(s.isLeaving)return nn(o);const l=Ku(o);if(!l)return nn(o);let u=Wa(l,r,s,i,c=>u=c);l.type!==Te&&xs(l,u);let d=i.subTree&&Ku(i.subTree);if(d&&d.type!==Te&&!gs(d,l)&&f_(i).type!==Te){let c=Wa(d,r,s,i);if(xs(d,c),n==="out-in"&&l.type!==Te)return s.isLeaving=!0,c.afterLeave=()=>{s.isLeaving=!1,i.job.flags&8||i.update(),delete c.afterLeave,d=void 0},nn(o);n==="in-out"&&l.type!==Te?c.delayLeave=(_,p,v)=>{const g=w_(s,d);g[String(d.key)]=d,_[Ke]=()=>{p(),_[Ke]=void 0,delete u.delayedLeave,d=void 0},u.delayedLeave=()=>{v(),delete u.delayedLeave,d=void 0}}:d=void 0}else d&&(d=void 0);return o}}};function v_(t){let e=t[0];if(t.length>1){for(const i of t)if(i.type!==Te){e=i;break}}return e}const Im=Cm;function w_(t,e){const{leavingVNodes:i}=t;let s=i.get(e.type);return s||(s=Object.create(null),i.set(e.type,s)),s}function Wa(t,e,i,s,a){const{appear:o,mode:r,persisted:n=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:d,onEnterCancelled:c,onBeforeLeave:_,onLeave:p,onAfterLeave:v,onLeaveCancelled:g,onBeforeAppear:y,onAppear:m,onAfterAppear:w,onAppearCancelled:x}=e,f=String(t.key),T=w_(i,t),P=(q,N)=>{q&&ii(q,s,9,N)},F=(q,N)=>{const Q=N[1];P(q,N),pt(q)?q.every(z=>z.length<=1)&&Q():q.length<=1&&Q()},B={mode:r,persisted:n,beforeEnter(q){let N=l;if(!i.isMounted)if(o)N=y||l;else return;q[Ke]&&q[Ke](!0);const Q=T[f];Q&&gs(t,Q)&&Q.el[Ke]&&Q.el[Ke](),P(N,[q])},enter(q){if(T[f]===t)return;let N=u,Q=d,z=c;if(!i.isMounted)if(o)N=m||u,Q=w||d,z=x||c;else return;let X=!1;q[ga]=tt=>{X||(X=!0,tt?P(z,[q]):P(Q,[q]),B.delayedLeave&&B.delayedLeave(),q[ga]=void 0)};const L=q[ga].bind(null,!1);N?F(N,[q,L]):L()},leave(q,N){const Q=String(t.key);if(q[ga]&&q[ga](!0),i.isUnmounting)return N();P(_,[q]);let z=!1;q[Ke]=L=>{z||(z=!0,N(),L?P(g,[q]):P(v,[q]),q[Ke]=void 0,T[Q]===t&&delete T[Q])};const X=q[Ke].bind(null,!1);T[Q]=t,p?F(p,[q,X]):X()},clone(q){const N=Wa(q,e,i,s,a);return a&&a(N),N}};return B}function nn(t){if(qr(t))return t=as(t),t.children=null,t}function Ku(t){if(!qr(t))return p_(t.type)&&t.children?v_(t.children):t;if(t.component)return t.component.subTree;const{shapeFlag:e,children:i}=t;if(i){if(e&16)return i[0];if(e&32&&wt(i.default))return i.default()}}function xs(t,e){t.shapeFlag&6&&t.component?(t.transition=e,xs(t.component.subTree,e)):t.shapeFlag&128?(t.ssContent.transition=e.clone(t.ssContent),t.ssFallback.transition=e.clone(t.ssFallback)):t.transition=e}function Gl(t,e=!1,i){let s=[],a=0;for(let o=0;o1)for(let o=0;oi.value,set:o=>i.value=o})}return i}function Yu(t,e){let i;return!!((i=Object.getOwnPropertyDescriptor(t,e))&&!i.configurable)}const Jo=new WeakMap;function Oa(t,e,i,s,a=!1){if(pt(t)){t.forEach((g,y)=>Oa(g,e&&(pt(e)?e[y]:e),i,s,a));return}if(Zs(s)&&!a){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Oa(t,e,i,s.component.subTree);return}const o=s.shapeFlag&4?zr(s.component):s.el,r=a?null:o,{i:n,r:l}=t,u=e&&e.r,d=n.refs===qt?n.refs={}:n.refs,c=n.setupState,_=St(c),p=c===qt?Ib:g=>Yu(d,g)?!1:Wt(_,g),v=(g,y)=>!(y&&Yu(d,y));if(u!=null&&u!==l){if(Ju(e),ie(u))d[u]=null,p(u)&&(c[u]=null);else if(Yt(u)){const g=e;v(u,g.k)&&(u.value=null),g.k&&(d[g.k]=null)}}if(wt(l))Xa(l,n,12,[r,d]);else{const g=ie(l),y=Yt(l);if(g||y){const m=()=>{if(t.f){const w=g?p(l)?c[l]:d[l]:v()||!t.k?l.value:d[t.k];if(a)pt(w)&&Nl(w,o);else if(pt(w))w.includes(o)||w.push(o);else if(g)d[l]=[o],p(l)&&(c[l]=d[l]);else{const x=[o];v(l,t.k)&&(l.value=x),t.k&&(d[t.k]=x)}}else g?(d[l]=r,p(l)&&(c[l]=r)):y&&(v(l,t.k)&&(l.value=r),t.k&&(d[t.k]=r))};if(r){const w=()=>{m(),Jo.delete(t)};w.id=-1,Jo.set(t,w),De(w,i)}else Ju(t),m()}}}function Ju(t){const e=Jo.get(t);e&&(e.flags|=8,Jo.delete(t))}yr().requestIdleCallback;yr().cancelIdleCallback;const Zs=t=>!!t.type.__asyncLoader,qr=t=>t.type.__isKeepAlive;function k_(t,e){x_(t,"a",e)}function A_(t,e){x_(t,"da",e)}function x_(t,e,i=Se){const s=t.__wdc||(t.__wdc=()=>{let a=i;for(;a;){if(a.isDeactivated)return;a=a.parent}return t()});if(Cr(e,s,i),i){let a=i.parent;for(;a&&a.parent;)qr(a.parent.vnode)&&zm(s,e,i,a),a=a.parent}}function zm(t,e,i,s){const a=Cr(e,t,s,!0);Qi(()=>{Nl(s[e],a)},i)}function Cr(t,e,i=Se,s=!1){if(i){const a=i[t]||(i[t]=[]),o=e.__weh||(e.__weh=(...r)=>{ji();const n=eo(i),l=ii(e,i,t,r);return n(),Mi(),l});return s?a.unshift(o):a.push(o),o}}const Vi=t=>(e,i=Se)=>{(!$a||t==="sp")&&Cr(t,(...s)=>e(...s),i)},Dm=Vi("bm"),Ie=Vi("m"),Nm=Vi("bu"),T_=Vi("u"),S_=Vi("bum"),Qi=Vi("um"),Lm=Vi("sp"),Um=Vi("rtg"),jm=Vi("rtc");function Mm(t,e=Se){Cr("ec",t,e)}const F_="components";function to(t,e){return E_(F_,t,!0,e)||t}const P_=Symbol.for("v-ndc");function Wm(t){return ie(t)?E_(F_,t,!1)||t:t||P_}function E_(t,e,i=!0,s=!1){const a=ve||Se;if(a){const o=a.type;{const n=Tg(o,!1);if(n&&(n===e||n===Pe(e)||n===vr(Pe(e))))return o}const r=Zu(a[t]||o[t],e)||Zu(a.appContext[t],e);return!r&&s?o:r}}function Zu(t,e){return t&&(t[e]||t[Pe(e)]||t[vr(Pe(e))])}function da(t,e,i,s){let a;const o=i&&i[s],r=pt(t);if(r||ie(t)){const n=r&&Li(t);let l=!1,u=!1;n&&(l=!Me(t),u=Wi(t),t=xr(t)),a=new Array(t.length);for(let d=0,c=t.length;de(n,l,void 0,o&&o[l]));else{const n=Object.keys(t);a=new Array(n.length);for(let l=0,u=n.length;l{const o=s.fn(...a);return o&&(o.key=s.key),o}:s.fn)}return t}function ee(t,e,i={},s,a){if(ve.ce||ve.parent&&Zs(ve.parent)&&ve.parent.ce){const u=Object.keys(i).length>0;return e!=="default"&&(i.name=e),D(),Nt(xt,null,[rt("slot",i,s&&s())],u?-2:64)}let o=t[e];o&&o._c&&(o._d=!1),D();const r=o&&O_(o(i)),n=i.key||r&&r.key,l=Nt(xt,{key:(n&&!He(n)?n:`_${e}`)+(!r&&s?"_fb":"")},r||(s?s():[]),r&&t._===1?64:-2);return!a&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),o&&o._c&&(o._d=!0),l}function O_(t){return t.some(e=>ea(e)?!(e.type===Te||e.type===xt&&!O_(e.children)):!0)?t:null}const Vn=t=>t?J_(t)?zr(t):Vn(t.parent):null,Ra=de(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>Vn(t.parent),$root:t=>Vn(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>q_(t),$forceUpdate:t=>t.f||(t.f=()=>{$l(t.update)}),$nextTick:t=>t.n||(t.n=si.bind(t.proxy)),$watch:t=>Rm.bind(t)}),ln=(t,e)=>t!==qt&&!t.__isScriptSetup&&Wt(t,e),Bm={get({_:t},e){if(e==="__v_skip")return!0;const{ctx:i,setupState:s,data:a,props:o,accessCache:r,type:n,appContext:l}=t;if(e[0]!=="$"){const _=r[e];if(_!==void 0)switch(_){case 1:return s[e];case 2:return a[e];case 4:return i[e];case 3:return o[e]}else{if(ln(s,e))return r[e]=1,s[e];if(a!==qt&&Wt(a,e))return r[e]=2,a[e];if(Wt(o,e))return r[e]=3,o[e];if(i!==qt&&Wt(i,e))return r[e]=4,i[e];Qn&&(r[e]=0)}}const u=Ra[e];let d,c;if(u)return e==="$attrs"&&xe(t.attrs,"get",""),u(t);if((d=n.__cssModules)&&(d=d[e]))return d;if(i!==qt&&Wt(i,e))return r[e]=4,i[e];if(c=l.config.globalProperties,Wt(c,e))return c[e]},set({_:t},e,i){const{data:s,setupState:a,ctx:o}=t;return ln(a,e)?(a[e]=i,!0):s!==qt&&Wt(s,e)?(s[e]=i,!0):Wt(t.props,e)||e[0]==="$"&&e.slice(1)in t?!1:(o[e]=i,!0)},has({_:{data:t,setupState:e,accessCache:i,ctx:s,appContext:a,props:o,type:r}},n){let l;return!!(i[n]||t!==qt&&n[0]!=="$"&&Wt(t,n)||ln(e,n)||Wt(o,n)||Wt(s,n)||Wt(Ra,n)||Wt(a.config.globalProperties,n)||(l=r.__cssModules)&&l[n])},defineProperty(t,e,i){return i.get!=null?t._.accessCache[e]=0:Wt(i,"value")&&this.set(t,e,i.value,null),Reflect.defineProperty(t,e,i)}};function $m(){return Hm().attrs}function Hm(t){const e=ge();return e.setupContext||(e.setupContext=X_(e))}function Zo(t){return pt(t)?t.reduce((e,i)=>(e[i]=null,e),{}):t}function Bi(t,e){return!t||!e?t||e:pt(t)&&pt(e)?t.concat(e):de({},Zo(t),Zo(e))}let Qn=!0;function Gm(t){const e=q_(t),i=t.proxy,s=t.ctx;Qn=!1,e.beforeCreate&&Xu(e.beforeCreate,t,"bc");const{data:a,computed:o,methods:r,watch:n,provide:l,inject:u,created:d,beforeMount:c,mounted:_,beforeUpdate:p,updated:v,activated:g,deactivated:y,beforeDestroy:m,beforeUnmount:w,destroyed:x,unmounted:f,render:T,renderTracked:P,renderTriggered:F,errorCaptured:B,serverPrefetch:q,expose:N,inheritAttrs:Q,components:z,directives:X,filters:L}=e;if(u&&Vm(u,s,null),r)for(const ht in r){const mt=r[ht];wt(mt)&&(s[ht]=mt.bind(i))}if(a){const ht=a.call(i,i);Lt(ht)&&(t.data=Ps(ht))}if(Qn=!0,o)for(const ht in o){const mt=o[ht],yt=wt(mt)?mt.bind(i,i):wt(mt.get)?mt.get.bind(i,i):ki,Pt=!wt(mt)&&wt(mt.set)?mt.set.bind(i):ki,_t=st({get:yt,set:Pt});Object.defineProperty(s,ht,{enumerable:!0,configurable:!0,get:()=>_t.value,set:lt=>_t.value=lt})}if(n)for(const ht in n)R_(n[ht],s,i,ht);if(l){const ht=wt(l)?l.call(i):l;Reflect.ownKeys(ht).forEach(mt=>{zo(mt,ht[mt])})}d&&Xu(d,t,"c");function et(ht,mt){pt(mt)?mt.forEach(yt=>ht(yt.bind(i))):mt&&ht(mt.bind(i))}if(et(Dm,c),et(Ie,_),et(Nm,p),et(T_,v),et(k_,g),et(A_,y),et(Mm,B),et(jm,P),et(Um,F),et(S_,w),et(Qi,f),et(Lm,q),pt(N))if(N.length){const ht=t.exposed||(t.exposed={});N.forEach(mt=>{Object.defineProperty(ht,mt,{get:()=>i[mt],set:yt=>i[mt]=yt,enumerable:!0})})}else t.exposed||(t.exposed={});T&&t.render===ki&&(t.render=T),Q!=null&&(t.inheritAttrs=Q),z&&(t.components=z),X&&(t.directives=X),q&&y_(t)}function Vm(t,e,i=ki){pt(t)&&(t=Kn(t));for(const s in t){const a=t[s];let o;Lt(a)?"default"in a?o=Jt(a.from||s,a.default,!0):o=Jt(a.from||s):o=Jt(a),Yt(o)?Object.defineProperty(e,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:r=>o.value=r}):e[s]=o}}function Xu(t,e,i){ii(pt(t)?t.map(s=>s.bind(e.proxy)):t.bind(e.proxy),e,i)}function R_(t,e,i,s){let a=s.includes(".")?h_(i,s):()=>i[s];if(ie(t)){const o=e[t];wt(o)&&Bt(a,o)}else if(wt(t))Bt(a,t.bind(i));else if(Lt(t))if(pt(t))t.forEach(o=>R_(o,e,i,s));else{const o=wt(t.handler)?t.handler.bind(i):e[t.handler];wt(o)&&Bt(a,o,t)}}function q_(t){const e=t.type,{mixins:i,extends:s}=e,{mixins:a,optionsCache:o,config:{optionMergeStrategies:r}}=t.appContext,n=o.get(e);let l;return n?l=n:!a.length&&!i&&!s?l=e:(l={},a.length&&a.forEach(u=>Xo(l,u,r,!0)),Xo(l,e,r)),Lt(e)&&o.set(e,l),l}function Xo(t,e,i,s=!1){const{mixins:a,extends:o}=e;o&&Xo(t,o,i,!0),a&&a.forEach(r=>Xo(t,r,i,!0));for(const r in e)if(!(s&&r==="expose")){const n=Qm[r]||i&&i[r];t[r]=n?n(t[r],e[r]):e[r]}return t}const Qm={data:td,props:ed,emits:ed,methods:Ta,computed:Ta,beforeCreate:Oe,created:Oe,beforeMount:Oe,mounted:Oe,beforeUpdate:Oe,updated:Oe,beforeDestroy:Oe,beforeUnmount:Oe,destroyed:Oe,unmounted:Oe,activated:Oe,deactivated:Oe,errorCaptured:Oe,serverPrefetch:Oe,components:Ta,directives:Ta,watch:Ym,provide:td,inject:Km};function td(t,e){return e?t?function(){return de(wt(t)?t.call(this,this):t,wt(e)?e.call(this,this):e)}:e:t}function Km(t,e){return Ta(Kn(t),Kn(e))}function Kn(t){if(pt(t)){const e={};for(let i=0;i{let d,c=qt,_;return Om(()=>{const p=t[a];Ae(d,p)&&(d=p,u())}),{get(){return l(),i.get?i.get(d):d},set(p){const v=i.set?i.set(p):p;if(!Ae(v,d)&&!(c!==qt&&Ae(p,c)))return;const g=s.vnode.props;g&&(e in g||a in g||o in g)&&(`onUpdate:${e}`in g||`onUpdate:${a}`in g||`onUpdate:${o}`in g)||(d=p,u()),s.emit(`update:${e}`,v),Ae(p,v)&&Ae(p,c)&&!Ae(v,_)&&u(),c=p,_=v}}});return n[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?r||qt:n,done:!1}:{done:!0}}}},n}const I_=(t,e)=>e==="modelValue"||e==="model-value"?t.modelModifiers:t[`${e}Modifiers`]||t[`${Pe(e)}Modifiers`]||t[`${Hi(e)}Modifiers`];function Xm(t,e,...i){if(t.isUnmounted)return;const s=t.vnode.props||qt;let a=i;const o=e.startsWith("update:"),r=o&&I_(s,e.slice(7));r&&(r.trim&&(a=i.map(d=>ie(d)?d.trim():d)),r.number&&(a=i.map(wr)));let n,l=s[n=en(e)]||s[n=en(Pe(e))];!l&&o&&(l=s[n=en(Hi(e))]),l&&ii(l,t,6,a);const u=s[n+"Once"];if(u){if(!t.emitted)t.emitted={};else if(t.emitted[n])return;t.emitted[n]=!0,ii(u,t,6,a)}}const tg=new WeakMap;function z_(t,e,i=!1){const s=i?tg:e.emitsCache,a=s.get(t);if(a!==void 0)return a;const o=t.emits;let r={},n=!1;if(!wt(t)){const l=u=>{const d=z_(u,e,!0);d&&(n=!0,de(r,d))};!i&&e.mixins.length&&e.mixins.forEach(l),t.extends&&l(t.extends),t.mixins&&t.mixins.forEach(l)}return!o&&!n?(Lt(t)&&s.set(t,null),null):(pt(o)?o.forEach(l=>r[l]=null):de(r,o),Lt(t)&&s.set(t,r),r)}function Ir(t,e){return!t||!pr(e)?!1:(e=e.slice(2).replace(/Once$/,""),Wt(t,e[0].toLowerCase()+e.slice(1))||Wt(t,Hi(e))||Wt(t,e))}function id(t){const{type:e,vnode:i,proxy:s,withProxy:a,propsOptions:[o],slots:r,attrs:n,emit:l,render:u,renderCache:d,props:c,data:_,setupState:p,ctx:v,inheritAttrs:g}=t,y=Yo(t);let m,w;try{if(i.shapeFlag&4){const f=a||s,T=f;m=vi(u.call(T,f,d,c,p,_,v)),w=n}else{const f=e;m=vi(f.length>1?f(c,{attrs:n,slots:r,emit:l}):f(c,null)),w=e.props?n:eg(n)}}catch(f){qa.length=0,Or(f,t,1),m=rt(Te)}let x=m;if(w&&g!==!1){const f=Object.keys(w),{shapeFlag:T}=x;f.length&&T&7&&(o&&f.some(mr)&&(w=ig(w,o)),x=as(x,w,!1,!0))}return i.dirs&&(x=as(x,null,!1,!0),x.dirs=x.dirs?x.dirs.concat(i.dirs):i.dirs),i.transition&&xs(x,i.transition),m=x,Yo(y),m}const eg=t=>{let e;for(const i in t)(i==="class"||i==="style"||pr(i))&&((e||(e={}))[i]=t[i]);return e},ig=(t,e)=>{const i={};for(const s in t)(!mr(s)||!(s.slice(9)in e))&&(i[s]=t[s]);return i};function sg(t,e,i){const{props:s,children:a,component:o}=t,{props:r,children:n,patchFlag:l}=e,u=o.emitsOptions;if(e.dirs||e.transition)return!0;if(i&&l>=0){if(l&1024)return!0;if(l&16)return s?sd(s,r,u):!!r;if(l&8){const d=e.dynamicProps;for(let c=0;cObject.create(N_),U_=t=>Object.getPrototypeOf(t)===N_;function og(t,e,i,s=!1){const a={},o=L_();t.propsDefaults=Object.create(null),j_(t,e,a,o);for(const r in t.propsOptions[0])r in a||(a[r]=void 0);i?t.props=s?a:o_(a):t.type.props?t.props=a:t.props=o,t.attrs=o}function rg(t,e,i,s){const{props:a,attrs:o,vnode:{patchFlag:r}}=t,n=St(a),[l]=t.propsOptions;let u=!1;if((s||r>0)&&!(r&16)){if(r&8){const d=t.vnode.dynamicProps;for(let c=0;c{l=!0;const[_,p]=M_(c,e,!0);de(r,_),p&&n.push(...p)};!i&&e.mixins.length&&e.mixins.forEach(d),t.extends&&d(t.extends),t.mixins&&t.mixins.forEach(d)}if(!o&&!l)return Lt(t)&&s.set(t,Ks),Ks;if(pt(o))for(let d=0;dt==="_"||t==="_ctx"||t==="$stable",Ql=t=>pt(t)?t.map(vi):[vi(t)],lg=(t,e,i)=>{if(e._n)return e;const s=$t((...a)=>Ql(e(...a)),i);return s._c=!1,s},W_=(t,e,i)=>{const s=t._ctx;for(const a in t){if(Vl(a))continue;const o=t[a];if(wt(o))e[a]=lg(a,o,s);else if(o!=null){const r=Ql(o);e[a]=()=>r}}},B_=(t,e)=>{const i=Ql(e);t.slots.default=()=>i},$_=(t,e,i)=>{for(const s in e)(i||!Vl(s))&&(t[s]=e[s])},ug=(t,e,i)=>{const s=t.slots=L_();if(t.vnode.shapeFlag&32){const a=e._;a?($_(s,e,i),i&&Lb(s,"_",a,!0)):W_(e,s)}else e&&B_(t,e)},dg=(t,e,i)=>{const{vnode:s,slots:a}=t;let o=!0,r=qt;if(s.shapeFlag&32){const n=e._;n?i&&n===1?o=!1:$_(a,e,i):(o=!e.$stable,W_(e,a)),r=e}else e&&(B_(t,e),r={default:1});if(o)for(const n in a)!Vl(n)&&r[n]==null&&delete a[n]},De=pg;function cg(t){return bg(t)}function bg(t,e){const i=yr();i.__VUE__=!0;const{insert:s,remove:a,patchProp:o,createElement:r,createText:n,createComment:l,setText:u,setElementText:d,parentNode:c,nextSibling:_,setScopeId:p=ki,insertStaticContent:v}=t,g=(S,O,C,M=null,H=null,$=null,b=void 0,h=null,A=!!O.dynamicChildren)=>{if(S===O)return;S&&!gs(S,O)&&(M=j(S),lt(S,H,$,!0),S=null),O.patchFlag===-2&&(A=!1,O.dynamicChildren=null);const{type:E,ref:Y,shapeFlag:U}=O;switch(E){case ca:y(S,O,C,M);break;case Te:m(S,O,C,M);break;case dn:S==null&&w(O,C,M,b);break;case xt:z(S,O,C,M,H,$,b,h,A);break;default:U&1?T(S,O,C,M,H,$,b,h,A):U&6?X(S,O,C,M,H,$,b,h,A):(U&64||U&128)&&E.process(S,O,C,M,H,$,b,h,A,ut)}Y!=null&&H?Oa(Y,S&&S.ref,$,O||S,!O):Y==null&&S&&S.ref!=null&&Oa(S.ref,null,$,S,!0)},y=(S,O,C,M)=>{if(S==null)s(O.el=n(O.children),C,M);else{const H=O.el=S.el;O.children!==S.children&&u(H,O.children)}},m=(S,O,C,M)=>{S==null?s(O.el=l(O.children||""),C,M):O.el=S.el},w=(S,O,C,M)=>{[S.el,S.anchor]=v(S.children,O,C,M,S.el,S.anchor)},x=({el:S,anchor:O},C,M)=>{let H;for(;S&&S!==O;)H=_(S),s(S,C,M),S=H;s(O,C,M)},f=({el:S,anchor:O})=>{let C;for(;S&&S!==O;)C=_(S),a(S),S=C;a(O)},T=(S,O,C,M,H,$,b,h,A)=>{if(O.type==="svg"?b="svg":O.type==="math"&&(b="mathml"),S==null)P(O,C,M,H,$,b,h,A);else{const E=S.el&&S.el._isVueCE?S.el:null;try{E&&E._beginPatch(),q(S,O,H,$,b,h,A)}finally{E&&E._endPatch()}}},P=(S,O,C,M,H,$,b,h)=>{let A,E;const{props:Y,shapeFlag:U,transition:k,dirs:R}=S;if(A=S.el=r(S.type,$,Y&&Y.is,Y),U&8?d(A,S.children):U&16&&B(S.children,A,null,M,H,un(S,$),b,h),R&&_s(S,null,M,"created"),F(A,S,S.scopeId,b,M),Y){for(const ot in Y)ot!=="value"&&!Fa(ot)&&o(A,ot,null,Y[ot],$,M);"value"in Y&&o(A,"value",null,Y.value,$),(E=Y.onVnodeBeforeMount)&&bi(E,M,S)}R&&_s(S,null,M,"beforeMount");const J=_g(H,k);J&&k.beforeEnter(A),s(A,O,C),((E=Y&&Y.onVnodeMounted)||J||R)&&De(()=>{E&&bi(E,M,S),J&&k.enter(A),R&&_s(S,null,M,"mounted")},H)},F=(S,O,C,M,H)=>{if(C&&p(S,C),M)for(let $=0;${for(let E=A;E{const h=O.el=S.el;let{patchFlag:A,dynamicChildren:E,dirs:Y}=O;A|=S.patchFlag&16;const U=S.props||qt,k=O.props||qt;let R;if(C&&hs(C,!1),(R=k.onVnodeBeforeUpdate)&&bi(R,C,O,S),Y&&_s(O,S,C,"beforeUpdate"),C&&hs(C,!0),(U.innerHTML&&k.innerHTML==null||U.textContent&&k.textContent==null)&&d(h,""),E?N(S.dynamicChildren,E,h,C,M,un(O,H),$):b||mt(S,O,h,null,C,M,un(O,H),$,!1),A>0){if(A&16)Q(h,U,k,C,H);else if(A&2&&U.class!==k.class&&o(h,"class",null,k.class,H),A&4&&o(h,"style",U.style,k.style,H),A&8){const J=O.dynamicProps;for(let ot=0;ot{R&&bi(R,C,O,S),Y&&_s(O,S,C,"updated")},M)},N=(S,O,C,M,H,$,b)=>{for(let h=0;h{if(O!==C){if(O!==qt)for(const $ in O)!Fa($)&&!($ in C)&&o(S,$,O[$],null,H,M);for(const $ in C){if(Fa($))continue;const b=C[$],h=O[$];b!==h&&$!=="value"&&o(S,$,h,b,H,M)}"value"in C&&o(S,"value",O.value,C.value,H)}},z=(S,O,C,M,H,$,b,h,A)=>{const E=O.el=S?S.el:n(""),Y=O.anchor=S?S.anchor:n("");let{patchFlag:U,dynamicChildren:k,slotScopeIds:R}=O;R&&(h=h?h.concat(R):R),S==null?(s(E,C,M),s(Y,C,M),B(O.children||[],C,Y,H,$,b,h,A)):U>0&&U&64&&k&&S.dynamicChildren&&S.dynamicChildren.length===k.length?(N(S.dynamicChildren,k,C,H,$,b,h),(O.key!=null||H&&O===H.subTree)&&H_(S,O,!0)):mt(S,O,C,Y,H,$,b,h,A)},X=(S,O,C,M,H,$,b,h,A)=>{O.slotScopeIds=h,S==null?O.shapeFlag&512?H.ctx.activate(O,C,M,b,A):L(O,C,M,H,$,b,A):tt(S,O,A)},L=(S,O,C,M,H,$,b)=>{const h=S.component=yg(S,M,H);if(qr(S)&&(h.ctx.renderer=ut),kg(h,!1,b),h.asyncDep){if(H&&H.registerDep(h,et,b),!S.el){const A=h.subTree=rt(Te);m(null,A,O,C),S.placeholder=A.el}}else et(h,S,O,C,H,$,b)},tt=(S,O,C)=>{const M=O.component=S.component;if(sg(S,O,C))if(M.asyncDep&&!M.asyncResolved){ht(M,O,C);return}else M.next=O,M.update();else O.el=S.el,M.vnode=O},et=(S,O,C,M,H,$,b)=>{const h=()=>{if(S.isMounted){let{next:U,bu:k,u:R,parent:J,vnode:ot}=S;{const Ge=G_(S);if(Ge){U&&(U.el=ot.el,ht(S,U,b)),Ge.asyncDep.then(()=>{De(()=>{S.isUnmounted||E()},H)});return}}let kt=U,Tt;hs(S,!1),U?(U.el=ot.el,ht(S,U,b)):U=ot,k&&Io(k),(Tt=U.props&&U.props.onVnodeBeforeUpdate)&&bi(Tt,J,U,ot),hs(S,!0);const At=id(S),ze=S.subTree;S.subTree=At,g(ze,At,c(ze.el),j(ze),S,H,$),U.el=At.el,kt===null&&ag(S,At.el),R&&De(R,H),(Tt=U.props&&U.props.onVnodeUpdated)&&De(()=>bi(Tt,J,U,ot),H)}else{let U;const{el:k,props:R}=O,{bm:J,m:ot,parent:kt,root:Tt,type:At}=S,ze=Zs(O);hs(S,!1),J&&Io(J),!ze&&(U=R&&R.onVnodeBeforeMount)&&bi(U,kt,O),hs(S,!0);{Tt.ce&&Tt.ce._hasShadowRoot()&&Tt.ce._injectChildStyle(At,S.parent?S.parent.type:void 0);const Ge=S.subTree=id(S);g(null,Ge,C,M,S,H,$),O.el=Ge.el}if(ot&&De(ot,H),!ze&&(U=R&&R.onVnodeMounted)){const Ge=O;De(()=>bi(U,kt,Ge),H)}(O.shapeFlag&256||kt&&Zs(kt.vnode)&&kt.vnode.shapeFlag&256)&&S.a&&De(S.a,H),S.isMounted=!0,O=C=M=null}};S.scope.on();const A=S.effect=new Bb(h);S.scope.off();const E=S.update=A.run.bind(A),Y=S.job=A.runIfDirty.bind(A);Y.i=S,Y.id=S.uid,A.scheduler=()=>$l(Y),hs(S,!0),E()},ht=(S,O,C)=>{O.component=S;const M=S.vnode.props;S.vnode=O,S.next=null,rg(S,O.props,M,C),dg(S,O.children,C),ji(),Qu(S),Mi()},mt=(S,O,C,M,H,$,b,h,A=!1)=>{const E=S&&S.children,Y=S?S.shapeFlag:0,U=O.children,{patchFlag:k,shapeFlag:R}=O;if(k>0){if(k&128){Pt(E,U,C,M,H,$,b,h,A);return}else if(k&256){yt(E,U,C,M,H,$,b,h,A);return}}R&8?(Y&16&&te(E,H,$),U!==E&&d(C,U)):Y&16?R&16?Pt(E,U,C,M,H,$,b,h,A):te(E,H,$,!0):(Y&8&&d(C,""),R&16&&B(U,C,M,H,$,b,h,A))},yt=(S,O,C,M,H,$,b,h,A)=>{S=S||Ks,O=O||Ks;const E=S.length,Y=O.length,U=Math.min(E,Y);let k;for(k=0;kY?te(S,H,$,!0,!1,U):B(O,C,M,H,$,b,h,A,U)},Pt=(S,O,C,M,H,$,b,h,A)=>{let E=0;const Y=O.length;let U=S.length-1,k=Y-1;for(;E<=U&&E<=k;){const R=S[E],J=O[E]=A?Ri(O[E]):vi(O[E]);if(gs(R,J))g(R,J,C,null,H,$,b,h,A);else break;E++}for(;E<=U&&E<=k;){const R=S[U],J=O[k]=A?Ri(O[k]):vi(O[k]);if(gs(R,J))g(R,J,C,null,H,$,b,h,A);else break;U--,k--}if(E>U){if(E<=k){const R=k+1,J=Rk)for(;E<=U;)lt(S[E],H,$,!0),E++;else{const R=E,J=E,ot=new Map;for(E=J;E<=k;E++){const Ue=O[E]=A?Ri(O[E]):vi(O[E]);Ue.key!=null&&ot.set(Ue.key,E)}let kt,Tt=0;const At=k-J+1;let ze=!1,Ge=0;const ha=new Array(At);for(E=0;E=At){lt(Ue,H,$,!0);continue}let ui;if(Ue.key!=null)ui=ot.get(Ue.key);else for(kt=J;kt<=k;kt++)if(ha[kt-J]===0&&gs(Ue,O[kt])){ui=kt;break}ui===void 0?lt(Ue,H,$,!0):(ha[ui-J]=E+1,ui>=Ge?Ge=ui:ze=!0,g(Ue,O[ui],C,null,H,$,b,h,A),Tt++)}const ku=ze?hg(ha):Ks;for(kt=ku.length-1,E=At-1;E>=0;E--){const Ue=J+E,ui=O[Ue],Au=O[Ue+1],xu=Ue+1{const{el:$,type:b,transition:h,children:A,shapeFlag:E}=S;if(E&6){_t(S.component.subTree,O,C,M);return}if(E&128){S.suspense.move(O,C,M);return}if(E&64){b.move(S,O,C,ut);return}if(b===xt){s($,O,C);for(let U=0;Uh.enter($),H));else{const{leave:U,delayLeave:k,afterLeave:R}=h,J=()=>{S.ctx.isUnmounted?a($):s($,O,C)},ot=()=>{const kt=$._isLeaving||!!$[Ke];$._isLeaving&&$[Ke](!0),h.persisted&&!kt?J():U($,()=>{J(),R&&R()})};k?k($,J,ot):ot()}else s($,O,C)},lt=(S,O,C,M=!1,H=!1)=>{const{type:$,props:b,ref:h,children:A,dynamicChildren:E,shapeFlag:Y,patchFlag:U,dirs:k,cacheIndex:R,memo:J}=S;if(U===-2&&(H=!1),h!=null&&(ji(),Oa(h,null,C,S,!0),Mi()),R!=null&&(O.renderCache[R]=void 0),Y&256){O.ctx.deactivate(S);return}const ot=Y&1&&k,kt=!Zs(S);let Tt;if(kt&&(Tt=b&&b.onVnodeBeforeUnmount)&&bi(Tt,O,S),Y&6)Xt(S.component,C,M);else{if(Y&128){S.suspense.unmount(C,M);return}ot&&_s(S,null,O,"beforeUnmount"),Y&64?S.type.remove(S,O,C,ut,M):E&&!E.hasOnce&&($!==xt||U>0&&U&64)?te(E,O,C,!1,!0):($===xt&&U&384||!H&&Y&16)&&te(A,O,C),M&>(S)}const At=J!=null&&R==null;(kt&&(Tt=b&&b.onVnodeUnmounted)||ot||At)&&De(()=>{Tt&&bi(Tt,O,S),ot&&_s(S,null,O,"unmounted"),At&&(S.el=null)},C)},gt=S=>{const{type:O,el:C,anchor:M,transition:H}=S;if(O===xt){Qt(C,M);return}if(O===dn){f(S);return}const $=()=>{a(C),H&&!H.persisted&&H.afterLeave&&H.afterLeave()};if(S.shapeFlag&1&&H&&!H.persisted){const{leave:b,delayLeave:h}=H,A=()=>b(C,$);h?h(S.el,$,A):A()}else $()},Qt=(S,O)=>{let C;for(;S!==O;)C=_(S),a(S),S=C;a(O)},Xt=(S,O,C)=>{const{bum:M,scope:H,job:$,subTree:b,um:h,m:A,a:E}=S;od(A),od(E),M&&Io(M),H.stop(),$&&($.flags|=8,lt(b,S,O,C)),h&&De(h,O),De(()=>{S.isUnmounted=!0},O)},te=(S,O,C,M=!1,H=!1,$=0)=>{for(let b=$;b{if(S.shapeFlag&6)return j(S.component.subTree);if(S.shapeFlag&128)return S.suspense.next();const O=_(S.anchor||S.el),C=O&&O[qm];return C?_(C):O};let K=!1;const Z=(S,O,C)=>{let M;S==null?O._vnode&&(lt(O._vnode,null,null,!0),M=O._vnode.component):g(O._vnode||null,S,O,null,null,null,C),O._vnode=S,K||(K=!0,Qu(M),c_(),K=!1)},ut={p:g,um:lt,m:_t,r:gt,mt:L,mc:B,pc:mt,pbc:N,n:j,o:t};return{render:Z,hydrate:void 0,createApp:Zm(Z)}}function un({type:t,props:e},i){return i==="svg"&&t==="foreignObject"||i==="mathml"&&t==="annotation-xml"&&e&&e.encoding&&e.encoding.includes("html")?void 0:i}function hs({effect:t,job:e},i){i?(t.flags|=32,e.flags|=4):(t.flags&=-33,e.flags&=-5)}function _g(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}function H_(t,e,i=!1){const s=t.children,a=e.children;if(pt(s)&&pt(a))for(let o=0;o>1,t[i[n]]0&&(e[s]=i[o-1]),i[o]=s)}}for(o=i.length,r=i[o-1];o-- >0;)i[o]=r,r=e[r];return i}function G_(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.asyncResolved?e:G_(e)}function od(t){if(t)for(let e=0;et.__isSuspense;function pg(t,e){e&&e.pendingBranch?pt(t)?e.effects.push(...t):e.effects.push(t):Fm(t)}const xt=Symbol.for("v-fgt"),ca=Symbol.for("v-txt"),Te=Symbol.for("v-cmt"),dn=Symbol.for("v-stc"),qa=[];let je=null;function D(t=!1){qa.push(je=t?null:[])}function mg(){qa.pop(),je=qa[qa.length-1]||null}let Ba=1;function tr(t,e=!1){Ba+=t,t<0&&je&&e&&(je.hasOnce=!0)}function K_(t){return t.dynamicChildren=Ba>0?je||Ks:null,mg(),Ba>0&&je&&je.push(t),t}function W(t,e,i,s,a,o){return K_(V(t,e,i,s,a,o,!0))}function Nt(t,e,i,s,a){return K_(rt(t,e,i,s,a,!0))}function ea(t){return t?t.__v_isVNode===!0:!1}function gs(t,e){return t.type===e.type&&t.key===e.key}const Y_=({key:t})=>t??null,No=({ref:t,ref_key:e,ref_for:i})=>(typeof t=="number"&&(t=""+t),t!=null?ie(t)||Yt(t)||wt(t)?{i:ve,r:t,k:e,f:!!i}:t:null);function V(t,e=null,i=null,s=0,a=null,o=t===xt?0:1,r=!1,n=!1){const l={__v_isVNode:!0,__v_skip:!0,type:t,props:e,key:e&&Y_(e),ref:e&&No(e),scopeId:__,slotScopeIds:null,children:i,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:a,dynamicChildren:null,appContext:null,ctx:ve};return n?(Kl(l,i),o&128&&t.normalize(l)):i&&(l.shapeFlag|=ie(i)?8:16),Ba>0&&!r&&je&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&je.push(l),l}const rt=gg;function gg(t,e=null,i=null,s=0,a=null,o=!1){if((!t||t===P_)&&(t=Te),ea(t)){const n=as(t,e,!0);return i&&Kl(n,i),Ba>0&&!o&&je&&(n.shapeFlag&6?je[je.indexOf(t)]=n:je.push(n)),n.patchFlag=-2,n}if(Sg(t)&&(t=t.__vccOpts),e){e=fg(e);let{class:n,style:l}=e;n&&!ie(n)&&(e.class=nt(n)),Lt(l)&&(Fr(l)&&!pt(l)&&(l=de({},l)),e.style=Ll(l))}const r=ie(t)?1:Q_(t)?128:p_(t)?64:Lt(t)?4:wt(t)?2:0;return V(t,e,i,s,a,r,o,!0)}function fg(t){return t?Fr(t)||U_(t)?de({},t):t:null}function as(t,e,i=!1,s=!1){const{props:a,ref:o,patchFlag:r,children:n,transition:l}=t,u=e?ba(a||{},e):a,d={__v_isVNode:!0,__v_skip:!0,type:t.type,props:u,key:u&&Y_(u),ref:e&&e.ref?i&&o?pt(o)?o.concat(No(e)):[o,No(e)]:No(e):o,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:n,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:e&&t.type!==xt?r===-1?16:r|16:r,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:l,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&as(t.ssContent),ssFallback:t.ssFallback&&as(t.ssFallback),placeholder:t.placeholder,el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return l&&s&&xs(d,l.clone(d)),d}function Ot(t=" ",e=0){return rt(ca,null,t,e)}function it(t="",e=!1){return e?(D(),Nt(Te,null,t)):rt(Te,null,t)}function vi(t){return t==null||typeof t=="boolean"?rt(Te):pt(t)?rt(xt,null,t.slice()):ea(t)?Ri(t):rt(ca,null,String(t))}function Ri(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:as(t)}function Kl(t,e){let i=0;const{shapeFlag:s}=t;if(e==null)e=null;else if(pt(e))i=16;else if(typeof e=="object")if(s&65){const a=e.default;a&&(a._c&&(a._d=!1),Kl(t,a()),a._c&&(a._d=!0));return}else{i=32;const a=e._;!a&&!U_(e)?e._ctx=ve:a===3&&ve&&(ve.slots._===1?e._=1:(e._=2,t.patchFlag|=1024))}else wt(e)?(e={default:e,_ctx:ve},i=32):(e=String(e),s&64?(i=16,e=[Ot(e)]):i=8);t.children=e,t.shapeFlag|=i}function ba(...t){const e={};for(let i=0;iSe||ve;let er,Jn;{const t=yr(),e=(i,s)=>{let a;return(a=t[i])||(a=t[i]=[]),a.push(s),o=>{a.length>1?a.forEach(r=>r(o)):a[0](o)}};er=e("__VUE_INSTANCE_SETTERS__",i=>Se=i),Jn=e("__VUE_SSR_SETTERS__",i=>$a=i)}const eo=t=>{const e=Se;return er(t),t.scope.on(),()=>{t.scope.off(),er(e)}},rd=()=>{Se&&Se.scope.off(),er(null)};function J_(t){return t.vnode.shapeFlag&4}let $a=!1;function kg(t,e=!1,i=!1){e&&Jn(e);const{props:s,children:a}=t.vnode,o=J_(t);og(t,s,o,e),ug(t,a,i||e);const r=o?Ag(t,e):void 0;return e&&Jn(!1),r}function Ag(t,e){const i=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,Bm);const{setup:s}=i;if(s){ji();const a=t.setupContext=s.length>1?X_(t):null,o=eo(t),r=Xa(s,t,0,[t.props,a]),n=zb(r);if(Mi(),o(),(n||t.sp)&&!Zs(t)&&y_(t),n){if(r.then(rd,rd),e)return r.then(l=>{nd(t,l)}).catch(l=>{Or(l,t,0)});t.asyncDep=r}else nd(t,r)}else Z_(t)}function nd(t,e,i){wt(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render=e:Lt(e)&&(t.setupState=n_(e)),Z_(t)}function Z_(t,e,i){const s=t.type;t.render||(t.render=s.render||ki);{const a=eo(t);ji();try{Gm(t)}finally{Mi(),a()}}}const xg={get(t,e){return xe(t,"get",""),t[e]}};function X_(t){const e=i=>{t.exposed=i||{}};return{attrs:new Proxy(t.attrs,xg),slots:t.slots,emit:t.emit,expose:e}}function zr(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(n_(Pr(t.exposed)),{get(e,i){if(i in e)return e[i];if(i in Ra)return Ra[i](t)},has(e,i){return i in e||i in Ra}})):t.proxy}function Tg(t,e=!0){return wt(t)?t.displayName||t.name:t.name||e&&t.__name}function Sg(t){return wt(t)&&"__vccOpts"in t}const st=(t,e)=>km(t,e,$a);function we(t,e,i){try{tr(-1);const s=arguments.length;return s===2?Lt(e)&&!pt(e)?ea(e)?rt(t,null,[e]):rt(t,e):rt(t,null,e):(s>3?i=Array.prototype.slice.call(arguments,2):s===3&&ea(i)&&(i=[i]),rt(t,e,i))}finally{tr(1)}}const Fg="3.5.35";let Zn;const ld=typeof window<"u"&&window.trustedTypes;if(ld)try{Zn=ld.createPolicy("vue",{createHTML:t=>t})}catch{}const th=Zn?t=>Zn.createHTML(t):t=>t,Pg="http://www.w3.org/2000/svg",Eg="http://www.w3.org/1998/Math/MathML",Oi=typeof document<"u"?document:null,ud=Oi&&Oi.createElement("template"),Og={insert:(t,e,i)=>{e.insertBefore(t,i||null)},remove:t=>{const e=t.parentNode;e&&e.removeChild(t)},createElement:(t,e,i,s)=>{const a=e==="svg"?Oi.createElementNS(Pg,t):e==="mathml"?Oi.createElementNS(Eg,t):i?Oi.createElement(t,{is:i}):Oi.createElement(t);return t==="select"&&s&&s.multiple!=null&&a.setAttribute("multiple",s.multiple),a},createText:t=>Oi.createTextNode(t),createComment:t=>Oi.createComment(t),setText:(t,e)=>{t.nodeValue=e},setElementText:(t,e)=>{t.textContent=e},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Oi.querySelector(t),setScopeId(t,e){t.setAttribute(e,"")},insertStaticContent(t,e,i,s,a,o){const r=i?i.previousSibling:e.lastChild;if(a&&(a===o||a.nextSibling))for(;e.insertBefore(a.cloneNode(!0),i),!(a===o||!(a=a.nextSibling)););else{ud.innerHTML=th(s==="svg"?`${t}`:s==="mathml"?`${t}`:t);const n=ud.content;if(s==="svg"||s==="mathml"){const l=n.firstChild;for(;l.firstChild;)n.appendChild(l.firstChild);n.removeChild(l)}e.insertBefore(n,i)}return[r?r.nextSibling:e.firstChild,i?i.previousSibling:e.lastChild]}},Yi="transition",fa="animation",ia=Symbol("_vtc"),eh={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ih=de({},g_,eh),Rg=t=>(t.displayName="Transition",t.props=ih,t),QP=Rg((t,{slots:e})=>we(Im,sh(t),e)),ps=(t,e=[])=>{pt(t)?t.forEach(i=>i(...e)):t&&t(...e)},dd=t=>t?pt(t)?t.some(e=>e.length>1):t.length>1:!1;function sh(t){const e={};for(const z in t)z in eh||(e[z]=t[z]);if(t.css===!1)return e;const{name:i="v",type:s,duration:a,enterFromClass:o=`${i}-enter-from`,enterActiveClass:r=`${i}-enter-active`,enterToClass:n=`${i}-enter-to`,appearFromClass:l=o,appearActiveClass:u=r,appearToClass:d=n,leaveFromClass:c=`${i}-leave-from`,leaveActiveClass:_=`${i}-leave-active`,leaveToClass:p=`${i}-leave-to`}=t,v=qg(a),g=v&&v[0],y=v&&v[1],{onBeforeEnter:m,onEnter:w,onEnterCancelled:x,onLeave:f,onLeaveCancelled:T,onBeforeAppear:P=m,onAppear:F=w,onAppearCancelled:B=x}=e,q=(z,X,L,tt)=>{z._enterCancelled=tt,Zi(z,X?d:n),Zi(z,X?u:r),L&&L()},N=(z,X)=>{z._isLeaving=!1,Zi(z,c),Zi(z,p),Zi(z,_),X&&X()},Q=z=>(X,L)=>{const tt=z?F:w,et=()=>q(X,z,L);ps(tt,[X,et]),cd(()=>{Zi(X,z?l:o),mi(X,z?d:n),dd(tt)||bd(X,s,g,et)})};return de(e,{onBeforeEnter(z){ps(m,[z]),mi(z,o),mi(z,r)},onBeforeAppear(z){ps(P,[z]),mi(z,l),mi(z,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(z,X){z._isLeaving=!0;const L=()=>N(z,X);mi(z,c),z._enterCancelled?(mi(z,_),Xn(z)):(Xn(z),mi(z,_)),cd(()=>{z._isLeaving&&(Zi(z,c),mi(z,p),dd(f)||bd(z,s,y,L))}),ps(f,[z,L])},onEnterCancelled(z){q(z,!1,void 0,!0),ps(x,[z])},onAppearCancelled(z){q(z,!0,void 0,!0),ps(B,[z])},onLeaveCancelled(z){N(z),ps(T,[z])}})}function qg(t){if(t==null)return null;if(Lt(t))return[cn(t.enter),cn(t.leave)];{const e=cn(t);return[e,e]}}function cn(t){return B2(t)}function mi(t,e){e.split(/\s+/).forEach(i=>i&&t.classList.add(i)),(t[ia]||(t[ia]=new Set)).add(e)}function Zi(t,e){e.split(/\s+/).forEach(s=>s&&t.classList.remove(s));const i=t[ia];i&&(i.delete(e),i.size||(t[ia]=void 0))}function cd(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let Cg=0;function bd(t,e,i,s){const a=t._endId=++Cg,o=()=>{a===t._endId&&s()};if(i!=null)return setTimeout(o,i);const{type:r,timeout:n,propCount:l}=ah(t,e);if(!r)return s();const u=r+"end";let d=0;const c=()=>{t.removeEventListener(u,_),o()},_=p=>{p.target===t&&++d>=l&&c()};setTimeout(()=>{d(i[v]||"").split(", "),a=s(`${Yi}Delay`),o=s(`${Yi}Duration`),r=_d(a,o),n=s(`${fa}Delay`),l=s(`${fa}Duration`),u=_d(n,l);let d=null,c=0,_=0;e===Yi?r>0&&(d=Yi,c=r,_=o.length):e===fa?u>0&&(d=fa,c=u,_=l.length):(c=Math.max(r,u),d=c>0?r>u?Yi:fa:null,_=d?d===Yi?o.length:l.length:0);const p=d===Yi&&/\b(?:transform|all)(?:,|$)/.test(s(`${Yi}Property`).toString());return{type:d,timeout:c,propCount:_,hasTransform:p}}function _d(t,e){for(;t.lengthhd(i)+hd(t[s])))}function hd(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function Xn(t){return(t?t.ownerDocument:document).body.offsetHeight}function Ig(t,e,i){const s=t[ia];s&&(e=(e?[e,...s]:[...s]).join(" ")),e==null?t.removeAttribute("class"):i?t.setAttribute("class",e):t.className=e}const ir=Symbol("_vod"),oh=Symbol("_vsh"),pd={name:"show",beforeMount(t,{value:e},{transition:i}){t[ir]=t.style.display==="none"?"":t.style.display,i&&e?i.beforeEnter(t):va(t,e)},mounted(t,{value:e},{transition:i}){i&&e&&i.enter(t)},updated(t,{value:e,oldValue:i},{transition:s}){!e!=!i&&(s?e?(s.beforeEnter(t),va(t,!0),s.enter(t)):s.leave(t,()=>{va(t,!1)}):va(t,e))},beforeUnmount(t,{value:e}){va(t,e)}};function va(t,e){t.style.display=e?t[ir]:"none",t[oh]=!e}const zg=Symbol(""),Dg=/(?:^|;)\s*display\s*:/;function Ng(t,e,i){const s=t.style,a=ie(i);let o=!1;if(i&&!a){if(e)if(ie(e))for(const r of e.split(";")){const n=r.slice(0,r.indexOf(":")).trim();i[n]==null&&Sa(s,n,"")}else for(const r in e)i[r]==null&&Sa(s,r,"");for(const r in i){r==="display"&&(o=!0);const n=i[r];n!=null?Ug(t,r,!ie(e)&&e?e[r]:void 0,n)||Sa(s,r,n):Sa(s,r,"")}}else if(a){if(e!==i){const r=s[zg];r&&(i+=";"+r),s.cssText=i,o=Dg.test(i)}}else e&&t.removeAttribute("style");ir in t&&(t[ir]=o?s.display:"",t[oh]&&(s.display="none"))}const md=/\s*!important$/;function Sa(t,e,i){if(pt(i))i.forEach(s=>Sa(t,e,s));else if(i==null&&(i=""),e.startsWith("--"))t.setProperty(e,i);else{const s=Lg(t,e);md.test(i)?t.setProperty(Hi(s),i.replace(md,""),"important"):t[s]=i}}const gd=["Webkit","Moz","ms"],bn={};function Lg(t,e){const i=bn[e];if(i)return i;let s=Pe(e);if(s!=="filter"&&s in t)return bn[e]=s;s=vr(s);for(let a=0;a_n||(Bg.then(()=>_n=0),_n=Date.now());function Hg(t,e){const i=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=i.attached)return;const a=i.value;if(pt(a)){const o=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{o.call(s),s._stopped=!0};const r=a.slice(),n=[s];for(let l=0;lt.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,Gg=(t,e,i,s,a,o)=>{const r=a==="svg";e==="class"?Ig(t,s,r):e==="style"?Ng(t,i,s):pr(e)?mr(e)||Mg(t,e,i,s,o):(e[0]==="."?(e=e.slice(1),!0):e[0]==="^"?(e=e.slice(1),!1):Vg(t,e,s,r))?(wd(t,e,s),!t.tagName.includes("-")&&(e==="value"||e==="checked"||e==="selected")&&vd(t,e,s,r,o,e!=="value")):t._isVueCE&&(Qg(t,e)||t._def.__asyncLoader&&(/[A-Z]/.test(e)||!ie(s)))?wd(t,Pe(e),s,o,e):(e==="true-value"?t._trueValue=s:e==="false-value"&&(t._falseValue=s),vd(t,e,s,r))};function Vg(t,e,i,s){if(s)return!!(e==="innerHTML"||e==="textContent"||e in t&&Ad(e)&&wt(i));if(e==="spellcheck"||e==="draggable"||e==="translate"||e==="autocorrect"||e==="sandbox"&&t.tagName==="IFRAME"||e==="form"||e==="list"&&t.tagName==="INPUT"||e==="type"&&t.tagName==="TEXTAREA")return!1;if(e==="width"||e==="height"){const a=t.tagName;if(a==="IMG"||a==="VIDEO"||a==="CANVAS"||a==="SOURCE")return!1}return Ad(e)&&ie(i)?!1:e in t}function Qg(t,e){const i=t._def.props;if(!i)return!1;const s=Pe(e);return Array.isArray(i)?i.some(a=>Pe(a)===s):Object.keys(i).some(a=>Pe(a)===s)}const rh=new WeakMap,nh=new WeakMap,sr=Symbol("_moveCb"),xd=Symbol("_enterCb"),Kg=t=>(delete t.props.mode,t),Yg=Kg({name:"TransitionGroup",props:de({},ih,{tag:String,moveClass:String}),setup(t,{slots:e}){const i=ge(),s=m_();let a,o;return T_(()=>{if(!a.length)return;const r=t.moveClass||`${t.name||"v"}-move`;if(!ef(a[0].el,i.vnode.el,r)){a=[];return}a.forEach(Zg),a.forEach(Xg);const n=a.filter(tf);Xn(i.vnode.el),n.forEach(l=>{const u=l.el,d=u.style;mi(u,r),d.transform=d.webkitTransform=d.transitionDuration="";const c=u[sr]=_=>{_&&_.target!==u||(!_||_.propertyName.endsWith("transform"))&&(u.removeEventListener("transitionend",c),u[sr]=null,Zi(u,r))};u.addEventListener("transitionend",c)}),a=[]}),()=>{const r=St(t),n=sh(r);let l=r.tag||xt;if(a=[],o)for(let u=0;u{n.split(/\s+/).forEach(l=>l&&s.classList.remove(l))}),i.split(/\s+/).forEach(n=>n&&s.classList.add(n)),s.style.display="none";const o=e.nodeType===1?e:e.parentNode;o.appendChild(s);const{hasTransform:r}=ah(s);return o.removeChild(s),r}const sa=t=>{const e=t.props["onUpdate:modelValue"]||!1;return pt(e)?i=>Io(e,i):e};function sf(t){t.target.composing=!0}function Td(t){const e=t.target;e.composing&&(e.composing=!1,e.dispatchEvent(new Event("input")))}const Ui=Symbol("_assign");function Sd(t,e,i){return e&&(t=t.trim()),i&&(t=wr(t)),t}const af={created(t,{modifiers:{lazy:e,trim:i,number:s}},a){t[Ui]=sa(a);const o=s||a.props&&a.props.type==="number";is(t,e?"change":"input",r=>{r.target.composing||t[Ui](Sd(t.value,i,o))}),(i||o)&&is(t,"change",()=>{t.value=Sd(t.value,i,o)}),e||(is(t,"compositionstart",sf),is(t,"compositionend",Td),is(t,"change",Td))},mounted(t,{value:e}){t.value=e??""},beforeUpdate(t,{value:e,oldValue:i,modifiers:{lazy:s,trim:a,number:o}},r){if(t[Ui]=sa(r),t.composing)return;const n=(o||t.type==="number")&&!/^0\d/.test(t.value)?wr(t.value):t.value,l=e??"";if(n===l)return;const u=t.getRootNode();(u instanceof Document||u instanceof ShadowRoot)&&u.activeElement===t&&t.type!=="range"&&(s&&e===i||a&&t.value.trim()===l)||(t.value=l)}},of={deep:!0,created(t,e,i){t[Ui]=sa(i),is(t,"change",()=>{const s=t._modelValue,a=Ha(t),o=t.checked,r=t[Ui];if(pt(s)){const n=Ul(s,a),l=n!==-1;if(o&&!l)r(s.concat(a));else if(!o&&l){const u=[...s];u.splice(n,1),r(u)}}else if(la(s)){const n=new Set(s);o?n.add(a):n.delete(a),r(n)}else r(uh(t,o))})},mounted:Fd,beforeUpdate(t,e,i){t[Ui]=sa(i),Fd(t,e,i)}};function Fd(t,{value:e,oldValue:i},s){t._modelValue=e;let a;if(pt(e))a=Ul(e,s.props.value)>-1;else if(la(e))a=e.has(s.props.value);else{if(e===i)return;a=ua(e,uh(t,!0))}t.checked!==a&&(t.checked=a)}const rf={deep:!0,created(t,{value:e,modifiers:{number:i}},s){const a=la(e);is(t,"change",()=>{const o=Array.prototype.filter.call(t.options,r=>r.selected).map(r=>i?wr(Ha(r)):Ha(r));t[Ui](t.multiple?a?new Set(o):o:o[0]),t._assigning=!0,si(()=>{t._assigning=!1})}),t[Ui]=sa(s)},mounted(t,{value:e}){Pd(t,e)},beforeUpdate(t,e,i){t[Ui]=sa(i)},updated(t,{value:e}){t._assigning||Pd(t,e)}};function Pd(t,e){const i=t.multiple,s=pt(e);if(!(i&&!s&&!la(e))){for(let a=0,o=t.options.length;aString(u)===String(n)):r.selected=Ul(e,n)>-1}else r.selected=e.has(n);else if(ua(Ha(r),e)){t.selectedIndex!==a&&(t.selectedIndex=a);return}}!i&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function Ha(t){return"_value"in t?t._value:t.value}function uh(t,e){const i=e?"_trueValue":"_falseValue";return i in t?t[i]:e}const nf=["ctrl","shift","alt","meta"],lf={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,e)=>nf.some(i=>t[`${i}Key`]&&!e.includes(i))},We=(t,e)=>{if(!t)return t;const i=t._withMods||(t._withMods={}),s=e.join(".");return i[s]||(i[s]=((a,...o)=>{for(let r=0;r{const i=t._withKeys||(t._withKeys={}),s=e.join(".");return i[s]||(i[s]=(a=>{if(!("key"in a))return;const o=Hi(a.key);if(e.some(r=>r===o||uf[r]===o))return t(a)}))},df=de({patchProp:Gg},Og);let Ed;function cf(){return Ed||(Ed=cg(df))}const bf=((...t)=>{const e=cf().createApp(...t),{mount:i}=e;return e.mount=s=>{const a=hf(s);if(!a)return;const o=e._component;!wt(o)&&!o.render&&!o.template&&(o.template=a.innerHTML),a.nodeType===1&&(a.textContent="");const r=i(a,!1,_f(a));return a instanceof Element&&(a.removeAttribute("v-cloak"),a.setAttribute("data-v-app","")),r},e});function _f(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function hf(t){return ie(t)?document.querySelector(t):t}const pf="11.4.4";function mf(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Pl().__INTLIFY_PROD_DEVTOOLS__=!1)}const Be={UNEXPECTED_RETURN_TYPE:o2,INVALID_ARGUMENT:25,MUST_BE_CALL_SETUP_TOP:26,NOT_INSTALLED:27,REQUIRED_VALUE:28,INVALID_VALUE:29,NOT_INSTALLED_WITH_PROVIDE:31,UNEXPECTED_ERROR:32,NOT_AVAILABLE_COMPOSITION_IN_LEGACY:34};function ti(t,...e){return _r(t,null,void 0)}const tl=ns("__translateVNode"),el=ns("__datetimeParts"),il=ns("__numberParts"),gf=ns("__setPluralRules"),ff=ns("__injectWithOption"),Hs=ns("__dispose");function Ga(t){if(!Ct(t)||yi(t))return t;for(const e in t)if(Ze(t,e))if(!e.includes("."))Ct(t[e])&&Ga(t[e]);else{const i=e.split("."),s=i.length-1;let a=t,o=!1;for(let r=0;r{if("locale"in n&&"resource"in n){const{locale:l,resource:u}=n;l?(r[l]=r[l]||Ht(),Co(u,r[l])):Co(u,r)}else dt(n)&&Co(JSON.parse(n),r)}),a==null&&o)for(const n in r)Ze(r,n)&&Ga(r[n]);return r}function ch(t){return t.type}function vf(t,e,i){let s=Ct(e.messages)?e.messages:Ht();"__i18nGlobal"in i&&(s=dh(t.locale.value,{messages:s,__i18n:i.__i18nGlobal}));const a=Object.keys(s);a.length&&a.forEach(o=>{t.mergeLocaleMessage(o,s[o])});{if(Ct(e.datetimeFormats)){const o=Object.keys(e.datetimeFormats);o.length&&o.forEach(r=>{t.mergeDateTimeFormat(r,e.datetimeFormats[r])})}if(Ct(e.numberFormats)){const o=Object.keys(e.numberFormats);o.length&&o.forEach(r=>{t.mergeNumberFormat(r,e.numberFormats[r])})}}}function Od(t){return rt(ca,null,t,0)}function Yl(){return ge()}const Rd="__INTLIFY_META__",qd=()=>[],wf=()=>!1;let Cd=0;function Id(t){return((e,i,s,a)=>t(i,s,Yl()||void 0,a))}const yf=()=>{const t=Yl();let e=null;return t&&(e=ch(t)[Rd])?{[Rd]:e}:null};function sl(t={}){const{__root:e,__injectWithOption:i}=t,s=e===void 0,a=t.flatJson,o=Bo?vt:Rt;let r=se(t.inheritLocale)?t.inheritLocale:!0;const n=o(e&&r?e.locale.value:dt(t.locale)?t.locale:Ho),l=o(e&&r?e.fallbackLocale.value:dt(t.fallbackLocale)||le(t.fallbackLocale)||zt(t.fallbackLocale)||t.fallbackLocale===!1?t.fallbackLocale:n.value),u=o(dh(n.value,t)),d=o(zt(t.datetimeFormats)?t.datetimeFormats:{[n.value]:{}}),c=o(zt(t.numberFormats)?t.numberFormats:{[n.value]:{}});let _=e?e.missingWarn:se(t.missingWarn)||$o(t.missingWarn)?t.missingWarn:!0,p=e?e.fallbackWarn:se(t.fallbackWarn)||$o(t.fallbackWarn)?t.fallbackWarn:!0,v=e?e.fallbackRoot:se(t.fallbackRoot)?t.fallbackRoot:!0,g=!!t.fallbackFormat,y=re(t.missing)?t.missing:null,m=re(t.missing)?Id(t.missing):null,w=re(t.postTranslation)?t.postTranslation:null,x=e?e.warnHtmlMessage:se(t.warnHtmlMessage)?t.warnHtmlMessage:!0,f=!!t.escapeParameter;const T=e?e.modifiers:zt(t.modifiers)?t.modifiers:{};let P=t.pluralRules||e&&e.pluralRules,F;F=(()=>{s&&Du(null);const k={version:pf,locale:n.value,fallbackLocale:l.value,messages:u.value,modifiers:T,pluralRules:P,missing:m===null?void 0:m,missingWarn:_,fallbackWarn:p,fallbackFormat:g,unresolving:!0,postTranslation:w===null?void 0:w,warnHtmlMessage:x,escapeParameter:f,messageResolver:t.messageResolver,messageCompiler:t.messageCompiler,__meta:{framework:"vue"}};k.datetimeFormats=d.value,k.numberFormats=c.value,k.__datetimeFormatters=zt(F)?F.__datetimeFormatters:void 0,k.__numberFormatters=zt(F)?F.__numberFormatters:void 0;const R=T2(k);return s&&Du(R),R})(),pa(F,n.value,l.value);function q(){return[n.value,l.value,u.value,d.value,c.value]}const N=st({get:()=>n.value,set:k=>{F.locale=k,n.value=k}}),Q=st({get:()=>l.value,set:k=>{F.fallbackLocale=k,l.value=k,pa(F,n.value,k)}}),z=st(()=>u.value),X=st(()=>d.value),L=st(()=>c.value);function tt(){return re(w)?w:null}function et(k){w=k,F.postTranslation=k}function ht(){return y}function mt(k){k!==null&&(m=Id(k)),y=k,F.missing=m}const yt=(k,R,J,ot,kt,Tt)=>{q();let At;try{__INTLIFY_PROD_DEVTOOLS__,s||(F.fallbackContext=e?x2():void 0),At=k(F)}finally{__INTLIFY_PROD_DEVTOOLS__,s||(F.fallbackContext=void 0)}if(J!=="translate exists"&&ce(At)&&At===hr||J==="translate exists"&&!At){const[ze,Ge]=R();return e&&v?ot(e):kt(ze)}else{if(Tt(At))return At;throw ti(Be.UNEXPECTED_RETURN_TYPE)}};function Pt(...k){return yt(R=>Reflect.apply(Bu,null,[R,...k]),()=>Bn(...k),"translate",R=>Reflect.apply(R.t,R,[...k]),R=>R,R=>dt(R))}function _t(...k){const[R,J,ot]=k;if(ot&&!Ct(ot))throw ti(Be.INVALID_ARGUMENT);return Pt(R,J,pe({resolvedMessage:!0},ot||{}))}function lt(...k){return yt(R=>Reflect.apply(Lu,null,[R,...k]),()=>Mn(...k),"datetime format",R=>Reflect.apply(R.d,R,[...k]),()=>Go,R=>dt(R)||le(R))}function gt(...k){return yt(R=>Reflect.apply(ju,null,[R,...k]),()=>Wn(...k),"number format",R=>Reflect.apply(R.n,R,[...k]),()=>Go,R=>dt(R)||le(R))}function Qt(k){return k.map(R=>dt(R)||ce(R)||se(R)?Od(String(R)):R)}const te={normalize:Qt,interpolate:k=>k,type:"vnode"};function j(...k){return yt(R=>{let J;const ot=R;try{ot.processor=te,J=Reflect.apply(Bu,null,[ot,...k])}finally{ot.processor=null}return J},()=>Bn(...k),"translate",R=>R[tl](...k),R=>[Od(R)],R=>le(R))}function K(...k){return yt(R=>Reflect.apply(ju,null,[R,...k]),()=>Wn(...k),"number format",R=>R[il](...k),qd,R=>dt(R)||le(R))}function Z(...k){return yt(R=>Reflect.apply(Lu,null,[R,...k]),()=>Mn(...k),"datetime format",R=>R[el](...k),qd,R=>dt(R)||le(R))}function ut(k){P=k,F.pluralRules=P}function ft(k,R){return yt(()=>{if(!k)return!1;const J=dt(R)?R:n.value,ot=dt(R)?[J]:jn(F,l.value,J);for(let kt=0;kt[k],"translate exists",J=>Reflect.apply(J.te,J,[k,R]),wf,J=>se(J))}function S(k){let R=null;const J=jn(F,l.value,n.value);for(let ot=0;ot{r&&(n.value=k,F.locale=k,pa(F,n.value,l.value))}),Bt(e.fallbackLocale,k=>{r&&(l.value=k,F.fallbackLocale=k,pa(F,n.value,l.value))}));const U={id:Cd,locale:N,fallbackLocale:Q,get inheritLocale(){return r},set inheritLocale(k){r=k,k&&e&&(n.value=e.locale.value,l.value=e.fallbackLocale.value,pa(F,n.value,l.value))},get availableLocales(){return Object.keys(u.value).sort()},messages:z,get modifiers(){return T},get pluralRules(){return P||{}},get isGlobal(){return s},get missingWarn(){return _},set missingWarn(k){_=k,F.missingWarn=_},get fallbackWarn(){return p},set fallbackWarn(k){p=k,F.fallbackWarn=p},get fallbackRoot(){return v},set fallbackRoot(k){v=k},get fallbackFormat(){return g},set fallbackFormat(k){g=k,F.fallbackFormat=g},get warnHtmlMessage(){return x},set warnHtmlMessage(k){x=k,F.warnHtmlMessage=k},get escapeParameter(){return f},set escapeParameter(k){f=k,F.escapeParameter=k},t:Pt,getLocaleMessage:C,setLocaleMessage:M,mergeLocaleMessage:H,getPostTranslationHandler:tt,setPostTranslationHandler:et,getMissingHandler:ht,setMissingHandler:mt,[gf]:ut};return U.datetimeFormats=X,U.numberFormats=L,U.rt=_t,U.te=ft,U.tm=O,U.d=lt,U.n=gt,U.getDateTimeFormat=$,U.setDateTimeFormat=b,U.mergeDateTimeFormat=h,U.getNumberFormat=A,U.setNumberFormat=E,U.mergeNumberFormat=Y,U[ff]=i,U[tl]=j,U[el]=Z,U[il]=K,U}const Jl={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:t=>t==="parent"||t==="global",default:"parent"},i18n:{type:Object}};function kf({slots:t},e){return e.length===1&&e[0]==="default"?(t.default?t.default():[]).reduce((s,a)=>[...s,...a.type===xt?a.children:[a]],[]):e.reduce((i,s)=>{const a=t[s];return a&&(i[s]=a()),i},Ht())}function bh(){return xt}const Af=ni({name:"i18n-t",props:pe({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:t=>ce(t)||!isNaN(t)}},Jl),setup(t,e){const{slots:i,attrs:s}=e,a=t.i18n||Dr({useScope:t.scope,__useComponent:!0});return()=>{const o=()=>{const l=Object.keys(i).filter(c=>c[0]!=="_"),u=Ht();t.locale&&(u.locale=t.locale),t.plural!==void 0&&(u.plural=dt(t.plural)?+t.plural:t.plural);const d=kf(e,l);return a[tl](t.keypath,d,u)},r=pe(Ht(),s),n=dt(t.tag)||Ct(t.tag)?t.tag:bh();return Ct(n)?we(n,r,{default:o}):we(n,r,o())}}}),zd=Af;function xf(t){return le(t)&&!dt(t[0])}function _h(t,e,i,s){const{slots:a,attrs:o}=e;return()=>{const r=()=>{const u={part:!0};let d=Ht();t.locale&&(u.locale=t.locale),dt(t.format)?u.key=t.format:Ct(t.format)&&(dt(t.format.key)&&(u.key=t.format.key),d=Object.keys(t.format).reduce((p,v)=>i.includes(v)?pe(Ht(),p,{[v]:t.format[v]}):p,Ht()));const c=s(t.value,u,d);let _=[u.key];return le(c)?_=c.map((p,v)=>{const g=a[p.type],y=g?g({[p.type]:p.value,index:v,parts:c}):[p.value];return xf(y)&&(y[0].key=`${p.type}-${v}`),y}):dt(c)&&(_=[c]),_},n=pe(Ht(),o),l=dt(t.tag)||Ct(t.tag)?t.tag:bh();return Ct(l)?we(l,n,{default:r}):we(l,n,r())}}const Tf=ni({name:"i18n-n",props:pe({value:{type:Number,required:!0},format:{type:[String,Object]}},Jl),setup(t,e){const i=t.i18n||Dr({useScope:t.scope,__useComponent:!0});return _h(t,e,Rb,(...s)=>i[il](...s))}}),Dd=Tf;function Sf(t,e){const i=t;if(t.mode==="composition")return i.__getInstance(e)||t.global;{const s=i.__getInstance(e);return s!=null?s.__composer:t.global.__composer}}function Ff(t){const e=r=>{const{instance:n,value:l}=r;if(!n||!n.$)throw ti(Be.UNEXPECTED_ERROR);const u=Sf(t,n.$),d=Nd(l);return[Reflect.apply(u.t,u,[...Ld(d)]),u]};return{created:(r,n)=>{const[l,u]=e(n);Bo&&(r.__i18nWatcher=Bt(u.locale,()=>{n.instance&&n.instance.$forceUpdate()})),r.__composer=u,r.textContent=l},unmounted:r=>{Bo&&r.__i18nWatcher&&(r.__i18nWatcher(),r.__i18nWatcher=void 0,delete r.__i18nWatcher),r.__composer&&(r.__composer=void 0,delete r.__composer)},beforeUpdate:(r,{value:n})=>{if(r.__composer){const l=r.__composer,u=Nd(n);r.textContent=Reflect.apply(l.t,l,[...Ld(u)])}},getSSRProps:r=>{const[n]=e(r);return{textContent:n}}}}function Nd(t){if(dt(t))return{path:t};if(zt(t)){if(!("path"in t))throw ti(Be.REQUIRED_VALUE,"path");return t}else throw ti(Be.INVALID_VALUE)}function Ld(t){const{path:e,locale:i,args:s,choice:a,plural:o}=t,r={},n=s||{};return dt(i)&&(r.locale=i),ce(a)&&(r.plural=a),ce(o)&&(r.plural=o),[e,n,r]}function Pf(t,e,...i){const s=zt(i[0])?i[0]:{};(!se(s.globalInstall)||s.globalInstall)&&([zd.name,"I18nT"].forEach(o=>t.component(o,zd)),[Dd.name,"I18nN"].forEach(o=>t.component(o,Dd)),[Md.name,"I18nD"].forEach(o=>t.component(o,Md))),t.directive("t",Ff(e))}const Ef=ns("global-vue-i18n");function Of(t={}){const e=se(t.globalInjection)?t.globalInjection:!0,i=new Map,[s,a]=Rf(t),o=ns("");function r(d){return i.get(d)||null}function n(d,c){i.set(d,c)}function l(d){i.delete(d)}const u={get mode(){return"composition"},async install(d,...c){if(d.__VUE_I18N_SYMBOL__=o,d.provide(d.__VUE_I18N_SYMBOL__,u),zt(c[0])){const v=c[0];u.__composerExtend=v.__composerExtend,u.__vueI18nExtend=v.__vueI18nExtend}let _=null;e&&(_=Lf(d,u.global)),Pf(d,u,...c);const p=d.unmount;d.unmount=()=>{_&&_(),u.dispose(),p()}},get global(){return a},dispose(){s.stop()},__instances:i,__getInstance:r,__setInstance:n,__deleteInstance:l};return u}function Dr(t={}){const e=Yl();if(e==null)throw ti(Be.MUST_BE_CALL_SETUP_TOP);if(!e.isCE&&e.appContext.app!=null&&!e.appContext.app.__VUE_I18N_SYMBOL__)throw ti(Be.NOT_INSTALLED);const i=qf(e),s=If(i),a=ch(e),o=Cf(t,a);if(o==="global")return vf(s,t,a),s;if(o==="parent"){let l=Ud(i,e,t.__useComponent);return l==null&&(l=s),l}if(o==="isolated"){if(i.mode!=="composition")throw ti(Be.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const l=i,u=pe({},t),d=Ud(i,e);u.__root=d||s;const c=sl(u);return l.__composerExtend&&(c[Hs]=l.__composerExtend(c)),Gi()&&Za(()=>{const p=c[Hs];p&&(p(),delete c[Hs])}),c}const r=i;let n=r.__getInstance(e);if(n==null){const l=pe({},t);"__i18n"in a&&(l.__i18n=a.__i18n),s&&(l.__root=s),n=sl(l),r.__composerExtend&&(n[Hs]=r.__composerExtend(n)),Df(r,e,n),r.__setInstance(e,n)}return n}function Rf(t,e){const i=kr(),s=i.run(()=>sl(t));if(s==null)throw ti(Be.UNEXPECTED_ERROR);return[i,s]}function qf(t){const e=Jt(t.isCE?Ef:t.appContext.app.__VUE_I18N_SYMBOL__);if(!e)throw ti(t.isCE?Be.NOT_INSTALLED_WITH_PROVIDE:Be.UNEXPECTED_ERROR);return e}function Cf(t,e){return br(t)?"__i18n"in e?"local":"global":t.useScope?t.useScope:"local"}function If(t){return t.mode==="composition"?t.global:t.global.__composer}function Ud(t,e,i=!1){let s=null;const a=e.root;let o=zf(e,i);for(;o!=null;){const r=t;if(t.mode==="composition"&&(s=r.__getInstance(o)),s!=null||a===o)break;o=o.parent}return s}function zf(t,e=!1){return t==null?null:e&&t.vnode.ctx||t.parent}function Df(t,e,i){Ie(()=>{},e),Qi(()=>{const s=i;t.__deleteInstance(e);const a=s[Hs];a&&(a(),delete s[Hs])},e)}const Nf=["locale","fallbackLocale","availableLocales"],jd=["t","rt","d","n","tm","te"];function Lf(t,e){const i=Object.create(null);return Nf.forEach(a=>{const o=Object.getOwnPropertyDescriptor(e,a);if(!o)throw ti(Be.UNEXPECTED_ERROR);const r=Yt(o.value)?{get(){return o.value.value},set(n){o.value.value=n}}:{get(){return o.get&&o.get()}};Object.defineProperty(i,a,r)}),t.config.globalProperties.$i18n=i,jd.forEach(a=>{const o=Object.getOwnPropertyDescriptor(e,a);if(!o||!o.value)throw ti(Be.UNEXPECTED_ERROR);Object.defineProperty(t.config.globalProperties,`$${a}`,o)}),()=>{delete t.config.globalProperties.$i18n,jd.forEach(a=>{delete t.config.globalProperties[`$${a}`]})}}const Uf=ni({name:"i18n-d",props:pe({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Jl),setup(t,e){const i=t.i18n||Dr({useScope:t.scope,__useComponent:!0});return _h(t,e,Ob,(...s)=>i[el](...s))}}),Md=Uf;mf();v2(t2);w2(m2);y2(jn);if(__INTLIFY_PROD_DEVTOOLS__){const t=Pl();t.__INTLIFY__=!0,e2(t.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const hn=t=>t&&typeof t=="object"&&!Array.isArray(t),al=(t,...e)=>{if(!e.length)return t;const i=e.shift();if(hn(t)&&hn(i))for(const s in i)hn(i[s])?(t[s]||Object.assign(t,{[s]:{}}),al(t[s],i[s])):Object.assign(t,{[s]:i[s]});return al(t,...e)},jf=al({},{ar:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Icon that illustrates the account"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Image of a QR code to scan"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Changes will be lost. Are you sure?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"سيكون لهذا تأثيرات خطيرة على أذونات هذا المستخدم. هل أنت متيقِّن؟"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete your account?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this group?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this account?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"هل أنت متيقِّن من أنك تريد حذف هذا المستخدم؟ لا يوجد أي رجعة."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"لن تكون بعد الآن مديرا. هل أنت متيقِّن؟"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all accounts?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all duplicates?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard this account?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"هذا هو حسابك الخاص. هل أنت متيقِّن؟"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to log out?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"هل أنت متيقِّن من أنك تريد إلغاء الطلب السابق؟"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"هل أنت متيقِّن من أنك تريد إعادة تعيين كلمة مرور هذا المستخدم؟"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this device?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domain is not a valid domain"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Aborted by user"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Account managed by an external provider"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth is configured to run behind an authentication proxy but your proxy does not return the expected header. Check your configuration and try again."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy authentication failed"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing discoverable credential support"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing user verification support"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Your device does not support webauthn. Try again later using a more modern browser"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Cannot create an OTP without a secret"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"The secret cannot be deciphered. This is mainly caused by a wrong APP_KEY set in the .env configuration file of 2Fauth or a corrupted data stored in database."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Cannot decode detected QR code, try to crop or sharpen the image"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot delete the only admin account"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot demote the only admin account"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Cannot detect a QR code in the image, try to crop the image"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Check failed, please retry later"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Data cannot be refreshed from server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"The data of this QR code is not a valid OTP Auth URI. The QR code contains:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Only user-created setting can be deleted"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Unreadable, the data seem encrypted"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Something went wrong during data fetching"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Decryption failed, your database is still protected. This is mainly caused by an integrity issue of encrypted data for one or more accounts."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Encryption failed, your database remains unprotected."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"File upload failed"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS context required"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecipherable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Invalid 2FA data"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"No authenticators support specified algorithms"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Password reset unavailable for this user"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No readable QR code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"No valid OTP resource in this QR code"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"This OTP format is not currently supported"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operation not allowed"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"This QR code is unreadable"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code has invalid checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Resource not found"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device already registered"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Something is wrong with your server"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"This SSO provider is not fully setup in your .env file"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is disabled"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication via SSO rejected"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrations are disabled"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"too many ids were included in the query parameter, max 100 allowed"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Unable to decrypt uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"You do not have permissions to view this resource or to perform this action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Data do not match any supported format"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported OTP type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"User account deletion failed, no data have been deleted"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"User ID was not between 1 and 64 chars"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong current password, nothing has changed"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"The algorithm used to secure your security codes"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorithm"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache management"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically check (once a week) and warn when a new release of 2FAuth is published on Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Check for new version"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Empty the Search box right after a code has been copied to the clipboard"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Clear Search on copy"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Click on a generated password to copy it automatically hides it from the screen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirm new password"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first Time-based One-Time Password (TOTP) password will be copied, not the rotating ones"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"The initial counter value"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Fill in your current password to confirm that it's you"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the newly created accounts are associated"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Default group"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode used when the Direct input option is On"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"The number of digits of the generated security codes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Digits"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"All your security devices will be revoked. Use this option if you have lost one or its security has been compromised."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Disable all security devices"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Disable registration"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want accounts to be displayed as a list or as a grid"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Display mode"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Email"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Try to) Get the official icon of the 2FA issuer when adding an account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Get official icons"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Language used to translate the 2FAuth user interface. Named languages are complete, set the one of your choice to override your browser preference."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Language"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Name this device"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Name"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"New name"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords (OTP) are displayed"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Show Password"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Password formatting"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"The period of validity of the generated security codes in second"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Period"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Remember group filter"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Let the ability to temporarily reveal Dot-Obscured passwords"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"The key used to generate your security codes"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Service"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Show icons"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Email configuration test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Theme"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"The time zone applied to all dates and times displayed in the application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Time zone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"If you experiences issues when capturing QR codes enables this option to switch to a more basic but more reliable QR code reader"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Use basic QR code reader"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protect sensitive data"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Use WebAuthn only"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"الدخول"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Danger Zone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Data input"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Environment"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"General"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groups"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Last accesses"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"New account"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"New group"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"New token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"مستخدم جديد"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Personal access tokens"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferences"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"التسجيلات"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Rename device"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Resources"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Security devices"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Security"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Supported migration formats"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"إدارة المستخدم"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"المستخدمون"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn login"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Active group"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Advanced form"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"After a click/tap"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Show all passwords in the main view, without doing anything"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"All of them, on home"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alone, in its own view"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Back"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Browser preference"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Cancel"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Check now"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Close"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantly"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copy"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Create"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Credits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Dark"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Default"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Delete this user"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete your account"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Device"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Discard all"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Discard duplicates"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Done"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Export"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Generate"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Grid"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Split digits into two equals groups"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"by Half"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Try my luck"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Import all"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Address"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Issuer"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Light"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"List"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Move"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"My device"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Never"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"New"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"No group"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"On security code copy"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mo."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yr."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Open in browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits two by two"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"by Pair"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Plain text"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Prefill using a QR Code"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a device"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Remove icon"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"إعادة إرسال البريد الإلكتروني"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Save"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scan a QR code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Send password reset link"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Send recovery link"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Send"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Sign out"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Submit"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Text file"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Time"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits three by three"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"by Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Update"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Upload a QR code"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"المستخدمون"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (German)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (English)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (French)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japanese)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russian)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"لوحة الإدارة"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Back to home"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Create new group"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"أنشئ مستخدمًا"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generate a new token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Help translate 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"login & password"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage groups"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recover your account"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a new device"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset it"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"a security device"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"See full log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Use the advanced form"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"View on Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"هذا الحساب مرتبط بحساب "},{t:4,k:"provider"},{t:3,v:" عبر OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery email sent!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Pick a method and add your first account"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Manage users registered on your instance or create new ones."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Already authenticated, please log out first"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Already registered?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative methods"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock is On"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"The user account will be deleted as well as all its 2FA data."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Your user account will be deleted as well as all your 2FA data. There is no going back."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Deleting your 2FAuth account has no impact on your external SSO account."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Deleting a group does not delete accounts"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Feature disabled in Demo mode"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Don't have your account yet?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"An error occured:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Failure"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Forgot your password?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Has lower case"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Has number"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Has special char"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Has upper case"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use the Export feature of these apps to get a migration resource like a QR code or a JSON file then load it here."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Imported"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"This reset token is invalid."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 characters min."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"اخر ظهور "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos by"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Lost your device?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Made with"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Make sure to copy your personal access token now. You won’t be able to see it again!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can create groups to organize your accounts the way you want. All accounts remain visible in the pseudo group named 'All', regardless of the group they belong to."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Mandatory"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Move selected to"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Set at least one device to enable the following options"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"No 2FA here!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"No entry yet"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"No result"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- no service -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nothing"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hello"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"You can also continue with:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Parsing data..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"يوجد طلب إعادة تعيين كلمة المرور لهذا المستخدم ولكن انتهت صلاحيته، بمعنى أن المستخدم لم يغير كلمة المرور الخاصة به في الوقت المناسب. قد يكون هذا طلباً من المستخدم نفسه أو من أحد المسؤولين."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"A password reset request exists for this user (request sent at "},{t:4,k:"datetime"},{t:3,v:"), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"An account with the exact same data already exists"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"To recover your account, 2FAuth resets some Webauthn settings so you will be able to sign in using your email and password."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"تم تسجيله "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a password reset link to this address. Click the link in the received email to set a new password."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a device is permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a token is permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Authentication devices you can use to sign in 2FAuth, like security keys (i.e Yubikey) or smartphones with biometric capabilities (i.e. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Some translations are missing using the browser preferred language?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Please use another device/camera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan can't start :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No camera on this device"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Maybe you forgot to plug in your webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fail to load scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is the camera already in use? Ensure that no other app use your camera and try again"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Secure context required"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"You should use a modern browser"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: jpg, jpeg, png, bmp, gif, svg, or webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Too many login attempts. Please try again in "},{t:4,k:"seconds"},{t:3,v:" seconds."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI Icons by"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use the available buttons to permanently save them to your 2FA collection or discard them."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Get ready to authenticate using (one of) your security devices. Plug your key in, remove face mask or gloves, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" active token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" security device(s) (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn login disabled"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" accounts"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selected"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"This instance is up-to-date"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully created"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully updated"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully deleted"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully moved"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Auto-lock triggered, you've been logged out"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cleared"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copied to clipboard"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data has been refresh to reflect server-side changes"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully revoked"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully registered"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Group name saved"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully created"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully deleted"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully reset"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's PATs successfully revoked"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profile successfully updated!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Settings saved"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token successfully revoked"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"User account successfully deleted"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"تم إنشاء المستخدم بنجاح"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"User role updated"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" valid accounts found"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Next »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Previous"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwords must be at least eight characters and match the confirmation."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Your password has been reset!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"We have emailed your password reset link!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Please wait before retrying."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"This password reset token is invalid."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"We can't find a user with that email address."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"اسم المستخدم، البريد الإلكتروني..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Item not found"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Accounts"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Create user"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Manage user"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Users management"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Create account"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Create group"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Account edit"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Group edit"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Error"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groups"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Import accounts"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"User account"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"New personal token"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth tokens"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn devices"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Device edit"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Account as QR code"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"New account"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Register a new device"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Clear search"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Clear selection"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Close the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Discard this account"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generate a test pasword"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Hide group selector"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Hide password"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Import this account"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Lock it"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Move selected into a group"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Rename"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"إعادة إرسال بريد إلكتروني لإعادة تعيين كلمة المرور للمستخدم"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Reveal password"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's security devices"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's tokens"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Select all"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Show group selector"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Show QR code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using a security device"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Sort ascending"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sort descending"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock it (at your own risk)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Use a QR code to fill the form magically"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted when :other is :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after or equal to :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters, numbers, dashes, and underscores."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters and numbers."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an array."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before or equal to :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have between :min and :max items."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max characters."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be true or false."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field confirmation does not match."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"The password is incorrect."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"This email address does not comply with the registration policy"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No account found using this email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"All emails must be valid and separated with a pipe"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs must be comma separated, without trailing comma."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"The uri must have a label."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not supported."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a base32 encoded string."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not a valid otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date equal to :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match the format :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid date."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined when :other is :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field and :other must be different."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max digits."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :digits digits."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has invalid image dimensions."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has a duplicate value."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not end with one of the following: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not start with one of the following: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid email address."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must end with one of the following: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have a value."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have more than :value items."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value characters."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :value items or more."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value characters."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an image."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must exist in :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an integer."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IP address."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv4 address."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv6 address."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid JSON string."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have less than :value items."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value characters."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :value items."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value characters."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid MAC address."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max digits."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max items."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max characters."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min digits."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min items."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min characters."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a multiple of :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a number."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"The uri parameter must be provided alone or only in combination with the 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one letter."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one uppercase and one lowercase letter."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one number."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one symbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"The given :attribute has appeared in a data leak. Please choose a different :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited when :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited unless :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field prohibits :other from being present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain entries for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is accepted."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required unless :other is in :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values are present."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is present."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when none of :values are present."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is not present."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"When using :attribute it must be the only parameter in this request body"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain :size items."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size characters."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must start with one of the following: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a string."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid timezone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute has already been taken."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute failed to upload."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid UUID."}}}},{bg:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Икона, илюстрираща акаунта"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Изображение на QR код за сканиране"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Профилът ще бъде загубен. Сигурен ли си?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"This will have serious impacts on this user's permissions. Are you sure?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да изтриете профила си?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да изтриете тази група?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да изтриете този профил?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this user? There is no going back."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"You will no longer be an administrator. Really sure?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да отхвърлите всички профили?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да отхвърлите всички дубликати?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да отхвърлите профила?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"This is your own account. Are you sure?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да излезете?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke the previous request?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to reset this user's password?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Сигурни ли сте, че искате да анулирате това устройство?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Наистина ли искате да анулирате този токен?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domain is not a valid domain"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Прекратено от потребителя"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Account managed by an external provider"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth е конфигуриран да работи зад прокси за удостоверяване, но вашето прокси не връща очаквания хедър. Проверете конфигурацията си и опитайте отново."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Неуспешно удостоверяване на проксито"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing discoverable credential support"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing user verification support"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Вашето устройство не поддържа webauthn. Опитайте отново с по-модерен браузър"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Не може да се създаде OTP без тайна"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Тайната не може да бъде разгадана. Това се причинява главно от грешен APP_KEY, зададен в конфигурационния файл .env на 2Fauth или на повредени данни в базата данни."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Cannot decode detected QR code, try to crop or sharpen the image"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Не може да изтрие единствения администраторски акаунт"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot demote the only admin account"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Cannot detect a QR code in the image, try to crop the image"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Check failed, please retry later"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Data cannot be refreshed from server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Данните от този QR код не са валиден OTP Auth URI. QR кодът съдържа:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Само настройка създадена от потребител може да бъде изтрита"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Нечетимо, данните изглеждат криптирани"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Something went wrong during data fetching"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Дешифрирането е неуспешно, вашата база данни все още е защитена. Това се дължи главно на проблем с целостта на криптираните данни за един или повече акаунти."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Шифроването е неуспешно, вашата база данни остава незащитена."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Качването на файл не бе успешно"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Изисква се HTTPS контекст"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*неразгадаем*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Невалидни 2FA данни"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"No authenticators support specified algorithms"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Password reset unavailable for this user"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No readable QR code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Няма валиден OTP ресурс в този QR код"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Този OTP формат не се поддържа"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Операцията не е разрешена"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Този QR код е нечетлив"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code has invalid checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Презареждане"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Ресурсът не е намерен"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device already registered"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Нещо не е наред със сървъра ви"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"This SSO provider is not fully setup in your .env file"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is disabled"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication via SSO rejected"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrations are disabled"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"твърде много идентификатори бяха включени в параметъра на заявката, разрешени са максимум 100"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"URIа не може да се декриптира"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"Нямате права да видите този ресурс или да извършите това действие"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Неразрешено"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Неизвестна грешка"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Данните не отговарят на нито един поддържан формат"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Неподдържан OTP тип"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Изтриването на профила не бе успешно, няма изтрити данни"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"User ID was not between 1 and 64 chars"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong current password, nothing has changed"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Джон Доу"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Профил"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Алгоритъмът, използван за защита на вашите кодове за сигурност"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Алгоритъм"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Авт. заключване"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Отписване на потребителя автоматично в случай на неактивност. Няма ефект, когато удостоверяването се обработва от прокси и не е указан персонализиран URL адрес за излизане."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Авт. заключване"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache management"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматично проверявайте (веднъж седмично) и предупреди, когато в Github се публикува нова версия на 2FAuth"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Проверка за нова версия"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Empty the Search box right after a code has been copied to the clipboard"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Clear Search on copy"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Click on a generated password to copy it automatically hides it from the screen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Потвърди новата парола"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматично копиране на генерирана парола веднага след като се появи на екрана. Поради ограниченията на браузърите само първата Time-based One-Time Password (TOTP) парола ще бъде копирана, а не ротационните"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Рисковано е да редактирате брояча, тъй като можете да десинхронизирате акаунта със сървъра за проверка на услугата. Използвайте иконата за заключване, за да разрешите промяната, но само ако знаете, че правите"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"Първоначалната стойност на брояча"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"0 по подразбиране"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Брояч"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Попълнете текущата си парола, за да потвърдите, че това сте вие"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Текуща парола"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Групата, към която са свързани новосъздадените акаунти"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Група по подразбиране"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Режим на въвеждане по подразбиране, използван, когато опцията Директно въвеждане е включена"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Режим на въвеждане по подразбиране"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Броят цифри на генерираните кодове за сигурност"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Цифри"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Всички ваши устройства за сигурност ще бъдат отменени. Използвайте тази опция, ако сте загубили такова устройство или сигурността му е била компрометирана."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Деактивирайте всички защитни устройства"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Disable registration"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Изберете дали искате профилите да се показват като списък или като решетка"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Режим на показване"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Имейл"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Текуща парола"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Нова парола"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Парола"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Взима официалната икона на издателя на 2FA при добавяне на акаунт (ако е възможно)"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Взимане на официални икони"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Икона"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Език, използван за превод на потребителския интерфейс 2FAuth. Наименуваните езици са завършени, задайте този по ваш избор, който да замени предпочитанията на браузъра ви."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Език"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Назовете това устройство"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Име"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Ново име"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Нова парола"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Можете да оставите следните опции празни, ако не знаете как да ги зададете. Ще бъдат приложени най-често използваните стойности."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Задайте как и кога One-Time Passwords (OTP) да се показват"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Покажи паролата"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Временен OTP или HMAC базиран OTP или Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Променете начина, по който се показват паролите, като групирате цифри, за да улесните четливостта и запаметяването"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Форматиране на парола"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Парола"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"Периодът на валидност на генерираните кодове за сигурност в секунди"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"30 по подразбиране"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Период"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Запазва последния приложен групов филтър и го възстановява при следващото ви посещение"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Запомняне на груповия филтър"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Let the ability to temporarily reveal Dot-Obscured passwords"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"Ключът, използван за генериране на вашите кодове за сигурност"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Тайна"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Услуга"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Показвай иконите"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Email configuration test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Прилагане на специфичен облик или прилагане на предпочитания според системните/браузърните предпочитания"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Облик"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"The time zone applied to all dates and times displayed in the application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Time zone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Ако имате проблеми при заснемането на QR кодове, тази опция позволява превключване към по-прост, но по-надежден четец на QR кодове"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Използване на основен четец на QR код"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protect sensitive data"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Използвайте само WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Изберете дали искате да бъдете подканени да изберете режим на въвеждане сред наличните или искате директно да използвате режима на въвеждане по подразбиране"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Директно въвеждане"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Относно"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Access"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Възстановяване на профил"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Удостоверяване"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Промяна на паролата"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Danger Zone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Въвеждане на данни"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Изтриване на профил"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Среда"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Общи"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Групи"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Импорт"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Last accesses"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Вход"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Нов профил"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Нова група"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Нова парола"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Нов токен"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"New user"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Опции"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Парола"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Персонални токени за достъп"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Предпочитания"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Профил"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR код"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registrations"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Преименуване на устройство"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Ресурси"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Устройства за сигурност"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Сигурност"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Поддържани формати за миграция"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Неразрешено"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"User management"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn вход"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"След 1 ден"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"След 1 час"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 1 минута"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 10 минути"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 15 минути"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 30 минути"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 5 минути"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Профил"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Активна група"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Разширена форма"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"След клик/тап"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Показване на всички пароли в основния изглед, без да правите нищо"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Всички в основният изглед"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Всички"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Щракнете върху акаунт, за да получите парола в отделен изглед"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Самостоятелно, в отделен изглед"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Авто"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Назад"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"По предпочитание на браузъра"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Отказ"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Промяна на паролата"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Всички"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Check now"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Качи"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Изчисти"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Затвори"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Постоянно"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Продължи"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Копиране в клипборда"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Копиране"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Създай"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Заслуги"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Тъмен"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Default"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Delete this user"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Изтрийте профила си"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Изтрий"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Device"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Отхвърли всички"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Отхвърли дубликатите"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Готово"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Експорт"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 15 минути"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 5 минути"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Създаване"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Решетка"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Разделяне на цифрите на две равни групи"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"на Половина"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"На късмет"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Импорт. на всички"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Импорт"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Address"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Издател"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Светъл"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Списък"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"Сканиране на QR код"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Управление"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Премести"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Моето устройство"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Никога"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Нов"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Няма група"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"При копиране на кода"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"След 1 ден"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"След 1 час"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 1 минута"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mo."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yr."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Отвори в браузър"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Опции"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Групиране на цифрите две по две"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"на Две"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Чист текст"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Попълнете използвайки QR код"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR код"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Презареждане"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Регистрирайте устройство"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Премахни икона"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Resend email"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Анулирaне"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Запази"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Сканирайте QR код"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Търсене"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Изпратете връзка за нулиране на паролата"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Изпратете връзка за възстановяване"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Send"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Вход"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Изход"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Submit"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 10 минути"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Тест"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Text file"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"След 30 минути"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Time"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Импорт"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Групиране на цифрите три по три"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"на Три"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Отключи"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Актуализация"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Качете QR код"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Български)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Немски)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Английски)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Френски)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (японски)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Руски)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Относно"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Admin panel"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Back to home"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Продължи"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Създай нова група"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Create a user"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Редактиране"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Генерирайте нов токен"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Помогнете за превода на 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"потребител и парола"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Управление на групи"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Управление"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Може би по-късно"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Възстановете профила си"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Регистриране на устройство"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Възстанови я"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Сканирай"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"устройство за сигурност"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"See full log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Вход"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Използвайте разширената форма"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"View on Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Уеб приложение за управление на вашите акаунти с двуфакторно удостоверяване (2FA) и генериране на техните кодове за сигурност"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Уеб приложение за управление на вашите акаунти с двуфакторно удостоверяване (2FA) и генериране на техните кодове за сигурност"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"This account is bound to a "},{t:4,k:"provider"},{t:3,v:" account via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Имейлът за възстановяване на акаунта е изпратен!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Изберете метод и добавете първия си акаунт"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Manage users registered on your instance or create new ones."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Вече сте удостоверени"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Вече сте регистриран?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Алтернативни методи"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Главните букви са включени"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"The user account will be deleted as well as all its 2FA data."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Това ще нулира 2FAuth. Вашият потребителски акаунт ще бъде изтрит, както и всички 2FA данни. Няма връщане назад."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Deleting your 2FAuth account has no impact on your external SSO account."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Изтриването на група не изтрива профили"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Директно въвеждане"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Функцията е деактивирана в демо режима"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"НЕ активирайте защита с парола или криптиране, когато експортирате данни (от 2FA приложение), които искате да импортирате в 2FAuth."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Все още нямате акаунт?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Възникна грешка:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Грешка"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Забравена парола?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Съдържа малки букви"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Съдържа числа"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Съдържа символи"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Съдържа големи букви"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use the Export feature of these apps to get a migration resource like a QR code or a JSON file then load it here."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Импортиран"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- невалиден профил -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Този токен за нулиране е невалиден."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- невалидна услуга -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"Минимум 8 символа."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Last seen "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Лога от"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Загубихте устройството си?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Изработено с"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Уверете се, че сте копирали вашия личен токен за достъп. Няма да можете да го видите отново!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Можете да създавате групи, за да организирате акаунтите си по желания от вас начин. Всички профили остават видими в псевдо групата, наречена „Всички“, независимо от групата, към която принадлежат."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Задължително"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Премести избраните в"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Задайте поне едно устройство, за да активирате следните опции"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Тук няма 2FA!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"No entry yet"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"No result"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- няма услуга -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nothing"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hello"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"You can also continue with:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Parsing data..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"A password reset request exists for this user but has expired, meaning that the user has not changed their password in time. This may be a request from the user themselves or from an administrator."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"A password reset request exists for this user (request sent at "},{t:4,k:"datetime"},{t:3,v:"), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Вече съществува профил със същите данни"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"За да възстановите акаунта си, 2FAuth нулира някои настройки на Webauthn, така че да можете да влезете с вашия имейл и парола."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registered "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth ще ви изпрати връзка за нулиране на паролата на този адрес. Кликнете върху връзката в получения имейл, за да зададете нова парола."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Анулираното на устройство е перманентно"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Анулираното на токена е перманентно"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Устройства за удостоверяване, които можете да използвате за влизане в 2FAuth, като ключове за сигурност (като Yubikey) или смартфони с биометрични възможности (като Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Влизане с"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Някои преводи липсват при използване на предпочитания от браузъра език?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Инсталираните камери не са подходящи"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Моля, използвайте друго устройство/камера"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"За стрийминг от камерата се изисква HTTPS"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Сканирането не може да стартира :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth няма разрешение за достъп до камерата ви"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Трябва да дадете разрешение за използване на камерата на вашето устройство. Ако вече сте отказали и вашият браузър не ви подкани отново, моля, вижте документацията на браузъра, за да разберете как да дадете разрешение."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"Няма камера на това устройство"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Може би сте забравили да включите уеб камерата си"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Неуспешно зареждане на скенера"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Камерата използва ли се вече? Уверете се, че никое друго приложение не използва камерата и опитайте отново"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Изисква се защитен контекст"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"За сканиране се изисква HTTPS. Ако стартирате 2FAuth от вашия компютър, не използвайте виртуален хост, различен от localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Бразучера не поддържа поточно API"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Трябва да използвате модерен браузър"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Приема се: чист текст, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Приемат се: jpg, jpeg, png, bmp, gif, svg или webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Твърде много опити за влизане. Опитайте се пак след "},{t:4,k:"seconds"},{t:3,v:" секунди."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Токените за персонален достъп позволяват на всяко приложение да се удостовери в 2Fauth API. Трябва да посочите токена за достъп като Bearer токен в хедърите за оторизация на заявките за потребителски приложения."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"Икони"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use the available buttons to permanently save them to your 2FA collection or discard them."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Пригответе се за удостоверяване с помощта на (едно от) вашите устройства за сигурност. Включете ключа си, свалете маската за лице или ръкавиците и т.н."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" active token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" security device(s) (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Влизането чрез Webauthn е деактивирано"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Добре дошли в 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" accounts"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selected"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Тази инстанция е актуална"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Профилът беше създаден успешно"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Профилът е актуализиран успешно"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Профил(ите) са изтрити успешно"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Профил(ите) са преместени успешно"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Неуспешна идентификация"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Задействано е автоматизно заклюване. Връзката ви е автоматично прекратена."}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cleared"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Копирано в клипборда"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data has been refresh to reflect server-side changes"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Устройството е анулирано успешно"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Устройството е регистрирано успешно"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Групата беше преименувана"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Групата беше създадена успешно"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Групата беше изтрита успешно"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully reset"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's PATs successfully revoked"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Профилът е актуализиран успешно!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Настройките са запазени"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Токена е анулиран успешно"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Потребителският профил е изтрит успешно"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"user successfully created"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"User role updated"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"Намерени са "},{t:4,k:"count"},{t:3,v:" валидни профила"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Напред »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Назад"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Паролите трябва да имат поне 8 символа и да съвпадат с потвърждението."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Вашата парола е нулирана!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Изпратихме Ви писмо с линк за нова парола!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Моля, изчакайте, преди да опитате отново."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Ключът за нулиране на паролата е невалиден."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Не можем да намерим потребител с този имейл адрес."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"User name, email..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Записът не е намерен"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Относно"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Профили"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Удостоверяване"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Create user"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Manage user"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Users management"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Авт. заключване"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Заснеми QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Създай профил"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Създай група"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Промени профил"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Промяна на група"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Наводнение"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Грешка"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Групи"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Импортиране на профили"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Вход"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Нулиране на паролата"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Нова парола"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Потребителски профил"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Нов персонален токен"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth токени"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Опции"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn устройства"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Редакция на устройство"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Профил като QR код"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Нов профил"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Отключи"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Възстановяване на профил"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Регистриране на устройство"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Изчисти търсенето"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Изчисти избраните"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Затвори "},{t:4,k:"pagetitle"},{t:3,v:" страницата"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Копиране в клипборда"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Изтрий"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Отхвърли профила"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Генериране на тестов код"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Скрий избора на групи"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Скрий паролата"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Импориране на профила"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Заключи го"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Управление"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Преместете избраните в група"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Преименуване"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Resend a password reset email to the user"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Покажи паролата"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's security devices"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's tokens"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Анулирaне"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Търсене"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Избери всички"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Покажи избора на групи"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Покажи QR код"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Влезте с помощта на защитно устройство"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Cортирай възходящо"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Сортирай низходящо"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Отключи го (на ваш собствен риск)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Използвайте QR код, за магическо попълване"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute да бъде приет когато :other е :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде приетo."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute не е валиден URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е дата след или равна на :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е дата след :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа само букви, цифри, долна черта и тире."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа само букви и цифри."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа само букви."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е низ."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е дата преди или равна на :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е дата преди :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е между :min и :max елемента."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е между :min и :max килобайта."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е между :min и :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е между :min и :max символа."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа булева стойност (true или false)."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"Потвърждението на полето :attribute не съвпада."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Паролата е грешна."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not contain colon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"This email address does not comply with the registration policy"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Не е намерен акаунт с този имейл."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"All emails must be valid and separated with a pipe"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"ID-тата трябва да са разделени със запетая, и да не завършват с такава."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"Адресът трябва да има етикет."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute is not supported."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a base32 encoded string."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not contain colon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute is not a valid otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е дата равна на :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute не съвпада с формата :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute не е валидна дата."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде отказано когато :other е :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде отказано."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute и :other трябва да са различни."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е между :min и :max цифри."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е :digits цифри."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute съдържа невалидни размери."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute има дублирана стойност."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"Полето :Attribute трябва да завършва с една от следните стойности: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"Полето :Attribute трябва да започва с едно от следните: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа валиден имейл."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да завърпва с една от следните стойности: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"Избраното :attribute е невалидно."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"Избраното поле :attribute е невалидно."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е файл."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа стойнот."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":Attribute трябва да разполага с повече от :value елемента."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е по-голямо от :value килобакта."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да е по-голямо от :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"Дължината на :attribute трябва да бъде по-голямо от :value символа."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да има :value елемента или повече."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да е по-голям или равн на :value Kb."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да е по-голямо или равно на :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да е повече или равно на :value символа."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да e изображение."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute не съществува в :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"Избраният :attribute е невалиден."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде цяло число."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде валиден IP адрес."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде валиден IPv4 адрес."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде валиден IPv6 адрес."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да съдържа валиден JSON."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да разполага с по-малко от :value елемента."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute не трябва да е по-голям от :value килобакта."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде по-малко от :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":Attribute трябва да бъде по-малка от :value знака."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute не трябва да има повече от :value елемента."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде по-малък от или равен на :value килобайта."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде по-малко или равно на :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде по-малко от или равно на :value знака."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде валиден MAC адрес."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да има по-малко от :max елемента."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute не трябва да има повече от :max елемента."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute не трябва да бъде по-голямо от :max килобайта."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute не трябва да бъде по-голям от :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде по-малко от :max знака."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде файл от тип: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде файл от тип: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва има минимум :min числа."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да има поне :min елемента."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде с големина минимум :min KB."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде минимум :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да бъде минимум :min знака."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"Числото :attribute трябва да бъде кратно на :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Избраният :attribute е невалиден."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute е с невалиден формат."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute трябва да бъде число."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"The uri parameter must be provided alone or only in combination with the 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа поне една буква."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа поне една главна и една малка буква."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа поне една цифра."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съдържа поне един символ."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"Избраната :attribute съществува е дейта лийк. Моля изберете друга :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"Полето :attribute трябва да съществува."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited when :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited unless :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute е забранено."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field prohibits :other from being present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute format is invalid."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain entries for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is accepted."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required unless :other is in :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values are present."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is present."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when none of :values are present."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is not present."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute and :other must match."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"When using :attribute it must be the only parameter in this request body"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must contain :size items."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be :size characters."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must start with one of the following: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a string."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid timezone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute has already been taken."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute failed to upload."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid UUID."}}}},{ca:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Icona que il·lustra el compte"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Imatge del QR a escanejar"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Segur?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Els canvis es perdran. N'estàs segur?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Això tindrà greus impactes en els permisos d'aquest usuari. N'estàs segur?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Segur que voleu eliminar el vostre compte?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Segur que voleu eliminar aquest grup?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Esteu segur que voleu suprimir aquest compte?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Segur que voleu eliminar aquest usuari? No hi ha marxa enrere."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Ja no seràs administrador. N'estàs segur?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Esteu segur que voleu descartar tots els comptes?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Esteu segur que voleu descartar tots els duplicats?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Esteu segur que voleu suprimir aquest compte?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Aquest és el teu compte. N'estàs segur?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Estàs segur que vols sortir del compte?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Esteu segur que voleu revocar la sol·licitud anterior?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Segur que voleu restablir la contrasenya d'aquest usuari?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Segur que vols revocar aquest dispositiu?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Segur que vols revocar aquest token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"El domini de 2FAuth no és vàlid"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Avortat per usuari"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Compte gestionat per un proveïdor extern"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth està configurat per executar-se darrere d'un proxy d'autenticació, però el proxy no retorna la capçalera esperada. Comprova la configuració."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"L'autenticació del proxy ha fallat"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"L'autenticador no té compatibilitat amb credencials detectables"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"L'autenticador no té compatibilitat amb la verificació d'usuaris"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"El dispositiu no admet l'autenticació web. Torna-ho a provar més tard amb un navegador modern"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"No es pot crear una OTP sense un secret"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"El secret no es pot desxifrar. Això es deu principalment a un APP_KEY incorrecte definit al fitxer de configuració .env de 2Fauth o a unes dades corruptes emmagatzemades a la base de dades."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No es pot descodificar el codi QR detectat, intenta retallar o enfocar la imatge"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"No es pot suprimir l'únic compte d'administrador"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"No es pot degradar l'únic compte d'administrador"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"No es pot detectar un codi QR a la imatge, intenta retallar la imatge"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"El canvi ha fallat, si us plau torni-ho a provar"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"La comprovació ha fallat, si us plau torni-ho a provar més tard"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"No es poden actualitzar les dades des del servidor"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Les dades d’aquest codi QR no són un URI OTP Auth vàlid. El codi QR conté:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Només es pot eliminar la configuració creada per l’usuari"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error en l'obtenció del codi QR"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Ha fallat l'enviament del correu electrònic"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Il·legible, les dades semblen xifrades"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Ha fallat la generació de la clau de xifratge"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Errora l'obtenirr dades"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"S'ha produït un error en el desxifratge, la vostra base de dades encara està protegida. Això sol ser causat per un problema d'integritat de les dades xifrades d'un o més comptes."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"S'ha produït un error en el xifratge, la vostra base de dades roman sense protecció."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Ha fallat la migració de les icones. S'ha restaurat el valor anterior de la configuració."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"L'autenticació ha fallat, comproveu el vostre PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"El servidor 2FAuth no és accessible, comproveu la URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha pogut desxifrar el PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Error en derivar la clau"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Error en xifrar el PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Error en obtenir la contrasenya"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Error en obtenir el testimoni"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha pogut injectar l'script per escaneig el codi QR"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Error en carregar la configuració des de la botiga"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Error en regenerar IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Error en recuperar la configuració de l'aplicació"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Error en recuperar les dades de l'emmagatzematge de xifrat"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Error en configurar el retard de bloqueig automàtic"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Error en definir la clau de xifratge"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"No s'han pogut establir els paràmetres de xifratge"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha pogut emmagatzemar el PAT xifrat"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"Aquest camp és obligatori i ha de ser un URL vàlid"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"Aquest camp és obligatori"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Ha fallat la pujada del fitxer"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Es requereix un context HTTPS"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indesxifrable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Dades 2FA invàlides"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Token d'accés personal invàlid o desconegut"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Dades de :appname invàlides o il·legibles"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"Sense etiqueta activa"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Cap autenticador admet els algorismes especificats"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Cap entrada era de tipus 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No hi ha cap icona disponible en aquesta variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha trobat cap coincidència en el paquet d'icones"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"El restabliment de la contrasenya no està disponible per a aquest usuari"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"Sense d'imatge QR disponible"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha trobat cap codi QR vàlid a l'àrea visible de la pàgina"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Codi QR il·legible"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"No hi ha cap recurs OTP vàlid en aquest codi QR"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Aquest format d'OTP no és compatible actualment"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operació no permesa"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Aquest codi QR és il·legible"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"El codi QR té una suma de verificació invàlida"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresca"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Nom reservat, si us plau trieu-ne un altre"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Si us plau, utilitzeu només lletres, números, guions, guions baixos, espais o cometes simples"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Recurs no trobat"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositiu ja registrat"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Error de seguretat: comproveu la vostra variable d'entorn WEBAUTHN_ID"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Alguna cosa va malament al vostre servidor"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Els espais no desitjats s'eliminaran automàticament"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Aquest proveïdor SSO no està totalment configurat al vostre fitxer .env"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO deshabilitat"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Ja existeix un compte d'usuari amb la mateixa adreça de correu electrònic, però no coincideix amb el vostre ID de compte extern. No utilitzeu SSO si ja esteu registrat a 2FAuth amb aquest correu."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Autenticació mitjançant SSO rebutjada"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registres deshabilitats"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"s'han inclòs massa IDs en el paràmetre de consulta, el màxim permès és 100"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha pogut desxifrar l'URI"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"No teniu permisos per veure aquest recurs o realitzar aquesta acció"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"No autoritzat"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Error desconegut durant el xifratge del PAT"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Error desconegut"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Les dades no coincideixen amb cap format compatible"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Tipus d'OTP no compatible"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"No aplicable quan s'utilitza un proxy d'autenticació o SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Aquest mètode d'autenticació és només per a administradors. Els usuaris han d'iniciar sessió amb SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Ha fallat l'eliminació del compte d'usuari, no s'ha eliminat cap dada"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"L'ID d'usuari no tenia entre 1 i 64 caràcters"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya actual incorrecta, no s'ha canviat res"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya incorrecta"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Compte"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"L'algoritme utilitzat per protegir els vostres codis de seguretat"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algoritme"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Permet que els usuaris creïn tokens d'accés personal i els utilitzin per autenticar-se amb aplicacions de tercers, com l'extensió web de 2FAuth"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Permetre l'ús de PAT"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"El Token d'Accés Personal (PAT) per autenticar l'extensió al servidor. En podeu generar un des de la pàgina Configuració > OAuth del vostre compte d'usuari 2FAuth"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"Token API"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Amaga automàticament la contrasenya a la pantalla després d'un temps d'espera. Això evita sol·licituds innecessàries de noves contrasenyes si oblideu tancar la vista de la contrasenya."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto tancar OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueja l'extensió automàticament per evitar l'accés il·legítim a les seves dades"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueig automàtic"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Tanca la sessió de l'usuari automàticament en cas d'inactivitat. No té cap efecte quan l'autenticació la gestiona un proxy i no s'especifica cap URL de tancament de sessió personalitzada."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueig automàtic"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Els nous comptes es registren automàticament després d'escanejar o pujar un codi QR, sense necessitat de fer clic al botó Desa"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Autodesa comptes"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"A vegades cal esborrar la memòria cau, per exemple després d'un canvi a les variables d'entorn o una actualització. Ho podeu fer des d'aquí."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Gestió de memòria cau"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Cerca automàticament (un cop a la setmana) i avisa quan hi hagi una nova versió a GitHub"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Comprova nova versió"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Buideu el quadre de cerca just després de copiar un codi al porta-retalls"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Neteja Cerca al copiar"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Fer clic en una contrasenya generada per copiar-la l'amaga automàticament de la pantalla"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Tanca OTP després de copiar"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirma nova contrasenya"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Copia automàticament una contrasenya generada just després que aparegui a la pantalla. A causa de les limitacions dels navegadors, només es copiarà la primera contrasenya d'un sol ús basada en temps (TOTP), no les rotatives"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copiar OTP al mostrar"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"És arriscat editar el comptador, ja que podeu dessincronitzar el compte amb el servidor de verificació del servei. Utilitzeu la icona del cadenat per permetre la modificació, però només si sabeu el que esteu fent"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"El valor inicial del comptador"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"0 per defecte"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Comptador"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Introduïu la vostra contrasenya actual per confirmar que sou vós"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya actual"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"El grup al qual s'associaran els comptes acabats de crear"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Grup per defecte"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Mode d'entrada predeterminat utilitzat quan l'opció d'entrada directa està activada"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Mode d'entrada per defecte"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"El nombre de dígits dels codis de seguretat generats"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Dígits"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Tots els vostres dispositius de seguretat seran revocats. Utilitzeu aquesta opció si n'heu perdut un o si la seva seguretat s'ha vist compromesa."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Desactivar tots els dispositius de seguretat"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Evita el registre de nous usuaris. Tret que s'anul·li (vegeu més avall), això també afecta el SSO, de manera que els nous usuaris no podran iniciar sessió mitjançant SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Desactivar registre"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Trieu si voleu que els comptes es mostrin com a llista o com a graella"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Mode Visualització"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Correu"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Permet que els visitants s'autentiquin mitjançant un ID extern a través de l'esquema Single Sign-On"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Activar SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"La contrasenya utilitzada actualment per desbloquejar l'extensió"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya actual"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"La nova contrasenya que s'utilitzarà per bloquejar aquesta extensió i xifrar dades sensibles quan sigui necessari"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nova contrasenya"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"La contrasenya que s'utilitzarà per bloquejar aquesta extensió i xifrar dades sensibles quan sigui necessari"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Intenta obtenir la icona oficial de l'emissor de 2FA en afegir un compte"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Obtenir icones oficials"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"El grup al qual s'ha d'assignar el compte"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Grup"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL que podeu visitar per comprovar l'estat d'aquesta instància 2FAuth. Aquest URL es pot utilitzar per configurar una comprovació de salut de Docker o una sonda de vida HTTPS de Kubernetes."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Punt de salut"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"L'adreça web de la instància de 2FAuth on us vau registrar. Per exemple: https://2fauth.meulloc.cat"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"URL del servidor 2FAuth"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"La col·lecció d'icones que es consultarà primer quan es requereixi una icona oficial."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Col·lecció en línia preferida"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Estableix si s'han de cercar les icones en una col·lecció de logotips en línia o en un paquet d'icones local. El canvi dels següents ajustos d'icona no refrescarà les icones que ja s'hagin obtingut."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Obtenir icones de"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"El paquet d'icones a utilitzar quan es requereixi una icona oficial. Els paquets d'icones es fan disponibles pujant directoris de paquets al servidor 2FAuth; consulteu l'administrador de la vostra instància per a més informació."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Paquet d'icones"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Restringir la cerca a la variant especificada. Si falta la variant, 2FAuth no intentarà recórrer a la variant normal."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Cerca estricta"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Algunes icones estan disponibles en diferents estils per adaptar-se millor a les interfícies d'usuari fosques o clares. Establiu la que voleu buscar primer. La variant normal s'obtindrà automàticament com a alternativa."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icona alternativa"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icona"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Dona drets d'administrador a l'usuari. Els administradors tenen permisos per gestionar tota l'aplicació; configuració i altres usuaris, però no poden generar contrasenyes per a un 2FA que no siguin de la seva propietat."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"És administrador"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Permet que els nous usuaris iniciïn la sessió per primera vegada mitjançant SSO mentre el registre està desactivat"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Mantenir el registre SSO habilitat"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Idioma utilitzat per traduir la interfície d'usuari de 2FAuth. Els idiomes anomenats estan complets, establiu el que trieu per sobreescriure la preferència del vostre navegador."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Idioma"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Anomena dispositiu"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Nom"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Nom nou"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nova contrasenya"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Rebre un correu cada vegada que falli un intent de connexió al vostre compte de 2FAuth"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"En cas de fallada en l'inici de sessió"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Rebre un correu quan un nou dispositiu es connecti al vostre compte de 2FAuth per primera vegada"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"En nou dispositiu"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Podeu deixar les següents opcions en blanc si no sabeu com configurar-les. S'aplicaran els valors més comuns."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Estableix com i quan es mostren les contrasenyes d'un sol ús (OTP)"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Mostra contrasenya"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"OTP basada en temps, o OTP basada en HMAC, o OTP de Steam"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Trieu el tipus d'OTP a crear"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Canvia com es mostren les contrasenyes agrupant els dígits per facilitar-ne la lectura i memorització"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Format de la contrasenya"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"El període de validesa dels codis de seguretat generats en segons"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"30 per defecte"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Període"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Desa l'últim filtre de grup aplicat i el restaura en la vostra propera visita"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Recordar filtre de grup"}},"field.restrict_list.help":{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Els correus electrònics d'aquesta llista podran registrar-se. Separeu les adreces amb una barra vertical ('"},{t:2,i:[{t:3}],s:"')"}]}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Llista de filtratge"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Fa que el registre només estigui disponible per a un rang limitat d'adreces de correu electrònic. Ambdues regles es poden utilitzar simultàniament. Això no té cap efecte en el registre via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restringir registre"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Els correus electrònics que coincideixin amb aquesta expressió regular podran registrar-se"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Regla de filtratge"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Permet la capacitat de revelar temporalment les contrasenyes ocultes per punts"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Revelar OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"La clau utilitzada per generar els vostres codis de seguretat"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Servei"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Mostra les icones dels comptes a la vista principal"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Mostra icones"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Mostra el correu de l'usuari connectat al peu de pàgina en lloc dels enllaços de navegació directa. Els enllaços estaran disponibles en un menú en fer clic sobre l'adreça de correu."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Mostra el correu al peu de pàgina"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Previsualitza la següent contrasenya, és a dir, la contrasenya que substituirà l'actual quan caduqui. Les preferències establertes per a l'OTP actual també s'apliquen a la següent (format, mostrar com a punts)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar següent OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Substitueix els caràcters de la contrasenya generada per *** per garantir la confidencialitat. No afecta la funció de copiar/enganxar"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Mostra l'OTP generada com a punts"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Quan s'invoca, força la funció d'ordenació a ordenar els comptes distingint entre majúscules i minúscules"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Distingeix entre majúscules i minúscules"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Les icones pujades es registren a la base de dades a més del sistema de fitxers, que llavors s'utilitza només com a memòria cau. Això facilita molt la creació d'una còpia de seguretat de 2FAuth, ja que només cal fer còpia de la base de dades."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Però atenció, això pot tenir alguns inconvenients: la mida de la base de dades pot augmentar significativament si la instància allotja moltes icones grans. També pot afectar el rendiment de l'aplicació perquè s'accedeix al sistema de fitxers més sovint per assegurar que estigui sincronitzat amb la base de dades."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Desa icones a la BBDD"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Envia un correu electrònic de prova per controlar la configuració del correu electrònic de la teva instància. És important tenir una configuració que funcioni; altrament, els usuaris no podran sol·licitar un restabliment de contrasenya."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Prova de configuració del mail"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Força un tema específic o aplica el tema definit en les preferències del vostre sistema/navegador"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Tema"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"La zona horària aplicada a totes les dates i hores mostrades a l'aplicació"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Zona horària"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Si experimenteu problemes en capturar codis QR, activeu aquesta opció per canviar a un lector de codis QR més bàsic però més fiable"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzar lector de codis QR bàsic"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Les dades sensibles, els secrets 2FA i els correus electrònics, s'emmagatzemen xifrats a la base de dades. Assegureu-vos de fer una còpia de seguretat del valor APP_KEY del vostre fitxer .env (o de tot el fitxer), ja que serveix com a clau de xifratge. No hi ha manera de desxifrar les dades xifrades sense aquesta clau."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protegir dades sensibles"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Fa que el SSO sigui l'únic mètode disponible per iniciar sessió a 2FAuth. L'inici de sessió amb contrasenya i Webauthn es desactiven llavors per als usuaris normals. Els administradors no es veuen afectats per aquesta restricció."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzar només SSO"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Fa que WebAuthn sigui l'únic mètode autoritzat per iniciar sessió al vostre compte de 2FAuth. Aquesta és la configuració recomanada per aprofitar la seguretat millorada de WebAuthn."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"En cas de pèrdua del dispositiu, podreu recuperar el vostre compte desactivant aquesta opció i iniciant sessió amb el vostre correu i contrasenya."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Atenció! El formulari de Correu i Contrasenya roman disponible tot i que aquesta opció està activada, però sempre retornarà una resposta d'Autenticació fallida."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzar només WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Trieu si voleu que se us demani triar un mode d'entrada entre els disponibles o si voleu utilitzar directament el mode d'entrada predeterminat"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Entrada directa"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Torna sempre al grup per defecte quan es copia una OTP"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Veure grup per defecte en copiar"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Quant a"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Registre d'accés"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Accés"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Recuperació de compte"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Autentificació"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Restriccions de Navegador"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Canvia contrasenya"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Zona perillosa"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Entrada de dades"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Suprimeix compte"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Editar compte"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Entorn"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"General"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grups"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Importa"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Últims accessos"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Inici de sessió"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Nou compte"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Nou grup"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nova contrasenya"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Nou token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Nou usuari"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notificacions"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Opcions"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Claus d'accés personals"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferències"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Perfil"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Finalitat"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Codi QR"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Registre"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registres"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Reanomena dispositiu"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablir extensió"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Restablir contrasenya"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Recursos"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositius de Seguretat"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Seguretat"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Opcions del Servidor"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Configuració"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"Inici de sessió SSO"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Emmagatzematge"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Formats de migració admesos"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"No autoritzat"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Actualització del perfil"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Gestió d'usuaris"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Usuaris"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"Inici de sessió WebAuthn"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Després d'un dia"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 hora més tard"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després d'1 minut"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 10 minuts"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 15 minuts"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 2 minuts"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 30 minuts"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 5 minuts"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"Sobre"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Compte"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Grup actiu"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Afegir a 2Fauth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Formulari avançat"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Després d'un clic/toc"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Mostra totes les contrasenyes a la vista principal, sense fer res"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Tots ells, a l'inici"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Tot"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Tots els comptes"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Sense grup"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Comptes sense grup"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Fes clic en un compte per obtenir la contrasenya en una vista dedicada"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Sol, en la seva pròpia vista"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Configuració de l'app"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Aplica"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Enrere"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Preferència de navegador"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Navegador"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Cancel·la"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Canvia contrasenya"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Tot"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Comprova"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Puja"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Neteja"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Tanca"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantment"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continua"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copia al porta-retalls"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copia"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Crear"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Crèdits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Fosc"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Per defecte"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Esborrar usuari"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Elimina el teu compte"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Esborra"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detecta codis QR"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Dispositiu"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Descarta tot"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Desestima duplicats"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Documents"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Fet"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Exporta"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extensió"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 15 minuts"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 5 minuts"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Genera"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"GitHub"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Graella"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Dividir dígits en dos grups iguals"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"A la meitat"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Prova Sort"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Paquet pujat"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Importa tot"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Importa"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"Adreça IP"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Emissor"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Clar"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Llista"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"Escaneig en viu de codi QR"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Administrar"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Potser després"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Moure"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"El meu dispositiu"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Mai"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Nou"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Cap grup"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- Cap paquet -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar del seu grup"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"En copiar el codi de seguretat"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Després d'un dia"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 hora més tard"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després d'1 minut"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"un mes."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"un any."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Col·lecció en línia"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Obre al navegador"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"SO"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Opcions"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"URIs otpauth"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Agrupar dígits en dos"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"Per parella"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Text pla"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Omplir mitjançant un codi QR"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Codi QR"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"Pujada de codi QR"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresca"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Registrar dispositiu"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Registrar"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Elimina icona"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Reenviar correu"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablir extensió"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Restablir contrasenya"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Restablir"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revocar"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Desa"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Escaneja codi QR"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Cerca"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Seleccioneu els comptes a mostrar"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Envia enllaç per restablir la contrasenya"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Envia enllaç de recuperació"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Envia"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Mostra'm"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Accedir"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Tanca sessió"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Envia"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 10 minuts"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Prova"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Arxiu de text"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 30 minuts"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Temps"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Importa"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Agrupar dígits en tres"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"Per trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Després de 2 minuts"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"Format 2FAuth"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloca"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Actualitza"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Puja codi QR"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Puja"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Usuaris"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Extensió web"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mesos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Búlgar (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Danès (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Alemany (German)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"Anglès (English)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Espanyol (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Francès (French)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"Hindú (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italià (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"Japonès (Japanese)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"Coreà (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Holandès (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Portuguès (Portuguese)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Rus (Russian)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Turc (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"Xinès (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Quant a"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Panell administració"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Torna a l'inici"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configura"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continua"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Crea un nou grup"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Crear un usuari"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"Com crear un PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edita"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generar nou token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Anar a 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Ajuda a traduir 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"Usuari i contrasenya"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Administra Grups"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Administrar"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Potser després"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recupera el compte"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Registrar dispositiu"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Registrar"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Restablir-la"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablir extensió"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Restablir la vostra contrasenya"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Escaneja"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"Un dispositiu de seguretat"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Veure log sencer"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Mira com habilitar un proveïdor"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Opcions"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Podeu iniciar sessió sense SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Accedir"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"Esquema d'exportació de 2FAuth"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Empra el formulari avançat"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Veure a GitHub"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Per què veig això?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Aplicació web per configurar els codis de doble factor (2FA) i generar els seus codis de seguretat"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Aplicació web per configurar els codis de doble factor (2FA) i generar els seus codis de seguretat"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Registre d'accés complet per a l'usuari "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Aquest compte està vinculat a un compte de "},{t:4,k:"provider"},{t:3,v:" mitjançant OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"Heu iniciat sessió via SSO utilitzant el vostre compte de "},{t:4,k:"provider"},{t:3,v:". La vostra informació no es pot canviar aquí, sinó a "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Correu de recuperació de compte enviat!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Trieu un mètode i afegiu el vostre primer compte"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Gestioneu els usuaris registrats a la vostra instància o creeu-ne de nous."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Ja esteu autenticat, si us plau tanqueu la sessió primer"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Ja esteu registrat?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Mètodes alternatius"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"L'autenticació la gestiona un proxy invers, les opcions següents estan desactivades."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"L'autenticació contra el servidor ha fallat."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"El company perfecte per a la vostra aplicació web 2FAuth"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser a :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"El bloqueig de majúscules està activat"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"El compte d'usuari s'eliminarà, així com totes les seves dades 2FA."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"El vostre compte d'usuari s'eliminarà així com totes les vostres dades 2FA. No hi ha marxa enrere."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar el vostre compte de 2FAuth no té cap impacte en el vostre compte extern de SSO."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar un grup no elimina els comptes"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Comença detecció i selecciona el codi, jo faré la resta."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Entrada directa"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Funció desactivada en mode Demostració"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"NO activeu la protecció per contrasenya ni el xifratge quan exporteu dades des d'una aplicació 2FA, altrament 2FAuth no podrà desxifrar-les."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Encara no teniu un compte?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"El correu serà enviat a "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Podeu millorar la seguretat del vostre compte 2FAuth activant l'autenticació WebAuthn."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Assegureu-vos d'obrir el correu en un dispositiu que sigui totalment vostre."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"S'ha produït un error:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Esperat: Una llista d'URIs otpauth, una per línia"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Inici de sessió fallit el "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Error"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Obtenint dades..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"El teu navegador (Firefox) requereix que s'activi una preferència especial perquè l'extensió s'obri automàticament quan captureu un codi QR d'una pàgina web."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Heu oblidat la vostra contrasenya?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Té minúscules"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Té números"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Té caràcters especials"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Té majúscules"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Ajuda: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hola "},{t:4,k:"username"},{t:3,v:", tot correcte"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"El botó 'Prova sort' intenta obtenir una icona estàndard de la col·lecció d'icones seleccionada. Com més senzill sigui el valor del camp Servei, més probabilitats tindreu d'obtenir la icona esperada: No afegiu cap extensió (com '.com'), utilitzeu el nom exacte del servei, eviteu caràcters especials."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrador?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzeu la funció d'exportació d'aquestes aplicacions per obtenir un recurs de migració com un codi QR o un fitxer JSON i carregueu-lo aquí."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth pot importar dades de diverses aplicacions 2FA."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Importat"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- compte invàlid -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Aquest token de restabliment no és vàlid."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- servei invàlid -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 caràcters mínim."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"El vostre token d'accés personal encara és vàlid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Vist per darrera vegada el "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logotips per"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Heu perdut el vostre dispositiu?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Fet amb"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Assegureu-vos de copiar el vostre token d'accés personal ara. No el podreu tornar a veure!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Gestioneu el compte en l'àmbit de proxy."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Gestioneu l'autenticació en l'àmbit de proxy."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Podeu crear grups per organitzar els vostres comptes com vulgueu. Tots els comptes romanen visibles en el pseudogrup anomenat 'Tots', independentment del grup al qual pertanyin."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Obligatori"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Moure seleccionats a"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Cal importar un dels codis QR visibles d'aquesta pàgina a 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"O"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"O filtrar comptes per grup"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Establiu almenys un dispositiu per habilitar les opcions següents"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Sense 2FA!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Sense entrada"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha trobat imatge al porta-retalls"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"Sense proveïdor"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Sense resultats"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- sense servei -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"¿Falta proveïdor?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"res"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Aquí teniu els detalls d'aquest intent de connexió"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Si heu estat vosaltres, podeu ignorar aquesta alerta. Si fallen més intents, hauríeu de contactar amb l'administrador de 2FAuth per revisar la configuració de seguretat i prendre mesures contra aquest atacant."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"Hi ha hagut un intent d'inici de sessió fallit al vostre compte de 2FAuth."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Inici de sessió fallit a 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hola :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hola"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Aquí teniu els detalls d'aquesta connexió"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Si heu estat vosaltres, podeu ignorar aquesta alerta. Si sospiteu de qualsevol activitat sospitosa al vostre compte, si us plau canvieu la vostra contrasenya."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Un nou dispositiu s'acaba de connectar al vostre compte de 2FAuth."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connexió a 2FAuth des d'un nou dispositiu"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Salutacions"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"Reseteja contrasenya 2Fauth"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"Reps aquest correu perquè has demanat restablir la contrasenya del compte de 2Fauth."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"El link de restabliment de contrasenya expira en :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"Si no has demanat el restabliment de contrasenya omet aquest correu."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Estàs rebent aquest correu perquè s'ha enviat una prova per validar les opcions de correu a la instància de 2fauth."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"Correu de prova de 2fAuth"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Bones notícies, funciona :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recomanat (altament)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"També podeu continuar amb:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"La URI otpauth és el format més comú utilitzat per intercanviar dades 2FA, per exemple en forma de codi QR quan activeu el 2FA en un lloc web. Seleccioneu això si voleu canviar de 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exportar dades com una llista d'URIs otpauth"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Analitzant dades..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"L'inici de sessió amb contrasenya i WebAuthn estan desactivats."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Existeix una sol·licitud de restabliment de contrasenya per a aquest usuari però ha caducat, el que significa que l'usuari no ha canviat la contrasenya a temps. Això pot ser una sol·licitud de l'usuari mateix o d'un administrador."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Existeix una sol·licitud de restabliment de contrasenya per a aquest usuari (sol·licitud enviada el "},{t:4,k:"datetime"},{t:3,v:"), el que significa que l'usuari encara no ha canviat la seva contrasenya però l'enllaç que ha rebut encara és vàlid. Això pot ser una sol·licitud de l'usuari mateix o d'un administrador."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Un compte amb les mateixes dades ja existeix"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"Aquesta extensió web és un complement a l'aplicació web 2FAuth. Us permet accedir a les dades 2FA del vostre compte d'usuari de 2FAuth i generar OTPs directament des de la barra del vostre navegador."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"Heu de tenir un compte d'usuari de 2FAuth i vincular-lo a l'extensió per poder utilitzar-la. Això es fa proporcionant l'adreça del servidor 2FAuth i un Token d'Accés Personal (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Per recuperar el vostre compte, 2FAuth restableix algunes configuracions de Webauthn perquè pugueu iniciar sessió amb el vostre correu i contrasenya."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth us enviarà un enllaç de recuperació a aquesta adreça de correu. Feu clic a l'enllaç del correu rebut i seguiu les instruccions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registrat el "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"El registre de 2FA des de l'extensió encara no és compatible. Visiteu la vostra aplicació 2FAuth per afegir el vostre primer 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzeu 'Reenviar correu' per enviar un nou correu de restabliment de contrasenya a l'usuari perquè pugui establir una nova contrasenya. Això deixarà la seva contrasenya actual com està i qualsevol sol·licitud anterior serà revocada."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzeu aquesta opció si heu oblidat la contrasenya de l'extensió."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"L'extensió serà despullada de la seva configuració actual i de les dades de 2FAuth. Estarà disponible de nou per tornar-la a vincular a un compte d'usuari de 2FAuth."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzeu 'Restablir contrasenya' per forçar un restabliment de contrasenya (això establirà una contrasenya temporal) abans d'enviar un correu de restabliment a l'usuari perquè pugui establir una nova contrasenya. Qualsevol sol·licitud anterior serà revocada."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth us enviarà un enllaç de restabliment de contrasenya a aquesta adreça. Feu clic a l'enllaç del correu rebut per establir una nova contrasenya."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Si sempre heu utilitzat SSO per iniciar sessió, tanqueu la sessió i utilitzeu la funció de restabliment de contrasenya per obtenir una contrasenya i així poder omplir aquest formulari."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Podeu provar de refrescar (potser ha estat un problema temporal) o podeu restablir l'extensió i proporcionar un nou token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"La revocació d'un dispositiu és permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"La revocació del token és permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Dispositius d'autenticació que podeu utilitzar per iniciar sessió a 2FAuth, com claus de seguretat (ex: Yubikey) o telèfons intel·ligents amb capacitats biomètriques (ex: Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Algunes opcions estan sent gestionades pel vostre administrador"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"Us podeu connectar utilitzant l'adreça de correu "},{t:4,k:"email"},{t:3,v:" i la contrasenya "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Trieu un proveïdor SSO per iniciar sessió:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Accedir emprant"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Falten algunes traduccions utilitzant l'idioma preferit del navegador?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Els usuaris normals han d'iniciar sessió amb SSO. Els altres mètodes són només per a administradors."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"L'autenticació està restringida només a SSO, "},{t:4,k:"auth_method"},{t:3,v:" està desactivat"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Les càmeres instal·lades no són adequades"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Si us plau, utilitzeu un altre dispositiu/càmera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Es requereix HTTPS per a l'escaneig de la càmera"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"L'escaneig en viu no pot començar:("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"Normalment es fa fent clic en una icona de càmera ratllada dins o al costat de la barra d'adreces del navegador"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth no té permís per accedir a la vostra càmera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Heu de concedir permís per utilitzar la càmera del vostre dispositiu. Si ja l'heu denegat i el vostre navegador no us ho torna a demanar, si us plau consulteu la documentació del navegador per saber com concedir el permís."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No hi ha cap càmera en aquest dispositiu"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Potser heu oblidat connectar la vostra càmera web"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Error en carregar l'escàner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"La càmera ja està en ús? Assegureu-vos que cap altra aplicació utilitzi la vostra càmera i torneu-ho a provar"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Es requereix un context segur"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"L'HTTPS és necessari per a l'escaneig en viu. Si executeu 2FAuth des del vostre ordinador, no utilitzeu cap host virtual que no sigui localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"L'API de Stream no és compatible amb aquest navegador"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Hauríeu d'utilitzar un navegador modern"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"S’han trobat els següents comptes 2FA al recurs de migració. Fins ara, cap d’ells s’ha afegit a 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Inici de sessió correcte el "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Tancament de sessió correcte el "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Acceptat: Text pla, JSON, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Acceptat: jpg, jpeg, png, bmp, gif, svg, o webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Això no és una eliminació suau, no hi ha marxa enrere."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Massa intents d'inici de sessió. Si us plau, torneu-ho a provar en "},{t:4,k:"seconds"},{t:3,v:" segons."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Els Tokens d'Accés Personal permeten que qualsevol aplicació s'autentiqui a l'API de 2Fauth. Heu d'especificar el token d'accés com un token Bearer a la capçalera d'autorització de les sol·licituds de les aplicacions consumidores."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"Aquesta acció no revoca el token d'accés personal en ús."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"Hauríeu de preferir aquesta opció si necessiteu crear una còpia de seguretat que es pugui restaurar. Aquest format té en compte les icones."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exportar dades emprant l'esquema JSON de 2FAuth"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"La definició de l'esquema es descriu aquí:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Una extensió de navegador per recuperar els codis de seguretat 2FA generats des del vostre servidor 2FAuth."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"Icones per"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"L'extensió està bloquejada per protegir les seves dades. Introduïu la contrasenya de l'extensió per accedir als vostres 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzeu els botons disponibles per desar-los permanentment a la vostra col·lecció de 2FA o descartar-los."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Prepareu-vos per autenticar-vos utilitzant (un dels) els vostres dispositius de seguretat. Connecteu la vostra clau, traieu-vos la mascareta o els guants, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Utilitzeu l'adreça de correu "},{t:4,k:"email"},{t:3,v:" i la contrasenya "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Compte d'usuari posat a disposició per un proxy d'autenticació."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" token(s) actiu(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" Dispositiu(s) de seguretat (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Vist el "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha trobat cap paquet d'icones al servidor."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Inici de sessió per Webauthn desactivat"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn us permet utilitzar dispositius de confiança (com Yubikeys o telèfons intel·ligents amb capacitats biomètriques) per iniciar sessió de manera ràpida i més segura."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Benvingut a 2fAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Benvinguts a la demostració de 2FAuth."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Benvinguts a la instància de proves de 2FAuth"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"Aquest és un canvi de configuració senzill que triga menys d'un minut. Hem preparat una guia pas a pas per ajudar-vos a habilitar la funció."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" Comptes"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" disponible"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" seleccionat"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Instància actualitzada"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"També pots Enganxar el porta-retalls"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"Necessiteu un compte per anar més lluny, si us plau registreu-vos."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Compte creat correctament"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Compte actualitzat correctament"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Compte(s) esborrat(s) correctament"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Compte(s) mogut(s) correctament"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"L'autenticació ha fallat"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"S'ha activat el bloqueig automàtic, s'ha tancat la sessió"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache esborrada"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiat al porta-retalls"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Dades actualitzades per reflectir canvis al servidor"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositiu revocat correctament"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositiu registrat"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Nom del grup desat"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Grup creat correctament"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Grup eliminat correctament"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No hi ha cap paquet d'icones disponible"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya canviada"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya canviada correctament"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya restablerta correctament"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Tokens PAT de l'usuari revocat correctament"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Perfil actualitzat correctament!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositius de seguretat de l'usuari revocats correctament"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Opcions desades"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Correu de prova enviat, comproveu la vostra bústia d'entrada"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token revocat satisfactòriament"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Compte d'usuari eliminat correctament"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"Usuari creat correctament"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Rol d'usuari actualitzat"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"S'han trobat "},{t:4,k:"count"},{t:3,v:" comptes vàlids"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Següent »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Anterior"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Les contrasenyes han de tenir almenys vuit caràcters i coincidir amb la confirmació."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"La contrasenya s'ha restablert!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Hem enviat per mail l'enllaç per restablir la contrasenya!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Si us plau, espera abans de reintentar-ho."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"El testimoni de reinici de contrasenya no és correcte."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"No existeix cap usuari amb aquest email."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Nom d'usuari, correu..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Element no trobat"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Quant a"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Comptes"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Configuració de l'app"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Autentificació"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Crear usuari"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Registre d'accés"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Gestiona usuari"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Gestió d'usuaris"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueig automàtic"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Crea compte"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Crear grup"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Edita compte"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Edita grup"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Inundat"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Error"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grups"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importar comptes"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Pàgina d'inici"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Inici de sessió"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Restablir contrasenya"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nova contrasenya"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablir extensió"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Registrar nou compte"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Comptes d'usuari"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Nou token personal"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"Tokens OAuth"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Opcions"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositius WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Edició del dispositiu"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Opcions"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Compte com a codi QR"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Nou compte"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloca"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Recuperació de compte"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Registrar dispositiu"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Neteja la cerca"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Neteja selecció"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Tanca la pàgina "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copia la següent contrasenya al porta-retalls"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copia al porta-retalls"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Esborra"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detecta codis QR a la pàgina web activa"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Descarta aquest compte"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Exportar comptes seleccionats"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generar contrasenya de prova"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Torna a la pàgina "},{t:4,k:"pagetitle"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Amaga el selector de grups"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Amaga la contrasenya"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Importa aquest compte"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Tanca'l"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Administrar"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Moure seleccionats a un grup"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exportar dades com una llista d'URI otpauth"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Actualitzar llista de paquets d'icones"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Reanomena"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Reenviar un correu de restabliment de contrasenya a l'usuari"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Restablir la contrasenya de l'usuari"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Mostra la contrasenya"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoca tots els dispositius de seguretat de l'usuari"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoca tots els tokens de l'usuari"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revocar"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Cerca"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Marca tot"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Mostra el selector de grups"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostra entrades del darrer mes"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostra entrades del darrer any"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Mostra el codi QR"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostra entrades dels darrers sis mesos"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostra entrades dels darrers tres mesos"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Iniciar sessió emprant un dispositiu de seguretat"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Ordre ascendent"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Mostra primer els menys recents"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Mostra primer els més recents"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Ordre descendent"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exportar dades emprant l'esquema JSON de 2FAuth"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloqueja-ho (sota el vostre propi risc)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Utilitzeu un codi QR per omplir el formulari màgicament"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visita "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser acceptat quan :other és :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser acceptat."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un URL vàlid."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una data posterior o igual a :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una data posterior a :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute només ha de contenir lletres, números, guions i guions baixos."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute només ha de contenir lletres i números."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute només ha de contenir lletres."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una matriu."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute només ha de contenir caràcters alfanumèrics i símbols d'un sol byte."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una data anterior o igual a :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una data anterior a :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir entre :min i :max elements."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir entre :min i :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'estar entre :min i :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir entre :min i :max caràcters."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser vertader o fals."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute conté un valor no autoritzat."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"La confirmació del camp :attribute no coincideix."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"Al camp :attribute li falta un valor obligatori."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Contrasenya invàlida."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de contenir el signe de dos punts."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Aquesta adreça de correu electrònic no compleix amb la política de registre"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No s'ha trobat compte per aquest email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Tots els correus han de ser vàlids i estar separats per una barra vertical ("},{t:2,i:[{t:3}],s:")"}]}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Formats acceptats: jpeg, png, bmp, gif, svg, o webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"Els IDs han d'estar separats per comes, sense coma final."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"L'URI ha de tenir una etiqueta."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no és compatible."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Formats acceptats: jpeg, png, bmp, gif, svg, o webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una cadena codificada en base32."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de contenir el signe de dos punts."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no és una URI otpauth vàlida."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una data igual a :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de coincidir amb el format :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una data vàlida."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir :decimal decimals."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser rebutjat quan :other és :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser rebutjat."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute i :other han de ser diferents."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir entre :min i :max dígits."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir :digits dígits."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute té dimensions d'imatge no vàlides."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute té un valor duplicat."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha d'acabar amb un dels següents: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de començar amb un dels següents: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una adreça de correu electrònic vàlida."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'acabar amb un dels següents: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"El :attribute seleccionat és invàlid."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"El :attribute seleccionat és invàlid."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir una de les següents extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un fitxer."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir un valor."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir més de :value elements."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser superior a :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser superior a :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser superior a :value caràcters."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir :value elements o més."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser superior o igual a :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser superior o igual a :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser superior o igual a :value caràcters."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un color hexadecimal vàlid."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"No es pot trobar el paquet d'icones al servidor."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una imatge."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'existir a :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"El :attribute seleccionat és invàlid."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un nombre sencer."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una adreça IP vàlida."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una adreça IPv4 vàlida."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una adreça IPv6 vàlida."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un patró de regex vàlid."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una cadena JSON vàlida."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una llista."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser en minúscules."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir menys de :value elements."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser inferior a :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser inferior a :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser inferior a :value caràcters."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de tenir més de :value elements."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser inferior o igual a :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser inferior o igual a :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser inferior o igual a :value caràcters."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una adreça MAC vàlida."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de tenir més de :max dígits."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de tenir més de :max elements."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de ser superior a :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de ser superior a :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute no ha de ser superior a :max caràcters."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un fitxer de tipus: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un fitxer de tipus: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir almenys :min dígits."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir almenys :min elements."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir almenys :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser almenys :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir almenys :min caràcters."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de faltar quan :other és :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de faltar tret que :other sigui :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de faltar quan :values estan presents."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de faltar quan :values està present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de faltar."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un múltiple de :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"El :attribute seleccionat és invàlid."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"El format del camp :attribute és invàlid."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un número."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"El paràmetre URI ha de ser proporcionat sol o només en combinació amb el paràmetre 'custom_otp'"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de contenir almenys una lletra."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de contenir almenys una majúscula i una minúscula."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de contenir almenys un número."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de contenir almenys un símbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"El :attribute proporcionat ha aparegut en una filtració de dades. Si us plau, trieu un :attribute diferent."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'estar present quan :other és :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'estar present tret que :other sigui :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'estar present quan :values estan presents."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'estar present quan :values està present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha d'estar present."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute està prohibit quan :other és :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute està prohibit tret que :other estigui a :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute està prohibit."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute prohibeix que :other estigui present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"El format del camp :attribute és invàlid."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de contenir entrades per a: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori quan s'accepta :other."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori quan es rebutja :other."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori quan :other és :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori tret que :other estigui a :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori quan :values estan presents."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori quan :values està present."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori quan cap de :values està present."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori quan :values no està present."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute és obligatori."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de coincidir amb :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Quan s'utilitza :attribute, ha de ser l'únic paràmetre en aquest cos de la sol·licitud"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de contenir :size elements."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de tenir :size caràcters."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de començar per un dels següents: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una cadena de text."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una zona horària vàlida."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un ULID vàlid."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"El :attribute ja ha estat ocupat."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"Ha fallat la pujada de :attribute."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser en majúscules."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser una URL vàlida."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"El camp :attribute ha de ser un UUID vàlid."}}}},{da:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Ikon som illustrerer kontoen"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Billede af en QR-kode, der skal scannes"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Ændringer vil gå tabt. Er du sikker?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"This will have serious impacts on this user's permissions. Are you sure?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Er du helt sikker på, at du vil slette din konto?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Sikker på, at du vil slette den valgte gruppe?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Er du sikker på, at du vil slette denne konto?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this user? There is no going back."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"You will no longer be an administrator. Really sure?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Er du sikker på du vil kassere alle konti?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Er du sikker på, at du vil kassere alle dubletter?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Er du sikker på, at du vil kassere denne konto?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"This is your own account. Are you sure?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Er du sikker på at du vil logge af?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke the previous request?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to reset this user's password?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Er du sikker på, at du vil tilbagekalde denne enhed?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domæne er ikke et gyldigt domæne"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Afbrudt af brugeren"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Konto administreres af en ekstern udbyder"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth er konfigureret til at køre bag en godkendelsesproxy, men din proxy returnerer ikke den forventede header. Tjek din konfiguration og prøv igen."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxygodkendelse mislykkedes"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Autentificering mangler synlig legitimationssupport"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Autentificering mangler brugerbekræftelsesunderstøttelse"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Din enhed understøtter ikke webauthn. Prøv igen senere ved hjælp af en mere moderne browser"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Kan ikke oprette en OTP uden hemmelighed"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Hemmeligheden kan ikke dechifreres. Dette er hovedsageligt forårsaget af en forkert APP_KEY sat i . nv konfigurationsfil af 2Fauth eller en beskadiget data gemt i databasen."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Kan ikke afkode detekteret QR-kode, prøv at beskære eller skærpe billedet"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Kan ikke slette den eneste admin konto"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Kan ikke degradere den eneste administratorkonto"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Kan ikke registrere en QR-kode i billedet, prøv at beskære billedet"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Kontrollen mislykkedes, prøv igen senere"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Data kan ikke opdateres fra server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Dataene for denne QR-kode er ikke en gyldig OTP Auth URI. QR-koden indeholder:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Kun brugeroprettede indstillinger kan slettes"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Ulæselig, dataene synes krypteret"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Noget gik galt under hentning af data"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Dekryptering mislykkedes, din database er stadig beskyttet. Dette skyldes primært et integritetsproblem af krypterede data for en eller flere konti."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Kryptering mislykkedes, din database forbliver ubeskyttet."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration af ikoner mislykkedes. Indstillingen er blevet gendannet til dens tidligere værdi."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Upload af fil mislykkedes"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS kontekst påkrævet"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecipherable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Ugyldige 2FA-data"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Ingen autentifikatorer understøtter angivne algoritmer"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Ingen indgang var af typen 'public- key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Nulstilling af adgangskode ikke tilgængelig for denne bruger"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Ingen læsbar QR-kode"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Ingen gyldig OTP-ressource i denne QR-kode"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Dette OTP-format understøttes ikke i øjeblikket"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Handling ikke tilladt"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Denne QR-kode kan ikke læses"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR-kode har ugyldig checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Opdater"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Ressource ikke fundet"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Enhed allerede registreret"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Noget er galt med din server"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Uønskede mellemrum vil automatisk blive fjernet"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Denne SSO-udbyder er ikke fuldt opsat i din .env-fil"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO er deaktiveret"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"En brugerkonto med den samme e-mailadresse findes allerede, men den matcher ikke dit eksterne konto-id. Brug ikke SSO hvis du allerede er registreret på 2FAuth med denne e-mail."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Godkendelse via SSO afvist"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registreringer er deaktiveret"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"for mange id'er var inkluderet i query parameter, max 100 tilladt"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Kan ikke dekryptere uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"Du har ikke rettigheder til at se denne ressource eller til at udføre denne handling"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Ikke Godkendt"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Ukendt fejl"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Data matcher ikke noget understøttet format"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Ikke understøttet OTP-type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Ikke relevant ved brug af en auth proxy eller SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Denne godkendelsesmetode er kun for administratorer. Brugere skal logge ind med SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Sletning af brugerkonto mislykkedes, ingen data er blevet slettet"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"Bruger-ID var ikke mellem 1 og 64 tegn"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Forkert nuværende adgangskode, intet er ændret"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Konto"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Den algoritme, der bruges til at sikre dine sikkerhedskoder"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algoritme"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Autolås"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Autolås"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache management"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Kontroller automatisk (én gang om ugen) og advarer når en ny udgivelse af 2FAuth er offentliggjort på Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Kontrollér for ny version"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Empty the Search box right after a code has been copied to the clipboard"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Clear Search on copy"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Klik på en genereret adgangskode for at kopiere den automatisk skjuler den fra skærmen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Bekræft ny adgangskode"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first Time-based One-Time Password (TOTP) password will be copied, not the rotating ones"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"The initial counter value"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Standard er 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Tæller"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Udfyld din nuværende adgangskode for at bekræfte, at det er dig"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Nuværende adgangskode"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the newly created accounts are associated"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Default group"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode used when the Direct input option is On"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Antal cifre i de genererede sikkerhedskoder"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Cifre"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"All your security devices will be revoked. Use this option if you have lost one or its security has been compromised."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Disable all security devices"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Disable registration"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Vælg om du vil have konti vist som en liste eller som et gitter"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Visnings tilstand"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"E-mail"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nuværende adgangskode"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nyt password"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Adgangskode"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Try to) Get the official icon of the 2FA issuer when adding an account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Get official icons"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Gruppe"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Ikon"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Language used to translate the 2FAuth user interface. Named languages are complete, set the one of your choice to override your browser preference."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Sprog"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Navngiv denne enhed"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Navn"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Nyt navn"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nyt password"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Indstil hvordan og hvornår One-Time Passwords (OTP)'er vises"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Vis adgangskode"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Formatering af adgangskode"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Adgangskode"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"Gyldighedsperioden for de genererede sikkerhedskoder i sekunder"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Standard er 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Periode"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Remember group filter"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Lad muligheden for midlertidigt at afsløre Dot-Obscured adgangskoder"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"Nøgle til generering af koder"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Tjeneste"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Vis ikoner"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Email configuration test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Tema"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"The time zone applied to all dates and times displayed in the application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Time zone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Hvis du oplever problemer, når du optager QR-koder, kan du skifte til en mere basal, men mere pålidelig QR-kodelæser"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Brug grundlæggende QR-kode læser"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protect sensitive data"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Brug kun WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Om"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Access"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Kontogendannelse"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Autorisation"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Skift adgangskode"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Danger Zone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Data input"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Slet konto"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Miljø"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Generelt"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupper"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Last accesses"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Ny konto"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Ny gruppe"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nyt password"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Ny token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"New user"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifikationer"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Indstillinger"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Adgangskode"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"personlige adgangstokens"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Præferencer"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profil"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Kode"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registrations"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Omdøb enhed"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Ressourcer"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Sikkerhedsenheder"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Sikkerhed"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO-login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Supported migration formats"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Ikke Godkendt"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"User management"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn login"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Konto"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Aktiv gruppe"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Advanced form"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Efter et klik/tryk"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Show all passwords in the main view, without doing anything"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Allesammen, på hovedskærmen"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alene i sin egen visning"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Automatisk"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Tilbage"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Browser præference"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Annuller"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Skift adgangskode"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Check now"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Ryd"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Luk"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Konstant"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Fortsæt"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Kopier til udklipsholder"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Kopier"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Opret"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Tak til"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Mørk"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Standard"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Delete this user"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Slet din konto"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Slet"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Enhed"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Kassér alle"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Kassér dubletter"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Færdig"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Eksporter"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Generer"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Gitter"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Opdel cifre i to lige store grupper"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"ved halv"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Try my luck"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Importer alle"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP-adresse"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Udsteder"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Lys"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Liste"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Administrer"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Flyt"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Min enhed"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Never"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Ny"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Ingen gruppe"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"On security code copy"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 md."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 år."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Åbn i browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"Styresystem"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Indstillinger"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Grupper cifre to med to"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"efter par"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Plain text"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Udfyld via en QR kode"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Kode"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Opdater"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Registrer en enhed"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Fjern ikon"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Resend email"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Ophæv"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Gem"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scan QR kode"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Søg"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Send link til nulstilling af adgangskode"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Send gendannelseslink"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Send"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Log på"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Log af"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Bekræft"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Tekst fil"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Tid"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Grupper cifre tre og tre"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"af Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Lås op"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Opdater"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Upload QR kode"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mdr."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (tysk)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"Engelsk (Engelsk)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Fransk (Fransk)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"(Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (japansk)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russisk)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Tujórkcře (tyrkisk)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Om"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Admin panel"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Tilbage til startsiden"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Fortsæt"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Opret ny gruppe"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Create a user"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Rediger"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generate a new token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Hjælp med at oversætte 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"Login og password"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Administrer grupper"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Administrer"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Måske senere"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Gendan din konto"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Registrer en ny enhed"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Nulstil det"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"en sikkerhedsenhed"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"See full log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Se hvordan man aktiverer en udbyder"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Indstillinger"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Du kan looge ind uden SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Log på"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Brug avanceret form"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"View on Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"En web-app til at administrere dine to-faktor godkendelse (2FA) konti og generere deres sikkerhedskoder"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"En web-app til at administrere dine to-faktor godkendelse (2FA) konti og generere deres sikkerhedskoder"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"This account is bound to a "},{t:4,k:"provider"},{t:3,v:" account via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Mail til kontogendannelse afsendt!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Vælg en metode og tilføj din første konto"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Manage users registered on your instance or create new ones."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Allerede autoriseret, log venligst ud først"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Allerede registreret?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative metoder"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock er tændt"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"The user account will be deleted as well as all its 2FA data."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Din brugerkonto vil blive slettet såvel som alle dine 2FA-data. Der er ingen vej tilbage."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Sletning af din 2FAuth konto har ingen indvirkning på din eksterne SSO-konto."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Sletning af en gruppe sletter ikke konti"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Funktionen er deaktiveret i demotilstand"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Har du ikke din konto endnu?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"En fejl opstod:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Fejl"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Glemt din adgangskode?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Har små bogstaver"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Har tal"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Har specialtegn"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Har store bogstaver"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Brug eksportfunktionen for disse apps til at få en migrationsressource som en QR-kode eller en JSON-fil og derefter indlæse den her."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth kan importere data fra forskellige 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Importeret"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Denne nulstillingstoken er ugyldig."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"min. 8 karakterer"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Last seen "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logoer af"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Har du mistet din enhed?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Lavet med"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Make sure to copy your personal access token now. You won’t be able to see it again!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Du kan oprette grupper til at organisere dine konti på den måde, du ønsker. Alle konti forbliver synlige i pseudogruppen kaldet 'Alle', uanset hvilken gruppe de tilhører."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Obligatorisk"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Flyt valgte til"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Angiv mindst én enhed for at aktivere følgende indstillinger"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Ingen 2FA her!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Ingen indtastning endnu"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"Ingen udbyder"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Ingen resultater"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- ingen tjeneste -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Mangler udbyderen?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"intet"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hello"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Du kan fortsætte med:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Fortolker data..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password og WebAuthN er deaktiveret."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"A password reset request exists for this user but has expired, meaning that the user has not changed their password in time. This may be a request from the user themselves or from an administrator."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"A password reset request exists for this user (request sent at "},{t:4,k:"datetime"},{t:3,v:"), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"En konto med nøjagtig samme data findes allerede"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"For at gendanne din konto, nulstiller 2FAuth nogle Webauthn indstillinger, så du vil være i stand til at logge ind ved hjælp af din e-mail og adgangskode."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registered "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth vil sende dig et link til nulstilling af adgangskode til denne adresse. Klik på linket i den modtagne e-mail for at angive en ny adgangskode."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Hvis du altid har brugt SSO til at logge på, log ud og brug derefter funktionen nulstil adgangskode til at få en adgangskode, så du kan udfylde denne formular."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Tilbagekaldelse af en enhed er permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a token is permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Autentificeringsenheder, du kan bruge til at logge på 2FAuth, såsom sikkerhedstaster (dvs. Yubikey) eller smartphones med biometriske funktioner (dvs. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Vælg din SSO udbyder for at logge ind:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Log ind med"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Some translations are missing using the browser preferred language?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Almindelige brugere skal logge ind med SSO. Andre metoder er kun for administratorer."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication er begrænset til kun SSO, "},{t:4,k:"auth_method"},{t:3,v:" er deaktiveret"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Brug venligst en anden enhed/kamera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan can't start :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"Intet kamera på denne enhed"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Maybe you forgot to plug in your webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Kunne ikke indlæse scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Er kameraet allerede i brug? Sørg for, at ingen anden app bruger dit kamera og prøv igen"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Secure context required"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Du skal bruge en moderne browser"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"Følgende 2FA-konti blev fundet i migrationsressourcen. Indtil videre er ingen af dem blevet tilføjet til 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepteret: jpg, jpeg, png, bmp, gif, svg eller webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"For mange forkerte indtastninger. Prøv igen om "},{t:4,k:"seconds"},{t:3,v:" sekunder."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI-ikoner af"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Brug de tilgængelige knapper til permanent at gemme dem til din 2FA-samling eller kassere dem."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Gør dig klar til at godkende ved hjælp af (en af) dine sikkerhedsenheder. Tilslut din nøgle i, fjern ansigtsmaske eller handsker, osv."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" active token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" security device(s) (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn er deaktiveret"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Velkommen til 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" konti"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selected"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Denne instans er up-to-date"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Konto oprettet"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Kontor opdateret"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Konto(i) slettet"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Konto(i) flyttet"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Godkendelse mislykkedes"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Auto-lås udført, du er blevet logget ud"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cleared"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Kopieret til udklipsholder"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data er blevet opdateret, så de afspejler ændringer på serversiden"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Enheden blev tilbagekaldt"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Enhed blev registreret"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Gruppenavn gemt"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Gruppen blev oprettet"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Gruppen blev slettet."}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully reset"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's PATs successfully revoked"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profilen blev opdateret."}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Indstillingerne er gemt!"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token successfully revoked"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Brugerkonto blev slettet"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"user successfully created"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"User role updated"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" gyldige konti fundet"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Næste »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Forrige"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Adgangskoder skal være på mindst otte tegn og svare til gentagelsen."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Dit kodeord er blevet nulstillet!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Vi har sendt dig en e-mail til at nulstille din adgangskode!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Vent venligst inden du prøver igen."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Denne adgangskode nulstillings-token er ugyldig."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Vi kan ikke finde en bruger med den e-mailadresse."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"User name, email..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Element ikke fundet"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Om"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Konti"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Autorisation"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Opret bruger"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Administrer bruger"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Users management"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Autolås"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Opret konto"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Opret gruppe"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Rediger konto"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Rediger gruppe"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Fejl"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupper"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importer konti"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Nulstil password"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nyt password"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Brugerkonto"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Nyt personligt token"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth tokens"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Indstillinger"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn enheder"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Rediger enhed"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Indstillinger"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Konto som QR kode"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Ny konto"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Lås op"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Kontogendannelse"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Registrer en ny enhed"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Ryd søgning"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Fravælg alle"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Luk siden "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Kopier til udklipsholder"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Slet"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Kasser denne konto"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generer et testkodeord"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Skjul gruppevælger"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Skjul adgangskode"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Importer denne konto"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Lock it"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Administrer"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Flyt valgte til en gruppe"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Omdøb"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Resend a password reset email to the user"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Vis adgangskode"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's security devices"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's tokens"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Ophæv"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Søg"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Vælg alle"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Vis gruppevælger"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Vis QR kode"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Log på med en sikker enhed"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Sorter stigende"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sorter faldende"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock it (at your own risk)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Brug en QR-kode til at udfylde formularen automagisk"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal accepteres, når :other er :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal accepteres."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute er ikke en gyldig URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være en dato efter eller lig med :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være en dato efter :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:":attribute må kun bestå af bogstaver, tal og bindestreger."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:":Attribute må kun bestå af bogstaver og tal."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:":attribute må kun bestå af bogstaver."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være et array."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:":attribute må kun indeholde single-byte alfanumeriske tegn og symboler."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være en dato før eller lig med :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være en dato før :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal indeholde mellem :min og :max elementer."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være mellem :min og :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være mellem :min og :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være mellem :min og :max tegn."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være sand eller falsk."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute indeholder en uautoriseret værdi."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute er ikke det samme som bekræftelsesfeltet."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:":attribute mangler en påkrævet værdi."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Adgangskoden er forkert."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"Attributfeltet må ikke indeholde kolon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Denne e-mailadresse overholder ikke registreringspolitikken"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Ingen konto fundet med denne e-mail."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Alle e-mails skal være gyldige og adskilt med et pipesymbol"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Understøttet format er jpeg, png, bmp, gif, svg eller webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"ID'er skal være kommaseparerede, uden efterfølgende komma."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"uri skal have en etiket."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"Attributfeltet understøttes ikke."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Understøttet format er jpeg, png, bmp, gif, svg eller webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"Attributfeltet skal være en base32 kodet streng."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"Attributfeltet må ikke indeholde kolon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"Attributfeltet er ikke en gyldig otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være en dato lig med :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute matcher ikke formatet :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute er ikke en gyldig dato."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal have :decimal decimaler."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal afvises, når :other er :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal afvises."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute og :other skal være forskellige."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal have mellem :min og :max cifre."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal have :digits cifre."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute har forkerte billeddimensioner."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute har en duplikatværdi."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute slutter muligvis ikke med en af ​​følgende: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute starter muligvis ikke med en af ​​følgende: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være en gyldig e-mailadresse."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal ende med et af følgende: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"De valgte :attribute er ugyldige."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"Valgte :attribute er ugyldig."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute skal have en af ​​følgende udvidelser: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være en fil."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal udfyldes."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være mere end :value elementer."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være større end :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være større end :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være mere end :value tegn."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal have :value elementer eller mere."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være større end eller lig med :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være større end eller lig med :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være mere end eller lig med :value tegn."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute skal være en gyldig hexadecimal farve."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være et billede."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:":Attribute eksisterer ikke i :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"Valgte :attribute er ugyldig."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være et heltal."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en gyldig IP adresse."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en gyldig IPv4 adresse."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en gyldig IPv6 adresse."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"Attributfeltet skal være et gyldigt regex."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en gyldig JSON streng."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute skal være en liste."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være små bogstaver."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal have mindre end :value items."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindre end :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindre end :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindre end :value tegn."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":Attribute må ikke have mere end :value elementer."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindre eller lig med :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindre eller lig med :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindre eller lig med :value tegn."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en gyldig MAC-adresse."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute må ikke have mere end :max cifre."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":Attribute må ikke indeholde mere end :max elementer."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":Attribute må ikke være større end :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":Attribute må ikke være større end :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:":Attribute må ikke være mere end :max tegn."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en fil af typen: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en fil af typen: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal have mindst :min cifre."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal indeholde mindst :min elementer."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindst :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindst :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være mindst :min tegn."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet skal mangle, når :other er :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet skal mangle, medmindre :other er :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet skal mangle, når :values er til stede."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet skal mangle, når :values er til stede."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet skal mangle."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være et multiplum af :value"}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Valgte :attribute er ugyldig."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"Formatet for :attribute er ugyldigt."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være et tal."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"uri-parameteren skal leveres alene eller kun i kombination med 'custom_otp'-parameteren"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal indeholde mindst ét ​​bogstav."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal indeholde mindst et stort og et lille bogstav."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal indeholde mindst ét ​​tal."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal indeholde mindst ét ​​symbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"De givne :attribute er dukket op i et datalæk. Vælg venligst en anden :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute skal være til stede, når :other er :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute skal være til stede, medmindre :other er :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet skal være til stede, når :values er til stede."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet skal være til stede, når :values er til stede."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være tilstede."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute er forbudt, når :other er :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet er forbudt, medmindre :other er i :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet er forbudt."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet forbyder :other at være til stede."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":Attribute formatet er ugyldigt."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute skal indeholde poster for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:":Attribute-feltet er påkrævet, når :other accepteres."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"Feltet :attribute er påkrævet, når :other afvises."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal udfyldes når :other er :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:":Attribute er påkrævet med mindre :other findes i :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal udfyldes når :values er udfyldt."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal udfyldes når :values er udfyldt."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal udfyldes når ingen af :values er udfyldt."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal udfyldes når :values ikke er udfyldt."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal udfyldes."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":Attribute og :other skal være ens."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Når du bruger :attribut skal det være den eneste parameter"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal indeholde :size elementer."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være :size tegn lang."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal starte med én af følgende: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en streng."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en gyldig tidszone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:":attribute skal være et gyldigt ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":Attribute er allerede taget."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":Attribute fejlede i upload."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute skal være store bogstaver."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:":Attribute formatet er ugyldigt."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":Attribute skal være en gyldig UUID."}}}},{de:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Symbol, das den Account darstellt"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Bild eines QR-Codes zum Scannen"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Das Konto wird gelöscht. Sind Sie sicher?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Dies wird gravierende Auswirkungen auf die Berechtigungen dieses Benutzers haben. Sind Sie sicher?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie Ihr Konto löschen möchten?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Möchten Sie diese Gruppe wirklich löschen?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie dieses Konto löschen möchten?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie diesen Benutzer löschen möchten? Es gibt kein Zurück mehr."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Sie werden kein Administrator mehr sein. Wirklich sicher?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie alle Konten verwerfen möchten?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Möchten Sie wirklich alle Duplikate verwerfen?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie dieses Konto verwerfen möchten?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Dies ist Ihr eigener Account. Sind Sie sicher?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie sich abmelden möchten?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie die vorherige Anfrage widerrufen möchten?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie das Passwort dieses Benutzers zurücksetzen möchten?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Möchten Sie das Gerät wirklich entfernen?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie diesen Token widerrufen möchten?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sind Sie sicher, dass Sie die Freigabe-Einstellung ändern möchten?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Damit wird das Teilen dieses Kontos mit allen Benutzern beendet. Sind Sie sicher?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"Dadurch wird die Freigabe dieser Konten beendet. Möchten Sie fortfahren?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Sie sind dabei, das Eigentum an diesem Konto zu verlieren. Sind Sie sicher?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuths Domain ist keine gültige Domain"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Vom Benutzer abgebrochen"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Konto von einem externen Anbieter verwaltet"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth ist so konfiguriert, dass es hinter einem Authentifizierungs-Proxy läuft, aber Ihr Proxy gibt nicht den erwarteten Header zurück. Überprüfen Sie Ihre Konfiguration und versuchen Sie es erneut."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy-Authentifizierung fehlgeschlagen"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authentifikator fehlt erkennbare Anmeldeinformationen"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authentifikator fehlt Unterstützung für die Benutzerüberprüfung"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Ihr Gerät unterstützt nicht Webauthn. Versuchen Sie es später mit einem moderneren Browser erneut"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Das OTP kann nicht ohne Geheimnis erstellt werden"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Das Geheimnis kann nicht entschlüsselt werden. Dies wird hauptsächlich durch einen falsch gesetzten APP_KEY in der .env-Konfigurationsdatei von 2Fauth oder durch beschädigte Daten in der Datenbank verursacht."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Kann den QR-Code nicht dekodieren. Bitte das Bild zuschneiden oder schärfen"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Das einzige Admin-Konto kann nicht gelöscht werden"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Das einzige Admin-Konto kann nicht herabgestuft werden"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Es kann kein QR-Code im Bild erkannt werden. Bitte das Bild zuschneiden"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Änderung fehlgeschlagen, bitte wiederholen"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Überprüfung fehlgeschlagen, bitte später erneut versuchen"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Daten können nicht vom Server aktualisiert werden"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Dieser QR-Code enthält keine gültige OTP-Auth-URI. Inhalt des QR-Codes:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Nur benutzerdefinierte Einstellungen können gelöscht werden"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Abrufen des QR-Codes"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"E-Mail senden fehlgeschlagen"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Nicht lesbar, die Daten scheinen verschlüsselt zu sein"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Erzeugung des Verschlüsselungsschlüssels fehlgeschlagen"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Während des Datenabrufs ist etwas schief gelaufen"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Entschlüsselung fehlgeschlagen, Ihre Datenbank bleibt geschützt. Dies wird hauptsächlich durch ein Integritätsproblem verschlüsselter Daten für ein oder mehrere Konten verursacht."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Verschlüsselung fehlgeschlagen, Ihre Datenbank bleibt ungeschützt."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration von Symbolen fehlgeschlagen. Die Einstellung wurde auf ihren vorherigen Wert zurückgesetzt."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierung fehlgeschlagen, überprüfen Sie Ihren PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth-Server nicht erreichbar, überprüfen Sie die URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT konnte nicht entschlüsselt werden"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Schlüssel konnte nicht abgerufen werden"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT konnte nicht verschlüsselt werden"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort konnte nicht abgerufen werden"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Token konnte nicht abgerufen werden"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Einschleusen des Skripts, um QR-Scan durchzuführen"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Laden der Einstellungen aus dem Store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Regenerieren von IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"App-Einstellungen konnten nicht abgerufen werden"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Abrufen der Verschlüsselungsdaten"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Festlegen der Auto-Lock-Verzögerung"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Festlegen des Verschlüsselungsschlüssels"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Festlegen der Verschlüsselungsparameter"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Speichern des verschlüsselten PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld ist erforderlich und muss eine gültige URL sein"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"Pflichtfeld"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Hochladen der Datei fehlgeschlagen"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS-Kontext erforderlich"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*nicht lesbar*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Ungültige 2FA-Daten"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Ungültiger oder unbekannter persönlicher Zugriffstoken"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Ungültige oder nicht lesbare Daten bei :appname"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"Kein aktiver Reiter gefunden"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Kein Authentifikator unterstützt die angegebenen Algorithmen"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Kein Eintrag vom Typ 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"Kein Symbol in dieser Variante verfügbar"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Keine Übereinstimmung im Icon-Paket"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Passwort zurücksetzen für diesen Benutzer nicht verfügbar"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"Keine QR-Bilddaten vorhanden"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"Kein gültiger QR-Code im sichtbaren Bereich der Seite gefunden"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Kein lesbarer QR-Code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Keine gültige OTP-Ressource in diesem QR-Code"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Dieses OTP-Format wird derzeit nicht unterstützt"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Vorgang nicht erlaubt"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth Key Berechtigungen sind auf dem Server ungültig. Bitte lesen Sie die Anleitung 'Upgrade auf v8' auf der 2FAuth Dokumentation um dieses Problem zu beheben."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Dieser QR-Code ist unlesbar"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code hat eine ungültige Prüfsumme"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Aktualisieren"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reservierter Name, bitte wählen Sie einen anderen"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Bitte verwenden Sie nur Buchstaben, Zahlen, Bindestriche, Unterstriche, Leerzeichen oder einfache Anführungszeichen"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Die Anfrage stammt nicht von einem vertrauenswürdigen Proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Ressource nicht gefunden"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Gerät ist bereits registriert"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Sicherheitsfehler: Überprüfen Sie WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Alle Nutzer, die diesen Bereich teilen, sind deaktiviert"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Freigabefunktion ist deaktiviert"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Etwas stimmt mit Ihrem Server nicht"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unerwünschte Leerzeichen werden automatisch entfernt"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Dieser SSO-Provider ist nicht vollständig in Ihrer .env-Datei eingerichtet"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO ist deaktiviert"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Ein Benutzerkonto mit der gleichen E-Mail-Adresse existiert bereits, aber es stimmt nicht mit Ihrer externen Konto-ID überein. Verwenden Sie kein SSO, wenn Sie bereits bei 2FAuth mit dieser E-Mail registriert sind."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierung über SSO abgelehnt"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrierungen sind deaktiviert"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Dieses Konto ist bereits mit allen Benutzern freigegeben."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Dieses Konto ist nicht mit allen Benutzern geteilt"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"zu viele IDs wurden in den Abfrageparameter eingefügt, maximal 100 sind erlaubt"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"URI konnte nicht entschlüsselt werden"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"Sie haben keine Berechtigung, diese Ressource zu sehen oder diese Aktion auszuführen"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Nicht berechtigt"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unbekannter Fehler bei der PAT-Verschlüsselung"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Unbekannter Fehler"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Daten stimmen mit keinem der unterstützten Formate überein"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Nicht unterstützter OTP-Typ"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Nicht unterstützter Freigabebereich"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Nicht anwendbar, wenn ein Auth-Proxy oder SSO benutzt wird"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Diese Authentifizierungsmethode ist nur für Administratoren. Benutzer müssen sich mit SSO anmelden."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Löschen des Benutzerkontos fehlgeschlagen, es wurden keine Daten gelöscht"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer-ID war nicht zwischen 1 und 64 Zeichen lang"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Aktuelles Passwort falsch, nichts wurde geändert"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Falsches Passwort"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Max Mustermann"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerkonto"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Der Algorithmus, der zur Sicherung Ihrer Sicherheitscodes verwendet wird"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorithmus"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer können persönliche Zugriffstoken erstellen und diese zur Authentifizierung mit Drittanbieter-Anwendungen wie der Web-Erweiterung 2FAuth verwenden"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"PAT-Nutzung erlauben"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"Der persönliche Zugriffstoken (PAT), um die Erweiterung zum Server zu authentifizieren. Sie können einen solchen Token über die Seite Einstellungen > OAuth Ihres 2FAuth-Benutzerkontos erstellen"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API-Token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Passwort automatisch nach einem Timeout auf dem Bildschirm ausblenden. Dies vermeidet unnötige Anfragen nach neuen Passwörtern, wenn Sie die Passwortansicht nicht schließen."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"OTP automatisch schließen"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Erweiterung automatisch sperren, um unrechtmäßigen Zugriff auf ihre Daten zu verhindern"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Automatische Sperrung"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Den Benutzer bei Inaktivität automatisch abmelden. Hat keine Auswirkung, wenn die Authentifizierung über einen Proxy erfolgt und keine benutzerdefinierte Abmelde-URL angegeben ist."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Automatische Sperrung"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Neue Konten werden automatisch nach dem Scannen oder Hochladen eines QR-Codes registriert, ohne dass Sie auf eine Schaltfläche Speichern klicken müssen"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Konten automatisch speichern"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Manchmal muss der Cache geleert werden, beispielsweise nach einer Änderung an Umgebungsvariablen oder einer Aktualisierung. Das können Sie hier tun."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache-Verwaltung"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch überprüfen (einmal pro Woche) und warnen, wenn eine neue Version von 2FAuth auf GitHub veröffentlicht wird"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Auf neue Version prüfen"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Das Suchfeld leeren, nachdem ein Code in die Zwischenablage kopiert wurde"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Suche beim Kopieren löschen"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Bei einem Klick auf das erzeugte Passwort wird es automatisch auf dem Bildschirm ausgeblendet"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"OTP nach dem Kopieren schließen"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Neues Passwort bestätigen"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Kopiert automatisch ein generiertes Passwort bei Anzeige auf dem Bildschirm. Aufgrund von Browserbeschränkungen wird nur das erste zeitbasierte Einmalpasswort (TOTP) kopiert, nicht die rotierenden Passwörter"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"OTP auf dem Bildschirm kopieren"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Es ist riskant, den Zähler zu ändern, da Sie dadurch die Synchronisierung des Kontos mit dem Verifizierungsserver des Dienstes beeinträchtigen können. Verwenden Sie das Schlosssymbol, um Änderungen zu ermöglichen, aber nur, wenn Sie wissen, was Sie tun"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"Der erste Zählerwert"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Standard ist 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Zähler"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Geben Sie Ihr aktuelles Passwort ein, um zu bestätigen, dass Sie es sind"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Aktuelles Passwort"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Gruppe, der neu erstellte Konten zugeordnet werden"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Standardgruppe"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Standard-Eingabemodus, der verwendet wird, wenn die Direkteingabe aktiviert ist"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Standard-Eingabemodus"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Anzahl der Ziffern der erzeugten Sicherheitscodes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Ziffern"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Alle Ihre Sicherheitsgeräte werden gesperrt. Verwenden Sie diese Option, wenn Sie ein Gerät verloren haben oder dessen Sicherheit beeinträchtigt wurde."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Alle Sicherheitsgeräte deaktivieren"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Verhindert eine neue Benutzerregistrierung. Sofern nicht überschrieben (siehe unten) wirkt sich dies auch auf SSO aus, so dass neue Benutzer sich nicht via SSO anmelden können"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Registrierung deaktivieren"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Wählen Sie aus, ob Konten als Liste oder als Raster angezeigt werden sollen"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Anzeigemodus"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"E-Mail"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Ermöglichen Sie Benutzern, ihre 2FA-Konten mit anderen Benutzern dieser 2FAuth-Instanz zu teilen. Nach der Freigabe können die Empfänger der Freigabe die 2FA-Konten einsehen und zur Generierung von OTP-Codes nutzen. Nur der Inhaber eines Kontos kann dieses bearbeiten, löschen oder exportieren sowie dessen Geheimcode einsehen oder die Freigabeeinstellungen des Kontos verwalten."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Freigabe aktivieren"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"Mit dem Anwendungsbereich 'Alle Benutzer' können Sie alle Benutzer der 2FAuth Instanz ansprechen. Wenn ein Konto auf dieser Ebene geteilt wird, wird es automatisch mit allen Benutzern geteilt, auch mit denen, die nach der Freigabe erstellt wurden."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Wenn Sie diese Einstellung deaktivieren, werden bestehende Freigaben mit dem Geltungsbereich 'Alle Benutzer' deaktiviert, jedoch nicht widerrufen. Wenn Sie diese Einstellung später wieder aktivieren, werden diese Freigaben wieder aktiv, sofern in der Zwischenzeit keine Freigaben für bestimmte Benutzer eingerichtet wurden."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Freigabebereich 'Alle Benutzer' aktivieren"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Besuchern die Authentifizierung mit einer externen ID über das Single-Sign-On-Schema ermöglichen"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"SSO aktivieren"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Das Passwort zum Entsperren der Erweiterung"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Aktuelles Passwort"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Das neue Passwort, das verwendet wird, um diese Erweiterung zu sperren und vertrauliche Daten zu verschlüsseln, wenn erforderlich"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Neues Passwort"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Das neue Passwort, das verwendet wird, um diese Erweiterung zu sperren und vertrauliche Daten zu verschlüsseln, wenn erforderlich"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Passwort"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Teilweise Suche nach Benutzername möglich, E-Mail-Adresse muss exakt übereinstimmen"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer zum Teilen finden"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Versuch) Das offizielle Symbol des 2FA-Ausstellers beim Hinzufügen eines Kontos erhalten"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Offizielle Symbole abrufen"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Gruppe, der das Konto zugeordnet werden soll"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Gruppe"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL, unter der Sie den Zustand dieser 2FAuth-Instanz überprüfen können. Diese URL kann verwendet werden, um eine Docker HEALTHECK oder eine Kubernetes HTTPS Liveness Sonde einzurichten."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Gesicherter Endpunkt"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Webadresse der 2FAuth-Instanz, bei der Sie sich angemeldet haben. Beispiel: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth-Server-URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Icon-Sammlung, die zuerst abgefragt werden soll, wenn ein offizielles Icon benötigt wird."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorisierte Online-Sammlung"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Legen Sie fest, ob die Symbole aus einer Online-Logo-Sammlung oder einem lokalen Icon-Paket abgerufen werden sollen. Wenn Sie die folgenden Symboleinstellungen ändern, werden die bereits abgerufenen Symbole nicht neu geladen."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Icons abrufen von"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"Das Icon-Paket, das verwendet werden soll, wenn ein offizielles Icon benötigt wird. Icon-Pakete werden zur Verfügung gestellt, indem Paketverzeichnisse auf den 2FAuth-Server hochgeladen werden, fragen Sie Ihren Instanz-Administrator nach mehr."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon-Paket"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Verkleinern Sie den Abruf auf die angegebene Variante. Falls die Variante fehlt, wird 2FAuth nicht versuchen, auf die reguläre Variante zurückzufallen."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strenger Abruf"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Einige Symbole sind in verschiedenen Varianten erhältlich, um am besten für dunkle oder helle Benutzeroberflächen zu passen. Legen Sie die Option fest, nach der Sie suchen möchten. Die reguläre Variante wird automatisch als Fallback geladen."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Symbol-Variante"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Symbol"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Geben Sie dem Benutzer Administratorrechte. Administratoren haben die Berechtigung, die gesamte App zu verwalten, d. h. Einstellungen und andere Benutzer, können aber kein Passwort für eine 2FA erstellen, die ihnen nicht gehört."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Ist Administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Neuen Benutzern die erstmalige Anmeldung über SSO ermöglichen, während die Registrierung deaktiviert ist"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO-Registrierung aktiviert lassen"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Sprache, die zur Übersetzung der 2FAuth-Benutzeroberfläche verwendet wird. Die aufgeführten Sprachen sind vollständig. Wählen Sie die gewünschte Sprache aus, um die Einstellungen Ihres Browsers zu überschreiben."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Sprache"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Dieses Gerät benennen"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Name"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Neuer Name"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"Der Benutzer, auf den der Besitz dieses Kontos übertragen wird."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Neuer Inhaber"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Neues Passwort"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Erhalten Sie jedes Mal eine E-Mail, wenn ein Verbindungsversuch zu Ihrem 2FAuth-Konto fehlschlägt"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"Bei fehlgeschlagener Anmeldung"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Erhalten Sie eine E-Mail, wenn sich ein neues Gerät zum ersten Mal mit Ihrem 2FAuth Konto verbindet"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"Auf neuem Gerät"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Sie können die folgenden Einstellungen leer lassen, wenn Sie nicht wissen, wie Sie sie einstellen. In dem Fall werden die Standardwerte verwendet."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Festlegen, wie und wann One-Time Passwords (OTP) angezeigt werden"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Passwort zeigen"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Zeitbasierte OTP oder HMAC-basierte OTP oder Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Wählen Sie den OTP-Typ zum Erstellen aus"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Anzeige der Passwörter ändern durch Gruppierung der Ziffern. Verbessert die Lesbarkeit und Passwörter lassen sich einfacher merken"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Passwort-Formatierung"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Gültigkeitsdauer der erzeugten Sicherheitscodes in Sekunden"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Standard ist 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Gültigkeitsdauer"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Den letzten Gruppenfilter speichern und ihn beim nächsten Besuch wiederherstellen"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Gruppenfilter merken"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"E-Mails in dieser Liste können sich registrieren. Trennen Sie Adressen mit einem Pfeil ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filterliste"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Registrierung nur für eine begrenzte Anzahl von E-Mail-Adressen verfügbar machen. Beide Regeln können gleichzeitig verwendet werden. Dies hat keinen Einfluss auf die Registrierung über SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Registrierung einschränken"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"E-Mails mit diesem regulären Ausdruck dürfen sich registrieren"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filterregel"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Fähigkeit Punkt-verdeckte Passwörter temporär freigeben"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Verdecktes OTP anzeigen"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"Der Schlüssel, der zur Erzeugung Ihrer Sicherheitscodes verwendet wird"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Geheimnis"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Dienst"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Kontosymbole in der Hauptansicht anzeigen"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Symbole anzeigen"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Die E-Mail des angemeldeten Benutzers in der Fußzeile anstelle von direkten Navigationslinks anzeigen. Die Links stehen dann im Menü hinter einem Klick/Tippen auf die E-Mail-Adresse zur Verfügung."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"E-Mail in Fußzeile anzeigen"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Diese Gruppe als Chip in der Gruppenauswahl auf der Hauptansicht anzeigen. Dies hat keinen Effekt, wenn 'Chips zum Umschalten verwenden' in den Benutzereinstellungen deaktiviert ist."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"In Chipschaltflächen anzeigen"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Vorschau des nächsten Passworts, d.h. des Passworts, welches das aktuelle Passwort ersetzt, wenn es abläuft. Einstellungen für das aktuelle OTP gelten auch für das nächste (Formatieren, als Punkt anzeigen)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Nächstes OTP anzeigen"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Passwortzeichen werden als *** angezeigt, um die Vertraulichkeit zu gewährleisten. Dies beeinflusst nicht die Kopieren/Einfügen-Funktion"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Erstellte OTP als Punkt anzeigen"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Erzwingt bei Aufruf der Funktion Sortieren die Sortierung der Konten unter Berücksichtigung der Groß- und Kleinschreibung"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Groß-/Kleinschreibung beachten"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Hochgeladene Symbole werden zusätzlich zum Dateisystem-Speicher in der Datenbank registriert, der dann nur als Cache verwendet wird. Dies erleichtert das Erstellen einer 2FAuth-Sicherung, da nur die Datenbank gesichert werden muss."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Aber Vorsicht, dies könnte einige Nachteile haben: Die Datenbankgröße kann erheblich zunehmen, wenn die Instanz viele große Symbole beherbergt. Es kann auch die Leistung der Anwendung beeinträchtigen, da das Dateisystem öfter genutzt wird, um sicherzustellen, dass es mit der Datenbank synchronisiert wird."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Symbole in Datenbank speichern"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Senden Sie eine Test-E-Mail, um die E-Mail-Konfiguration Ihrer Instanz zu kontrollieren. Es ist wichtig, eine funktionierende Konfiguration zu haben, sonst können Benutzer kein Zurücksetzen des Passworts anfordern."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"E-Mail-Konfigurationstest"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Eine bestimmte Darstellung erzwingen oder die in Ihren System-/Browsereinstellungen definierte Darstellung anwenden"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Design"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"Die Zeitzone wird auf alle in der Anwendung angezeigten Daten und Zeiten angewendet"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Zeitzone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Wenn bei der Erfassung von QR-Codes Probleme auftreten, können Sie mit dieser Option zu einem einfacheren, aber zuverlässigeren QR-Codeleser wechseln"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Einfachen QR-Codeleser benutzen"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Vertrauliche Daten, die 2FA-Geheimnisse und E-Mails, werden verschlüsselt in der Datenbank gespeichert. Erstellen Sie ein Backup der APP_KEY-Variablen der .env Datei (oder der gesamten Datei), da sie als Schlüssel zur gesicherten Datenbank dient. Es gibt keine Möglichkeit, verschlüsselte Daten ohne diesen Schlüssel zu wiederherzustellen."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Sensible Daten schützen"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Machen Sie SSO die einzige verfügbare Methode, um sich bei 2FAuth anzumelden. Passwort-Login und Webauthn sind dann für normale Benutzer deaktiviert. Administratoren sind von dieser Einschränkung nicht betroffen."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Nur SSO verwenden"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Machen Sie WebAuthn zur einzigen autorisierten Methode, um sich in Ihr 2FAuth Konto einzuloggen. Dies ist die empfohlene Einrichtung, um die Vorteile der erweiterten WebAuthn Sicherheit zu nutzen."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Im Falle eines verloren gegangenen Gerätes können Sie Ihr Konto wiederherstellen, indem Sie diese Option zurücksetzen und sich mit Ihrer E-Mail und Ihrem Passwort anmelden."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Achtung! Das E-Mail & Passwort-Formular bleibt verfügbar, obwohl diese Option aktiviert ist, wird aber immer eine 'Authentifizierung fehlgeschlagen' Antwort zurückgeben."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Nur WebAuthn verwenden"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Wählen Sie aus, ob Sie einen Eingabemodus unter den Verfügbaren wählen möchten oder ob Sie direkt den Standard-Eingabemodus verwenden möchten"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Direkteingabe"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Immer zur Standardgruppe zurückkehren, wenn ein OTP kopiert wird"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Standardgruppe beim Kopieren anzeigen"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Über"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Zugriffsprotokoll"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Zugang"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Kontowiederherstellung"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierung"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser-Einschränkungen"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort ändern"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Gefahrenzone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Daten-Eingabe"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Konto löschen"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Konto bearbeiten"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Umgebung"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Allgemein"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Gruppen"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Importieren"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Letzte Zugriffe"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Neues Konto"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Neue Gruppe"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Neues Passwort"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Neuer Token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Neuer Benutzer"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Benachrichtigungen"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Persönliche Zugriffsstoken"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Voreinstellungen"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profil"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Zweck"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registrierungen"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Gerät umbenennen"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Erweiterung zurücksetzen"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort zurücksetzen"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Ressourcen"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Sicherheitsgeräte"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Sicherheit"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server-Parameter"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single-Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO-Login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Speicher"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Unterstütze Migrationsformate"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Weberweiterung"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Nicht berechtigt"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profilaktualisierung"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerverwaltung"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn-Anmeldung"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Nach 1 Tag"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Nach 1 Stunde"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 1 Minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 10 Minuten"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 15 Minuten"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 2 Minuten"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 30 Minuten"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 5 Minuten"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"Über"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerkonto"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Aktionen"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Aktive Gruppe"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Zu 2FAuth hinzufügen"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Erweitertes Formular"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Nach einem Klick/Tippen"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Alle Passwörter auf dem Startbildschirm anzeigen, ohne etwas tun zu müssen"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Alle auf dem Startbildschirm anzeigen"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Alle Konten"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Gruppenlos"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Gruppenlose Konten"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Konto anklicken, um ein Passwort in einer eigenen Ansicht zu erhalten"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Einzeln, in eigener Ansicht"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App-Einrichtung"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Übernehmen"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Zurück"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Browsereinstellung"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Abbrechen"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort ändern"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Jetzt prüfen"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Hochladen"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Leeren"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Schließen"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Ständig"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Weiter"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"In die Zwischenablage kopieren"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Kopieren"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Erstellen"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Mitwirkende"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Dunkel"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Standard"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer löschen"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Ihr Konto Löschen"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Löschen"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR-Codes erkennen"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Gerät"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Alles verwerfen"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Duplikate verwerfen"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Dokumentation"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Erledigt"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Bearbeiten"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Exportieren"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Erweiterung"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 15 Minuten"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 5 Minuten"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Erzeugen"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"GitHub"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Raster"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Ziffern in zwei gleiche Gruppen aufteilen"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"nach Hälfte"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Mein Glück versuchen"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Hochgeladenes Paket"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Alle importieren"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Importieren"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP-Adresse"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Aussteller"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Hell"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Liste"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code scannen"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Verwalten"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Vielleicht später"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Verschieben"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Mein Gerät"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Niemals"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Neu"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Keine Gruppe"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- Kein Paket -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Aus der Gruppe entfernen"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"Beim Kopieren des Token"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Nach 1 Tag"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Nach 1 Stunde"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 1 Minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 Mon."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 J."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online-Sammlung"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Im Browser öffnen"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Ziffern in zweistellige Gruppen aufteilen"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"nach Paar"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Klartext"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Mit einem QR-Code ausfüllen"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code hochladen"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Aktualisieren"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Ein Gerät registrieren"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Symbol entfernen"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"E-Mail erneut senden"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Erweiterung zurücksetzen"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort zurücksetzen"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Zurücksetzen"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Widerrufen"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Speichern"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code scannen"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Suche"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Konten zum Anzeigen auswählen"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Link zum Zurücksetzen des Passworts senden"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Wiederherstellungs-Link senden"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Absenden"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Zeige mir"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Abmelden"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Absenden"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 10 Minuten"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Textdatei"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 30 Minuten"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Zeit"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Importieren"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Übertragen"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Ziffern in dreistellige Gruppen aufteilen"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"nach Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Nach 2 Minuten"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth-Format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Entsperren"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Aktualisieren"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code hochladen"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Hochladen"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variablen"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web-Erweiterung"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" Mon."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarisch)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Dänisch)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Deutsch)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Englisch)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanisch)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Französisch)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italienisch)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japanisch)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Koreanisch)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Niederländisch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portugiesisch, Brasilianisch)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russisch)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinesisch vereinfacht)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Über"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer hinzufügen"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Admin-Panel"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Zurück zur Startseite"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Konfigurieren"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Weiter"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Neue Gruppe erstellen"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer erstellen"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"Wie man einen PAT erstellt"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Bearbeiten"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Neuen Token erzeugen"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Zu 2FAuth gehen"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Helfen Sie 2FAuth zu übersetzen"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"Benutzername & Passwort"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Gruppen verwalten"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Verwalten"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Vielleicht später"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Konto wiederherstellen"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Neues Gerät registrieren"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Zurücksetzen"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Erweiterung zurücksetzen"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort zurücksetzen"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scannen"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"einem Sicherheitsgerät"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Gesamtes Zugriffsprotokoll anzeigen"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Wie man einen Anbieter aktiviert"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Sie können sich ohne SSO anmelden"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth-Exportschema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Erweitertes Formular verwenden"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Auf GitHub anzeigen"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Warum sehe ich das?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Eine Web-App um Ihre Zwei-Faktor-Authentifizierung (2FA) Konten zu verwalten und deren Sicherheitscodes zu generieren"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Eine Web-App um Ihre Zwei-Faktor-Authentifizierung (2FA)-Konten zu verwalten und deren Sicherheitscodes zu erzeugen"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Vollständiges Zugriffsprotokoll für Benutzer "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Dieses Konto ist mit einem "},{t:4,k:"provider"},{t:3,v:" Konto über OAuth verbunden"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"Sie haben sich mit Ihrem "},{t:4,k:"provider"},{t:3,v:" -Konto via SSO angemeldet. Ihre Daten können hier nicht geändert werden, sondern auf "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"E-Mail zur Kontowiederherstellung versendet!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Wählen Sie eine Methode und fügen Sie Ihren ersten Account hinzu"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer verwalten, die bereits registriert sind, oder neue Benutzer erstellen."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Bereits authentifiziert, bitte erst abmelden"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Schon registriert?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative Methoden"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierung durch einen Reverse-Proxy bearbeitet, unten sind die Einstellungen deaktiviert."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierung am Server fehlgeschlagen."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"Der perfekte Begleiter zu Ihrer 2FAuth Webanwendung"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser auf :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Die Feststelltaste ist aktiviert"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"Das Benutzerkonto sowie alle 2FA-Daten werden gelöscht."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Ihr Benutzerkonto wird gelöscht, ebenso wie alle Ihre 2FA-Daten. Es gibt kein Zurück mehr."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Das Löschen Ihres 2FAuth-Kontos hat keine Auswirkungen auf Ihr externes SSO-Konto."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Konten bleiben beim Löschen der Gruppe erhalten"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Beginnen Sie die Erkennung und wählen Sie den Code, ich werde den Rest handhaben."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Direkteingabe"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Funktion im Demo-Modus deaktiviert"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Aktivieren Sie NICHT den Passwortschutz oder die Verschlüsselung, wenn Sie Daten aus einer anderen 2FA-App exportieren, die Sie in 2FAuth importieren möchten."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Sie haben noch keinen Account?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"Diese E-Mail wird an "},{t:4,k:"email"},{t:3,v:" gesendet."}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Sie können die Sicherheit Ihres 2FAuth-Kontos erhöhen, indem Sie die WebAuthn-Authentifizierung aktivieren."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Vergewissern Sie sich, dass Sie die E-Mail auf einem Gerät öffnen, das Ihnen vollständig gehört."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Ein Fehler ist aufgetreten:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Erwartet: Eine Liste der otpauth URI, eins pro Zeile"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Anmeldung fehlgeschlagen auf "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Fehlschlag"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Datenabruf..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Ihr Browser (Firefox) setzt voraus, dass die Erweiterung automatisch geöffnet wird, wenn Sie einen QR-Code von einer Webseite erfassen."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort vergessen?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Beinhaltet Kleinbuchstaben"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Beinhaltet Zahlen"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Beinhaltet Sonderzeichen"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Beinhaltet Großbuchstaben"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Hilfe: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hallo "},{t:4,k:"username"},{t:3,v:", es ist alles gut"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"Mit der Schaltfläche 'Testen Sie mein Glück' wird versucht, ein Standardsymbol aus der ausgewählten Symbolsammlung zu erhalten. Je einfacher der Wert des Service-Feldes ist, desto wahrscheinlicher ist es, dass Sie das erwartete Symbol bekommen: Fügen Sie keine Erweiterung (wie '.com') an, verwenden Sie den genauen Namen des Dienstes, vermeiden Sie Sonderzeichen."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Benutzen Sie die Export-Funktion dieser Apps, um eine Migrations-Ressource wie einen QR-Code oder eine JSON-Datei zu erhalten und lade Sie sie hier."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth kann Daten aus verschiedenen 2FA-Apps importieren."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Importiert"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- ungültiges Konto -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Der Schlüssel zum Zurücksetzen des Passwortes ist ungültig."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- ungültiges Service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"Besteht aus mindestens 8 Zeichen"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Ist Ihr persönlicher Zugriffstoken noch gültig?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Zuletzt gesehen "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos von"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Haben Sie Ihr Gerät verloren?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Erstellt mit"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Kopieren Sie Ihren persönlichen Zugriffstoken jetzt. Sie werden ihn nicht mehr sehen können!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Konto auf Proxy-Ebene verwalten."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierung auf Proxyebene verwalten."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Sie können Gruppen erstellen, um Ihre Konten so zu organisieren wie Sie möchten. Alle Konten bleiben in der Pseudo-Gruppe mit dem Namen 'Alle' sichtbar, unabhängig davon, zu welcher Gruppe sie gehören."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Erforderlich"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Ausgewählte verschieben"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Brauchen Sie einen der sichtbaren QR-Codes dieser Seite in 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Oder"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Oder Konten nach Gruppe filtern"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Mindestens ein Gerät einrichten, um die nachfolgenden Optionen zu aktiveren"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Noch keine 2FA vorhanden!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Noch kein Eintrag"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Kein Bild in der Zwischenablage gefunden"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"kein Anbieter"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Kein Ergebnis"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- kein Service -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Anbieter fehlt?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nichts"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Hier sind die Details zu diesem Verbindungsversuch"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Wenn Sie dies waren, können Sie diese Warnung ignorieren. Falls weitere Versuche fehlschlagen, sollten Sie den 2FAuth-Administrator kontaktieren, um die Sicherheitseinstellungen zu überprüfen und Maßnahmen gegen diesen Angreifer zu ergreifen."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"Es gab einen fehlgeschlagenen Anmeldeversuch auf Ihr 2FAuth Konto."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Anmeldung bei 2FAuth fehlgeschlagen"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hallo :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hallo"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Hier sind die Details dieser Verbindung"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Wenn dies auf Sie zutrifft, können Sie diese Meldung ignorieren. Wenn Sie eine verdächtige Aktivität in Ihrem Konto vermuten, ändern Sie bitte Ihr Passwort."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Ein neues Gerät hat sich gerade mit Ihrem 2FAuth-Konto verbunden."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Verbindung zu 2FAuth von einem neuen Gerät"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Mit freundlichen Grüßen"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth-Passwort zurücksetzen"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"Sie erhalten diese E-Mail, weil Sie ein Passwort für Ihr 2FAuth-Konto angefordert haben."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dieser Link zum Zurücksetzen des Passworts läuft in :count Minuten ab."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"Falls Sie keine Anfrage zum Passwort zurücksetzen gestellt haben, müssen Sie nichts weiter machen."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Sie erhalten diese E-Mail, weil Sie eine Test-E-Mail angefordert haben, um die E-Mail-Einstellungen Ihrer 2FAuth Instanz zu überprüfen."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth-Test-E-Mail"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Gute Nachricht, es funktioniert :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Empfohlen (sehr)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Sie können auch fortfahren mit:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI ist das am häufigsten verwendete Format für den Austausch von 2FA-Daten zum Beispiel in Form eines QR-Codes, wenn Sie 2FA auf einer Website aktivieren. Wählen Sie diese Option, wenn Sie von 2FAuth wechseln möchten."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Daten als Liste der otpauth URIs exportieren"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Daten werden verarbeitet..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Passwort-Login und WebAuthn sind deaktiviert."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Für diesen Benutzer existiert eine Anfrage zum Zurücksetzen des Passworts, die aber abgelaufen ist, was bedeutet, dass der Benutzer sein Passwort nicht rechtzeitig geändert hat. Dies kann eine Anfrage des Benutzers selbst oder eines Administrators sein."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Für diesen Benutzer existiert eine Anfrage zum Zurücksetzen des Passworts (Anfrage um "},{t:4,k:"datetime"},{t:3,v:"), was bedeutet, dass der Benutzer sein Passwort noch nicht geändert hat, aber der Link, den er erhalten hat, weiterhin gültig ist. Dies könnte eine Anfrage des Benutzers selbst oder eines Administrators sein."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Ein Konto mit den gleichen Daten ist bereits vorhanden"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"Diese Web-Erweiterung ist ein Add-on für die 2FAuth Web-Anwendung. Sie können auf die 2FA-Daten Ihres 2FAuth-Benutzerkontos zugreifen und OTPs direkt aus Ihrer Browserleiste generieren."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"Sie müssen ein 2FAuth-Benutzerkonto haben und es an die Erweiterung binden, um sie nutzen zu können. Dazu müssen Sie die Adresse des 2FAuth-Servers und einen persönlichen Zugriffstoken (PAT) angeben."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Um Ihr Konto wiederherzustellen, setzt 2FAuth einige Webauthn-Einstellungen zurück, damit Sie sich mit Ihrer E-Mail und Ihrem Passwort anmelden können."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth wird Ihnen einen Wiederherstellungslink an diese E-Mail-Adresse senden. Klicken Sie auf den Link in der empfangenen E-Mail und folgen Sie den Anweisungen."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registriert "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA-Registraton von der Erweiterung wird noch nicht unterstützt. Öffne die 2FAuth-App, um eine erste 2FA hinzuzufügen."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Verwenden Sie 'E-Mail erneut senden', um eine neue E-Mail zum Zurücksetzen des Passworts an den Benutzer zu senden, damit er ein neues Passwort festlegen kann. Dies wird sein aktuelles Passwort unverändert lassen und jede vorherige Anfrage wird widerrufen."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Verwenden Sie diese Option, wenn Sie das Passwort der Erweiterung vergessen haben."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"Die Erweiterung wird von der aktuellen Konfiguration und den 2FAuth-Daten entfernt. Sie wird wieder für eine erneute Bindung an ein 2FAuth-Benutzerkonto zur Verfügung stehen."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Verwenden Sie 'Passwort zurücksetzen' um ein Passwort zurückzusetzen (dies wird ein temporäres Passwort setzen), bevor Sie eine E-Mail an den Benutzer senden, damit er ein neues Passwort setzen kann. Alle vorherigen Anfragen werden widerrufen."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth sendet Ihnen einen Link zum Zurücksetzen des Passworts an diese Adresse. Klicken Sie auf den Link in der erhaltenen E-Mail, um ein neues Passwort festzulegen."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Wenn Sie sich immer mit SSO angemeldet haben, melden Sie sich ab und verwenden Sie die Funktion zum Zurücksetzen des Passworts, um ein Passwort zu erhalten, damit Sie dieses Formular ausfüllen können."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Sie können versuchen zu aktualisieren (vielleicht war es ein vorübergehendes Problem) oder Sie können die Erweiterung zurücksetzen und einen neuen Token zur Verfügung stellen."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Das Widerrufen eines Gerätes ist dauerhaft"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Widerruf eines Token ist dauerhaft"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierungsgeräte, mit denen Sie sich in 2FAuth anmelden können, wie z.B. Sicherheitsschlüssel (z.B. Yubikey) oder Smartphones mit biometrischen Fähigkeiten (z.B. Apple FaceID/TouchID)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Einige Einstellungen werden von Ihrem Administrator verwaltet"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"Sie können sich mit der E-Mail-Adresse "},{t:4,k:"email"},{t:3,v:" und dem Passwort "},{t:4,k:"password"},{t:3,v:" verbinden"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Wählen Sie einen SSO-Anbieter zum Anmelden:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden mit"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Einige Übersetzungen fehlen bei Verwendung der bevorzugten Sprache des Browsers?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Normale Benutzer müssen sich mit SSO anmelden. Andere Methoden sind nur für Administratoren gedacht."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentifizierung ist nur auf SSO beschränkt, "},{t:4,k:"auth_method"},{t:3,v:" ist deaktiviert"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Die verbauten Kameras sind nicht geeignet"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Bitte verwenden Sie ein anderes Gerät/Kamera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS für Kamera-Übertragung erforderlich"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Der Live-Scan kann nicht gestartet werden :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"Dies geschieht üblicherweise durch Klicken auf ein geschlitztes Kamerasymbol in oder neben der Adressleiste des Browsers"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth hat keine Berechtigung auf Ihre Kamera zuzugreifen"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Sie müssen die Erlaubnis erteilen, um Ihre Gerätekamera zu verwenden. Falls Sie bereits verweigert haben und Ihr Browser Sie nicht erneut anfragt, verweisen Sie bitte auf die Browser-Dokumentation, um herauszufinden, wie Sie die Erlaubnis erteilen können."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"Keine Kamera in diesem Gerät"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Vielleicht haben Sie vergessen, Ihre Webcam anzuschließen"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fehler beim Laden des Scanners"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Wird die Kamera bereits verwendet? Stellen Sie sicher, dass keine andere App Ihre Kamera verwendet und versuchen Sie es erneut"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Sichere Umgebung erforderlich"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS wird für den Live-Scan benötigt. Wenn Sie 2FAuth auf Ihrem Computer ausführen, verwenden Sie nur localhost und keinen anderen virtuellen Host"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API wird von diesem Browser nicht unterstützt"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Sie sollten einen modernen Browser verwenden"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"Die folgenden 2FA-Konten wurden in der Migrations-Ressource gefunden. Bisher wurden noch keine von ihnen zu 2FAuth hinzugefügt."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Erfolgreiche Anmeldung auf "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Erfolgreiche Abmeldung auf "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Akzeptiert: Klartext, Json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Akzeptiert: jpg, jpeg, png, bmp, gif, svg oder webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Dies ist kein einfacher Löschvorgang, es gibt kein Zurück mehr."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Zu viele Anmeldeversuche. Bitte versuchen Sie es in "},{t:4,k:"seconds"},{t:3,v:" Sekunden erneut."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Mit persönlichen Zugriffstoken kann sich jede 2FAuth-API authentifizieren. Sie sollten das Zugriffstoken als Bearer-Token im Autorisierungs-Header der Anfragen von Verbraucher-Apps angeben."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"Diese Aktion widerruft nicht das verwendete persönliche Zugriffstoken."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"Sie sollten diese Option bevorzugen, wenn Sie eine Sicherung erstellen müssen, die wiederhergestellt werden kann. Dieses Format kümmert sich um die Symbole."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Daten mit dem 2FAuth json Schema exportieren"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"Die Schema-Definition ist hier beschrieben:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Eine Browser-Erweiterung, um 2FA-Sicherheitscodes abzurufen, die von Ihrem 2FAuth-Server generiert wurden."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI-Symbole von"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"Die Erweiterung ist gesperrt, um ihre Daten zu schützen. Geben Sie das Erweiterungspasswort ein, um auf Ihre 2FAs zuzugreifen."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Verwenden Sie die verfügbaren Schaltflächen, um sie dauerhaft in Ihrer 2FA-Sammlung zu speichern oder zu verwerfen."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Machen Sie sich bereit, sich mit (einem) Ihren Sicherheitsgeräten zu authentifizieren. Schließen Sie Ihren Schlüssel an, entfernen Sie die Gesichtsmaske oder Handschuhe, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Verwenden Sie die E-Mail-Adresse "},{t:4,k:"email"},{t:3,v:" und das Passwort "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerkonto, das von einem Authentifizierungsproxy zur Verfügung gestellt wurde."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" aktive Token"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" Sicherheitsgerät(e) (Passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Angesehen auf "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Kein Icon-Paket auf dem Server gefunden."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn-Login deaktiviert"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"Mit WebAuthn können Sie sich schnell und sicher mit vertrauenswürdigen Geräten (wie Yubikeys oder Smartphones mit biometrischen Funktionen) anmelden."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Willkommen bei 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Willkommen zur 2FAuth-Demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Willkommen zur 2FAuth-Test-Instanz"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"Dies ist eine einfache Konfigurationsänderung, die weniger als eine Minute dauert. Wir haben eine Schritt-für-Schritt-Anleitung vorbereitet, die Ihnen hilft, diese Funktion zu aktivieren."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" Konten"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" ist verfügbar"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" ausgewählt"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Instanz ist auf dem neusten Stand"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"Sie können auch Ihre Zwischenablage einfügen"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"Sie benötigen ein Konto, um weiter zu gehen. Bitte registrieren Sie sich."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Konto erfolgreich erstellt"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Konto erfolgreich aktualisiert"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Konto(en) erfolgreich gelöscht"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Konto(en) erfolgreich verschoben"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Anmeldung fehlgeschlagen"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Automatische Sperre ausgelöst, Sie wurden abgemeldet"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache geleert"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"In die Zwischenablage kopiert"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Daten wurden aktualisiert, um Änderungen auf dem Server wiederzugeben"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Gerät erfolgreich widerrufen"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Gerät erfolgreich registriert"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Gruppenname gespeichert"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Gruppe erfolgreich erstellt"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Gruppe erfolgreich gelöscht"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"Kein Icon-Paket verfügbar"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Passwort geändert"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Passwort erfolgreich geändert"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Passwort erfolgreich zurückgesetzt"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer-PATs erfolgreich widerrufen"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profil erfolgreich aktualisiert!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Sicherheitsgeräte des Benutzers wurden erfolgreich widerrufen"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen gespeichert"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test-E-Mail gesendet, überprüfen Sie Ihren Posteingang"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token erfolgreich widerrufen"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerkonto wurde erfolgreich gelöscht"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer erfolgreich erstellt"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerrolle aktualisiert"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" gültige Konten gefunden"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Weiter »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Zurück"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwörter müssen mindestens acht Zeichen lang sein und mit der Bestätigung übereinstimmen."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Das Passwort wurde zurückgesetzt!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Passworterinnerung wurde gesendet!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Bitte warten Sie, bevor Sie es erneut versuchen."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Der Passwort-Wiederherstellungs-Schlüssel ist ungültig oder abgelaufen."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Es konnte leider kein Benutzer mit dieser E-Mail-Adresse gefunden werden."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Benutzername, E-Mail..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Objekt nicht gefunden"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Über"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Konten"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App-Einrichtung"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentifizierung"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer erstellen"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Zugriffsprotokoll"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Benutzer verwalten"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerverwaltung"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Automatische Sperrung"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"QR blinken"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Konto erstellen"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Gruppe erstellen"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Konto bearbeiten"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Gruppe bearbeiten"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Überschwemmung"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Fehler"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Gruppen"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Konten importieren"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Anmelden"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Passwort zurücksetzen"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Neues Passwort"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Erweiterung zurücksetzen"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Neues Konto registrieren"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Benutzerkonto"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Neuer persönlicher Token"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth-Token"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn-Geräte"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Gerät bearbeiten"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Konto als QR-Code"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Neues Konto"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Entsperren"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Kontowiederherstellung"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Neues Gerät registrieren"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Suche leeren"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Auswahl löschen"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Seite "},{t:4,k:"pagetitle"},{t:3,v:" schließen"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Nächstes Passwort in die Zwischenablage kopieren"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"In die Zwischenablage kopieren"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Löschen"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"QR-Codes auf der aktiven Webseite erkennen"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Dieses Konto verwerfen"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Ausgewählte Konten exportieren"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Ein Testpasswort erzeugen"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Zurück zur "},{t:4,k:"pagetitle"},{t:3,v:" Seite"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Gruppenauswahl ausblenden"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort verbergen"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Dieses Konto importieren"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Sperren"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Verwalten"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Auswahl in eine Gruppe verschieben"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Daten als Liste der otpauth URIs exportieren"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Icon-Paketliste aktualisieren"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Umbenennen"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Eine E-Mail zum Zurücksetzen des Passworts erneut senden"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Passwort des Benutzers zurücksetzen"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Passwort anzeigen"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Alle Sicherheitsgeräte des Benutzers widerrufen"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Alle Benutzer-Token widerrufen"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Widerrufen"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Suche"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Alle auswählen"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Gruppenauswahl anzeigen"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Einträge aus dem letzten Monat anzeigen"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Einträge aus dem letzten Jahr anzeigen"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR-Code anzeigen"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Einträge aus den letzten 6 Monaten anzeigen"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Einträge aus den letzten 3 Monaten anzeigen"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Mit einem Sicherheitsgerät anmelden"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Sortierung aufsteigend"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Älteste zuerst anzeigen"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Aktuellste zuerst anzeigen"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sortierung absteigend"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Daten mit dem 2FAuth json Schema exportieren"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Entsperren (auf eigene Gefahr)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Verwenden Sie einen QR-Code, um das Formular auszufüllen"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:4,k:"website"},{t:3,v:" besuchen"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute muss akzeptiert werden, wenn :other :value ist."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss akzeptiert werden."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute ist keine gültige Internet-Adresse."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein Datum nach dem :date oder gleich dem :date sein."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein Datum nach dem :date sein."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nur Buchstaben, Ziffern, Bindestriche und Unterstriche enthalten."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nur aus Zeichen und Nummern bestehen."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nur Buchstaben enthalten."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein Array sein."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute darf nur alphanumerische Einzelbyte-Zeichen und -Symbole enthalten."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein Datum vor dem :date oder gleich dem :date sein."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein Datum vor dem :date sein."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss zwischen :min & :max Elemente haben."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss zwischen :min & :max Kilobytes groß sein."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss zwischen :min & :max liegen."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss zwischen :min & :max Zeichen lang sein."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss entweder 'true' oder 'false' sein."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute enthält einen unzulässigen Wert."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute stimmt nicht mit der Bestätigung überein."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:":attribute Feld fehlt ein benötigter Wert."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Das Passwort ist falsch."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf keinen Doppelpunkt enthalten."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Diese E-Mail-Adresse entspricht nicht den Registrierungsrichtlinien"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Kein Konto mit dieser E-Mail gefunden."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Alle E-Mails müssen gültig und durch eine Pipe getrennt sein"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Unterstützte Formate sind jpeg, png, bmp, gif, svg oder webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs müssen durch Komma getrennt werden, ohne Komma am Ende."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"Der URI muss ein Label haben."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld wird nicht unterstützt."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Unterstützte Formate sind jpeg, png, bmp, gif, svg oder webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss einen Base32 kodierten String enthalten."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf keinen Doppelpunkt enthalten."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld enthält kein gültiges otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein Datum gleich :date sein."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute entspricht nicht dem gültigen Format für :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein gültiges Datum sein."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss :decimal Dezimalstellen haben."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute muss abgelehnt werden, wenn :other :value ist."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute muss abgelehnt werden."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute und :other müssen sich unterscheiden."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss zwischen :min und :max Stellen haben."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss :digits Stellen haben."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute hat ungültige Bildabmessungen."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute beinhaltet einen bereits vorhandenen Wert."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute darf nicht mit einem der folgenden Werte enden: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nicht mit einem der folgenden Werte beginnen: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine gültige E-Mail-Adresse sein."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine der folgenden Endungen aufweisen: :values"}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"Der gewählte Wert für :attribute ist ungültig."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"Der gewählte Wert für :attribute ist ungültig."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss eine der folgenden Erweiterungen haben: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine Datei sein."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt sein."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss mehr als :value Elemente haben."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss größer als :value Kilobytes sein."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss größer als :value sein."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss länger als :value Zeichen sein."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss mindestens :value Elemente haben."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute muss größer oder gleich :value Kilobytes groß sein."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss größer oder gleich :value sein."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss mindestens :value Zeichen enthalten."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss eine gültige Hexadezimalfarbe sein."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"Das Icon-Paket kann nicht auf dem Server gefunden werden."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein Bild sein."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"Der gewählte Wert für :attribute kommt nicht in :other vor."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"Der gewählte Wert für :attribute ist ungültig."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine ganze Zahl sein."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine gültige IP-Adresse sein."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine gültige IPv4-Adresse sein."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine gültige IPv6-Adresse sein."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein gültiges Regex-Muster sein."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein gültiger JSON-String sein."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute-Feld muss eine Lis7te sein."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss aus Kleinbuchstaben bestehen."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss weniger als :value Elemente haben."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss kleiner als :value Kilobytes sein."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss kleiner als :value sein."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss kürzer als :value Zeichen sein."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute darf maximal :value Elemente haben."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute muss kleiner oder gleich :value Kilobytes groß sein."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss kleiner oder gleich :value sein."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf maximal :value Zeichen enthalten."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss eine gültige MAC-Adresse enthalten."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nicht mehr als :max Ziffern enthalten."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nicht mehr als :max Elemente enthalten."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute darf nicht größer als :max Kilobytes groß sein."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nicht größer als :max sein."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld darf nicht mehr als :value Zeichen enthalten."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss den Dateityp :values haben."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss den Dateityp :values haben."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss mindestens :min Ziffern enthalten."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss mindestens :min Elemente haben."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss mindestens :min Kilobytes groß sein."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss mindestens :min sein."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss mindestens :min Zeichen lang sein."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss fehlen, wenn :other gleich :value ist."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss fehlen, wenn :other nicht :value ist."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss fehlen, wenn :values vorhanden sind."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss fehlen, wenn :values vorhanden ist."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss fehlen."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss ein Vielfaches von :value sein."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Der gewählte Wert für :attribute ist ungültig."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute hat ein ungültiges Format."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss eine Zahl sein."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"Der uri Parameter muss allein oder nur in Kombination mit dem 'custom_otp' Parameter angegeben werden"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss mindestens einen Buchstaben enthalten."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss mindestens einen Groß- und einen Kleinbuchstaben enthalten."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss mindestens eine Zahl enthalten."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss mindestens ein Symbol enthalten."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"Der im :attribute Feld angegebene Wert wurde in einem Datenleck gefunden. Bitte geben Sie für :attribute einen anderen Wert ein."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss vorhanden sein, wenn :other gleich :value ist."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss vorhanden sein, es sei denn, :other ist :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss vorhanden sein, wenn :values vorhanden sind."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss vorhanden sein, wenn :values vorhanden ist."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss vorhanden sein."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld ist unzulässig, wenn :other den Wert :value entspricht."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld ist unzulässig, wenn :other nicht den Wert :value annimmt."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld ist unzulässig."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"Bei gegebenem :attribute Feld ist :other nicht zulässig."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute Format ist ungültig."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss Einträge enthalten für: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss ausgefüllt werden, wenn :other ausgefüllt wurde."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute ist erforderlich, wenn :other abgelehnt wird."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt werden, wenn :other den Wert :value hat."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt werden, wenn :other nicht den Wert :values hat."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt werden, wenn :values ausgefüllt wurde."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt werden, wenn :values ausgefüllt wurde."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt werden, wenn keines der Felder :values ausgefüllt wurde."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt werden, wenn :values nicht ausgefüllt wurde."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ausgefüllt werden."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attribute und :other müssen übereinstimmen."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Bei Verwendung von :attribute muss es der einzige Parameter in diesem Anfragetext sein"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss genau :size Elemente haben."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss :size Kilobyte groß sein."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss gleich :size sein."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss :size Zeichen lang sein."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss mit einem der folgenden Anfänge aufweisen: :values"}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein String sein."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss eine gültige Zeitzone sein."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss eine gültige ULID sein."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":attribute ist bereits vergeben."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attribute konnte nicht hochgeladen werden."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"Das Feld :attribute muss in Großbuchstaben geschrieben sein."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"Das :attribute Feld muss eine gültige URL aufweisen."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attribute muss ein UUID sein."}}}},{en:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Icon that illustrates the account"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Image of a QR code to scan"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Changes will be lost. Are you sure?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"This will have serious impacts on this user's permissions. Are you sure?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete your account?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this group?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this account?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this user? There is no going back."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"You will no longer be an administrator. Really sure?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all accounts?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all duplicates?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard this account?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"This is your own account. Are you sure?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to log out?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke the previous request?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to reset this user's password?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this device?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domain is not a valid domain"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Aborted by user"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Account managed by an external provider"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth is configured to run behind an authentication proxy but your proxy does not return the expected header. Check your configuration and try again."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy authentication failed"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing discoverable credential support"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing user verification support"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Your device does not support webauthn. Try again later using a more modern browser"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Cannot create an OTP without a secret"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"The secret cannot be deciphered. This is mainly caused by a wrong APP_KEY set in the .env configuration file of 2Fauth or a corrupted data stored in database."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Cannot decode detected QR code, try to crop or sharpen the image"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot delete the only admin account"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot demote the only admin account"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Cannot detect a QR code in the image, try to crop the image"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Check failed, please retry later"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Data cannot be refreshed from server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"The data of this QR code is not a valid OTP Auth URI. The QR code contains:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Only user-created setting can be deleted"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Unreadable, the data seem encrypted"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Something went wrong during data fetching"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Decryption failed, your database is still protected. This is mainly caused by an integrity issue of encrypted data for one or more accounts."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Encryption failed, your database remains unprotected."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"File upload failed"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS context required"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecipherable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Invalid 2FA data"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"No authenticators support specified algorithms"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Password reset unavailable for this user"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No readable QR code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"No valid OTP resource in this QR code"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"This OTP format is not currently supported"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operation not allowed"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"This QR code is unreadable"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code has invalid checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Resource not found"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device already registered"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Something is wrong with your server"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"This SSO provider is not fully setup in your .env file"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is disabled"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication via SSO rejected"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrations are disabled"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"too many ids were included in the query parameter, max 100 allowed"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Unable to decrypt uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"You do not have permissions to view this resource or to perform this action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Data do not match any supported format"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported OTP type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"User account deletion failed, no data have been deleted"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"User ID was not between 1 and 64 chars"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong current password"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"The algorithm used to secure your security codes"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorithm"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache management"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically check (once a week) and warn when a new release of 2FAuth is published on Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Check for new version"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Empty the Search box right after a code has been copied to the clipboard"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Clear Search on copy"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Click on a generated password to copy it automatically hides it from the screen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirm new password"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first Time-based One-Time Password (TOTP) will be copied, not the rotating ones"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"The initial counter value"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Fill in your current password to confirm that it's you"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the newly created accounts are associated"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Default group"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode used when the Direct input option is On"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"The number of digits of the generated security codes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Digits"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"All your security devices will be revoked. Use this option if you have lost one or its security has been compromised."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Disable all security devices"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Disable registration"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want accounts to be displayed as a list or as a grid"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Display mode"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Email"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Try to) Get the official icon of the 2FA issuer when adding an account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Get official icons"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Language used to translate the user interface. Named languages are complete, set the one of your choice to override your browser preference."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Language"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Name this device"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Name"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"New name"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords are displayed."}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Show Password"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Password formatting"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"The period of validity of the generated security codes in second"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Period"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Remember group filter"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Let the ability to temporarily reveal Dot-Obscured passwords"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"The key used to generate your security codes"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Service"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Show icons"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Email configuration test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Theme"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"The time zone applied to all dates and times displayed in the application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Time zone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"If you experiences issues when capturing QR codes enables this option to switch to a more basic but more reliable QR code reader"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Use basic QR code reader"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protect sensitive data"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Use WebAuthn only"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Access"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Danger Zone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Data input"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Environment"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"General"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groups"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Last accesses"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"New account"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"New group"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"New token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"New user"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Personal access tokens"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferences"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registrations"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Rename device"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Resources"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Security devices"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Security"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Supported migration formats"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"User management"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn login"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Active group"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Advanced form"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"After a click/tap"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Show all passwords in the main view, without doing anything"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"All of them, on home"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alone, in its own view"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Back"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Browser preference"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Cancel"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Check now"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Close"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantly"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copy"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Create"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Credits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Dark"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Default"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Delete this user"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete your account"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Device"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Discard all"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Discard duplicates"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Done"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Export"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Generate"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Grid"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Split digits into two equals groups"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"by Half"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Try my luck"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Import all"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Address"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Issuer"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Light"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"List"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Move"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"My device"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Never"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"New"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"No group"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"On security code copy"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mo."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yr."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Open in browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits two by two"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"by Pair"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Plain text"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Prefill using a QR Code"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a device"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Remove icon"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Resend email"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Save"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scan a QR code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Send password reset link"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Send recovery link"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Send"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Sign out"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Submit"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Text file"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Time"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits three by three"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"by Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Update"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Upload a QR code"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (German)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (English)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (French)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japanese)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russian)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Admin panel"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Back to home"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Create new group"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Create a user"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generate a new token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Help translate 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"login & password"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage groups"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recover your account"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a new device"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset it"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"a security device"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"See full log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Use the advanced form"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"View on Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"This account is bound to a "},{t:4,k:"provider"},{t:3,v:" account via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery email sent!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Pick a method and add your first account"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Manage users registered on your instance or create new ones."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Already authenticated, please log out first"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Already registered?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative methods"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock is On"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"The user account will be deleted as well as all its 2FA data."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Your user account will be deleted as well as all your 2FA data. There is no going back."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Deleting your 2FAuth account has no impact on your external SSO account."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Deleting a group does not delete accounts"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Feature disabled in Demo mode"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Don't have your account yet?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"An error occured:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Failure"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Forgot your password?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Has lower case"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Has number"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Has special char"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Has upper case"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use the Export feature of these apps to get a migration resource like a QR code or a JSON file then load it here."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Imported"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"This reset token is invalid."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 characters min."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Last seen "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos by"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Lost your device?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Made with"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Make sure to copy your personal access token now. You won’t be able to see it again!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can create groups to organize your accounts the way you want. All accounts remain visible in the pseudo group named 'All', regardless of the group they belong to."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Mandatory"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Move selected to"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Set at least one device to enable the following options"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"No 2FA here!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"No entry yet"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"No result"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- no service -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nothing"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hello"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"You can also continue with:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Parsing data..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"A password reset request exists for this user but has expired, meaning that the user has not changed their password in time. This may be a request from the user themselves or from an administrator."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"A password reset request exists for this user (request sent at "},{t:4,k:"datetime"},{t:3,v:"), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"An account with the exact same data already exists"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"To recover your account, 2FAuth resets some Webauthn settings so you will be able to sign in using your email and password."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registered "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a password reset link to this address. Click the link in the received email to set a new password."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a device is permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a token is permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Authentication devices you can use to sign in 2FAuth, like security keys (i.e Yubikey) or smartphones with biometric capabilities (i.e. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Some translations are missing using the browser preferred language?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Please use another device/camera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan can't start :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No camera on this device"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Maybe you forgot to plug in your webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fail to load scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is the camera already in use? Ensure that no other app use your camera and try again"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Secure context required"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"You should use a modern browser"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: jpg, jpeg, png, bmp, gif, svg, or webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Too many login attempts. Please try again in "},{t:4,k:"seconds"},{t:3,v:" seconds."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI Icons by"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use the available buttons to permanently save them to your 2FA collection or discard them."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Get ready to authenticate using (one of) your security devices. Plug your key in, remove face mask or gloves, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" active token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" security device(s) (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn login disabled"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" accounts"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selected"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"This instance is up-to-date"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully created"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully updated"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully deleted"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully moved"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Auto-lock triggered, you've been logged out"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cleared"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copied to clipboard"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data has been refresh to reflect server-side changes"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully revoked"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully registered"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Group name saved"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully created"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully deleted"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully reset"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's PATs successfully revoked"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profile successfully updated!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Setting saved"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token successfully revoked"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"User account successfully deleted"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"user successfully created"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"User role updated"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" valid accounts found"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Next »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Previous"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwords must be at least eight characters and match the confirmation."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Your password has been reset!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"We have emailed your password reset link!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Please wait before retrying."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"This password reset token is invalid."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"We can't find a user with that email address."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"User name, email..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Item not found"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Accounts"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Create user"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Manage user"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Users management"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Create account"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Create group"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Account edit"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Group edit"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Error"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groups"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Import accounts"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"User account"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"New personal token"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth tokens"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn devices"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Device edit"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Account as QR code"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"New account"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Register a new device"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Clear search"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Clear selection"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Close the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Discard this account"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generate a test pasword"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Hide group selector"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Hide password"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Import this account"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Lock it"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Move selected into a group"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Rename"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Resend a password reset email to the user"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Reveal password"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's security devices"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's tokens"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Select all"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Show group selector"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Show QR code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using a security device"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Sort ascending"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sort descending"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock it (at your own risk)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Use a QR code to fill the form magically"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted when :other is :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after or equal to :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters, numbers, dashes, and underscores."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters and numbers."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an array."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before or equal to :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have between :min and :max items."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max characters."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be true or false."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field confirmation does not match."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"The password is incorrect."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"This email address does not comply with the registration policy"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No account found using this email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"All emails must be valid and separated with a pipe"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs must be comma separated, without trailing comma."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"The uri must have a label."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not supported."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a base32 encoded string."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not a valid otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date equal to :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match the format :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid date."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined when :other is :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field and :other must be different."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max digits."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :digits digits."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has invalid image dimensions."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has a duplicate value."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not end with one of the following: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not start with one of the following: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid email address."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must end with one of the following: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have a value."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have more than :value items."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value characters."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :value items or more."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value characters."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an image."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must exist in :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an integer."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IP address."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv4 address."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv6 address."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid JSON string."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have less than :value items."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value characters."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :value items."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value characters."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid MAC address."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max digits."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max items."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max characters."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min digits."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min items."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min characters."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a multiple of :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a number."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"The uri parameter must be provided alone or only in combination with the 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one letter."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one uppercase and one lowercase letter."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one number."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one symbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"The given :attribute has appeared in a data leak. Please choose a different :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited when :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited unless :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field prohibits :other from being present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain entries for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is accepted."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required unless :other is in :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values are present."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is present."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when none of :values are present."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is not present."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"When using :attribute it must be the only parameter in this request body"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain :size items."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size characters."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must start with one of the following: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a string."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid timezone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute has already been taken."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute failed to upload."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid UUID."}}}},{"es-ES":{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Icono de la cuenta"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Código QR para escanear"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"¿Estás seguro?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"La cuenta será eliminada. ¿Estás seguro?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Esto tendrá graves impactos en los permisos de este usuario. ¿Estás seguro?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea eliminar su cuenta?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea eliminar este grupo?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea eliminar esta cuenta?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea eliminar este usuario? No hay vuelta atrás."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Ya no serás administrador. ¿Estás seguro?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea eliminar todas las cuentas?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea eliminar todos los duplicados?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea eliminar esta cuenta?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Esta es tu propia cuenta. ¿Estás seguro?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"¿Seguro que quieres cerrar la sesión?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea revocar la solicitud anterior?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro de que desea restablecer la contraseña de este usuario?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que quiere eliminar este dispositivo?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"¿Está seguro que desea revocar este token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"¿Seguro que quieres cambiar la configuración de uso compartido?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Se dejará de compartir esta cuenta con todos los usuarios. ¿Seguro que quieres continuar?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"Se dejarán de compartir estas cuentas. ¿Seguro que quieres continuar?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Vas a dejar de ser el propietario de esta cuenta. ¿Seguro que quieres continuar?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"El dominio de 2FAuth's no es un dominio válido"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Abortado por el usuario"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta administrada por un proveedor externo"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth está configurado para ejecutarse detrás de un proxy de autenticación, pero, su proxy no devuelve el encabezado esperado. Compruebe su configuración e intente de nuevo."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"La autenticación proxy falló"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"El autentificador no cuenta con soporte para credenciales detectables"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"El autentificador no cuenta con soporte para la verificación de usuario"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Su dispositivo no soporta WebAuthn. Intente de nuevo más tarde en un navegador más moderno"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"No se puede crear un OTP sin una clave secreta"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"The clave secreta no puede ser descifrada. Esto es, principalmente, causado por una APP_KEY inválida en el archivo de configuración .env de 2FAuth, o datos corruptos almacenados en la base de datos."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No se puede leer el código QR, intente recortar o mejorar la imagen"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"No se puede eliminar la única cuenta de administrador"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"No se puede eliminar la única cuenta de administrador"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"No se puede detectar un QR en la imagen, intente recortar la imagen"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Cambio fallido, vuelva a intentarlo"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Comprobación fallida, por favor inténtelo más tarde"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Los datos no se pueden actualizar desde el servidor"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Los datos de este código QR no son una URI OTP de Autenticación. El código QR contiene:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Sólo los ajustes creados por el usuario pueden ser eliminados"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error al obtener el código QR"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Error al enviar el correo"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Ilegible, los datos parecen estar encriptados"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Error al generar la clave de cifrado"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Algo salió mal durante la obtención de datos"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"El descifrado falló, su base de datos todavía está protegida. Esto se debe, principalmente, a un problema de integridad de datos cifrados para una o más cuentas."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"El cifrado falló, la base de datos permanece sin protección."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migración de iconos fallida. La configuración ha sido restaurada a su valor anterior."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Autenticación fallida, compruebe su PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"Servidor 2FAuth inaccesible, compruebe la URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Error al descifrar PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Error al derivar la clave"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Error al cifrar PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Error al obtener la contraseña"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Error al obtener el token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"No se pudo inyectar el script para realizar el escaneo del código QR"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Error al cargar la configuración de la tienda"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Error al regenerar IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Error al recuperar la configuración de la aplicación"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Error al recuperar datos del almacén de cifrado"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Error al establecer el retardo de autobloqueo"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Error al establecer la clave de cifrado"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Error al establecer parámetros de cifrado"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Error al almacenar PAT cifrado"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"El campo es obligatorio y debe ser una URL válida"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"Este campo es obligatorio"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Fallo al subir el archivo"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Contexto HTTPS requerido"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indescifrable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Datos 2FA inválidos"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"El token de acceso personal no es válido o es desconocido"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Datos inválidos o ilegibles de :appname"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No se encontró ninguna pestaña activa"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"No existen autentificadores que soporten los algoritmos especificados"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Ninguna entrada es del tipo 'clave pública'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"Ningún icono disponible en esta variante"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No hay coincidencia en el paquete de iconos"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"El restablecimiento de contraseña no está disponible para este usuario"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No hay datos de imagen del código QR disponibles"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No se encontró ningún código QR válido en el área visible de la página"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Ningún código QR legible"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"No hay un recurso OTP válido en este código QR"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Este formato OTP no está soportado actualmente"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operación no permitida"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"Los permisos de la clave OAuth no son válidos en el servidor. Consulta la guía «Actualización a la versión 8» en la documentación de 2FAuth para resolver este problema."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Este código QR no se puede leer"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"El código QR tiene una suma de verificación no válida"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Nombre reservado, por favor seleccione otra cosa"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Por favor, utilice sólo letras, números, guiones, guiones, guiones bajos, espacios o comillas simples"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"La solicitud no procede de un proxy de confianza"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Recurso no encontrado"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo ya registrado"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Error de seguridad: Compruebe su variable env WEBAUTHN_ID"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"El uso compartido con todos los usuarios está desactivado"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"La función de uso compartido está desactivada"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Algo va mal con su servidor"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Los espacios no deseados se eliminarán automáticamente"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Este proveedor SSO no está completamente configurado en su archivo .env"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO está desactivado"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Ya existe una cuenta de usuario con la misma dirección de correo electrónico, pero no coincide con su ID de cuenta externa. No utilice SSO si ya se encuentra registrado en 2FAuth con este correo electrónico."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Autenticación mediante SSO rechazada"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Los registros están deshabilitados"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Esta cuenta ya está compartida con todos los usuarios."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Esta cuenta no está compartida con todos los usuarios."}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"Se han incluido demasiados ID en el parámetro de consulta; se permite un máximo de 100"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"No se puede descifrar uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"No tiene permisos para ver este recurso o para realizar esta acción"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"No autorizado"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Error desconocido durante el cifrado PAT"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Error desconocido"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Los datos no coinciden con ningún formato soportado"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Tipo de OTP no soportada"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Ámbito de uso compartido no compatible"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"No aplicable al usar un proxy de autenticación o SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Este método de autenticación es solo para administradores. Los usuarios deben iniciar sesión con SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Error al borrar la cuenta de usuario, no se han eliminado datos"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"El ID de usuario no está entre 1 y 64 caracteres"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña actual incorrecta"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña incorrecta"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"El algoritmo usado para proteger sus códigos de seguridad"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorítmo"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Permitir a los usuarios crear token de acceso personal y utilizarlos para autenticarse con aplicaciones de terceros como la extensión web 2FAuth"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Permitir el uso de PAT"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"El token de acceso personal (PAT) para autenticar la extensión al servidor. Puede generar una desde los Ajustes > Página OAuth de su cuenta de usuario 2FAuth"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"Toquen de API"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Ocultar automáticamente la contraseña en pantalla después de un tiempo de espera. Esto evita peticiones innecesarias de contraseñas frescas si olvida cerrar la vista de contraseñas."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Cierre automático OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Bloquea la extensión automáticamente para evitar el acceso no legítimo a sus datos"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueo automático"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Cerrar sesión del usuario automáticamente en caso de inactividad. No tiene efecto cuando la autenticación es manejada por un proxy, ni cuando ninguna url de cierre de sesión personalizada se especificada."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueo automático"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Las cuentas nuevas se registran automáticamente después de escanear o subir un código QR, no hay necesidad de hacer clic en el botón Guardar"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Autoguardar cuentas"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"A veces la caché necesita ser borrada, por ejemplo después de un cambio en las variables de entorno o una actualización. Puedes hacerlo desde aquí."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Administración de caché"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Comprobar automáticamente (una vez por semana), y avisar si una nueva versión de 2FAuth se publique en Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Comprobar nueva versión"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Vaciar la casilla de búsqueda justo después de que un código haya sido copiado al portapapeles"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Limpiar la búsqueda al copiar"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Al hacer clic en una contraseña generada para copiarla, se oculta automáticamente de la pantalla"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Cerrar token después de la copia"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirma la contraseña nueva"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Copiar automáticamente la contraseña justo después de aparecer en pantalla. Debido a limitaciones en los navegadores, solo la primera contraseña (TOTP) será copiada, no las que roten"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copiar OTP en pantalla"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Es arriesgado editar el contador, ya que puede desincronizar la cuenta con el servidor de verificación del servicio. Utilice el icono de bloqueo para habilitar la modificación, pero solo si sabe lo que está haciendo"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"El valor inicial del contador"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Por defecto es 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Contador"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Introduzca su contraseña actual para confirmar que es usted"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña actual"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"El grupo al que las cuentas recién creadas están asociadas"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Grupo por defecto"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Modo de entrada predeterminado usado cuando la opción de entrada directa está encendida"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Modo de entrada de datos por defecto"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"El número de dígitos del código de seguridad generado"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Dígitos"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Todos sus dispositivos de seguridad serán revocados. Utilice esta opción si ha perdido uno o si su seguridad ha sido comprometida."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Desactivar todos los dispositivos de seguridad"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Evitar el registro de nuevos usuarios. A menos que se sobreescriba (ver abajo), esto afecta también a SSO, por lo que los nuevos usuarios no podrán iniciar sesión a través de SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Deshabilitar registro de usuarios"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Elija si desea que las cuentas se muestren como una lista o como una cuadrícula"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Modo de visualización"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"E-mail"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Permite a los usuarios compartir sus cuentas de 2FA con otros usuarios de esta instancia de 2FAuth. Cuando se comparten, los destinatarios pueden verlas y utilizarlas para generar códigos OTP. Solo el propietario de una cuenta puede editarla, eliminarla o exportarla, así como ver su secreto o gestionar su configuración de uso compartido."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Activar el uso compartido"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"El ámbito «Todos los usuarios» permite compartir una cuenta con todos los usuarios de esta instancia de 2FAuth. Cuando una cuenta se comparte en este ámbito, se comparte automáticamente con todos los usuarios, incluidos los que se creen después."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Al desactivar esta opción, se desactivarán los usos compartidos existentes con el ámbito «Todos los usuarios», pero no se revocarán. Si vuelves a activarla más adelante, esos usos compartidos volverán a estar activos, salvo que mientras tanto se hayan configurado usos compartidos con usuarios específicos."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Activar el ámbito de uso compartido «Todos los usuarios»"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Permite que los visitantes se autentiquen mediante un identificador externo utilizando el sistema de inicio Single Sign-On"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Habilitar SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"La contraseña usada actualmente para desbloquear la extensión"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña actual"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"La nueva contraseña que se utilizará para bloquear esta extensión y cifrar datos sensibles cuando sea necesario"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nueva contraseña"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"La contraseña que se utilizará para bloquear esta extensión y cifrar datos sensibles cuando sea necesario"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Se admite la búsqueda parcial por nombre de usuario, el correo electrónico debe coincidir exactamente"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Buscar usuarios con los que compartir"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Intentar) Obtener el icono oficial del emisor 2FA al añadir una cuenta"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Obtener iconos oficiales"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"El grupo al que la cuenta será asignada"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Grupo"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL que puedes visitar para comprobar la salud de esta instancia de 2FAuth. Esta URL se puede utilizar para configurar un Docker HEALTHCHECK o una sonda de seguridad HTTPS de Kubernetes."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Endpoint de estado"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"La dirección web de la instancia de 2FAuth donde te registraste. Por ejemplo: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"URL del servidor 2FAuth"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"La colección de iconos a ser consultada al principio cuando se requiere un icono oficial."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Colección en línea de favoritos"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Establezca si desea obtener los iconos de una colección de logos en línea o un paquete de iconos local. Cambiar los siguientes ajustes de iconos no actualizará los iconos que ya han sido recuperados."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Obtener iconos de"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"El paquete de iconos a usar cuando se requiere un icono oficial. Los paquetes de iconos están disponibles subiendo los directorios de paquetes al servidor 2FAuth, pida a su administrador de instancia para más."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Pack de iconos"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Flecha la búsqueda a la variante especificada. Si falta la variante, 2FAuth no intentará recurrir a la variante normal."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Obtención estricta"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Algunos iconos están disponibles en diferentes sabores para adaptarse mejor a las interfaces de usuario oscuras o claras. Establezca el que desea buscar primero. La variante regular se recuperará automáticamente como un respaldo."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Variante de icono"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icono"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Concede derechos de administrador al usuario. Los administradores pueden gestionar toda la aplicación, incluida la configuración y los demás usuarios, pero no pueden generar contraseñas de cuentas 2FA que no les pertenezcan."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Es administrador"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Permitir a nuevos usuarios iniciar sesión por primera vez a través de SSO mientras que el registro está deshabilitado"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Mantener el registro SSO habilitado"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Idioma utilizado para traducir la interfaz de usuario. Los idiomas disponibles están completamente traducidos; selecciona el que prefieras para reemplazar la preferencia de tu navegador."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Idioma"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Proporcione nombre al dispositivo"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Nombre"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo nombre"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"El usuario al que se transferirá la propiedad de esta cuenta."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo propietario"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nueva contraseña"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Recibe un correo electrónico cada vez que falle un intento de iniciar sesión en tu cuenta de 2FAuth"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"En caso de error al iniciar sesión"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Obtén un correo electrónico cuando un nuevo dispositivo se conecte a tu cuenta de 2FAuth por primera vez"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"Al iniciar sesión desde un dispositivo nuevo"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Puede dejar las siguientes opciones en blanco si no sabe cómo establecerlas. Los valores más utilizados se aplicarán."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Configura cómo y cuándo se muestran los códigos de un solo uso (OTP)."}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar contraseña"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"OTP basado en tiempo, OTP basado en HMAC u OTP de Steam"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Elija el tipo de OTP a crear"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Cambiar cómo se muestran las contraseñas agrupando dígitos para facilitar la legibilidad y la memorización"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Formato de contraseñas"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"Periodo de validez de los códigos se seguridad generados, en segundos"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Por defecto es 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Periodo"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Guardar el último filtro de grupo aplicado y restaurarlo en su próxima visita"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Recordar el filtro de grupo"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Las direcciones de correo electrónico de esta lista podrán registrarse. Separa las direcciones con una barra vertical ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Listas de filtros"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Hacer que el registro sólo esté disponible para un rango limitado de direcciones de correo electrónico. Ambas reglas se pueden utilizar simultáneamente. Esto no tiene ningún efecto en el registro a través de SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restringir el registro"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Los correos que coincidan con esta expresión podrán registrarse"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Reglas de filtro"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Activa la capacidad de revelar temporalmente las contraseñas ocultas"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Revelar OTP oculto"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"La clave utilizada para generar sus códigos de seguridad"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secreto"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Servicio"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar iconos de la cuenta en la vista principal"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar iconos"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar el correo electrónico del usuario registrado en el pie de página en lugar de los enlaces de navegación directa. Los enlaces están entonces disponibles en un menú detrás de un clic/toque en la dirección de correo electrónico."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar correo en pie de página"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar este grupo como un chip en el selector de grupo en la vista principal. Esto no tiene efecto si 'Usar fichas para activar' está desactivado en las preferencias del usuario."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar como chips para cambiar de grupo"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Vista previa de la siguiente contraseña, es decir, la que reemplazará la contraseña actual cuando expire. Las preferencias establecidas para el OTP actual también se aplican a la siguiente (formateo, mostrar como punto)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar siguiente OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Reemplaza carácteres de contraseñas generados con *** para asegurar confidencialidad. No afecta la función copiar/pegar"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar OTP generado como punto"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Añada un menú de navegación al lado de ciertas páginas largas para que pueda desplazarse directamente a secciones específicas. Esta función sólo está disponible en el ordenador. Los menús no serán visibles en móviles o tabletas."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar menús de nav rápidos"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar fichas para grupos virtuales como el grupo Grupo Less Accounts, el grupo Shared With/By Me, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar grupos virtuales"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Cuando se invoca, fuerza la función Ordenar cuentas de forma sensible a mayúsculas"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Ordenar mayúsculas"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Los iconos subidos se registran en la base de datos además del almacenamiento del sistema de archivos, que se utiliza sólo como caché. Esto hace que crear una copia de seguridad de 2FAuth sea mucho más fácil, ya que sólo la base de datos tiene que ser respaldada."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Pero cuidado, esto puede tener algunos inconvenientes: El tamaño de la base de datos puede aumentar significativamente si la instancia aloja muchos iconos grandes. También puede afectar el rendimiento de la aplicación porque el sistema de archivos se ve afectado más a menudo para asegurarse de que está sincronizado con la base de datos."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Guardar iconos en la base de datos"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Envía un correo electrónico de prueba para controlar la configuración de tu instancia. Es importante tener una configuración funcional, de lo contrario los usuarios no podrán solicitar un restablecimiento de contraseña."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Prueba de configuración de email"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Forzar un tema específico o aplicar el tema definido en sus preferencias de sistema/navegador"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Tema"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"La zona horaria aplicada a todas las fechas y horas mostradas en la aplicación"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Zona horaria"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Si experimenta problemas al capturar códigos QR habilite esta opción para cambiar a un lector de código QR más básico, pero más fiable"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Usar lector de código QR básico"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Muestra un conjunto de chips sobre la lista de cuentas de 2FA para cambiar de grupo directamente desde la vista principal. Si se desactiva, el nombre del grupo activo se mostrará en una etiqueta sobre la que habrá que hacer clic para abrir el selector de grupos."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Usar chips para cambiar de grupo"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Los datos sensibles, las claves secretas y correos electrónicos de 2FA, se almacenan cifrados en la base de datos. Asegúrese de respaldar el valor de APP_KEY de su archivo .env (o el archivo entero), pues, sirve como clave de cifrado. No hay forma de descifrar datos encriptados sin esta clave."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Proteger los datos confidenciales"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Hacer de SSO el único método disponible para iniciar sesión en 2FAuth. El usuario con contraseña y con WebAuthn están deshabilitados para los usuarios regulares. Los administradores no se ven afectados por esta restricción."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Usar sólo SSO"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Haga de WebAuthn el único método autorizado para iniciar sesión en su cuenta 2FAuth. Esta es la configuración recomendada para aprovechar la seguridad mejorada de WebAuthn."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"En caso de pérdida de dispositivo, podrá recuperar su cuenta restableciendo esta opción e iniciando sesión usando su correo electrónico y contraseña."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"¡Atención! El formulario de correo electrónico y contraseña sigue disponible a pesar de que esta opción está activada, pero siempre devolverá una respuesta de 'Autenticación fallida'."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Usar WebAuthn solo"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Elija si desea que se le pida que elija un modo de entrada entre los disponibles o si desea utilizar directamente el modo de entrada por defecto"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Entrada directa"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Siempre volver al grupo predeterminado cuando se copie un OTP"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Ver grupo predeterminado en la copia"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Acerca de"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Registro de accesos"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Recuperación cuenta"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Cuentas de 2FA"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Compartiendo"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Configuración de uso compartido"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Autenticación"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Restricciones del navegador"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Cambiar Contraseña"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Zona peligrosa"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Introducción de datos"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar cuenta"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Editar cuenta"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Editar grupo"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Entorno"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"General"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupos"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Iconos"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Importar"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Último acceso"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Iniciar sesión"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Nueva cuenta"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo grupo"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nueva contraseña"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo uso compartido"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo usuario"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notificaciones"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Opciones"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"Contraseñas de un solo uso"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"Registro de generación de códigos OTP"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Tokens de acceso personal"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferencias"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Perfil"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Propósito"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Código QR"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Registro"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registros"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Renombrar dispositivo"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer extensión"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer contraseña"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Recursos"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivos de seguridad"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Seguridad"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Parámetros del servidor"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Sesión"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Configuración"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Inicio de sesión único (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"Inicio de sesión SSO"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Almacenamiento"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Formatos de migración soportados"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"Usuario"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transferir la propiedad"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"Extensión web de 2FAuth"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"No autorizado"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Perfil actualizado"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Gestión de usuarios"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Usuarios"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"Inicio de sesión WebAuthn"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Después de 1 día"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Después de 1 hora"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 1 minuto"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 10 minutos"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 15 minutos"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 2 minutos"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 30 minutos"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 5 minutos"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"Acerca de"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Cuentas compartidas conmigo"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Cuentas que comparto"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Acciones"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Grupo activo"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Añadir a 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrador"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Formulario avanzado"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Después de un clic/toque"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar todas las contraseñas en la vista principal, sin hacer nada"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Todos ellos en la página de inicio"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Todo"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Todas las cuentas"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Sin grupo"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Cuentas sin grupo"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Haga clic en una cuenta para obtener una contraseña en una vista dedicada"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Por separado, en su propia vista"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Configuración de la aplicación"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Aplicar"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Autenticación"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Automático"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Volver"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Preferencia del navegador"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Navegador"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Cancelar"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Cambiar Contraseña"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Todo"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Comprobar ahora"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Subir"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Limpiar"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Cerrar"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantemente"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continuar"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiar al portapapeles"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copiar"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Contador"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Crear"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Créditos"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Oscuro"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Por defecto"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar este usuario"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar su cuenta"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detectar códigos QR"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Descartar todo"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Descartar duplicados"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Documentación"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Hecho"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Editar"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Exportar"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extensión"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 15 minutos"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 5 minutos"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Generar"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Cuadrícula"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Dividir dígitos en dos grupos iguales"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"a la Mitad"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Probar suerte"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Paquete cargado"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Importar todo"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Importar"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"Dirección IP"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Emisor"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Claro"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Lista"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"Escaneo código QR"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Configurar"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Quizás más tarde"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Mover"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Mi dispositivo"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Nunca"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Sin grupo"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- Sin paquete -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"No compartir"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar del grupo"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"Al copiar código de seguridad"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Después de 1 día"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Después de 1 hora"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 1 minuto"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mes."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 año."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Colección en línea"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Abrir en el navegador"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Opciones"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Grupo de dígitos dos por dos"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"por Parejas"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Texto plano"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Rellenar usando un código QR"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Código QR"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"Cargar código QR"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Registrar un dispositivo"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Registro"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Estándar"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar icono"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Reenviar correo electrónico"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer extensión"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer contraseña"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revocar"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Guardar"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Escanear un código QR"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Buscar"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Seleccionar cuentas para mostrar"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Enviar enlace para restablecer contraseña"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Enviar enlace de recuperación"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Enviar"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Compartir"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Compartida"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Compartida por mí"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Compartida conmigo"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Todos los usuarios"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Usuarios específicos"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Mostrarme"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Iniciar sesión"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Cerrar sesión"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Enviar"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 10 minutos"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Prueba"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Fichero de texto"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 30 minutos"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Hora"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Importar"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transferir"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transferir la propiedad"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Grupo de dígitos tres por tres"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"por Tríos"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Después de 2 minutos"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"Formato de 2FAuth"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloquear"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"No compartir"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Subir un código QR"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Cargar"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Usuarios"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Extensión web"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" Meses."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Búlgaro)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danés)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Alemán)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Inglés)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Español)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Francés)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italiano)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japonés)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Coreano)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Holandés)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuges, brasileño)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (ruso)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turco)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chino Simplificado)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Acerca de"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Añadir uso compartido"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Añadir usuarios"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Panel de administración"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Volver al inicio"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configurar"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continuar"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Crear nuevo grupo"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Crear un usuario"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Cree su primer grupo"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"Cómo crear un PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Editar"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generar nuevo token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Ir a 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Ayude a traducir 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Documentación de iconos"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"usuario y contraseña"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Gestionar grupos"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Gestionar el uso compartido"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Configurar"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Quizás más tarde"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Abre 2FAuth para crear un grupo"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"Registro de generación de códigos OTP"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recuperar su cuenta"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Registrar un nuevo dispositivo"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Registro"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Reiniciarlo"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer extensión"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer tu contraseña"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Escanear"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"Un dispositivo de seguridad"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Ver registro completo"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Ver cómo activar un proveedor"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Ajustes"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Documentación sobre el uso compartido"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Puede firmar sin SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Iniciar sesión"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transferir la propiedad"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"Esquema de exportación 2FAuth"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Usar el formulario avanzado"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Ver como código QR"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Ver en Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"¿Por qué veo esto?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Una app web para administrar tus cuentas de autenticación de doble factor (2FA), y generar tus códigos de seguridad"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Una aplicación web para administrar tus cuentas de autenticación de dos factores (2FA) y generar sus códigos de seguridad"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"El registro contiene más entradas."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Registro de acceso completo para el usuario "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Esta cuenta está vinculada a una cuenta "},{t:4,k:"provider"},{t:3,v:" a través de OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"Ha iniciado sesión a través de SSO usando su cuenta "},{t:4,k:"provider"},{t:3,v:". Su información no se puede cambiar aquí, sino en "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"¡Correo de recuperación de cuenta enviado!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Elige un método y añade tu primer cuenta"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Añade el primer usuario con el que compartir esta cuenta"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Administre los usuarios registrados en su instancia o cree otros nuevos."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Selecciona «Todos los usuarios» para compartir esta cuenta con todos los usuarios de la instancia de 2FAuth, tanto los actuales como los que se creen en el futuro."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Ya has iniciado sesión. Cierra la sesión primero"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"¿Ya te has registrado?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"ya compartida"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Métodos alternativos"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Autenticación manejada por un proxy inverso, debajo los ajustes están deshabilitados."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"La autenticación con el servidor ha fallado."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"El complemento perfecto para tu aplicación web 2FAuth"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser en :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueo de mayúsculas está Activado"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"La cuenta de usuario será eliminada así como todos sus datos de 2FA."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Esto restablecerá 2FAuth. Su cuenta de usuario se eliminará, así como, todos los datos de 2FA. No hay vuelta atrás."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar su cuenta de 2FAuth no tiene impacto en su cuenta SSO externa."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"La eliminación de un grupo no elimina cuentas"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Inicia la detección y selecciona el código; yo me encargaré del resto."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Entrada directa"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Característica desactivada en el modo Demo"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"NO actives la protección mediante contraseña ni el cifrado al exportar datos desde una aplicación 2FA; de lo contrario, 2FAuth no podrá descifrarlos."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"¿Aún no tienes una cuenta?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Comprueba bien tu elección antes de continuar, ya que no podrás deshacer esta acción. Recuerda que el usuario al que transfieras la propiedad tendrá control total sobre esta cuenta de 2FA, por lo que debe ser alguien de tu confianza."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"El correo electrónico se enviará a "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Puede mejorar la seguridad de su cuenta de 2FAuth activando la autenticación de WebAuthn."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Asegúrese de abrir el correo electrónico en un dispositivo que sea de su propiedad."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Se ha producido un error:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Esperado: Una lista de la URI de otpauth, una por línea"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Caduca en "},{t:4,k:"days_to_expiration"},{t:3,v:" día(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Caducó el "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Error al iniciar sesión en "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Fallo"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Obteniendo datos..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Ten en cuenta que compartir una cuenta no permite al destinatario acceder a los datos confidenciales de la cuenta 2FA; únicamente le permite generar códigos OTP."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Tu navegador (Firefox) requiere activar una opción específica para que la extensión se abra automáticamente al capturar un código QR desde una página web."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"¿Olvidó su contraseña?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generado por "},{t:4,k:"requester"},{t:3,v:" el "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Tiene minúsculas"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Tiene número"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Tiene carácter especial"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Tiene mayúsculas"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hola "},{t:4,k:"username"},{t:3,v:", Está todo bien"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:'El botón "Probar suerte" intenta obtener un icono estándar de la colección de iconos seleccionada. Cuanto más simple sea el valor del campo Servicio, más probable es que obtenga el icono esperado: No añada ninguna extensión (como ".com"), utilice el nombre exacto del servicio, evite caracteres especiales.'}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"¿Administrador?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use la función Exportar de estas aplicaciones para obtener un recurso de migración como un código QR o un archivo JSON y luego cárguelo aquí."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth puede importar datos de varias aplicaciones 2FA."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Importado"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- cuenta inválida -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Este token de recuperación no es válido."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- servicio inválido -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"Mínimo 8 caracteres."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"¿Sigue siendo válido su token de acceso personal?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Compartida con todos los usuarios"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Todos los usuarios de esta instancia de 2FAuth, tanto los actuales como los futuros, pueden ver esta cuenta y generar códigos para ella."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Visto por última vez "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos por"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"¿Perdió su dispositivo?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Hecho con"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Asegúrese de copiar su token de acceso personal ahora. ¡No podrá volver a verlo!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Administrar la cuenta a nivel de proxy."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Administrar autenticación a nivel proxy."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Puedes crear grupos para organizar tus cuentas de la manera que quieras. Todas las cuentas permanecen visibles en el pseudo grupo llamado 'Todo', independientemente del grupo al que pertenezcan."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Obligatorio"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Mover selección a"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"¿Necesitas importar a 2FAuth uno de los códigos QR visibles en esta página?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"O"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"O filtrar cuentas por grupo"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"Puedes transferir la propiedad de esta cuenta 2FA a otro usuario. El nuevo propietario tendrá control total sobre ella."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"La transferencia no afectará a la configuración de uso compartido existente de la cuenta."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Si esta cuenta se comparte actualmente con todos los usuarios, podrás seguir generando códigos de un solo uso para ella."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Si esta cuenta se comparte actualmente con usuarios específicos, dejarás de verla a menos que el nuevo propietario la comparta contigo posteriormente."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Establezca al menos un dispositivo para activar las siguientes opciones"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"¡No hay 2FA aquí!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"No hay entrada aún"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"Aún no hay ningún grupo"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ninguna imagen en el portapapeles"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"Sin coincidencias"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no hay proveedor"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Ningún resultado"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- sin servicio -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"¿Falta el proveedor?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"no compartida"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nada"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Aquí están los detalles de este intento de conexión"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Si ha sido usted, puede ignorar esta alerta. Si continúa recibiendo esta notificación, póngase en contacto con el administrador para revisar la configuración de seguridad y tomar medidas contra este ataque."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"Ha habido un intento de inicio de sesión fallido en su cuenta de 2FAuth."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Error al iniciar sesión en 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hola :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hola"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Aquí tienes los detalles de esta conexión"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Si ha sido usted, puede ignorar esta alerta. Si observa alguna actividad sospechosa en su cuenta, por favor cambie su contraseña."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Un nuevo dispositivo acaba de conectarse a tu cuenta de 2FAuth."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Conexión a 2FAuth desde un nuevo dispositivo"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"Esta cuenta 2FA podría haber sido compartida con otros usuarios antes de la transferencia de propiedad. Revisa la configuración de uso compartido para asegurarte de que los permisos siguen siendo los adecuados."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"Queremos informarte de que :actor te ha transferido la propiedad de la cuenta 2FA :twofaccount. Ahora eres el propietario de esta cuenta 2FA y tienes control total sobre ella."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Transferencia de propiedad de una cuenta 2FA"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"Ya no puedes ver esta cuenta 2FA ni utilizarla para generar códigos de un solo uso."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Queremos informarte de que :actor ha revocado el uso compartido de la cuenta 2FA :twofaccount para todos los usuarios."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"Te informamos de que :actor ha revocado tu acceso a la cuenta 2FA :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"Se ha revocado el uso compartido de la cuenta 2FA"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Te informamos de que :actor ha compartido la cuenta 2FA :twofaccount con todos los usuarios."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"Te informamos de que :actor ha compartido contigo la cuenta 2FA :twofaccount."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"Se ha compartido una cuenta 2FA contigo"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"Ahora puedes ver esta cuenta 2FA y utilizarla para generar códigos OTP mientras el uso compartido esté activo."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Saludos"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"Restablecimiento de contraseña de 2FAuth"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"Estás recibiendo este correo porque has solicitado restablecer la contraseña de tu cuenta de 2FAuth."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Este enlace para restablecer la contraseña caducará en :count minutos."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"Si no has solicitado restablecer la contraseña, no es necesario realizar ninguna otra acción."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Estás recibiendo este correo electrónico porque has solicitado un correo de prueba para validar la configuración de tu instancia de 2FAuth."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"Correo de prueba 2FAuth"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Buenas noticias, funciona correctamente :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Muy recomendable"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"También puede continuar con:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI es el formato más común usado para intercambiar datos 2FA por ejemplo en forma de código QR cuando se habilita 2FA en un sitio web. Seleccione esto si desea cambiar de 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exportar datos como una lista de URI de otpauth"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Analizando datos..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña de inicio de sesión y WebAuthn están deshabilitados."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Existe una solicitud de restablecimiento de contraseña para este usuario pero ha caducado, lo que significa que el usuario no ha cambiado su contraseña a tiempo. Esto puede ser una solicitud del propio usuario o de un administrador."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Existe una solicitud de restablecimiento de contraseña para este usuario (solicitud enviada a "},{t:4,k:"datetime"},{t:3,v:"), lo que significa que el usuario aún no ha cambiado su contraseña, pero el enlace que recibió sigue siendo válido. Esto puede ser una solicitud del propio usuario o de un administrador."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Ya existe una cuenta con exactamente los mismos datos"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"Esta extensión web es un complemento a la aplicación web 2FAuth. Le permite acceder a los datos de 2FA de su cuenta de usuario de 2FAuth y generar OTP directamente desde la barra de su navegador."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"Debes tener una cuenta de usuario 2FAuth y vincularla a la extensión para poder usarla. Esto se hace proporcionando la dirección del servidor 2FAuth y un token de acceso personal (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Para recuperar su cuenta, 2FAuth restablece algunos ajustes de WebAuthn, de modo que podrá iniciar sesión utilizando su correo electrónico y contraseña."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth le enviará un enlace de recuperación a esta dirección de correo electrónico. Haga clic en el enlace en el correo electrónico recibido y siga las instrucciones."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registrado "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"El registro de 2FA de la extensión no está soportado todavía. Visita tu aplicación 2FAuth para añadir tu primera 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Utilice 'Reenviar correo electrónico' para enviar un nuevo correo electrónico de restablecimiento de contraseña al usuario para que pueda establecer una nueva contraseña. Esto dejará su contraseña actual como es y cualquier solicitud anterior será revocada."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Utilice esta opción si ha olvidado la contraseña de la extensión."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"La extensión será eliminada de su configuración actual y de los datos 2FAuth. Estará disponible de nuevo para volver a enlazar a una cuenta de usuario 2FAuth."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Utilice 'Restablecer contraseña' para forzar un restablecimiento de contraseña (esto establecerá una contraseña temporal) antes de enviar un correo electrónico de restablecimiento de contraseña al usuario para que pueda establecer una nueva contraseña. Cualquier solicitud anterior será revocada."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth le enviará un enlace para restablecer la contraseña a esta dirección. Haga clic en el enlace en el correo electrónico recibido para establecer una nueva contraseña."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Si siempre ha usado SSO para iniciar sesión, desconecte y use la función de restablecer la contraseña y así obtener una nueva y pueda rellenar este formulario."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Puede intentar actualizar (quizás fue un problema temporal) o puede restablecer la extensión y proporcionar un nuevo token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"El revocado de un dispositivo es permanente"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"El revocado de un token es permanente"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivos de autenticación que puedes usar para iniciar sesión en 2FAuth, como: llaves de seguridad (ej. Yubikey) o smartphones con capacidades biométricas (ej. Apple FaceID/TouchID)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Selecciona «Usuarios específicos» para compartir esta cuenta con los usuarios que elijas."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Algunos ajustes están siendo gestionados por su administrador"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Comparte esta cuenta 2FA con otros usuarios de esta instancia de 2FAuth."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Otros usuarios podrán ver y utilizar las cuentas compartidas para generar códigos OTP, pero solo el propietario podrá editarlas, eliminarlas o acceder a sus secretos."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Compartida por "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Desde "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"compartido con todos"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"compartido con usuarios específicos"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"Puede conectarse usando la dirección de correo electrónico "},{t:4,k:"email"},{t:3,v:" y la contraseña "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Elija un proveedor SSO con el que iniciar sesión:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Iniciar sesión usando"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"¿Faltan algunas traducciones utilizando el idioma preferido por el navegador?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Los usuarios deben iniciar sesión con SSO. Otros métodos son únicamente para administradores."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"La autenticación está restringida solo a SSO, "},{t:4,k:"auth_method"},{t:3,v:" está deshabilitado"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Las cámaras instaladas no son apropiadas"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Por favor usa otro dispositivo/cámara"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS requerido para la transmisión de la cámara"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan no puede comenzar :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"Normalmente se realiza haciendo clic en el icono de la cámara en o al lado de la barra de direcciones del navegador"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth no tiene permiso para acceder a tu cámara"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Necesitas conceder permiso para usar la cámara de tu dispositivo. Si ya lo ha denegado y su navegador no le preguntan de nuevo, por favor refiérase a la documentación del navegador para averiguar cómo conceder permisos."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No se encontraron cámaras en este dispositivo"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Tal vez olvidaste conectar tu cámara web"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fallo al cargar el escáner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"¿La cámara ya está en uso? Asegúrate de que ninguna otra aplicación use tu cámara e inténtalo de nuevo"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Requiere contexto seguro"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS es necesario para escanear en vivo. Si ejecuta 2FAuth desde su computadora, no utilice un host virtual distinto de localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API no está soportado en este navegador"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Deberías usar un navegador moderno"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"Las siguientes cuentas de 2FA fueron encontradas en el recurso de migración. Hasta ahora, ninguna de ellas ha sido añadida a 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Inicio de sesión correcto en "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Cierre de sesión en "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Aceptado: texto plano, JSON, 2FA"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Aceptado: JPG, JPEG, PNG, BMP, GIF, SVG o WebP"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"Esta cuenta está actualmente "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Los datos eliminados no podrán ser recuperados."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Este formulario no modifica los permisos de uso compartido actuales de la cuenta. Para dejar de compartir esta cuenta con un usuario, debes revocar su acceso desde la configuración de uso compartido."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Demasiados intentos de acceso. Por favor intente nuevamente en "},{t:4,k:"seconds"},{t:3,v:" segundos."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Los tokens de acceso personal permiten que cualquier aplicación se autentique en la API de 2FAuth. Debe especificar el token de acceso como un token Bearer en el encabezado de autorización de las solicitudes de las aplicaciones de terceros."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"Esta acción no revoca el token de acceso personal en uso."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"Debería preferir esta opción si necesita crear una copia de seguridad que se pueda restaurar. Este formato se encarga de los iconos."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporte datos utilizando el esquema JSON de 2FAuth"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"Aquí se describe la definición del esquema:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Una extensión del navegador para recuperar códigos de seguridad de 2FA generados a partir de su servidor 2FAuth."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"Iconos UI por"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"La extensión está bloqueada para proteger sus datos. Introduzca la contraseña de la extensión para acceder a sus 2FA."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Utilice los botones disponibles para guardarlos permanentemente en su colección de 2FA o descartarlos."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Prepárese para autenticarse usando (uno) de sus dispositivos de seguridad. Conecte su llave, retirar máscaras o guantes, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Utilizar dirección de correo electrónico "},{t:4,k:"email"},{t:3,v:" y contraseña "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta de usuario disponible por un proxy de autenticación."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" token(s) activos"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" Dispositivo(s) de seguridad (claves)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Visto en "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Ningún paquete de iconos encontrado en el servidor."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Inicio de sesión WebAuthn desactivado"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn le permite usar dispositivos confiables (como Yubikeys o smartphones con capacidades biométricas) para iniciar sesión rápida y con mayor seguridad."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Bienvenido a 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Bienvenido a la demo de 2FAuth."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Bienvenido a la instancia de prueba de 2FAuth"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"Se trata de un cambio de configuración sencillo que puedes realizar en menos de un minuto. Hemos preparado una guía paso a paso para ayudarte a activar esta función."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" Cuentas"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" Está disponible"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" Seleccionados"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Esta instancia está actualizada"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"También puedes pegar desde el portapapeles"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"Puedes cambiar la configuración de uso compartido en cualquier momento"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"Necesitas una cuenta para continuar, por favor regístrate."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta creada correctamente"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta actualizada correctamente"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta(s) eliminada(s) correctamente"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta(s) movida(s) correctamente"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"La autenticación ha fallado"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Se ha activado el bloqueo automático. Se ha cerrado su sesión"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Caché borrado"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiado al portapapeles"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Los datos han sido actualizados para reflejar los cambios en el lado del servidor"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo revocado correctamente"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo registrado correctamente"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Nombre de grupo guardado"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Grupo creado correctamente"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Grupo eliminado correctamente"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"Ningún paquete de iconos disponible"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña cambiada"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"La contraseña se cambió correctamente"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Contraseña cambiada exitosamente"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"PAT del usuario revocado con éxito"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"¡Perfil actualizado con éxito!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivos de seguridad del usuario revocados con éxito"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Ajustes guardados"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Correo de prueba enviado, comprueba tu bandeja de entrada"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token revocado correctamente"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta de usuario eliminada correctamente"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"usuario creado correctamente"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Rol de usuario actualizado"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"Se han encontrado "},{t:4,k:"count"},{t:3,v:" cuentas válidas"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Siguiente »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Anterior"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"La contraseña debe tener al menos ocho caracteres, y coincidir con la confirmación de contraseña."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"¡Su contraseña ha sido restablecida!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"¡Te hemos enviado por correo el enlace para restablecer tu contraseña!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Por favor, espere antes de intentar de nuevo."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"El token de recuperación de contraseña es inválido."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"No podemos encontrar ningún usuario con ese correo electrónico."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Nombre de usuario, email..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Artículo no encontrado"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Acerca de"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Cuentas"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Compartir cuentas"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Configuración de la aplicación"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Autenticación"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Crear usuario"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Registro de accesos"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Administrar usuario"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Administración de usuarios"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueo automático"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Grabar QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Crear cuenta"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Crear grupo"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Editar Cuenta"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Editar grupo"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Desbordar"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Error"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupos"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importar cuentas"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Página de inicio"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Iniciar sesión"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"Registro de generación de códigos OTP"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer contraseña"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nueva contraseña"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer extensión"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Registrar una cuenta nueva"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta de usuario"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Nuevo token personal"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"Tokens de OAuth"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Opciones"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivos WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Editar dispositivo"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Ajustes"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta compartida"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Cuenta como código QR"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Nueva cuenta"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transferir la propiedad"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloquear"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Recuperación cuenta"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Registrar un nuevo dispositivo"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Limpiar búsqueda"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Borrar selección"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Cerrar la página "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Crear nuevo grupo"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copiar la siguiente contraseña al portapapeles"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiar al portapapeles"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar cuenta"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Eliminar cuentas seleccionadas"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detectar los códigos QR en la página web activa"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Descartar esta cuenta"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Editar cuenta"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Editar grupo"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Editar uso compartido"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Exportar cuentas seleccionadas"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generar una contraseña de prueba"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Volver a la página "},{t:4,k:"pagetitle"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Ocultar selector de grupo"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Ocultar contraseña"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Importar esta Cuenta"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Bloquearlo"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Configurar"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Gestiona tus grupos"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Mover seleccionados a un grupo"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exportar datos como una lista de URI de otpauth"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Actualizar lista de paquetes de iconos"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Renombrar"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Reenviar un correo de restablecimiento de contraseña al usuario"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Restablecer la contraseña del usuario"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Revelar contraseña"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revocar todos los dispositivos de seguridad del usuario"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revocar todos los tokens de usuario"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revocar"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Buscar"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Seleccionar todo"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Compartir esta cuenta"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Añadir nuevo usuario compartido"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Compartido con todos"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Ver selector de grupo"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas del último mes"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas del último año"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Muestra el código QR"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas de los últimos 6 meses"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas de los últimos 3 meses"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Iniciar sesión usando un dispositivo de seguridad"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Ordenar de forma ascendente"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar primero los más antiguos"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar primero los más recientes"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Ordenar de forma descendente"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" ha compartido esta cuenta contigo"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Compartes esta cuenta con todos los usuarios"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Compartes esta cuenta con usuarios específicos"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exportar datos usando el esquema JSON 2FAuth"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloquearlo (bajo su propio riesgo)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revocar todos los usos compartidos de las cuentas seleccionadas"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Usa un código QR para rellenar mágicamente el formulario"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visita "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe aceptarse cuando :other sea :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe aceptarse."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener una URL válida."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener una fecha posterior o igual a :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener una fecha posterior a :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute solo puede contener letras, números, guiones y guiones bajos."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute solo puede contener letras y números."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute solo puede contener letras."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una matriz."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute solo debe contener caracteres alfanuméricos y símbolos de un solo byte."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener una fecha anterior o igual a :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener una fecha anterior a :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener entre :min y :max elementos."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener un tamaño de entre :min y :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar entre :min y :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener entre :min y :max caracteres."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener un valor verdadero o falso."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute contiene un valor no autorizado."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"La confirmación del campo :attribute no coincide."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no tiene un valor obligatorio."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"La contraseña es incorrecta."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no debe contener dos puntos."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Esta dirección de correo electrónico no cumple con la política de registro"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ninguna cuenta con este correo electrónico."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Todas las direcciones de correo electrónico deben ser válidas y estar separadas por una barra vertical"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Los formatos soportados son: jpeg, png, bmp, gif, svg o webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"Los IDs deben estar separados por comas, sin comas finales."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"La uri debe tener una etiqueta."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no es compatible."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Los formatos soportados son: jpeg, png, bmp, gif, svg o webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una cadena codificada en Base32."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no debe contener dos puntos."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no es un uri otpauth válido."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una fecha igual a :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no coincide con el formato:format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una fecha válida."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener :decimal cifras decimales."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser rechazado cuando :other sea :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser rechazado."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute y :other deben ser diferentes."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener entre :min y :max dígitos."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener :digits dígitos."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute tiene dimensiones de imagen no válidas."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute contiene un valor duplicado."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no debe finalizar con uno de los siguientes: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no debe comenzar con uno de los siguientes: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una dirección de correo electrónico válida."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe terminar con uno de los siguientes valores: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"El valor seleccionado para :attribute no es válido."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"El valor seleccionado para :attribute no es válido."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener una de las siguientes extensiones: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser un archivo."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener un valor."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener más de :value elementos."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener más de :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser mayor que :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener más de :value caracteres."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener al menos :value elementos."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser mayor o igual que :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser mayor o igual que :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener al menos :value caracteres."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser un color hexadecimal válido."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"No se puede encontrar el paquete de iconos en el servidor."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una imagen."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no existe en :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"El valor seleccionado para :attribute no es válido."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser un número entero."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una dirección IP válida."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una dirección IPv4 válida."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una dirección IPv6 válida."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una expresión regular válida."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una cadena JSON válida."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The campo :attribute debe ser una lista."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar en minúscula."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener menos de :value elementos."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener menos de :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser menor que :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener menos de :value caracteres."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener como máximo :value elementos."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser menor o igual que :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser menor o igual que :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener como máximo :value caracteres."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una dirección MAC válida."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener como máximo :max dígitos."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener como máximo :max elementos."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no debe superar los :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute no debe superar :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener como máximo :max caracteres."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe un archivo de tipo: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe un archivo de tipo: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener al menos :min dígitos."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener al menos :min elementos."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener al menos :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser al menos :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener al menos :min caracteres."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar ausente cuando :other es :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar vacío a menos que :other sea :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar vacío cuando :values estén presentes."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar vacío cuando :values esté presente."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar vacío."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser un múltiplo de :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"El valor seleccionado para :attribute no es válido."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"El formato del campo :attribute no es válido."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"El nuevo propietario no puede ser el propietario actual."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser un número."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"El parámetro uri debe ser proporcionado solo o sólo en combinación con el parámetro 'custom_otp'"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener al menos una letra."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener al menos una letra mayúscula y una letra minúscula."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener al menos un número."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener al menos un símbolo."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute ha aparecido en una fuga de datos. Por favor, elige un nuevo valor."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar presente cuando :other sea :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar presente a menos que :other sea :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar presente cuando :values esté presente."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar presente cuando :values esté presente."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar presente."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute está prohibido cuando :other es :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute está prohibido a menos que :other sea :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute está prohibido."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute prohíbe que :other esté presente."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"El formato del campo :attribute no es válido."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener entradas para::values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio cuando :other se acepta."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio si :other es rechazado."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio cuando :other es :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio a menos que :other esté en :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio cuando :values están presentes."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio cuando :values está presente."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio cuando ninguno de :values está presente."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio cuando :values no está presente."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute es obligatorio."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe coincidir con :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Cuando se usa :attribute, éste debe ser el único parámetro en este cuerpo de la solicitud"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener :size elementos."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener un tamaño de :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe tener :size caracteres."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe comenzar por uno de los siguientes valores: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser una cadena de caracteres."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener una zona horaria válida."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser un ULID válido."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute ya ha sido registrado."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"No se pudo subir :attribute."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe estar en mayúsculas."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe contener una URL válida."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"El campo :attribute debe ser un UUID válido."}}}},{fr:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Icône qui illustre le compte"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Image d'un QR code à scanner"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Continuer ?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Les données seront perdues, êtes-vous sûrs ?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Cela va grandement impacter les permissions de cet utilisateur. Êtes-vous sûr ?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Voulez-vous vraiment supprimer votre compte ?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûr·e de vouloir supprimer ce groupe ?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûrs de vouloir supprimer le compte ?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûr de vouloir supprimer cet utilisateur ? Il est impossible de restaurer un utilisateur supprimé."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Vous ne serez plus administrateur. Vraiment sûr ?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûrs de vouloir retirer tous les comptes ?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûrs de vouloir retirer tous les doublons ?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûrs de vouloir retirer ce compte ?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Il s'agit de votre propre compte. Êtes-vous sûr ?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûrs de vouloir vous déconnecter ?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûr de vouloir supprimer la demande précédente ?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûr de vouloir réinitialiser le mot de passe de cet utilisateur ?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Voulez-vous vraiment supprimer cet appareil ?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûr(e) de vouloir révoquer ce jeton ?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Êtes-vous sûr de vouloir modifier le mode de partage ?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Le partage avec tous les utilisateurs sera revoqué. Êtes-vous sûr ?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"Cela révoquera le partage de ces comptes. Êtes-vous sûr ?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Vous êtes sur le point de perdre la propriété de ce compte. Êtes-vous sûr ?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"Le domaine de l'instance 2FAuth n'est pas un domaine valide"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Abandonné par l'utilisateur"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Compte géré par un fournisseur externe"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth est configuré pour fonctionner derrière un proxy d'authentification, mais votre proxy ne retourne pas l'en-tête attendu. Vérifiez votre configuration et réessayez."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Échec de l'authentification par le proxy"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Identifiants découvrables non supportés par l'authentificateur"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Vérification de l'utilisateur non supportée par l'authentificateur"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Votre appareil ne supporte pas WebAuthn. Réessayez plus tard en utilisant un navigateur plus récent"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de créer un OTP sans un secret"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Le secret ne peut pas être déchiffré. Ceci est généralement causé par une valeur APP_KEY incorrecte définie dans le fichier de configuration .env de 2Fauth ou des données corrompues dans la base de données."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de décoder le QR code détecté, essayez de rogner ou d'améliorer l'image"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de supprimer le seul compte administrateur"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de rétrograder le seul compte administrateur"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de détecter un QR code dans l'image, essayez de recadrer l'image"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Échec de la modification, merci de réessayer"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Échec de la vérification, veuillez réessayer plus tard"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Les données ne peuvent être actualisées depuis le serveur"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Les données de ce code QR ne forment pas une URI OTP Auth valide. Le QR code contient :"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Seuls les paramètres créés par l'utilisateur peuvent être supprimés"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Erreur pendant la récupération du QR code"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"L'envoi de l'e-mail a échoué"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Non lisible, les données semblent chiffrées"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de générer la clé de chiffrement"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Une erreur s'est produite lors de la récupération des données"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Le déchiffrement a échoué, votre base de données est toujours protégée. Ceci est principalement dû à un problème d'intégrité des données chiffrées pour un ou plusieurs comptes."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Le chiffrement a échoué, votre base de données reste non protégée."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"La migration des icônes a échoué. Le paramètre a été restauré à sa précédente valeur."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Échec de l'authentification, contrôlez le PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"Serveur 2FAuth introuvable, contrôlez l'URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de déchiffrer le PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de dériver la clé"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de chiffrer le PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Impossible d'obtenir le mot de passe"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Impossible d'obtenir le jeton"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Impossible d'injecter le script de détection des QR codes"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de charger les réglages depuis le magasin"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de régénérer l'IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de récupérer les paramètres de l'application"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Échec de la récupération des données du magasin de chiffrement"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de définir le délai d'auto-lock"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Impossible d'enregistrer la clé"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de définir les paramètres de chiffrement"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de stocker le PAT chiffré dans le magasin"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"Le champ est obligatoire et doit être une URL valide"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"Le champ est obligatoire"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Échec de téléchargement du fichier"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Contexte HTTPS requis"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indéchiffrable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Données 2FA invalides"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Jeton d'accès invalide ou inconnu"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Données :appname invalides ou illisibles"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"Aucun onglet actif"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Aucun authentificateur ne supporte les algorithmes spécifiés"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Aucune entrée de type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3,v:"Aucun logo disponible pour "},{t:4,k:"service"}]}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Aucun résultat dans le pack d'icônes"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialisation du mot de passe indisponible pour cet utilisateur"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"Aucune donnée d'image QR disponible"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"Aucun code QR valide détecté dans la partie visible de la page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Aucun QR code lisible"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Aucune donnée OTP valide dans ce QR code"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Ce format OTP n'est pas supporté pour le moment"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Opération non autorisée"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Ce QR code est illisible"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"La somme de contrôle du QR code est invalide"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Actualiser"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Nom réservé, veuillez en choisir un autre"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Veuillez n'utiliser que des lettres, chiffres, tirets, tirets bas, espaces ou guillemets simples"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Ressource introuvable"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Périphérique déjà enregistré"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Erreur de sécurité : Vérifiez votre variable d'environnement WEBAUTHN_ID"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Le mode de partage Avec Tous Les Utilisateurs est désactivé"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"La fonction de partage est désactivée"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Il y a un problème avec votre serveur"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Les espaces indésirables seront automatiquement supprimés"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Ce fournisseur SSO n'est pas entièrement configuré dans votre fichier .env"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO est désactivé"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Un compte utilisateur avec la même adresse e-mail existe déjà mais ne correspond pas à votre compte externe. N'utilisez pas SSO si vous êtes déjà inscrit sur 2FAuth avec cette adresse e-mail."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentification via SSO refusée"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Les inscriptions sont désactivées"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Ce compte est déjà partagé avec tous les utilisateurs."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Ce compte n'est pas partagé avec tous les utilisateurs"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"Trop d'IDs ont été inclus dans le paramètre de requête, max. 100 autorisés"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"URI impossible à décoder"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"Vous n'avez pas la permission de voir cette ressource ou d'effectuer cette action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Non autorisé"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Erreur inconnue durant le chiffrement du PAT"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Erreur inconnue"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Les données ne correspondent à aucun format pris en charge"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Type OTP non supporté"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Mode de partage non supporté"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Sans effet avec un proxy d'authentification ou SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Cette méthode d'authentification est réservée aux administrateurs. Les utilisateurs doivent se connecter avec SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"La suppression du compte utilisateur a échoué, aucune donnée n'a été supprimée"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"L'identifiant utilisateur n'est pas compris entre 1 et 64 caractères"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Mauvais mot de passe (actuel)"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Mauvais mot de passe"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Marc Dupont"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Compte"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"L'algorithme utilisé pour sécuriser vos codes de sécurité"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorithme"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Permettre aux utilisateurs de créer et utiliser les jetons d'accès personnels (PAT) pour s'authentifier depuis des applications tierces comme l'extension web 2FAuth"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Autoriser l'usage des PAT"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"Le jeton d'accès personnel (PAT) pour authentifier l'extension auprès du serveur. Vous pouvez en générer un depuis la page Réglages > OAuth de votre application 2FAuth"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"Jeton d'accès à l'API"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Cache automatiquement le code OTP à l'écran après un certain temps. Cela évite les générations inutiles de nouveaux codes si la vue dédiée à leur affichage est restée ouverte."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Fermeture automatique de la vue OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Verrouille automatiquement l'extension pour empêcher tout accès indésirable aux données qu'elle contient"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Verrouillage automatique"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Déconnecte automatiquement l'utilisateur en cas d'inactivité. Est sans effet lorsque l'authentification est gérée par un proxy et qu'aucune URL de déconnexion personnalisée n'est configurée."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Verrouillage automatique"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Les nouveaux comptes sont automatiquement enregistrés après le scan ou le téléchargement d'un code QR, il n'est plus nécessaire de cliquer sur le bouton Enregistrer"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Sauvegarde automatique des comptes"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Parfois le cache doit être effacé, par exemple après une modification de variable d'environnement ou une mise à jour. Vous pouvez le faire ici."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Gestion du cache"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Vérifie automatiquement (une fois par semaine) et avertit quand une nouvelle version de 2FAuth est publiée sur Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Rechercher les mises à jour"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Vide le champ de recherche dès qu'un code a été copié dans le presse-papier"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Effacer la recherche après copie"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Le code OTP qui vient d'être copié ne reste pas visible à l'écran"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Fermer la vue OTP une fois le code copié"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirmez le nouveau mot de passe"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Copie automatiquement dans le presse-papier le code OTP qui vient de s'afficher à l'écran. A cause de restrictions des navigateurs, seul le premier code à s'afficher est copié, pas les codes suivants"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copier le code OTP dès qu'il s'affiche"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Il est risqué de modifier le compteur car vous pouvez désynchroniser le compte avec le serveur de vérification du service. Utilisez l'icône cadenas pour activer la modification, mais seulement si vous savez ce que vous faites"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"La valeur initiale du compteur"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"0 par défaut"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Compteur"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Indiquez votre mot de passe actuel pour confirmer qu'il s'agit bien de vous"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe actuel"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Le groupe auquel sont associés les nouveaux comptes"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Groupe par défaut"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Mode de saisie utilisé par défaut lorsque l'option Saisie directe est activée"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Mode de saisie par défaut"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Le nombre de chiffres des codes de sécurité générés"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Nombre de chiffres"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Tous vos périphériques de sécurité seront révoqués. Utilisez cette option si vous avez perdu un périphérique ou si sa sécurité a été compromise."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Désactiver tous les périphériques de sécurité"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Empêche l'inscription de nouveaux utilisateurs. A moins que ce réglage ne soit surchargé (voir ci-après), cela affecte également l'inscription (c'est-à-dire la première connexion) via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Désactiver les inscriptions"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Change le mode d'affichage des comptes, soit sous forme de liste, soit sous forme de grille"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Mode d'affichage"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Email"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Autoriser les utilisateurs à partager leurs comptes 2FA avec d'autres utilisateurs de cette instance 2FAuth. Lorsqu'ils sont partagés, les comptes 2FA peuvent être consultés et utilisés par les destinataires pour générer des codes OTP. Seul le propriétaire d'un compte peut le modifier, le supprimer ou l'exporter, en plus de voir son secret ou de gérer la configuration de partage du compte."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Activer le partage"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"La mode de partage Avec Tous Les Utilisateurs permet de cibler tous les utilisateurs de l'instance 2FAuth. Lorsqu'un compte est partagé de cette façon, il est automatiquement disponible pour tous les utilisateurs, y compris ceux qui seront créés après l'action de partage."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Désactiver ce paramètre suspendra les partages existants en mode Avec Tous Les Utilisateurs, mais il ne les révoquera pas. Si vous réactivez ce paramètre plus tard, ces partages seront à nouveau actifs, sauf si des partages avec des utilisateurs spécifiques ont été configurés entre-temps."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Activer le mode de partage Avec Tous Les Utilisateurs"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Permet aux visiteurs de s'authentifier avec un compte externe grâce à la méthode Single Sign-On"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Activer SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Le mot de passe actuellement utilisé pour déverrouiller l'extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe actuel"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Le nouveau mot de passe qui sera utilisé pour déverrouiller l'extension et chiffrer les données sensibles"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau mot de passe"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Le mot de passe qui sera utilisé pour déverrouiller cette extension et chiffrer certaines données sensibles"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Recherche partielle supportée sur le nom d'utilisateur, l'e-mail doit correspondre exactement"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Trouver avec qui partager ce compte"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Essaie de) Récupère automatiquement l'icône officielle du service émetteur du compte 2FA lors de son ajout à 2FAuth"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Récupérer les icônes officielles"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"Le groupe auquel assigner le compte"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Groupe"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL que vous pouvez visiter pour vérifier l'état de santé de cette instance 2FAuth. Cette URL peut être utilisée pour configurer une sonde Docker HEALTHCHECK ou une sonde Kubernetes HTTPS Liveness."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"État de santé"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"L'adresse de l'application web 2FAuth ou vous avez un compte. Par exemple : https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"URL du serveur 2FAuth"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"La collection d'icônes à interroger en premier quand une icône officielle est requise."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Collection en ligne préférée"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Définit si les icônes doivent être récupérées depuis une collection de logos en ligne ou depuis un pack d'icône en local. La modification de cette option et des options associées n'actualisera pas les icônes qui ont déjà été récupérées."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Source des icônes"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"Le pack d'icônes à utiliser quand une icône officielle est requise. Les packs d'icônes sont mis à disposition dès lors qu'ils ont été téléchargés sur le serveur 2FAuth. Contactez l'administrateur pour disposer de packs supplémentaires."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Pack d'icônes"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Restreint la récupération à la seule variante choisie. Si la variant est indisponible, 2FAuth ne tentera pas de récupérer automatiquement la variante standard."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Choix de variante strict"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Certaines icônes sont disponibles en plusieurs variantes de couleur pour s'intégrer au mieux avec les thèmes clairs et sombres des interfaces. Choisissez la variante qui devra être récupérée en priorité. Si celle-ci est indisponible, la variante standard sera récupérée automatiquement en remplacement."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Variante des icônes"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icône"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Donne les droits d'administrateur à l'utilisateur. Les administrateurs peuvent gérer l'application, c'est-à-dire modifier ses paramètres et gérer ses utilisateurs. Un administrateur n'a aucun moyen de consulter les données 2FA d'un autre utilisateur ou de lui générer des codes."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Est administrateur"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Permet aux nouveaux utilisateurs de se connecter pour la première fois via SSO alors que les inscriptions sont désactivées"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Garder l'inscription via SSO activée"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Langue utilisée pour traduire l'interface utilisateur de l'extension. Les langues proposées sont complètes, vous pouvez les utiliser pour remplacer la langue de référence de votre navigateur."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Langue"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Nommer ce périphérique"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Nom"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau nom"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"L'utilisateur auquel la propriété de ce compte sera transférée."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau propriétaire"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau mot de passe"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Recevez un e-mail chaque fois qu'une tentative de connexion à votre compte 2FAuth échoue"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"Après une connexion échouée"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Recevez un email quand un nouvel appareil se connecte à votre compte 2FAuth pour la première fois"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"Pour un nouvel appareil"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez laisser les options suivantes non renseignées si vous ne savez pas comment les définir. Les valeurs les plus couramment utilisées seront appliquées."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Définit quand et comment sont affichés les OTPs."}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Affichage des codes OTP"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP ou HMAC-based OTP ou Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choisissez le type de code OTP à créer"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Modifie l'affichage des codes OTP en regroupement les chiffres afin de faciliter la lisibilité et leur mémorisation"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Mise en forme des codes OTP"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"La durée de validité des codes de sécurité générés, en seconde"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"30 secondes par défaut"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Durée de validité"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Enregistre le dernier groupe affiché et le restaure lors de votre prochaine visite"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Mémoriser le filtrage par groupe"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Les adresses email dans cette liste seront autorisées à s'inscrire. Séparez les adresses avec le caractère '|'"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Listes de filtrage"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Restreint la possibilité de s'inscrire à certaines adresses email seulement. Les deux règles peuvent être utilisées simultanément. Cette limitation est sans effet sur les inscriptions via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restreindre les inscriptions"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Les adresses emails validant cette expression régulière seront autorisées à s'inscrire"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Règle de filtrage"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Permet à l'utilisateur de révéler temporairement les code OTP dont les caractères ont été remplacés par des ●●●"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Révéler les codes OTP illisibles"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"La clé utilisée pour générer vos codes de sécurité"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Service"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les icônes des comptes dans la vue principale"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les icônes"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Affiche l'email de l'utilisateur connecté dans le pied de page, en lieu et place des liens de navigation. Les liens sont alors accessibles dans un menu de navigation que l'on affiche en cliquant/tapotant sur l'email."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Afficher l'email dans le pied de page"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Afficher ce groupe dans les boutons de bascule rapide dans la vue principale. Cela n'a aucun effet si 'Boutons de bascule rapide' est désactivé dans les préférences de l'utilisateur."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Afficher dans les boutons de bascule rapide"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Prévisualiser le prochain code OTP, c'est-à-dire le code qui remplacera le code actuel après son expiration. Les préférences définies pour le code OTP actuel s'appliquent également au prochain code (mise en forme, affichage en point)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Afficher le prochain code OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Remplace les caractères des codes OTP générés par des ●●● pour garantir leur confidentialité. N'affecte pas la fonction de copier/coller qui reste utilisable."}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Rendre illisibles les codes générés"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter un menu de navigation sur le côté des pages particulièrement longues pour atteindre les différentes sections rapidement. Cette fonctionnalité n'est visible qu'en résolution Desktop et supérieur. Les menus ne seront pas visibles sur mobile ou sur tablette."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Menus de navigation rapide"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Afficher des boutons pour les groupes virtuels : Groupe 'Comptes sans groupe', groupe 'Partagé avec/Par Moi', etc."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Voir les groupes virtuels"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Force la fonction de tri à tenir compte de la casse des lettres (majuscule/minuscule) pour ordonner les éléments"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Trier en tenant compte de la casse"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Les icônes sont enregistrées dans la base de données en plus de leur stockage dans le système de fichiers. Celui-ci est alors utilisé uniquement comme cache. Cela facilite la création de backup de votre instance 2FAuth car seule sa base de données est à sauvegarder."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Attention toutefois, certains effets négatifs sont possibles : La taille de la base de données va augmenter significativement et rapidement si l'instance héberge beaucoup d'icônes de grandes résolutions. Cela peut également affecter les performances de l'application car le système de fichiers est plus souvent interoggé pour s'assurer que son état reflète bien celui de la base de données."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer les icônes dans la base de données"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Envoyez un email de test pour contrôler la capacité de votre instance à utiliser l'email. Il est important d'avoir une configuration fonctionnelle, sans quoi les utilisateurs ne pourront pas demander de réinitialisation de leur mot de passe par exemple."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Test de la configuration Email"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Forcer un thème spécifique ou appliquer le thème défini dans vos préférences système/navigateur"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Thème"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"Fuseau horaire appliqué à toutes les dates et heures affichées dans l'application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Fuseau horaire"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Si vous rencontrez des problèmes lors de la lecture des QR codes activez cette option pour utiliser un lecteur de QR code moins évolué mais plus largement compatible"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Utiliser le lecteur de QR code basique"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Afficher une liste de boutons au-dessus des comptes 2FA de la vue principale pour permettre une bascule rapide entre les différents groupes. Lorsque cette option est désactivée, le nom du groupe actif est affiché et il doit être cliqué pour appeler le sélecteur de groupe."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Boutons de bascule rapide"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Les données sensibles, les secrets et les e-mails 2FA, sont stockés chiffrés dans la base de données. Assurez-vous de sauvegarder la valeur APP_KEY de votre fichier env (ou tout le fichier) car il sert de clé de chiffrement. Il n'y a aucun moyen de déchiffrer les données chiffrées sans cette clé."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protéger les données sensibles"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Définir SSO comme la seule méthode disponible pour se connecter à 2FAuth. La connexion par mot de passe ou Webauthn est alors désactivée pour les utilisateurs. Les administrateurs ne sont pas impactés par cette restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Utiliser uniquement SSO"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Faire de WebAuthn la seule méthode autorisée pour vous connecter à votre compte 2FAuth. Ceci est la configuration recommandée pour profiter de la sécurité améliorée de WebAuthn."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"En cas de perte de votre périphérique, vous pourrez récupérer votre compte en réinitialisant cette option et en vous connectant à l'aide de votre adresse e-mail et de votre mot de passe."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention ! Le formulaire E-mail + Mot de passe restera disponible même si l'option est activée, mais il retournera systématiquement une réponse 'Échec de l'authentification'."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Utiliser uniquement WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choisissez si vous voulez être invité à choisir un mode de saisie parmi ceux disponibles ou si vous voulez utiliser directement le mode de saisie par défaut"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Saisie directe"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Bascule systématiquement l'affichage sur le groupe par défaut dès qu'un code a été copié dans le presse-papier"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Afficher le groupe par défaut après copie"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"À propos"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Journal des accès"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Accès"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Récupération du compte"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Comptes 2FA"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Partage"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Paramètres de partage"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Authentification"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Restrictions du navigateur"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Changer le mot de passe"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Zone dangereuse"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Saisie des données"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer le compte"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Modifier le compte"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Modifier le groupe"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Environnement"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Général"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groupes"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icônes"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Derniers accès"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Connexion"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau compte"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau groupe"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau mot de passe"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau partage"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau jeton"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Nouvel utilisateur"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"Mots de passe à usage unique"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"Journal des générations OTP"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Jetons d'accès personnel"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Préférences"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profil"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Objectif"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Inscription"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Inscriptions"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Renommer le périphérique"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser l'extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe oublié"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Ressources"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Périphériques de sécurité"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Sécurité"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Paramètres du serveur"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Configuration"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"Connexion SSO"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Stockage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Formats de migration supportés"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"Utilisateur"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfert de propriété"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Non autorisé"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Mis à jour du profil"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Gestion de l'utilisateur"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Utilisateurs"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"Connexion WebAuthn"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Après 1 journée"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Après 1 heure"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 1 minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 10 minutes"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 15 minutes"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 30 minutes"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 5 minutes"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"À propos"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Compte"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Comptes partagés avec moi"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Comptes que je partage"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Groupe actif"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter à 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrateur"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Formulaire avancé"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Après un clic/tap"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Montrer tous les codes OTP sur l'écran d'accueil sans aucune action de l'utilisateur"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Tous, sur l'écran d'accueil"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Tous"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Tous les comptes"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Sans groupe"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Comptes sans groupe"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Cliquer sur un compte pour obtenir un code OTP dans un écran dédié"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Seul, dans un écran dédié"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Configuration"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Appliquer"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentification"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Retour"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Préférence du navigateur"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Navigateur"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Annuler"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Modifier le mot de passe"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Tous"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Vérifier maintenant"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Télécharger"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Effacer"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Fermer"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"En permanence"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continuer"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copier"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copier"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Compteur"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Créer"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Crédits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Sombre"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Défaut"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer l'utilisateur"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer votre compte"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Démo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Détecter les QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Appareil"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Tout retirer"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Retirer les doublons"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Terminé"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Modifier"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Exporter"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 15 minutes"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 5 minutes"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Générer"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Grille"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Sépare les chiffres en deux groupes égaux"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"par Moitié"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"J'ai de la chance"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Pack téléchargé"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Tout importer"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Importer"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"Adresse IP"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Émetteur"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Clair"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Liste"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"Scanner avec la caméra"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gérer"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Pas maintenant"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Déplacer"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Mon périphérique"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Jamais"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Aucun groupe"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- Aucun pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Non partagé"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Retirer du groupe actuel"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"Après copie d'un code OTP"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Après 1 journée"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Après 1 heure"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 1 minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mo."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 an"}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Collection en ligne"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Ouvrir dans votre navigateur"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"Sys."}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"URIs otpauth"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Groupe les chiffres deux par deux"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"par Paire"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Texte brut"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Préremplir à l'aide d'un QR Code"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"Téléchargement de QR code"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Actualiser"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter un périphérique"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Créer le compte"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Standard"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer l'icône"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Renvoyer l'email"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser l'extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser le mdp"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Révoquer"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scanner un QR code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Recherche"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Sélectionnez les comptes à afficher"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Envoyer"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Envoyer le lien de récupération"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Envoyer"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Partager"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Partagé"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Partagés par moi"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Partagés avec moi"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Tous les utilisateurs"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Utilisateurs choisis"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Montrez-moi"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Se connecter"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Déconnexion"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Envoyer"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 10 minutes"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Tester"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Fichier texte"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 30 minutes"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Heure"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Importer"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transférer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transférer la propriété"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Groupe les chiffres trois par trois"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"par Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Après 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"Format 2FAuth"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Déverrouiller"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Ne plus partager"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Uploader un QR code"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Utilisateurs"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Extension Web"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mo."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgare)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danois)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Allemand)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Anglais)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Espagnol)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Français)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italien)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japonais)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Coréen)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Néerlandais)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portugais, Brésilien)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (russe)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turc)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinois simplifié)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"À propos"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter un partage"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter des utilisateurs"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Administration"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Retour à l'accueil"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configurer"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continuer"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Créer un nouveau groupe"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Créer un utilisateur"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Créez votre premier groupe"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"Comment créer un PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Modifier"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Générer un nouveau jeton"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Visiter 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Aidez à traduire 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Documentation sur les icônes"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"login & mot de passe"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Gérer les groupes"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Gérer le partage"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gérer"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Peut-être plus tard"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Ouvrir 2FAuth pour créer un groupe"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"Journal des générations OTP"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Récupérer votre compte"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter un nouveau périphérique"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Créer un compte"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialisez-le"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser l'extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser votre mot de passe"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"un périphérique de sécurité"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Voir le log complet"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Voir comment activer un fournisseur"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Réglages"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Documentation sur le partage"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Connectez-vous sans SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Se connecter"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transférer la propriété"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"Schéma d'export 2FAuth"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Utiliser le formulaire avancé"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Voir sous forme de QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Voir sur GitHub"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Pourquoi cette étape ?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Une web app pour gérer vos comptes avec double authentification (2FA) et générer leurs codes de sécurité"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Une web app pour gérer vos comptes avec double authentification (2FA) et générer leurs codes de sécurité"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"Le journal contient plus d'entrées."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Journal des accès de l'utilisateur "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Ce compte est lié à un compte "},{t:4,k:"provider"},{t:3,v:" via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"Vous vous êtes connecté via SSO avec votre compte "},{t:4,k:"provider"},{t:3,v:". Vos informations ne peuvent être modifiées ici mais sur "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"E-mail de récupération du compte envoyé !"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Choisissez une méthode et ajoutez votre premier compte"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter un premier utilisateur avec qui partager ce compte"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Gérer les utilisateurs de votre instance ou créer de nouveaux utilisateurs."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Définir à 'Tous les utilisateurs' pour partager ce compte avec tous les autres utilisateurs de l'instance 2FAuth. Cela inclut les utilisateurs existants et futurs."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Déjà authentifié"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Déjà enregistré ?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"déjà partagé"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Méthodes alternatives"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentification gérée par un proxy inverse, les paramètres ci-dessous sont désactivés."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Échec de l'authentification auprès du serveur."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"Le compagnon idéal de votre application 2FAuth"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser sur :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Verr Maj est activé"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"Le compte utilisateur sera supprimé ainsi que toutes ses données 2FA."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Cela réinitialisera 2FAuth. Votre compte utilisateur sera supprimé ainsi que toutes les données 2FA. Il est impossible de restaurer des données réinitialisées."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"La suppression de votre compte 2FAuth n'a aucun impact sur votre compte externe."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"La suppression d'un groupe ne supprime pas les comptes"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Lancez la détection et choisissez le code, je m'occupe du reste."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Saisie directe"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Fonctionnalité désactivée en mode Démo"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"N'activez PAS la protection par mot de passe ou le chiffrement lorsque vous exportez des données (depuis une application 2FA) que vous comptez importer dans 2FAuth."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Pas encore de compte ?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Contrôlez votre choix avant de continuer car cette action ne pourra pas être annulée (par vous). De plus, assurez-vous que vous transférez la propriété à un utilisateur de confiance, car celui-ci aura un contrôle total sur ce compte 2FA."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"L'email sera envoyé à "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez améliorer la sécurité de votre compte 2FAuth en activant l'authentification WebAuthn."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Assurez-vous d'ouvrir l'e-mail depuis un appareil qui vous appartient ou que vous considérez de confiance."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Une erreur est survenue :"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Attendu : Une liste d'URI au format otpauth, une par ligne"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expire dans "},{t:4,k:"days_to_expiration"},{t:3,v:" jour(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expiré depuis le "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Connexion refusée le "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Échec"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Récupération des données..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Gardez à l'esprit que le partage d'un compte ne donne pas la permission au destinataire d'accéder aux données sensibles du compte 2FA mais seulement à la possibilité de générer des codes OTP."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Votre navigateur (Firefox) nécessite un réglage particulier pour que la fenêtre de l’extension puisse s’ouvrir automatiquement après la capture d'un QR depuis une page Web."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe oublié ?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" généré par "},{t:4,k:"requester"},{t:3,v:" le "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Contient une minuscule"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Contient un chiffre"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Contient un caractère spécial"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Contient une majuscule"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Aide : "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Bonjour "},{t:4,k:"username"},{t:3,v:", c'est tout bon"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"Le bouton 'J'ai de la chance' essaie d'obtenir l'icône officielle du service renseigné. Entrez le nom exact du service, sans l'extension '.xyz' et avec la bonne orthographe. (fonctionnalité bêta)"}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrateur ?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Utilisez la fonction d'exportation de ces applications pour obtenir une ressource de migration, comme un code QR ou un fichier JSON, puis chargez-la ici."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth peut importer les données de diverses applications 2FA."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Importé"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- compte non valide -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Ce jeton de réinitialisation n'est pas valide."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- service non valide -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"Au moins 8 caractères"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Votre jeton d'accès personnel est-il toujours valide ?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Partagé avec tous les utilisateurs"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Chaque utilisateur de cette instance 2FAuth, actuel et futur, peut voir ce compte et générer des codes OTP."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Dernière connexion "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos par"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Vous avez perdu votre appareil ?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Fabriqué avec"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Copier votre jeton d'accès personnel dès maintenant. Vous ne pourrez pas l'afficher à nouveau !"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Gérer le compte au niveau du proxy."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Gérer l'authentification au niveau du proxy."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez créer des groupes pour organiser vos comptes comme bon vous semble. Tous les comptes restent visibles dans le pseudo groupe nommé 'Tous', quel que soit le groupe auquel ils appartiennent."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Obligatoire"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Déplacer la sélection vers"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Besoin d'importer dans 2FAuth un QR code visible sur cette page web ?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Ou bien"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Ou filtrer les comptes par groupe"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez transférer la propriété de ce compte 2FA à un autre utilisateur. Le nouveau propriétaire en aura alors un contrôle total."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Les paramètres de partage du compte ne seront pas affectés par le transfert."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Si ce compte est actuellement partagé avec tous les utilisateurs, vous pourrez continuer à générer des codes OTP."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Si ce compte est actuellement partagé avec des utilisateurs spécifiques, vous ne le verrez plus, à moins que le nouveau propriétaire ne le partage avec vous par la suite."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Définissez au moins un périphérique pour activer ces options"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Aucun compte 2FA !"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Aucune entrée pour l'instant"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"Aucun groupe pour l'instant"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Aucune image trouvée dans le presse-papier"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"Aucun résultat"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"aucun fournisseur"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Aucun résultat"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- aucun service -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Fournisseur manquant ?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"non partagé"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"rien"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Voici les détails de cette tentative de connexion"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"S'il s'agit de vous, vous pouvez ignorer cette alerte. Si d'autres tentatives infructueuses se produisent, vous devriez contacter l'administrateur de 2FAuth pour examiner les paramètres de sécurité et prendre des mesures contre cet attaquant."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"Une tentative de connexion à votre compte 2FAuth a eu lieu mais a été rejetée."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Échec de connexion à 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Bonjour :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Bonjour"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Voici les détails de cette connexion"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"S'il s'agit de vous, vous pouvez ignorer cette alerte. Dans le cas contraire, et si vous soupçonnez une activité suspecte sur votre compte, changez votre mot de passe sans attendre."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Un nouvel appareil vient de se connecter à votre compte 2FAuth."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connexion à 2FAuth depuis un nouvel appareil"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"Ce compte 2FA peut avoir été partagé avec d'autres utilisateurs avant que vous en récupériez la propriété, vous devriez consulter les paramètres de partage du compte pour vous assurer qu'ils sont toujours appropriés."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"Nous voulions vous informer que :actor vous a transféré la propriété du compte 2FA :twofaccount. Vous en êtes maintenant le propriétaire et avez un contrôle total sur celui-ci."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Transfert de propriété sur un compte 2FA"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"Vous ne pouvez plus voir ce compte 2FA ou l'utiliser pour générer des codes OTP."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Nous voulions vous informer que :actor a révoqué le partage du compte 2FA :twofaccount pour tous les utilisateurs."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"Nous voulions vous informer que :actor ne partage plus le compte 2FA :twofaccount avec vous."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"Partage du compte 2FA révoqué"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Nous voulions vous informer que :actor a partagé le compte 2FA :twofaccount avec tous les utilisateurs."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"Nous voulions vous informer que :actor a partagé le compte 2FA :twofaccount avec vous."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"Un compte 2FA a été partagé avec vous"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez maintenant voir ce compte 2FA et l'utiliser pour générer des codes OTP tant que le partage est actif."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Cordialement"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialisation de mot de passe 2FAuth"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"Vous recevez cet e-mail parce que vous avez demandé une réinitialisation du mot de passe de votre compte 2FAuth."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Ce lien de réinitialisation du mot de passe expirera dans :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"Si vous n'avez pas demandé de réinitialisation de mot de passe, vous pouvez ignorer ce message."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Vous recevez cet email car vous avez demandé à vérifier le bon fonctionnement de l'envoi des emails sur votre instance 2FAuth."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"Email de test 2FAuth"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Bonne nouvelle, ça fonctionne :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommandé (fortement)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez aussi continuer avec :"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"L'URI otpauth est le format le plus couramment utilisé pour échanger des données 2FA, par exemple sous la forme d'un code QR lorsque vous activez l'authentification 2FA sur un site Web. Préférez ce format si vous souhaitez quitter 2FAuth pour une solution alternative."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporter les données sous forme de liste d'URIs otpauth"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Analyse des données..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"La connexion par mot de passe ou WebAuthn est désactivée."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Une demande de réinitialisation de mot de passe existe pour cet utilisateur mais a expiré. Cela signifie que l'utilisateur n'a pas changé son mot de passe à temps. Cette demande peut venir de l'utilisateur lui-même ou d'un administrateur."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Une demande de réinitialisation de mot de passe existe pour cet utilisateur (demande envoyée le "},{t:4,k:"datetime"},{t:3,v:"). Cela signifie que l'utilisateur n'a pas encore changé son mot de passe, mais que le lien qu'il a reçu est toujours valide. Cette demande peut venir de l'utilisateur lui-même ou d'un administrateur."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Un compte avec les mêmes informations existe déjà"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"Cette extension est un complément à l'application web 2FAuth. Elle permet de générer des mots de passe 2FA directement depuis la barre d'outils du navigateur."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"Vous devez posséder un compte utilisateur 2FAuth et le connecter à l'extension pour la rendre opérationnelle. Cela se fait en fournissant l'adresse du serveur 2FAuth et un jeton d'accès personnel (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Pour récupérer votre compte, 2FAuth réinitialise certains paramètres Webauthn afin que vous puissiez vous connecter en utilisant votre adresse e-mail et votre mot de passe."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth vous enverra un lien de récupération à cette adresse e-mail. Cliquez sur le lien et suivez les instructions pour restaurer l'accès à votre compte."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Inscription "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"L'enregistrement de compte 2FA depuis l'extension n'est pas supportée pour l'instant. Utilisez votre application web 2FAuth pour ajouter votre premier compte."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Utilisez 'Renvoyer l'email' pour renvoyer un nouvel email de réinitialisation de mot de passe à l'utilisateur afin qu'il puisse choisir un nouveau mot de passe. Renvoyer un nouvel email ne change pas le mot de passe actuel de l'utilisateur, toutes les demandes précédemment envoyées seront révoquées."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Utiliser cette option si vous avez oublié votre mot de passe d'extension."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"Toutes les données de configuration et de double authentification seront supprimées. L'extension pourra être reconnectée à un compte utilisateur 2FAuth."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Utilisez 'Réinitialiser le mdp' pour forcer la réinitialisation du mot de passe immédiatement (cela va définir un mot de passe temporaire) avant d'envoyer un e-mail de réinitialisation de mot de passe à l'utilisateur. L'utilisateur pourra alors choisir un nouveau mot de passe personnalisé. Les demandes précédemment envoyées seront révoquées."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth vous enverra un lien de réinitialisation de mot de passe à cette adresse. Cliquez sur le lien dans l'e-mail reçu pour définir un nouveau mot de passe."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Si vous avez toujours utilisé SSO pour vous connecter, déconnectez-vous, puis utilisez la fonction de réinitialisation du mot de passe pour obtenir un mot de passe afin de remplir ce formulaire."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Essayez d'actualiser (ce n'était peut-être qu'un problème temporaire) ou alors réinitialisez l'extension et fournissez un nouveau jeton d'accès."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"La révocation d'un périphérique est définitive"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Révoquer un jeton est définitif"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Périphériques d'authentification que vous pouvez utiliser pour vous connecter à 2FAuth, comme des clés de sécurité (ex : YubiKey) ou des smartphones dotés de capacités biométriques (ex : Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Définir à 'Utilisateurs choisis' pour partager ce compte avec les utilisateurs de votre choix."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Certains réglages sont gérés par votre administrateur"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Partagez ce compte 2FA avec d'autres utilisateurs de cette instance 2FAuth."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Les comptes partagés peuvent être vus et utilisés par d'autres utilisateurs pour générer des codes OTP, mais seul le propriétaire peut les modifier ou les supprimer, ou voir leur secret."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Partagé par "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Depuis "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"partagé avec tous les utilisateurs"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"partagé avec des utilisateurs spécifiques"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"Vous pouvez vous connecter en utilisant l'adresse email "},{t:4,k:"email"},{t:3,v:" et le mot de passe "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Choisissez un fournisseur SSO pour vous connecter :"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Se connecter en utilisant"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Certaines traductions sont manquantes en utilisant la langue préférée du navigateur ?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Les utilisateurs doivent se connecter avec SSO. Les autres méthodes sont réservées aux administrateurs."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"L'authentification n'est possible qu'avec SSO, "},{t:4,k:"auth_method"},{t:3,v:" est désactivé"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Votre équipement ne dispose pas d'une caméra adaptée"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Veuillez utiliser un autre appareil"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS requis pour utiliser la caméra"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Le scanner ne peut pas démarrer :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"Cela se fait généralement en cliquant sur une icône représentant une caméra barrée, dans ou à côté de la barre d'adresse du navigateur"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth n'a pas la permission d'accéder à votre caméra"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Vous devez autoriser l'utilisation de l'appareil photo de votre appareil. Si vous avez déjà refusé et que votre navigateur ne vous le demande plus, veuillez vous référer à la documentation du navigateur pour savoir comment accorder l'autorisation."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"Votre équipement ne dispose pas de caméra"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Peut-être avez-vous oublié de brancher votre webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Impossible de charger le scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"La caméra est-elle déjà en cours d'utilisation ? Assurez-vous qu'aucune autre application n'utilise votre appareil photo et réessayez"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Contexte sécurisé requis"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"Une connexion sécurisée HTTPS est requise pour utiliser le scanner. Si vous exécutez 2FAuth depuis votre ordinateur, n'utilisez pas d'hôte virtuel autre que localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"L'API Stream n'est pas prise en charge dans ce navigateur"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Vous devriez utiliser un navigateur moderne"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"Les comptes 2FA suivants ont été trouvés dans la ressource de migration. Pour l'instant aucun d'entre eux n'a été ajouté à 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Connexion réussie le "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Déconnexion réussie le "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepté : Texte brut, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepté : jpg, jpeg, png, bmp, gif, svg, ou webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"Ce compte est actuellement "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Il ne s'agit pas d'une désactivation, le compte ne sera pas récupérable."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Ce formulaire n'affecte pas les partages existants de ce compte. Pour arrêter de partager ce compte avec un utilisateur, vous devez révoquer le partage depuis les paramètres de partage."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Tentatives de connexion trop nombreuses. Veuillez essayer de nouveau dans "},{t:4,k:"seconds"},{t:3,v:" secondes."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Les jetons d'accès personnels permettent à n'importe quelle application de s'authentifier à l'API 2Fauth. Vous devez fournir le jeton d'accès en tant que Bearer dans l'en-tête d'autorisation des requêtes de ces applications."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"Cette action ne révoque pas le jeton d'accès actuellement utilisé."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"Utilisez cette option si vous avez besoin de créer une sauvegarde qui peut être restaurée. Ce format prend en charge les icônes."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporter les comptes en utilisant le format json de 2FAuth"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"Le schéma de données est décrit ici :"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Une extension de navigateur pour obtenir des codes de sécurité 2FA générés par votre serveur 2FAuth."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"Icônes par"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"L'extension est verrouillée afin de protéger ses données. Saisissez le mot de passe de l'extension pour la déverrouiller."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Utilisez les boutons disponibles pour les enregistrer de façon permanente dans votre collection 2FA ou les retirer."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Préparez-vous à vous authentifier en utilisant un de vos dispositifs de sécurité. Branchez votre clé, retirez votre masque ou vos gants, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Utilisez l'adresse e-mail "},{t:4,k:"email"},{t:3,v:" et le mot de passe "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Compte utilisateur mis à disposition par un proxy d'authentification."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" jeton(s) actif(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" périphérique(s) de sécurité"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Vu le "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Aucun pack d'icônes trouvé sur le serveur."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Connexion Webauthn désactivée"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn vous permet d'utiliser des appareils de confiance (comme des Yubikeys ou des smartphones dotés de capacités biométriques) pour vous connecter rapidement et de manière plus sécurisée."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Bienvenue sur 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Bienvenue sur la démo de 2FAuth."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3,v:"Utilisez l'adresse e-mail "},{t:4,k:"email"},{t:3,v:" et mot de passe "},{t:4,k:"password"}]}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"Il s'agit d'une simple modification de sa configuration qui prend moins d'une minute. Nous avons préparé un guide étape par étape pour vous aider à activer cette fonctionnalité."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" comptes"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" est disponible"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" sélectionné(s)"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Cette instance est à jour"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez aussi Coller (ctrl+V)"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"Vous pouvez changer le mode de partage à tout moment"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"Vous avez besoin d'un compte pour aller plus loin, veuillez vous enregistrer."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Compte créé avec succès"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Compte mis à jour avec succès"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Compte·s supprimé·s avec succès"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Compte·s déplacé·s avec succès"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Échec de l'authentification"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"L'événement surveillé par la fonction de verrouillage automatique s'est déclenché. Vous avez été automatiquement déconnecté."}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache vidé"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copié dans le presse-papier"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Les données ont été actualisées pour refléter les changements côté serveur"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Périphérique révoqué avec succès"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Périphérique enregistré avec succès"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Nom du groupe enregistré"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Groupe créé avec succès"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Groupe supprimé avec succès"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"Aucun pack d'icônes disponible"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe modifié"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe modifié avec succès"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe réinitialisé avec succès"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Jetons de l'utilisateur révoqués avec succès"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profil mis à jour avec succès !"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Périphériques de sécurité de l'utilisateur révoqués avec succès"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Réglages sauvegardés"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"E-mail de test envoyé, vérifiez votre boîte de réception"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Jeton révoqué avec succès"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Compte supprimé avec succès"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"Utilisateur créé avec succès"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Rôle utilisateur mis à jour"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" comptes valides trouvés"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Suivant »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Précédent"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Les mots de passe doivent contenir au moins huit caractères et être identiques."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Votre mot de passe a été réinitialisé !"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Nous vous avons envoyé par email le lien de réinitialisation du mot de passe !"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Veuillez patienter avant de réessayer."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Ce jeton de réinitialisation du mot de passe n'est pas valide."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Aucun utilisateur n'a été trouvé avec cette adresse email."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Nom d'utilisateur, email ..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Élément non trouvé"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"À propos"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Comptes"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Partage de compte"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Configuration de l'application"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentification"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Créer un utilisateur"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Journal des accès"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Gestion de l'utilisateur"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Gestion des utilisateurs"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Verrouillage automatique"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash un QR code"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Créer un compte"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Créer un groupe"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Édition du compte"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Édition du groupe"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Trop de tentatives"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Erreur"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groupes"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importer des comptes"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Accueil"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Connexion"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"Journal des générations OTP"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialisation du mot de passe"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau mot de passe"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser l'extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Inscription"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Compte utilisateur"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau jeton d'accès personnel"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"Jetons OAuth"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Périphériques WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Édition du périphérique"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Réglages"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Partager le compte"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"QR code du compte"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Nouveau compte"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transférer la propriété"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Déverrouiller"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Récupération du compte"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Ajouter un nouveau périphérique"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Effacer la recherche"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Effacer la sélection"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Fermer la page "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Créer un nouveau groupe"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copier le prochain code OTP dans le presse-papiers"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copier"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer le compte"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Supprimer les comptes sélectionnés"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Détecter les QR codes dans la page Web active"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Retirer ce compte"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Modifier le compte"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Modifier le groupe"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Modifier le partage"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Exporter les comptes sélectionnés"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Générer un code OTP de test"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Retourner à la page "},{t:4,k:"pagetitle"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Masquer le sélecteur de groupe"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Masquer le mot de passe"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Importer ce compte"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Verrouiller le champ"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gérer"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Gérer vos groupes"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Déplacer la sélection dans un groupe"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporter les données sous forme de liste d'URIs otpauth"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Actualiser la liste des packs d'icônes"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Renommer"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Renvoyer un email de réinitialisation du mot de passe à l'utilisateur"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Réinitialiser le mot de passe de l'utilisateur"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Afficher le mot de passe"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Révoquer tous les périphériques de sécurité de l'utilisateur"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Révoquer tous les jetons de l'utilisateur"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Révoquer"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Recherche"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Tout sélectionner"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Partager ce compte"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Partager avec de nouveaux utilisateurs"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Partagé avec tous les utilisateurs"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Afficher le sélecteur de groupe"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les entrées sur un mois"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les entrées sur un an"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Afficher le QR code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les entrées sur 6 mois"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les entrées sur 3 mois"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Se connecter en utilisant un périphérique de sécurité"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Trier par ordre croissant"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les plus anciens en premier"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Afficher les plus récents en premier"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Trier par ordre décroissant"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" partage ce compte avec vous"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Vous partagez ce compte avec tous les utilisateurs"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Vous partagez ce compte avec des utilisateurs spécifiques"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporter les comptes en utilisant le format json de 2FAuth"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Déverrouiller le champ (à vos risques et périls)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Révoquer tous les partages sur les comptes sélectionnés"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Utiliser un QR code pour renseigner le formulaire d'un seul coup d'un seul"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visiter "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être accepté quand :other vaut :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être accepté."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une URL valide."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une date postérieure ou égale à :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une date postérieure à :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir uniquement des lettres, des chiffres et des tirets (hauts ou bas)."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir uniquement des chiffres et des lettres."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir uniquement des lettres."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un tableau."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit contenir que des caractères alphanumériques et des symboles d'un seul octet."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une date antérieure ou égale à :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une date antérieure à :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute doit contenir entre :min et :max éléments."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"La taille du fichier de :attribute doit être comprise entre :min et :max kilo-octets."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être compris entre :min et :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir entre :min et :max caractères."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être vrai ou faux."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute contient une valeur interdite."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"La confirmation du champ :attribute ne correspond pas."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être renseigné."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Le mot de passe est incorrect."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit pas contenir le symbole deux-points."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Cette adresse e-mail n'est pas conforme à la politique d'inscription"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Aucun compte utilisateur n'utilise cet email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Tous les emails doivent être valides et séparés par le caractère '"},{t:2,i:[{t:3}],s:"' (pipe)"}]}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Les formats acceptés sont jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"Les IDs doivent être séparés par des virgules, sans virgule en fin de chaîne."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"L'URI doit avoir un label."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute n'est pas supporté."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Les formats acceptés sont jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une chaîne encodée en base32."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit pas contenir le symbole deux-points."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute n'est pas une URI otpauth valide."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une date égale à :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit correspondre au format :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une date valide."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit avoir :decimal chiffres après la virgule."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être décliné quand :other vaut :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être décliné."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"Les champs :attribute et :other doivent être différents."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir entre :min et :max chiffres."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir :digits chiffres."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"Les dimensions de l'image du champ :attribute ne sont pas conformes."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute a une valeur en double."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit pas se terminer par l'une de ces valeurs : :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit pas commencer par l'une de ces valeurs : :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une adresse email valide."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit se terminer par une de ces valeurs : :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute sélectionné n'est pas valide."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute sélectionné est invalide."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit avoir une des extensions suivantes : :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un fichier."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit avoir une valeur."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute doit contenir plus de :value éléments."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"La taille du fichier du champ :attribute doit être supérieure à :value kilo-octets."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être supérieur à :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir plus de :value caractères."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute doit contenir au moins :value éléments."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"Le fichier du champ :attribute doit peser au moins :value kilo-octets."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être supérieur ou égal à :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au moins :value caractères."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un code couleur hexadécimal valide."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"Le pack d'icônes est introuvable sur le serveur."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une image."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"La valeur du champ :attribute doit exister dans :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est invalide."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un entier."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une adresse IP valide."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une adresse IPv4 valide."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une adresse IPv6 valide."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une expression régulière valide."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une chaîne JSON valide."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une liste."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être en minuscule."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute doit contenir moins de :value éléments."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"Le fichier du champ :attribute doit peser moins de :value kilo-octets."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être inférieur à :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir moins de :value caractères."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute ne doit pas contenir plus de :value éléments."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"Le fichier du champ :attribute ne doit pas peser plus de :value kilo-octets."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être inférieur ou égal à :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au plus :value caractères."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une adresse MAC valide."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit pas contenir plus de :max chiffres."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute ne doit pas contenir plus de :max éléments."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"Le fichier du champ :attribute ne doit pas peser plus de :max kilo-octets."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit pas être supérieur à :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute ne doit pas contenir plus de :max caractères."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un fichier de type : :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un fichier de type : :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au moins :min chiffres."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute doit contenir au moins :min éléments."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"Le fichier du champ :attribute doit peser au moins :min kilo-octets."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être supérieur ou égal à :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au moins :min caractères."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être manquant quand :other vaut :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être manquant sauf si :other vaut :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être manquant quand les valeurs :values sont présentes."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être manquant quand :values est présent."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être manquant."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un multiple de :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute sélectionné n'est pas valide."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"Le format du champ :attribute n'est pas valide."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"Le nouveau propriétaire ne peut pas être le propriétaire actuel."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un nombre."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"Le paramètre uri doit être fourni seul ou seulement avec le paramètre 'custom_otp'"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au moins une lettre."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au moins une lettre majuscule et une lettre minuscule."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au moins un chiffre."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir au moins un symbole."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est apparu dans une fuite de données, merci d'en choisir un différent."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être présent quand :other vaut :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être présent sauf si :other vaut :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être présent quand les valeurs :values sont présentes."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être présent quand :values est présent."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être présent."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est interdit quand :other a la valeur :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est interdit à moins que :other est l'une des valeurs :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est interdit."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute interdit :other d'être présent."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"Le format du champ :attribute n'est pas valide."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir des entrées pour : :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est requis lorsque :other est accepté."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est requis lorsque :other est décliné."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est obligatoire quand la valeur de :other est :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est obligatoire sauf si :other est :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est obligatoire quand :values sont présents."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est obligatoire quand :values est présent."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est requis quand aucun de :values n'est présent."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est obligatoire quand :values n'est pas présent."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute est obligatoire."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"Les champs :attribute et :other doivent correspondre."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Lors de l'utilisation de :attribut, il doit être le seul paramètre dans le corps de la requête"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"Le tableau :attribute doit contenir :size éléments."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"Le fichier du champ :attribute doit peser :size kilo-octets."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"La valeur du champ :attribute doit être de :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit contenir :size caractères."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit commencer avec une de ces valeurs : :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une chaîne de caractères."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un fuseau horaire valide."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un ULID valide."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"La valeur du champ :attribute est déjà utilisée."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"Le fichier du champ :attribute n'a pu être téléversé."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être en majuscule."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être une URL valide."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"Le champ :attribute doit être un UUID valide."}}}},{hi:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"वह आइकान जो खाते को दर्शाता है"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"स्कैन करने के लिए QR कोड की छवि"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"परिवर्तन खो जायेंगे। क्या आपको यकीन है?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"इससे इस उपयोगकर्ता की अनुमतियों पर गंभीर प्रभाव पड़ेगा। क्या आप आश्वस्त हैं?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में अपना अकाउंट डिलीट करना चाहते हैं?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में इस ग्रुप को मिटाना चाहते हैं?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में यह अकाउंट डिलीट करना चाहते हैं?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में इस उपयोगकर्ता को डिलीट करना चाहते हैं? फिर वापस नहीं जा पाएंगे।"}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"आप अब ऐडमिनिस्ट्रेटर नहीं रहेंगे। वास्तव में आश्वस्त हैं?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में सभी अकाउंट को हटाना चाहते हैं?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में सभी डूप्लिकेट को हटाना चाहते हैं?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में इस अकाउंट को हटाना चाहते हैं?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"यह आपका अपना अकाउंट है। क्या आप आश्वस्त हैं?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में लॉग आउट करना चाहते हैं?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वाकई पिछले अनुरोध को रद्द करना चाहते हैं?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में इस उपयोगकर्ता का पासवर्ड रिसेट करना चाहते हैं?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में इस डिवाइस को निरस्त करना चाहते हैं?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"क्या आप वास्तव में इस टोकन को निरस्त करना चाहते हैं?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth का डोमेन वैध डोमेन नहीं है"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता द्वारा निरस्त किया गया।"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"खाता किसी बाहरी प्रदाता द्वारा प्रबंधित किया गया है"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth को प्रमाणीकरण प्रॉक्सी के पीछे चलाने के लिए कॉन्फ़िगर किया गया है लेकिन आपकी प्रॉक्सी अपेक्षित हेडर वापस नहीं करती है। अपना कॉन्फ़िगरेशन जांचें और पुनः प्रयास करें।"}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy प्रमाणीकरण विफल रहा"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"प्रमाणक के पास खोजने योग्य क्रेडेंशियल का समर्थन नहीं है"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"प्रमाणक के पास उपयोगकर्ता के सत्यापन का समर्थन नहीं है"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"आपका डिवाइस webauthn का समर्थन नहीं करता है. बाद में अधिक आधुनिक ब्राउज़र का उपयोग करके पुनः प्रयास करें"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"बिना रहस्य के OTP नहीं बनाया जा सकता"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"रहस्य को समझा नहीं जा सकता. यह मुख्य रूप से 2Fauth की .env कॉन्फ़िगरेशन फ़ाइल में गलत APP_KEY सेट या डेटाबेस में संग्रहीत दूषित डेटा के कारण होता है।"}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR Code डिकोड नहीं हो रहा है, कृपया चित्र को क्रॉप करें या ठीक करें"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"एकमात्र व्यवस्थापक खाता हटाया नहीं जा सकता"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"केवल बचे ऐड्मिन अकाउंट को नीचा नहीं किया जा सकता"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"चित्र में QR Code पढ़ा नहीं जा रहा है, कृपया चित्र को क्रॉप करें"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"खोज विफल रही, कृपया बाद में पुनर्प्रयास करें!"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"सर्वर से डेटा रिफ्रेश नहीं किया जा सकता"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"इस QR कोड का डेटा वैध OTP Auth URI नहीं है। QR कोड में शामिल हैं:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"केवल उपयोगकर्ता द्वारा बनाई गई सेटिंग ही मिटाई जा सकती हैं"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"अपठनीय, डेटा एन्क्रिप्टेड लगता है"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀डेटा लाने में कुछ गलत हो गया"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"डिक्रिप्शन विफल, आपका डेटाबेस अभी भी सुरक्षित है। ऐसा मुख्य रूप से एक या अधिक खातों के लिए एन्क्रिप्टेड डेटा की अखंडता की समस्या के कारण होता है।"}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"एन्क्रिप्शन विफल, आपका डेटाबेस अभी भी असुरक्षित है।"}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"फाइल अपलोड असफल रहा"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS संदर्भ आवश्यक है"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*अस्पष्ट*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"अमान्य 2FA डेटा"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"निर्दिष्ट एल्गोरिदम का समर्थन कोई भी प्रमाणक नहीं करता है"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"कोई भी प्रविष्टि 'public-key' प्रकार की नहीं थी"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"इस ईमेल के लिए पासवर्ड रीसेट नहीं किया जा सकता है।"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"कोई QR Code पाठ्य नहीं है"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"इस QR कोड में कोई वैध OTP संसाधन नहीं है"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"OTP का यह प्रारूप इस समय समर्थित नहीं है"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"इस संचालन की अनुमति नहीं है"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"यह QR कोड पढ़ा नहीं जा सकता"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR Code का चेकसम अमान्य है"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"रिफ्रेश करें"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"संसाधन नहीं मिला"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"डिवाइस पहले से ही पंजीकृत है"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"आप के सर्वर में कोई गड़बड़ है"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"अनावश्यक खाली अक्षर अपने आप निकाल दिए जाएंगे"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"यह SSO प्रदाता आपकी .env फ़ाइल में पूरी तरह से सेटअप नहीं है"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO निष्क्रिय है"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"समान ईमेल पते वाला एक उपयोगकर्ता खाता पहले से मौजूद है लेकिन यह आपकी बाहरी खाता आईडी से मेल नहीं खाता है। यदि आप पहले से ही इस ईमेल के साथ 2FAuth पर पंजीकृत हैं तो SSO का उपयोग न करें।"}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"SSO के माध्यम से प्रमाणीकरण अस्वीकृत"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"पंजीकरण निष्क्रिय हैं"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"क्वेरी पैरामीटर में बहुत सारी आईडी शामिल की गईं, अधिकतम 100 की अनुमति है"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"URI को डिक्रिप्ट करने में असमर्थ"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"आपको इस संसाधन को देखने या यह क्रिया करने की अनुमति नहीं है"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"अनधिकृत"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"अज्ञात त्रुटि"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"डेटा किसी भी समर्थित प्रारूप से मेल नहीं खाता"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"ओटीपी का प्रकार असमर्थित"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता के कहते को हटाना विफल रहा, कोई डेटा हटाया नहीं गया है"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता आईडी 1 से 64 वर्णों के बीच नहीं थी"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"गलत वर्तमान पासवर्ड, कुछ भी बदला नहीं गया है"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"जॉन डो"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"आपके सुरक्षा कोड को सुरक्षित करने की अलगोरिथ्म"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"अलगोरिथ्म"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"ऑटो-लॉक"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"निष्क्रियता की स्थिति में उपयोगकर्ता को स्वचालित रूप से लॉग आउट करें। जब प्रमाणीकरण को प्रॉक्सी द्वारा नियंत्रित किया जाता है और कोई कस्टम लॉगआउट URL निर्दिष्ट नहीं किया जाता है तो इसका कोई प्रभाव नहीं पड़ता है।"}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"ऑटो-लॉक"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"कभी-कभी कैश को साफ़ करने की आवश्यकता होती है, उदाहरण के लिए एनवायरनमेंट वेरीएबल में बदलाव या अपडेट के बाद। आप इसे यहां से कर सकते हैं."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"कैश का मैनेजमेन्ट"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Github पर 2FAuth की नई रिलीज़ प्रकाशित होने पर स्वचालित रूप से जाँच करें (सप्ताह में एक बार) और चेतावनी दें"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"नए संस्करण के लिए जाँच करें"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"क्लिपबोर्ड पर कोड कॉपी होने के ठीक बाद सर्च बॉक्स को खाली कर दें"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"कॉपी होने पर खोज मिटा दें"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Click on a generated password to copy it automatically hides it from the screen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"नए पासवर्ड की पुष्टि करें"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"जनरेट किया गया पासवर्ड स्क्रीन पर दिखाई देने के तुरंत बाद स्वचालित रूप से कॉपी हो जाता है। ब्राउज़र की सीमाओं के कारण, बदलने वाले पासवर्ड नहीं, केवल पहला समय-आधारित वन-टाइम पासवर्ड (TOTP) पासवर्ड कॉपी किया जाएगा"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"काउंटर को संपादित करना जोखिम भरा है क्योंकि आप सेवा के सत्यापन करने वाले सर्वर के साथ खाते को डीसिंक्रोनाइज़ कर सकते हैं। संशोधन सक्रिय करने के लिए लॉक आइकन का उपयोग करें, लेकिन केवल तभी जब आप जानते हों कि आप क्या कर रहे हैं"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"काउंटर का प्रारंभिक मान"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"डिफ़ॉल्ट 0 है"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"काउन्टर"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"यह पुष्टि करने के लिए कि यह आप ही हैं, अपना वर्तमान पासवर्ड भरें"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"वर्तमान पासवर्ड"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"वह समूह जिससे नव निर्मित अकाउंट जुड़े हैं"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"डिफ़ॉल्ट ग्रुप"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"डायरेक्ट इनपुट विकल्प चालू होने पर डिफ़ॉल्ट इनपुट मोड का उपयोग किया जाता है"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"डिफ़ॉल्ट इनपुट मोड"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"उत्पन्न सुरक्षा कोड के अंकों की संख्या"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"अंक"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"आपके सभी सुरक्षा उपकरण निरस्त कर दिये जायेंगे। यदि आपने कोई खो दिया है या उसकी सुरक्षा से छेड़छाड़ की गई है तो इस विकल्प का उपयोग करें।"}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"सभी सुरक्षा उपकरण अक्षम (डिसेबल) करें"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"नए उपयोगकर्ता रेजिस्ट्रेशन रोकें। जब तक इसे ओवरराइड नहीं किया जाता (नीचे देखें), यह SSO को भी प्रभावित करता है, इसलिए नए उपयोगकर्ता SSO के माध्यम से साइन इन नहीं कर पाएंगे"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"रेजिस्ट्रेशन निष्क्रिय करें"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"चुनें कि आप खातों को सूची के रूप में प्रदर्शित करना चाहते हैं या ग्रिड के रूप में"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"डिस्प्ले मोड"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"ईमेल"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"आगंतुकों को सिंगल साइन-ऑन योजना के माध्यम से बाहरी ID का उपयोग करके प्रमाणित करने की अनुमति दें"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"वर्तमान पासवर्ड"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"नया पासवर्ड"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"खाता जोड़ते समय 2FA जारीकर्ता का आधिकारिक आइकन प्राप्त करें (कोशिश करें)"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"आधिकारिक आइकान प्राप्त करें"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"आइकॉन"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता को ऐडमिनिस्ट्रेटर के अधिकार दें. ऐडमिनिस्ट्रेटर के पास पूरे ऐप, यानी सेटिंग्स और अन्य उपयोगकर्ताओं को प्रबंधित करने की अनुमति है, लेकिन वे उन 2FA के लिए पासवर्ड उत्पन्न नहीं कर सकते हैं जो उनके पास नहीं है।"}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"ऐडमिनिस्ट्रेटर है"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"नए उपयोगकर्ताओं को SSO के माध्यम से पहली बार साइन इन करने की अनुमति दें जबकि रेजिस्ट्रेशन निष्क्रिय है"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO द्वारा रेजिस्ट्रेशन को सक्रिय रखें"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth उपयोगकर्ता इंटरफ़ेस का अनुवाद करने के लिए उपयोग की जाने वाली भाषा। नामित भाषाएँ पूर्ण हैं, अपनी ब्राउज़र प्राथमिकता को ओवरराइड करने के लिए अपनी पसंद में से एक भाषा को चुनें।"}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"भाषा "}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"इस डिवाइस का नाम बताएं"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"नाम"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"नया नाम"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"नया पासवर्ड"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"यदि आप नहीं जानते कि उन्हें कैसे सेट किया जाए तो आप निम्नलिखित विकल्पों को खाली छोड़ सकते हैं। सबसे अधिक उपयोग किए जाने वाले मान लागू किए जाएंगे।"}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords are displayed."}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड दिखाएँ"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"समय-आधारित OTP या HMAC-आधारित OTP या स्टीम OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"पठनीयता और याद रखने में आसानी के लिए अंकों को समूहीकृत करके पासवर्ड प्रदर्शित करने का तरीका बदलें"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड फ़ॉर्मेटिंग"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"उत्पन्न सुरक्षा कोड की वैधता की अवधि सेकंड में"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"डिफ़ॉल्ट 30 है"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"अवधि"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"लागू किए गए अंतिम ग्रुप फ़िल्टर को सहेजें और अगली बार इसे पुनर्स्थापित करें"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप फ़िल्टर याद रखें"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"फिल्टरों की सूची"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"रेजिस्ट्रेशन केवल सीमित ईमेल पतों के लिए ही उपलब्ध कराएं। दोनों नियमों का एक साथ उपयोग किया जा सकता है। इसका SSO के माध्यम से किए गए रेजिस्ट्रेशन पर कोई प्रभाव नहीं पड़ता है।"}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"रेजिस्ट्रेशन पर प्रतिबंध लगाएं"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"इस रेगुलर इक्स्प्रेशन से मेल खाने वाले ईमेल को रेजिस्ट्रेशन की अनुमति दी जाएगी"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"फिल्टर करने के नियम"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"डॉट-ऑब्स्क्योर्ड पासवर्ड को अस्थायी रूप से प्रकट करने की क्षमता दें"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"आपके सुरक्षा कोड बनाने की कुंजी"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"रहस्य"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"गूगल, ट्विटर, एप्पल"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"सर्विस"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"आइकन दिखाएं"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"अपने इंस्टेंस के ईमेल कॉन्फ़िगरेशन को नियंत्रित करने के लिए एक परीक्षण ईमेल भेजें। कार्यशील कॉन्फ़िगरेशन होना महत्वपूर्ण है, अन्यथा उपयोगकर्ता रीसेट पासवर्ड का अनुरोध नहीं कर पाएंगे।"}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"ईमेल कॉन्फ़िगरेशन परीक्षण"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"किसी विशिष्ट थीम को बाध्य करें या अपने सिस्टम/ब्राउज़र प्राथमिकताओं में परिभाषित थीम को लागू करें"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"थीम"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"एप में दिखाए गए सभी समय और तारीखों पर यह टाइम ज़ोन लागू होगा"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"टाइम ज़ोन"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"यदि आप QR कोड कैप्चर करते समय समस्याओं का अनुभव करते हैं तो यह विकल्प अधिक बुनियादी लेकिन अधिक विश्वसनीय QR कोड रीडर पर स्विच करने में सक्षम बनाता है"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"बेसिक QR कोड रीडर का उपयोग करें"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"संवेदनशील डेटा, 2FA रहस्य और ईमेल, डेटाबेस में एन्क्रिप्टेड रूप में संग्रहीत किए जाते हैं। अपनी .env फ़ाइल के APP_KEY value का (या संपूर्ण फ़ाइल का) बैकअप लेना सुनिश्चित करें क्योंकि यह एन्क्रिप्शन की कुंजी के रूप में कार्य करता है। इस कुंजी के बिना एन्क्रिप्टेड डेटा को समझने का कोई तरीका नहीं है।"}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"संवेदनशील डेटा को सुरक्षित करें"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"केवल WebAuthn का उपयोग करें"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"चुनें कि क्या आप उपलब्ध इनपुट मोड में से एक इनपुट मोड चुनने की सुविधा चाहते हैं या आप सीधे डिफ़ॉल्ट इनपुट मोड का उपयोग करना चाहते हैं"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"सीधे दर्ज करें"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"जब भी OTP कॉपी हो जाए तो हमेशा डिफ़ॉल्ट ग्रुप पर वापस आ जाएं"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"कॉपी होने पर डिफ़ॉल्ट ग्रुप देखें"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"बारे में"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"लॉग को खोलें"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"पहुँच"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट पुनर्प्राप्ति"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"प्रमाणीकरण"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड बदलें"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"खतरे का क्षेत्र"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"डेटा इनपुट"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट डिलीट करें"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"वातावरण"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"सामान्य"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप्स"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"आयात"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"पिछला प्रवेश"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"लॉग इन करें"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"नया अकाउंट"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"नया ग्रुप"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"नया पासवर्ड"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"नया टोकन"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"नया उपयोगकर्ता"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"विकल्प"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"प्रवेश के व्यक्तिगत टोकन"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"प्राथमिकताएं"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"प्रोफ़ाइल"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR कोड"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"रजिस्ट्रेशन"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"डिवाइस का नाम बदलें"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"संसाधन"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"सुरक्षा उपकरण"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"सुरक्षा"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"समर्थित माइग्रेशन फॉर्मैट"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"अनधिकृत"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता प्रबंधन"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn लॉगिन"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"1 दिन के बाद"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 घंटे बाद"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"१ मिनट बाद"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 मिनट बाद"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 मिनट बाद"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 मिनट बाद"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"५ मिनट बाद"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"एक्टिव ग्रुप"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"उन्नत फॉर्म"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"क्लिक / टैप के बाद"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"बिना कुछ किए सभी पासवर्ड मुख्य दृश्य में दिखाएं"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"वे सभी, होम पर"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"सब"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड को अलग दृश्य में प्राप्त करने के लिए किसी खाते पर क्लिक करें"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"अपने दृश्य में अकेला"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"एप का सेटअप"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"ऑटो"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"पीछे"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"ब्राउज़र की प्राथमिकता"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"ब्राउजर"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"रद्द करें"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड बदलें"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"सब"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"अब जांचें"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"अपलोड"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"साफ़ करें"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"बंद करें"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"लगातार"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"जारी रखें"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"क्लिपबोर्ड पर कॉपी करें"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"कॉपी करें"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"बनाएँ"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"आभार"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"गहरा रंग"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"पूर्व निर्धारित"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"इस उपयोगकर्ता को हटा दें"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"अपना अकाउंट डिलीट करें"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"डिलीट करें"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"उपकरण (डिवाइस)"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"सभी को खारिज करें"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"डुप्लिकेट त्यागें"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"समाप्त हुआ"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"निर्यात करें"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 मिनट बाद"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"५ मिनट बाद"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"जनरेट करें"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"ग्रिड"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"अंकों को दो बराबर समूहों में विभाजित करें"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"आधे में"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"अपनी किस्मत आज़माएं"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"सभी आयात करें"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"आयात"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"आई पी अड्रेस"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"आई पी"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"ज़ारीकर्ता"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"हल्का रंग"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"सूची"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR कोड का लाइव स्कैन"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"प्रबंधन करें"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"खिसकाएँ"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"मेरी डिवाइस"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"कभी नहीं"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"नया"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"कोई ग्रुप नहीं"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"सुरक्षा कोड कॉपी होने पर"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"1 दिन के बाद"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 घंटे बाद"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"१ मिनट बाद"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 मास"}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 वर्ष"}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"ब्राउज़र में खोलें"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"ओ एस"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"विकल्प"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"अंकों को दो बटा दो समूहित करें"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"जोड़े से"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"साधारण टेक्स्ट"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR कोड का उपयोग कर के पहले से भरें"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR कोड"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"रिफ्रेश करें"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"एक डिवाइस रजिस्टर करें"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"आइकन हटाएं"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"ईमेल दुबारा भेजें"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"वापस लें"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"सुरक्षित करें"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"एक QR कोड स्कैन करें"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"खोजें"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड रिसेट करने के लिए लिंक भेजें"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"रिकवरी लिंक भेजें"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"भेजें"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"साइन इन करें"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"साइन आउट करें"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"जमा करें"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 मिनट बाद"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"जाँच"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"टेक्स्ट फ़ाईल"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 मिनट बाद"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"समय"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"आयात"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"अंकों को तीन बटा तीन समूहित करें"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"तिकड़ी से"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"अनलॉक"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"अपडेट करें"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"एक QR कोड अपलोड करें"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"वेरिएबल"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" मास"}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (बुल्गेरियन)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (जर्मन)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (इंग्लिश)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (फ्रेंच)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (हिंदी)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (जापानी)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (रशिअन)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"बारे में"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Admin panel"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"मुख पृष्ठ पर वापस जाएं"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"जारी रखें"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"नया ग्रुप बनाएँ"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता बनाइये"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"संशोधन करें"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"एक नया टोकन बनाएं"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth का अनुवाद करने में सहायता करें"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"लॉग इन और पासवर्ड"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप्स प्रबंधित करें"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"प्रबंधन करें"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"शायद बाद में"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"अपना खाता पुनः प्राप्त करें"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"एक नई डिवाइस रजिस्टर करें"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"रीसेट कीजिए"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"स्कैन करें"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"एक सुरक्षा उपकरण"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"पूरा लॉग देखें"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"सेटिंग्स"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"साइन इन करें"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"उन्नत फॉर्म का उपयोग करें"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"गिटहब पर देखें"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"आपके दो-कारक प्रमाणीकरण (2FA) खातों को प्रबंधित करने और उनके सुरक्षा कोड उत्पन्न करने के लिए एक वेब ऐप"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"आपके दो-कारक प्रमाणीकरण (2FA) खातों को प्रबंधित करने और उनके सुरक्षा कोड उत्पन्न करने के लिए एक वेब ऐप"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" का पूरा प्रवेश लॉग"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"यह अकाउंट OAuth के माध्यम से "},{t:4,k:"provider"},{t:3,v:" अकाउंट से जुड़ा हुआ है"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"आपने अपने "},{t:4,k:"provider"},{t:3,v:" खाते का उपयोग करके SSO के माध्यम से साइन-इन किया है। आपकी जानकारी यहां "},{t:4,k:"provider"},{t:3,v:" के अलावा नहीं बदली जा सकती।"}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"खाता पुनर्प्राप्ति ईमेल भेज दिया गया है!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"एक विधि चुनें और अपना पहला अकाउंट जोड़ें"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"अपने इंस्टेंस पर पंजीकृत उपयोगकर्ताओं को प्रबंधित करें या नए बनाएं।"}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"पहले से ही प्रमाणित है, कृपया पहले लॉग आउट करें"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"पहले से ही पंजीकृत?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"वैकल्पिक विधियाँ"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"कैप्स लॉक ऑन है"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता का अकाउंट डिलीट होगा और साथ ही उस का 2FA डेटा भी।"}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"आपका उपयोगकर्ता खाता और साथ ही आपका सभी 2FA डेटा हटा दिया जाएगा। वहां से वापसी का कोई विकल्प नहीं है।"}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"आपके 2FAuth खाते को हटाने से आपके बाहरी SSO खाते पर कोई प्रभाव नहीं पड़ेगा।"}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"किसी समूह को हटाने से खाते नहीं हटते हैं"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"सीधे दर्ज करें"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"डेमो मोड में यह सुविधा अक्षम है"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"जब आप 2FA ऐप से डेटा निर्यात करते हैं तो पासवर्ड सुरक्षा या एन्क्रिप्शन सक्रिय न करें अन्यथा 2FAuth उन्हें समझने में सक्षम नहीं होगा।"}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"क्या आपके पास अभी तक अकाउंट नहीं है?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"ईमेल "},{t:4,k:"email"},{t:3,v:" पर भेजा जाएगा"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"एक त्रुटि उत्पन्न हुई"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"अपेक्षित: otpauth URI की सूची, एक लाइन पर एक"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:" पर असफल लॉगिन"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"विफलता"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड भूल गए हैं?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"लोअर केस होना चाहिए"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"नंबर होना चाहिए"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"स्पेशल कैरेक्टर होना चाहिए"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"अपर केस होना चाहिए"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"QR कोड या JSON फ़ाइल जैसे माइग्रेशन संसाधन प्राप्त करने के लिए इन ऐप्स की निर्यात करने की सुविधा का उपयोग करें और फिर उसे यहां अपलोड करें।"}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth विभिन्न 2FA ऐप्स से डेटा आयात कर सकता है।"}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"आयात"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- अवैध अकाउंट -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"यह रीसेट टोकन अमान्य है"}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- अवैध सर्विस -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"कम से कम 8 कैरेक्टर"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:4,k:"date"},{t:3,v:" तारीख को अंतिम बार देखा गया"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"लोगो सौजन्य से"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"क्या आपका उपकरण खो गया?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"से बना"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"अपने नए व्यक्तिगत एक्सेस टोकन को अभी कॉपी करना सुनिश्चित करें। आप इसे दोबारा नहीं देख पाएंगे!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"आप अपने खातों को अपनी इच्छानुसार व्यवस्थित करने के लिए समूह बना सकते हैं। सभी खाते 'ऑल' नाम के सूडो ग्रुप में दृश्यमान रहते हैं, भले ही वे किसी भी समूह से संबंधित हों।"}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"अनिवार्य"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"चयन को स्थानांतरित करें"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"निम्नलिखित विकल्पों को सक्षम करने के लिए कम से कम एक डिवाइस सेट करें"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"यहाँ 2FA नहीं है"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"अभी प्रवेश निषेध है"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"कोई परिणाम नहीं"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- कोई सर्विस नहीं -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"कुछ नहीं"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"इस कनेक्शन की कोषसीसह का ब्योरा इस प्रकार है"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"यदि यह आप थे तो इस अलर्ट को नजरंदाज कर दें। यदि और कोशिश नाकाम होती है तो सुरक्षा सेटिंग के बारे में अपने 2FAuth ऐड्मिन से संपर्क करें और इस आक्रमणकारी के विरुद्ध कार्यवाही करें।"}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"आपके 2FAuth अकाउंट में एक नाकाम लॉगिन की कोशिश की गई"}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth में नाकाम लॉगिन"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"नमस्कार"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"इस कनेक्शन का ब्योरा इस प्रकार है"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"यदि यह आप थे तो इस अलर्ट को नजरंदाज कर दें। यदि अपने अकाउंट पर कोई संदिग्ध ऐक्टिविटी लगती है तो अपना पासवर्ड तुरंत बदलें।"}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"एक नया उपकरण आपके 2 Fauth अकाउंट से अभी कनेक्ट हुआ है"}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"सम्मान सहित"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"आपको यह ईमेल इसलिए प्राप्त हुआ है क्योंकि आपने अपने 2FAuth इंस्टेंस की ईमेल सेटिंग्स को मान्य करने के लिए एक परीक्षण ईमेल का अनुरोध किया था।"}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth की टेस्ट ईमेल"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"बधाई हो! यह काम करता है :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"आप ऐसे भी आगे जा सकते हैं:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"डेटा पार्स किया जा रहा है..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"इस उपयोगकर्ता के लिए एक पासवर्ड रीसेट अनुरोध मौजूद है पर अब मान्य नहीं है, जिसका अर्थ है कि उपयोगकर्ता ने अपना पासवर्ड समय से नहीं बदला है। यह स्वयं उपयोगकर्ता या किसी व्यवस्थापक का अनुरोध हो सकता है।"}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"इस उपयोगकर्ता के लिए एक पासवर्ड रीसेट अनुरोध मौजूद है (अनुरोध "},{t:4,k:"datetime"},{t:3,v:" पर भेजा गया) जिसका अर्थ है कि उपयोगकर्ता ने अभी तक अपना पासवर्ड नहीं बदला है लेकिन उसे प्राप्त लिंक अभी भी मान्य है। यह स्वयं उपयोगकर्ता या किसी व्यवस्थापक का अनुरोध हो सकता है।"}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"बिल्कुल समान डेटा वाला एक खाता पहले से मौजूद है"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"आपके खाते को पुनर्प्राप्त करने के लिए, 2FAuth कुछ Webauthn सेटिंग्स को रीसेट करता है ताकि आप अपने ईमेल और पासवर्ड का उपयोग करके साइन इन कर सकें।"}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"रेजिस्ट्रेशन की तारीख "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth आपको इस पते पर एक पासवर्ड रीसेट लिंक भेजेगा। नया पासवर्ड सेट करने के लिए प्राप्त ईमेल में दिए गए लिंक पर क्लिक करें।"}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"यदि आपने साइन इन करने, साइन आउट करने के लिए हमेशा SSO का उपयोग किया है तो पासवर्ड प्राप्त करने के लिए रीसेट पासवर्ड सुविधा का उपयोग करें ताकि आप यह फॉर्म भर सकें।"}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"किसी डिवाइस को रद्द करना स्थायी होता है"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"टोकन का निरस्त्रीकरण स्थायी होता है"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"प्रमाणीकरण उपकरण जिनका उपयोग आप 2FAuth में साइन इन करने के लिए कर सकते हैं, जैसे सुरक्षा कुंजी (यानी Yubikey) या बायोमेट्रिक क्षमताओं वाले स्मार्टफोन (यानी Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"साइन इन के लिए चाहिए"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"ब्राउज़र की पसंदीदा भाषा का उपयोग करते हुए क्या कुछ अनुवाद गायब हैं?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"स्थापित कैमरे उपयुक्त नहीं हैं"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"कृपया दूसरी डिवाइस / कैमरा उपयोग करें"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"कैमरा स्ट्रीमिंग के लिए HTTPS आवश्यक है"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"लाइव स्कैन शुरू नहीं किया जा सकता :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"यह आमतौर पर ब्राउज़र के एड्रेस बार में या उसके बगल में कटे हुए कैमरा आइकन पर क्लिक करके किया जाता है"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth को आप का कैमरा उपयोग करने की अनुमति नहीं है"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"आपको अपने डिवाइस के कैमरे का उपयोग करने की अनुमति देनी होगी। यदि आपने पहले ही इनकार कर दिया है और आपका ब्राउज़र आपको दोबारा संकेत नहीं देता है, तो कृपया अनुमति देने का तरीका जानने के लिए ब्राउज़र के दस्तावेज़ देखें।"}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"इस डिवाइस में कैमरा नहीं है"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"आप शायद अपना वेबकैम लगाना भूल रहे हैं"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"स्कैनर लोड करने में विफल"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"क्या कैमरा पहले से ही उपयोग में है? सुनिश्चित करें कि कोई अन्य ऐप आपके कैमरे का उपयोग न करे और पुनः प्रयास करें"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"सुरक्षित संदर्भ आवश्यक है"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"लाइव स्कैन के लिए HTTPS आवश्यक है। यदि आप अपने कंप्यूटर से 2FAuth चलाते हैं, तो localhost के अलावा वर्चुअल होस्ट का उपयोग न करें"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"इस ब्राउज़र में स्ट्रीम API समर्थित नहीं है"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"आप को एक आधुनिक ब्राउजर का उपयोग करना चाहिए"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"माइग्रेशन संसाधन में निम्नलिखित 2FA खाते पाए गए। अभी तक उनमें से किसी को भी 2FAuth में नहीं जोड़ा गया है।"}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:" पर सफल लॉगिन"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:4,k:"logout_at"},{t:3,v:" पर सफल लॉगआउट"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"स्वीकृत: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"स्वीकृत: jpg, jpeg, png, bmp, gif, svg, या webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"यह कोई सॉफ्ट डिलीट नहीं है, इसमें वापस जाना संभव नहीं है।"}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"बहुत सारे लॉगिन के प्रयास। "},{t:4,k:"seconds"},{t:3,v:" सेकंड में फिर से कोशिश करें।"}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"व्यक्तिगत एक्सेस टोकन किसी भी ऐप को 2Fauth API को प्रमाणित करने की अनुमति देते हैं। आपको उपभोक्ता ऐप के अनुरोधों के प्राधिकरण हेडर में एक्सेस टोकन को बियरर टोकन के रूप में निर्दिष्ट करना चाहिए।"}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI प्रतीक सौजन्य से"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"उन्हें अपने 2FA संग्रह में स्थायी रूप से सहेजने या त्यागने के लिए उपलब्ध बटनों का उपयोग करें।"}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"अपने सुरक्षा उपकरणों में से किसी एक का उपयोग करके प्रमाणित करने के लिए तैयार हो जाइए। अपनी चाबी प्लग इन करें, फेस मास्क या दस्ताने आदि हटा दें।"}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" सक्रिय टोकन"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" सुरक्षा डिवाइस (पास की)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:" पर देखा गया"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn लॉगिन अक्षम किया गया है"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth में आपका स्वागत है"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" अकाउंट"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" संस्करण उपलब्ध है!"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" चुने गए"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"यह एप अप-टू-डेट है"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट सफलतापूर्वक बना दिया गया है"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट सफलतापूर्वक अपडेट कर दिया गया है"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट सफलतापूर्वक मिटा दिया गया है"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट सफलतापूर्वक स्थानांतरित कर दिया गया है"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"प्रमाणीकरण विफल रहा"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"ऑटो-लॉक ट्रिगर हो गया है और आप लॉग आउट हो गए हैं"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"कैश साफ कर दिया गया है"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"क्लिपबोर्ड पर कॉपी हो गया I"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"सर्वर में हुए परिवर्तनों को प्रतिबिंबित करने के लिए डेटा को रिफ्रेश किया गया है"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"डिवाइस सफलतापूर्वक निरस्त हो गई है!"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"डिवाइस सफलतापूर्वक पंजीकृत हो गई है!"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप का नाम सुरक्षित किया"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप सफलतापूर्वक बनाया गया"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप सफलतापूर्वक डिलीट किया गया"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड सफलता पूर्वक बदला गया।"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता के PAT सफलतापूर्वक निरस्त्र कर दिए गए हैं"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"प्रोफ़ाइल सफलतापूर्वक अपडेट की गई!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता के सुरक्षा उपकरण सफलतापूर्वक निरस्त्र कर दिए गए हैं"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"सेटिंग्स सेव हो गयी"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"टोकन सफलतापूर्वक निरस्त हो गया है"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता का खाता सफलतापूर्वक हटा दिया गया है"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता सफलतापूर्वक बनाया गया"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता का रोल अपडेट हो गया है"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" वैध अकाउंट पाए गए"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"अगला »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« पिछला"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड कम से कम आठ अक्षर का होना चाहिए और पुष्टिकरण से मेल खाना चाहिए।"}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"आपका पासवर्ड रिसेट कर दिया गया है!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"हमने आपका पासवर्ड रीसेट लिंक ईमेल कर दिया है!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"कृपया फिर से कोशिश करने से पहले प्रतीक्षा करें।"}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"इस पासवर्ड को बदलने का टोकन अमान्य है।"}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"हम इस ईमेल पते वाले उपयोगकर्ता को नहीं ढूंढ पाए।"}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता का नाम, ईमेल इत्यादि..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"आइटम नहीं मिला"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"बारे में"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"एप का सेटअप"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"प्रमाणीकरण"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता बनाइये"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"लॉग को खोलें"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ताओं को प्रतिबंधित करें"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता प्रबंधन"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"ऑटो-लॉक"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"फ्लैश QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट (खाता) बनाएं"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"ग्रूप बनाएं"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट में परिवर्तन करें"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप में परिवर्तन करें"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"बाढ़"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"त्रुटि"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप्स"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"एकाउॅटस आयात करें"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"लॉग इन करें"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड रीसेट करें"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"नया पासवर्ड"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता अकाउंट"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"नया व्यक्तिगत टोकन"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth टोकन"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"विकल्प"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn की डिवाइस"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"डिवाइस में परिवर्तन"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"सेटिंग्स"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"QR कोड की तरह अकाउंट"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"नया अकाउंट"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"अनलॉक"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"अकाउंट पुनर्प्राप्ति"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"एक नई डिवाइस रजिस्टर करें"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"खोज साफ़ करें"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"चयन मिटाएं"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:4,k:"pagetitle"},{t:3,v:" पेज को बंद करें"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"क्लिपबोर्ड पर कॉपी करें"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"डिलीट करें"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"इस अकाउंट को खारिज करें"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"परीक्षण के लिए एक पासवर्ड बनाएं"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप सेलेक्टर छुपायें"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड छिपाएं"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"इस अकाउंट को आयात करें"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"लॉक करें"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"प्रबंधन करें"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"चयन को ग्रुप में स्थानांतरित करें"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"नाम बदलें"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड रिसेट की ईमेल उपयोगकर्ता को दोबारा भेजें"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"उपयोगकर्ता का पासवर्ड रिसेट करें"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड प्रकट करें"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"सभी उपयोगकर्ता डिवाइसेस निरस्त्र करें"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"सभी उपयोगकर्ता टोकन निरस्त्र करें"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"वापस लें"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"खोजें"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"सभी चुनें"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"ग्रुप सेलेक्टर दिखाएँ"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"पिछले महीने की एंट्री दिखाएं"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"पिछले साल की एंट्री दिखाएं"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR कोड दिखाएं"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"पिछले 6 महीने की एंट्री दिखाएं"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"पिछले 3 महीने की एंट्री दिखाएं"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"सुरक्षा उपकरण का उपयोग करके साइन इन करें"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"बढ़ते क्रम में जमाएं"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"सबसे कम नई पहले दिखाएं"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"सबसे नई पहले दिखाएं"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"घटते क्रम में जमाएं"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"इसे अनलॉक करें (अपने जोखिम पर)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"जादू से फॉर्म भरने के लिए एक QR कोड का उपयोग करें"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"जब :other :value हो तो :attribute को स्वीकार करना होगा।"}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:":attribute को स्वीकार करना होगा।"}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक वैध URL नहीं है"}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute :date के बाद की या उस के बराबर की तारीख होनी चाहिए।"}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute :date के बाद की तारीख होनी चाहिए।"}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:":attribute में केवल अक्षर, संख्याएँ, डैश और अंडरस्कोर होने चाहिए।"}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:":attribute में केवल अक्षर और संख्याएँ होने चाहिए।"}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:":attribute में केवल अक्षर होने चाहिए"}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक सरणी होनी चाहिए।"}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute :date के पहले की या बराबर की तारीख होनी चाहिए।"}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute :date के पहले की तारीख होनी चाहिए।"}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attibute :min और :max आइटम के बीच होनी चाहिए।"}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attibute :min और :max किलोबाइट्स के बीच होनी चाहिए।"}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attibute :min और :max के बीच होनी चाहिए।"}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attibute :min और :max अक्षरों के बीच होनी चाहिए।"}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attribute फ़ील्ड सही या गलत होनी चाहिए।"}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute पुष्टिकरण मेल नहीं खाता।"}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"पासवर्ड गलत है।"}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कोलन नहीं होना चाहिए।"}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"यह ईमेल पता रेजिस्ट्रेशन के नियम का पालन नहीं करता है"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"इस ईमेल का कोई अकाउंट नहीं पाया गया।"}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"सभी ईमेल वैध होने चाहिए और पाइप सिम्बल ("},{t:2,i:[{t:3}],s:") से अलग किए जाने चाहिए"}]}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"jpeg, png, bmp, gif, svg, या webp ही समर्थित प्रारूप हैं"}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs को कॉमा से अलग किया जाना चाहिए, बिना अंतिम कॉमा के।"}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"URI में लेबल होना चाहिए।"}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:":attribute समर्थित नहीं है।"}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"jpeg, png, bmp, gif, svg, या webp ही समर्थित प्रारूप हैं"}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:":attribute base32 कोडिंग में बनाया हुआ स्ट्रिंग होना चाहिए।"}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कोलन नहीं होना चाहिए।"}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक वैध OTPAuth URI नहीं है।"}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute :date के बराबर तारीख होनी चाहिए"}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute :format प्रारूप से मेल नहीं खाती।"}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक वैध तारीख नहीं है"}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"जब :other :value हो तो :attribute को अस्वीकार किया जाना चाहिए।"}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:":attribute को अस्वीकार किया जाना चाहिए।"}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute और :other भिन्न होने चाहिए।"}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attibute :min और :max अंकों के बीच होना चाहिए।"}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute :digits अंकों का होना चाहिए।"}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute के छवि आयाम मान्य नहीं हैं।"}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute फील्ड में डुप्लिकेट मान है।"}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute निम्नलिखित में से किसी एक के साथ समाप्त नहीं हो सकता: :मान।"}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute निम्नलिखित में से किसी एक के साथ शुरू नहीं हो सकता: :values।"}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक वैध ईमेल अड्रेस होना चाहिए।"}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute निम्नलिखित में से किसी एक के साथ समाप्त होना चाहिए: :values।"}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"चुना गया :attribute वैध नहीं है।"}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"चुना गया :attribute वैध नहीं है।"}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक फ़ाइल होनी चाहिए।"}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attribute के स्थान में एक मान होना चाहिए।"}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute में :value से अधिक चीजें होनी चाहिए।"}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value किलोबाइट से बड़ा होना चाहिए।"}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value से बड़ा होना चाहिए।"}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value अक्षरों से बड़ा होना चाहिए।"}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute में :value या उससे अधिक चीजें होनी चाहिए।"}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value किलोबाइट से बड़ा या बराबर होना चाहिए।"}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value से बड़ा या बराबर होना चाहिए।"}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value अक्षरों से बड़ा या बराबर होना चाहिए।"}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक छवि होनी चाहिए।"}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:":attribute फील्ड, :other में मौजूद नहीं है।"}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"चुना गया :attribute वैध नहीं है।"}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक पूर्णांक(integer) होना चाहिए।"}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य IP पता होना चाहिए।"}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य IPv4 पता होना चाहिए।"}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य IPv6 पता होना चाहिए।"}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य JSON स्ट्रिंग होना चाहिए।"}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute में :value से कम चीजें होनी चाहिए।"}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value किलोबाइट से कम होना चाहिए।"}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value से कम होना चाहिए।"}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value अक्षरों से कम होना चाहिए।"}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute में :value से अधिक चीजें नहीं होनी चाहिए।"}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value किलोबाइट से कम या बराबर होना चाहिए।"}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value से कम या बराबर होना चाहिए।"}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value अक्षरों से कम या बराबर होना चाहिए।"}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य MAC पता होना चाहिए।"}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute में :max से ज्यादा अंक नहीं हो सकते हैं।"}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute में :max से ज्यादा चीजें नहीं हो सकती हैं।"}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :max किलोबाइट से बड़ा नहीं हो सकता है।"}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute :max से बड़ा नहीं होना चाहिए।"}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :max अक्षरों से बड़ा नहीं हो सकता है।"}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attribute :values टाइप की फाइल होनी चाहिए।"}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attribute :values टाइप की फाइल होनी चाहिए।"}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कम से कम :min अंक होने चाहिए।"}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कम से कम :min चीजें होनी चाहिए।"}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute कम से कम :min किलोबाइट का होना चाहिए।"}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute कम से कम :min होना चाहिए।"}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कम से कम :min अक्षर होने चाहिए।"}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:":attribute :values का मल्टिपल होना चाहिए।"}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"चुना गया :attribute वैध नहीं है।"}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute फॉर्मेट अमान्य है।"}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक संख्या होनी चाहिए।"}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"URI पैरामीटर अकेले या केवल 'custom_otp' पैरामीटर के संयोजन में प्रदान किया जाना चाहिए"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कम से कम एक अक्षर होना चाहिए।"}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कम से कम एक uppercase और एक lowecase अक्षर होना चाहिए।"}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कम से कम एक अंक होना चाहिए।"}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:":attribute में कम से कम एक सिम्बल होना चाहिए।"}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक डेटा लीक में पाया गया है। कृपया एक दूसरा :attribute चुनें।"}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":attribute फील्ड मौजूद होना चाहिए।"}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"जब :other :value हो तो :attribute फील्ड निषिद्ध है।"}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"यदि :other :values में न हो तो :attribute फील्ड निषिद्ध है।"}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:":attribute फील्ड निषिद्ध है।"}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:":attribute फील्ड :other के प्रस्तुत होने को निषेध करता है।"}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute का फॉर्मैट अवैध है।"}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:":attribute फील्ड में :values की प्रविष्टियाँ होनी चाहिए।"}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"जब :other मान्य हो तो :attribute फील्ड आवश्यक है।"}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"जब :other :value हो तो :attribute फील्ड आवश्यक है।"}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"यदि :other :values में न हो तो :attribute फील्ड आवश्यक है।"}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"जब :values प्रस्तुत हो तो :attribute फील्ड आवश्यक है।"}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"जब :values प्रस्तुत हो तो :attribute फील्ड आवश्यक है।"}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"जब :values में से कोई भी प्रस्तुत न हो तो :attribute फील्ड आवश्यक है।"}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"जब :values प्रस्तुत न हो तो :attribute फील्ड आवश्यक है।"}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":attribute फील्ड की आवश्यकता है।"}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attribute और :other मैच करना चाहिए।"}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:":attribute का उपयोग करते समय वह इस request के body में एकमात्र पैरामीटर होना चाहिए"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute में :size आइटम होने चाहिए।"}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :size किलोबाइट्स का होना चाहिए।"}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute :size का होना चाहिए।"}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :size अक्षर का होना चाहिए।"}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute निम्नलिखित में से किसी एक के साथ शुरू नहीं हो सकता: :values।"}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक स्ट्रिंग होनी चाहिए।"}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य टाइम जोन होना चाहिए।"}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":attribute को पहले ही उपयोग में लिया जा चुका है।"}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attribute अपलोड होने में असफल रहा।"}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य URL होना चाहिए।"}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attribute एक मान्य UUID होना चाहिए।"}}}},{id:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Ikon yang menggambarkan akun"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Image of a QR code to scan"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Changes will be lost. Are you sure?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"This will have serious impacts on this user's permissions. Are you sure?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Apakah Anda yakin ingin menghapus akun anda?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this group?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this account?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this user? There is no going back."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"You will no longer be an administrator. Really sure?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all accounts?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all duplicates?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard this account?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"This is your own account. Are you sure?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Apakah Anda yakin ingin keluar?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke the previous request?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to reset this user's password?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Anda yakin ingin menghapus perangkat ini?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domain is not a valid domain"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Aborted by user"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Account managed by an external provider"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth is configured to run behind an authentication proxy but your proxy does not return the expected header. Check your configuration and try again."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy authentication failed"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing discoverable credential support"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing user verification support"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Your device does not support webauthn. Try again later using a more modern browser"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Tidak dapat membuat sebuah OTP tanpa sebuah rahasia"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"The secret cannot be deciphered. This is mainly caused by a wrong APP_KEY set in the .env configuration file of 2Fauth or a corrupted data stored in database."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Cannot decode detected QR code, try to crop or sharpen the image"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot delete the only admin account"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot demote the only admin account"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Cannot detect a QR code in the image, try to crop the image"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Check failed, please retry later"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Data cannot be refreshed from server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Data dari kode QR merupakan Auth URI OTP yang tidak valid. Kode QR nya mengandung:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Only user-created setting can be deleted"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Unreadable, the data seem encrypted"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Something went wrong during data fetching"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Dekripsi gagal, database anda masih tetap tidak terlindungi. Hal ini utamanya terjadi karena sebuah masalah integritas enkripsi data untuk satu atau lebih akun."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Enkripsi gagal, database anda masih tetap tidak terlindungi."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"File upload failed"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS context required"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecipherable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Invalid 2FA data"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"No authenticators support specified algorithms"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Password reset unavailable for this user"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No readable QR code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Tidak ada sumber OTP Valid untuk kode QR ini"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Format OTP ini saat ini tidak didukung"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operation not allowed"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Kode QR ini tidak dapat dibaca"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code has invalid checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Muat Ulang"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Sumber daya tidak ditemukan"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device already registered"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Ada yang selah dengan server anda"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"This SSO provider is not fully setup in your .env file"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is disabled"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication via SSO rejected"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrations are disabled"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"terlalu banyak id yang yang disertakan didalam parameter kueri, maksimal yang diperbolehkan 100"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Tidak dapat mendekripsi uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"You do not have permissions to view this resource or to perform this action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Data do not match any supported format"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported OTP type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"User account deletion failed, no data have been deleted"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"User ID was not between 1 and 64 chars"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Kata sandi saat ini salah, tidak ada yang diubah"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Fulan"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"The algorithm used to secure your security codes"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorithm"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Kunci Otomatis"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Kunci Otomatis"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache management"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically check (once a week) and warn when a new release of 2FAuth is published on Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Check for new version"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Empty the Search box right after a code has been copied to the clipboard"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Clear Search on copy"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Click on a generated password to copy it automatically hides it from the screen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirm new password"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first Time-based One-Time Password (TOTP) password will be copied, not the rotating ones"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"The initial counter value"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Fill in your current password to confirm that it's you"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the newly created accounts are associated"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Default group"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode used when the Direct input option is On"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"The number of digits of the generated security codes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Digits"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"All your security devices will be revoked. Use this option if you have lost one or its security has been compromised."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Disable all security devices"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Disable registration"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want accounts to be displayed as a list or as a grid"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Display mode"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Email"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Kata sandi baru"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Try to) Get the official icon of the 2FA issuer when adding an account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Get official icons"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Ikon"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Language used to translate the 2FAuth user interface. Named languages are complete, set the one of your choice to override your browser preference."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Language"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Name this device"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Name"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"New name"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Kata sandi baru"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords (OTP) are displayed"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Show Password"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Password formatting"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"The period of validity of the generated security codes in second"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Period"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Remember group filter"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Let the ability to temporarily reveal Dot-Obscured passwords"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"The key used to generate your security codes"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Layanan"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Show icons"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Email configuration test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Theme"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"The time zone applied to all dates and times displayed in the application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Time zone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"If you experiences issues when capturing QR codes enables this option to switch to a more basic but more reliable QR code reader"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Use basic QR code reader"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protect sensitive data"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Use WebAuthn only"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Tentang"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Access"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Pemulihan akun"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Otentikasi"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Danger Zone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Data input"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Environment"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"General"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grup"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Last accesses"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Masuk"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Akun baru"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"New group"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Kata sandi baru"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"New token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"New user"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Opsi"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Personal access tokens"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferences"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registrations"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Rename device"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Resources"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Perangkat keamanan"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Security"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Supported migration formats"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"User management"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn login"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Active group"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Advanced form"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"After a click/tap"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Show all passwords in the main view, without doing anything"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"All of them, on home"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alone, in its own view"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Back"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Preferensi perambaan"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Cancel"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Check now"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Unggah"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Close"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantly"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copy"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Create"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Credits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Dark"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Default"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Delete this user"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete your account"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Device"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Discard all"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Discard duplicates"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Done"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Export"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Generate"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Grid"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Split digits into two equals groups"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"by Half"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Coba keberuntunganku"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Import all"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Address"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Issuer"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Light"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"List"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Move"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"My device"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Never"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"New"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"No group"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"On security code copy"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mo."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yr."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Open in browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Opsi"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits two by two"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"by Pair"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Plain text"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Isi awal menggunakan sebuah Kode QR"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Muat Ulang"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a device"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Hapus ikon"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Resend email"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Save"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Pindai kode QR"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Send password reset link"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Send recovery link"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Send"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Masuk"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Keluar"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Submit"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Tes"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Text file"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Time"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits three by three"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"by Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Buka"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Update"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Unggah kode QR"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (German)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (English)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (French)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japanese)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russian)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Tentang"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Admin panel"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Back to home"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Create new group"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Create a user"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generate a new token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Help translate 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"masuk & kata sandi"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage groups"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Mungkin nanti"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recover your account"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Daftarkan sebuah perangkat baru"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset it"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"sebuah perangkat keamanan"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"See full log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Masuk"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Gunakan formulir lanjutan"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"View on Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"This account is bound to a "},{t:4,k:"provider"},{t:3,v:" account via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery email sent!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Pilih sebuah metode dan tambahkan terlebih dahulu akun anda"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Manage users registered on your instance or create new ones."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Telah terotentikasi"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Already registered?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative methods"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock is On"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"The user account will be deleted as well as all its 2FA data."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Your user account will be deleted as well as all your 2FA data. There is no going back."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Deleting your 2FAuth account has no impact on your external SSO account."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Deleting a group does not delete accounts"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Feature disabled in Demo mode"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Don't have your account yet?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Terjadi kesalahan:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Failure"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Forgot your password?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Has lower case"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Has number"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Has special char"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Has upper case"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use the Export feature of these apps to get a migration resource like a QR code or a JSON file then load it here."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Imported"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"This reset token is invalid."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 characters min."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Last seen "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos by"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Lost your device?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Made with"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Make sure to copy your personal access token now. You won’t be able to see it again!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can create groups to organize your accounts the way you want. All accounts remain visible in the pseudo group named 'All', regardless of the group they belong to."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Mandatory"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Move selected to"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Set at least one device to enable the following options"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Tidak ada 2FA disini!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"No entry yet"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"No result"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- tidak ada layanan -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nothing"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hello"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"You can also continue with:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Parsing data..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"A password reset request exists for this user but has expired, meaning that the user has not changed their password in time. This may be a request from the user themselves or from an administrator."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"A password reset request exists for this user (request sent at "},{t:4,k:"datetime"},{t:3,v:"), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"An account with the exact same data already exists"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"To recover your account, 2FAuth resets some Webauthn settings so you will be able to sign in using your email and password."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registered "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a password reset link to this address. Click the link in the received email to set a new password."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a device is permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a token is permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Perangkat otentikasi yang dapat anda gunakan untuk masuk ke 2FAuth, seperti kunci kemanan(cth. Yubikey) atau smartphone dengan kemampuan biometrik (cth. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Masuk dengan"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Some translations are missing using the browser preferred language?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Please use another device/camera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan can't start :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No camera on this device"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Maybe you forgot to plug in your webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fail to load scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is the camera already in use? Ensure that no other app use your camera and try again"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Secure context required"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"You should use a modern browser"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: jpg, jpeg, png, bmp, gif, svg, or webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Terlalu banyak upaya log masuk. Silakan coba lagi dalam "},{t:4,k:"seconds"},{t:3,v:" detik."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI Icons by"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use the available buttons to permanently save them to your 2FA collection or discard them."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Get ready to authenticate using (one of) your security devices. Plug your key in, remove face mask or gloves, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" active token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" security device(s) (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn login disabled"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" accounts"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selected"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"This instance is up-to-date"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Akun berhasil dibuat"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Akun berhasil diperbaru"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Akun berhasil dihapus"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Akun berhasil dipindahkan"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Peristiwa yang di awasi oleh fitur Kunci Otomatis telah di picu. Jika anda terputus otomatis."}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cleared"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copied to clipboard"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data has been refresh to reflect server-side changes"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully revoked"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully registered"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Group name saved"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully created"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully deleted"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully reset"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's PATs successfully revoked"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profile successfully updated!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Settings saved"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token successfully revoked"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"User account successfully deleted"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"user successfully created"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"User role updated"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" valid accounts found"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Selanjutnya »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Sebelumnya"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Kata sandi harus setidaknya delapan karakter dan sesuai dengan konfirmasi."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Kata sandi Anda telah diatur ulang!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Kami telah mengirimkan email tautan pengaturan ulang kata sandi anda!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Mohon tunggu sebelum mencoba lagi."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Token pengaturan ulang kata sandi ini tidak valid."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Kami tidak dapat menemukan pengguna dengan alamat email tersebut."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"User name, email..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Item tidak ditemukan"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Tentang"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Akun"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Otentikasi"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Create user"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Manage user"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Users management"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Kunci Otomatis"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"QR Kilat"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Buat akun"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Buat grup"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Ubah akun"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Edit grup"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Banjir"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Galat"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grup"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Impor Akun"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Masuk"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Atur ulang kata sandi"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Kata sandi baru"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Akun pengguna"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Token personal baru"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"Token OAuth"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Opsi"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Perangkat WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Pengaturan perangkat"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Akun sebagai kode QR"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Akun baru"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Buka"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Pemulihan akun"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Daftarkan sebuah perangkat baru"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Clear search"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Clear selection"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Close the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Discard this account"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generate a test pasword"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Hide group selector"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Hide password"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Import this account"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Kunci"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Move selected into a group"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Rename"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Resend a password reset email to the user"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Reveal password"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's security devices"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's tokens"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Select all"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Show group selector"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Tampilkan kode QR"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Masuk menggunakan sebuah perangkat keamanan"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Sort ascending"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sort descending"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Buka (tanggung resiko sendiri)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Gunakan sebuah kode QR untuk mengisi formulir secara ajaib"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted when :other is :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after or equal to :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters, numbers, dashes, and underscores."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters and numbers."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an array."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before or equal to :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have between :min and :max items."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max characters."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be true or false."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field confirmation does not match."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"The password is incorrect."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"This email address does not comply with the registration policy"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No account found using this email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"All emails must be valid and separated with a pipe"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs must be comma separated, without trailing comma."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"The uri must have a label."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not supported."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a base32 encoded string."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not a valid otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date equal to :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match the format :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid date."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined when :other is :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field and :other must be different."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max digits."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :digits digits."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has invalid image dimensions."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has a duplicate value."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not end with one of the following: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not start with one of the following: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid email address."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must end with one of the following: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have a value."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have more than :value items."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value characters."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :value items or more."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value characters."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an image."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must exist in :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an integer."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IP address."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv4 address."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv6 address."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid JSON string."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have less than :value items."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value characters."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :value items."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value characters."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid MAC address."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max digits."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max items."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max characters."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min digits."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min items."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min characters."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a multiple of :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a number."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"The uri parameter must be provided alone or only in combination with the 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one letter."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one uppercase and one lowercase letter."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one number."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one symbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"The given :attribute has appeared in a data leak. Please choose a different :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited when :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited unless :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field prohibits :other from being present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain entries for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is accepted."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required unless :other is in :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values are present."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is present."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when none of :values are present."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is not present."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"When using :attribute it must be the only parameter in this request body"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain :size items."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size characters."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must start with one of the following: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a string."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid timezone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute has already been taken."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute failed to upload."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid UUID."}}}},{it:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Icona che illustra l'account"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Immagine di un codice QR da scansionare"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Changes will be lost. Are you sure?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Questo avrà gravi ripercussioni sui permessi di questo utente. Sei sicuro?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler eliminare il tuo account?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler eliminare questo gruppo?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this account?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler eliminare questo utente? Non è possibile annulare."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Non sarai più un amministratore. Sei sicuro?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all accounts?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler scartare tutti i duplicati?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard this account?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Questo è il tuo account. Sei sicuro?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di volerti disconnettere?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler eliminare questo dispositivo?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler reimpostare la password dell'utente?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler eliminare questo dispositivo?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Sei sicuro di voler revocare questo token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domain is not a valid domain"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Annullato dall'utente."}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Account gestito da un provider esterno"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth is configured to run behind an authentication proxy but your proxy does not return the expected header. Check your configuration and try again."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy authentication failed"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Supporto credenziali scopribili mancante per l'autenticazione"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing user verification support"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Il tuo dispositivo non supporta webauthn. Riprova più tardi usando un browser più moderno"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Impossibile creare un OTP senza un segreto"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Il segreto non può essere decifrato. Questo è causato principalmente da un set APP_KEY sbagliato nel . nv file di configurazione di 2Fauth o dati corrotti memorizzati nel database."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Impossibile decodificare il codice QR rilevato, prova a ritagliare o affilare l'immagine"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot delete the only admin account"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot demote the only admin account"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Impossibile rilevare un codice QR nell'immagine, prova a ritagliare l'immagine"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Check failed, please retry later"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Data cannot be refreshed from server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"I dati di questo codice QR non sono un valido OTP Auth URI. Il codice QR contiene:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Solo le impostazioni create dall'utente possono essere eliminate"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Unreadable, the data seem encrypted"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Something went wrong during data fetching"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Decifratura non riuscita, il database è ancora protetto. Questo è causato principalmente da un problema di integrità dei dati crittografati per uno o più account."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Cifratura non riuscita, il database rimane non protetto."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Impossibile iniettare lo script per eseguire la scansione QR"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Recupero dei dati dell'archivio crittografia non riuscito"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"File upload failed"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Contesto HTTPS necessario"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecifrabile*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Invalid 2FA data"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Nessun autenticatore supporta gli algoritmi specificati"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Password reset unavailable for this user"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No readable QR code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Nessuna risorsa OTP valida in questo codice QR"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Questo formato OTP non è attualmente supportato"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operazione non consentita"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Questo codice QR è illeggibile"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code has invalid checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Ricarica"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Risorsa non trovata"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo già registrato"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Qualcosa non va con il tuo server"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"This SSO provider is not fully setup in your .env file"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is disabled"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication via SSO rejected"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrations are disabled"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"troppi ID sono stati inclusi nel parametro di query, max 100 consentiti"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Impossibile decifrare uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"You do not have permissions to view this resource or to perform this action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Errore sconosciuto"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Data do not match any supported format"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported OTP type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"User account deletion failed, no data have been deleted"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"User ID was not between 1 and 64 chars"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Password corrente errata, nulla è cambiato"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"The algorithm used to secure your security codes"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Il numero di cifre dei codici di sicurezza generati"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Nascondi automaticamente la password sullo schermo dopo un timeout. Questo evita richieste non necessarie di nuove password se dimentichi di chiudere la vista password."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Blocco automatico"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Blocco automatico"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-salvataggio account"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Gestione cache"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Controlla automaticamente (una volta a settimana) e avvisa quando viene pubblicata una nuova versione di 2FAuth su Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Controlla aggiornamenti"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Svuota la casella di ricerca subito dopo che un codice è stato copiato negli appunti"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Svuota ricerca sulla copia"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Fare clic su una password generata per copiarla automaticamente nascondendola dallo schermo"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Conferma nuova password"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Copia automaticamente una password generata subito dopo che appare sullo schermo. A causa delle limitazioni del browser, solo la prima password Time-based One-Time Password (TOTP) verrà copiata, non quelle rotanti"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"The initial counter value"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Inserisci la tua password attuale per confermare che sei tu"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Password attuale"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the newly created accounts are associated"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Gruppo predefinito"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode used when the Direct input option is On"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Il numero di cifre dei codici di sicurezza generati"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Digits"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Tutti i tuoi dispositivi di sicurezza saranno rimossi. Usa questa opzione se ne hai perso uno o se la sua sicurezza è stata compromessa."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Disabilita tutti i dispositivi di sicurezza"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Disabilita la registrazione"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want accounts to be displayed as a list or as a grid"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Modalità Display"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Email"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Abilita SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Password attuale"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nuova password"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Try to) Get the official icon of the 2FA issuer when adding an account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Ottieni icone ufficiali"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"Il gruppo al quale l'account deve essere assegnato"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Gruppo"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icona"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"E` amministratore"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Lingua utilizzata per tradurre l'interfaccia utente 2FAuth. Le lingue con nome sono complete, imposta quella scelta per sovrascrivere le preferenze del browser."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Lingua"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Nome di questo dispositivo"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Nome"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo nome"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nuova password"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords (OTP) are displayed"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Mostra Password"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Password formatting"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"The period of validity of the generated security codes in second"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Period"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Remember group filter"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Lascia la possibilità di rivelare temporaneamente le password oscurate"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"La chiave utilizzata per generare i codici di sicurezza"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Segreto"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Servizio"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Mostra icone"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Quando invocato, forza la funzione Ordina per ordinare gli account in base a maiuscolo/minuscolo"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Ordina maiuscole e minuscole"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Test di configurazione email"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Tema"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"Il fuso orario è applicato a tutte le date e gli orari mostrati nell'applicazione"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Fuso orario"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Se si verificano problemi durante la cattura di codici QR consente questa opzione di passare a un lettore di codice QR più semplice ma più affidabile"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Usa lettore di codice QR di base"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Proteggi i dati sensibili"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Usa solo SSO"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Usa solo WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Input diretto"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Informazioni"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Registro accessi"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Accesso"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Recupero dell'account"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Autenticazione"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Cambia password"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Zona Pericolosa"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Inserire i dati"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Elimina account"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Ambiente"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Generale"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Gruppi"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Importa"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Ultimo accesso"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Accedi"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo account"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo gruppo"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nuova password"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo utente"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifiche"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Opzioni"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Token di accesso personali"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferenze"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profilo"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Codice QR"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registrazioni"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Rinomina dispositivo"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Risorse"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivi di sicurezza"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Sicurezza"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"Accesso SSO"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Spazio di archiviazione"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Supported migration formats"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Gestione utenti"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Utenti"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn login"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 1 giorno"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 1 ora"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 1 minuto"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 10 minuti"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 15 minuti"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 2 minuti"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 30 minuti"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 5 minuti"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Gruppo attivo"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Modulo avanzato"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"After a click/tap"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Show all passwords in the main view, without doing anything"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"All of them, on home"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Tutti"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alone, in its own view"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni App"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Automatico"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Indietro"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Preferenza del browser"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Annulla"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Cambia password"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Tutti"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Controlla ora"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Carica"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Pulisci"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Chiudi"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantly"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continua"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copia negli appunti"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copia"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Crea"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Ringraziamenti"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Scuro"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Predefinito"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Eliminare questo utente"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Elimina il tuo account"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Cancella"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Discard all"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Discard duplicates"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Fatto"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Esporta"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 15 minuti"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 5 minuti"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Genera"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Griglia"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Split digits into two equals groups"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"by Half"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Prova la mia fortuna"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Import all"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Importa"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"Indirizzo IP"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Issuer"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Chiaro"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Lista"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"Livescan codice QR"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gestisci"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Sposta"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Il mio dispositivo"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Mai"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Nessun gruppo"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"Alla copia del codice di sicurezza"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 1 giorno"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 1 ora"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 1 minuto"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mese"}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 anno"}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Apri nel browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Opzioni"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits two by two"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"by Pair"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Testo in chiaro"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Precompila utilizzando un codice QR"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Codice QR"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Ricarica"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Registra un dispositivo"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Rimuovi icona"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Reinvia email"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoca"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Salva"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scansiona un codice QR"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Cerca"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Invia link per reset password"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Invia link di recupero password"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Invia"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Accedi"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Disconnettiti"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Invia"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 10 minuti"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Text file"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 30 minuti"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Tempo"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Importa"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits three by three"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"by Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Dopo 2 minuti"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Sblocca"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Carica un codice QR"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Utenti"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variabili"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mesi"}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Tedesco)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Inglese)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Francese)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Giapponese)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (russo)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turco)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Informazioni"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Pannello amministratore"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Torna alla home"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continua"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Crea un nuovo gruppo"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Creare un utente"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Modifica"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Genera un nuovo token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Aiutaci a tradurre 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"nome utente e password"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Gestione gruppi"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gestisci"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Magari più tardi"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recupera il tuo account"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi dispositivo"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Reimpostala"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scansiona"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"un dispositivo di sicurezza"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Vedi il registro completo"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Vedi come abilitare un provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Puoi accedere senza SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Accedi"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Usa il modulo avanzato"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Vedi su GitHub"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Una web app per gestire i tuoi account di autenticazione a due fattori (2FA) e generarne i rispettivi codici di sicurezza"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Una web app per gestire i tuoi account di autenticazione a due fattori (2FA) e generarne i rispettivi codici di sicurezza"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Questo account è associato a un account "},{t:4,k:"provider"},{t:3,v:" tramite OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"Hai effettuato l'accesso tramite SSO utilizzando il tuo account "},{t:4,k:"provider"},{t:3,v:". Le tue informazioni non possono essere modificate qui ma su "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Email di recupero account inviata!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Pick a method and add your first account"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Gestisci gli utenti registrati nella tua istanza o creane nuovi."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Già autenticato"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Sei già registrato?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative methods"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Il blocco maiuscole è attivo"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"L'account utente verrà eliminato così come tutti i suoi dati 2FA."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Il tuo account utente verrà eliminato insieme a tutti i dati di 2FA. Non puoi tornare indietro."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"L'eliminazione del tuo account 2FAuth non influenza in alcun modo il tuo account SSO esterno."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"L'eliminazione di un gruppo non elimina gli account"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Input diretto"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Funzione disabilitata in modalità demo"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Non hai ancora un account?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Si è verificato un errore:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Fallimento"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Hai dimenticato la password?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Contiene minuscole"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Contiene numeri"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Contiene caratteri speciali"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Contiene maiuscole"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Amministratore?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Utilizzare la funzione Esporta di queste app per ottenere una risorsa di migrazione come un codice QR o un file JSON, quindi caricarlo qui."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Importato"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Questo token di reset non è valido."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 caratteri minimo"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Ultimo accesso "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Loghi di"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Hai perso il tuo dispositivo?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Creato con"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Assicurati di copiare il tuo token di accesso personale ora. Non sarai in grado di vederlo di nuovo!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Puoi creare gruppi per organizzare i tuoi account come vuoi. Tutti gli account rimangono visibili nel gruppo pseudo chiamato 'All', indipendentemente dal gruppo a cui appartengono."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Richiesto"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Sposta selezionato in"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Imposta almeno un dispositivo per abilitare le seguenti opzioni"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"No 2FA here!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Ancora nessuna voce"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"nessun provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Nessun risultato"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- nessun servizio -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Manca il provider?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"niente"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hello"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stai ricevendo questa email perché hai richiesto una email di prova per convalidare le impostazioni di posta elettronica della tua istanza 2FAuth."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Puoi anche continuare con:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Parsing data..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password di accesso e WebAuthn sono disabilitati."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Esiste una richiesta di reimpostazione della password per questo utente ma è scaduta, il che significa che l'utente non ha cambiato la sua password in tempo. Questa può essere una richiesta da parte dell'utente stesso o da un amministratore."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3}],s:"."}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"An account with the exact same data already exists"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Per recuperare il tuo account, 2FAuth ripristina alcune impostazioni Webauthn in modo che tu possa essere in grado di accedere utilizzando la tua email e password."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registrato "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth ha iniviato il link per il reset password al tuo indirizzo. Clicca sul link ricevuto nell'email per impostare una nuova password."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Se hai sempre usato SSO per accedere, disconnettiti quindi utilizza la funzione di reset della password per ottenere una password in modo da poter compilare questo modulo."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revocare un dispositivo è permanente"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revocare un token è permanente"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivi di autenticazione che puoi usare per accedere a 2FAuth, come le chiavi di sicurezza (come Yubikey) o gli smartphone con funzionalità biometriche (es. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Scegliere un provider SSO con cui effettuare l'accesso:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Accedi con"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Mancano alcune traduzioni usando la lingua preferita del browser?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Gli utenti regolari devono accedere con SSO. Altri metodi sono solo per gli amministratori."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"L'autenticazione è limitata solo a SSO, "},{t:4,k:"auth_method"},{t:3,v:" è disabilitato"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Please use another device/camera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan can't start :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No camera on this device"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Maybe you forgot to plug in your webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fail to load scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is the camera already in use? Ensure that no other app use your camera and try again"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Secure context required"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"You should use a modern browser"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: jpg, jpeg, png, bmp, gif, svg, or webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Questa non è una cancellazione morbida, non è possibile annullare."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Troppi tentativi di accesso. Riprova tra "},{t:4,k:"seconds"},{t:3,v:" secondi."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"I token di accesso personale consentono a qualsiasi app di autenticarsi all'API 2Fauth. È necessario specificare il token di accesso come token Bearer nell'intestazione di autorizzazione delle richieste delle app consumer."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"Icone UI di"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use the available buttons to permanently save them to your 2FA collection or discard them."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Preparati ad autenticarti usando uno dei dispositivi di sicurezza. Collega la tua chiave, rimuovi la mascherina o i guanti, ecc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" token attivi"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" dispositivi di sicurezza (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Login Webauthn disabilitato"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Benvenuto su 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" account"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selezionati"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Questa istanza è aggiornata"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Account creato con successo"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Account aggiornato con successo"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account eliminato con successo"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Account spostato correttamente"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Autenticazione fallita"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Blocco automatico attivato, sei stato disconnesso"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cancellata"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiato negli appunti"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"I dati sono stati aggiornati per rispecchiare le modifiche lato server"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo revocato con successo"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo registrato con successo"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Nome del gruppo salvato"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Gruppo creato con successo"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Gruppo eliminato con successo"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password reimpostata con successo"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Pat dell'utente revocati con successo"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profilo aggiornato con successo!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivi di sicurezza dell'utente revocati con successo"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni salvate!"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token revocato con successo"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account utente eliminato correttamente"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"utente creato con successo"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Ruolo dell'utente aggiornato"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" valid accounts found"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Successivo »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Precedente"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"La password deve contenere almeno otto caratteri e corrispondere alla conferma."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"La password è stata reimpostata!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Ti abbiamo inviato una email con il link per il reset della password!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Per favore, attendi prima di riprovare."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Questo token di reset della password non è valido."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Non riusciamo a trovare un utente con questo indirizzo email."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Nome utente, email..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Elemento non trovato"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Informazioni"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Accounts"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni App"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Autenticazione"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Crea utente"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Registro accessi"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Gestione utenti"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Gestione utenti"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Blocco automatico"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Crea account"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Crea gruppo"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Modifica account"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Modifica gruppo"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Errore"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Gruppi"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importa accounts"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Accedi"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Reimposta password"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nuova password"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Account utente"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo token personale"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth Tokens"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Opzioni"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivi WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Modifica dispositivo"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Account come codice QR"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Nuovo account"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Sblocca"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Recupero dell'account"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi dispositivo"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Pulisci ricerca"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Annulla selezione"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Chiudi la pagina "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copia negli appunti"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Cancella"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Scarta questo account"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Esporta gli account selezionati"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Genera una parola d'ordine di prova"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Nascondi selettore gruppo"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Nascondi password"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Import this account"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Bloccarlo"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gestisci"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Sposta selezionato in un gruppo"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Rinomina"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Reinvia una email di reimpostazione password all'utente"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reimposta la password dell'utente"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Mostra password"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoca tutti i dispositivi di sicurezza dell'utente"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoca tutti i token dell'utente"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoca"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Cerca"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Seleziona tutti"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Mostra selettore di gruppo"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Mostra codice QR"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Accedi tramite un dispositivo di sicurezza"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Ordine crescente"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Ordine decrescente"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Sblocca (a tuo rischio)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Usa un codice QR per compilare magicamente il modulo"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be accepted when :other is :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere accettato."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute non è un URL valido."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere una data successiva o uguale al :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere una data successiva al :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must only contain letters, numbers, dashes and underscores."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must only contain letters and numbers."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must only contain letters."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un array."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere una data precedente o uguale al :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere una data precedente al :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve avere tra :min - :max elementi."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve trovarsi tra :min - :max kilobyte."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve trovarsi tra :min - :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve trovarsi tra :min - :max caratteri."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute deve essere vero o falso."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"Il campo di conferma per :attribute non coincide."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"The password is incorrect."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not contain colon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"This email address does not comply with the registration policy"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No account found using this email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"All emails must be valid and separated with a pipe"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs must be comma separated, without trailing comma."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"The uri must have a label."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute is not supported."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a base32 encoded string."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not contain colon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute is not a valid otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere una data e uguale a :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute non coincide con il formato :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute non è una data valida."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be declined when :other is :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be declined."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute e :other devono essere differenti."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere tra :min e :max cifre."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere di :digits cifre."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"Le dimensioni dell'immagine di :attribute non sono valide."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute contiene un valore duplicato."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute may not end with one of the following: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute may not start with one of the following: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute non è valido."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve finire con uno dei seguenti valori: :values"}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:":attribute selezionato non è valido."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un file."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute deve contenere un valore."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere più di :value elementi."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere maggiore di :value kilobyte."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere maggiore di :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere più di :value caratteri."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere un numero di elementi uguale o maggiore di :value."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be greater than or equal to :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be greater than or equal to :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be greater than or equal to :value characters."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un'immagine."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"Il valore del campo :attribute non esiste in :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:":attribute selezionato non è valido."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un numero intero."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un indirizzo IP valido."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un indirizzo IPv4 valido."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un indirizzo IPv6 valido."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere una stringa JSON valida."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere meno di :value elementi."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere minore di :value kilobyte."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere minore di :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere meno di :value caratteri."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere un numero di elementi minore o uguale a :value."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be less than or equal to :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be less than or equal to :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be less than or equal to :value characters."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid MAC address."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not have more than :max digits."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not have more than :max items."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not be greater than :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not be greater than :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must not be greater than :max characters."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere del tipo: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere del tipo: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must have at least :min digits."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve avere almeno :min elementi."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere almeno di :min kilobyte."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere almeno :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere almeno :min caratteri."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a multiple of :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Il valore selezionato per :attribute non è valido."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"Il formato di :attribute non è valido."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un numero."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"The uri parameter must be provided alone or only in combination with the 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must contain at least one letter."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must contain at least one uppercase and one lowercase letter."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must contain at least one number."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must contain at least one symbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"The given :attribute has appeared in a data leak. Please choose a different :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute deve essere presente."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited when :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited unless :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field prohibits :other from being present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"Il formato del campo :attribute non è valido."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain entries for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is accepted."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute è richiesto quando :other è :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute è richiesto a meno che :other sia in :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute è richiesto quando :values sono presenti."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute è richiesto quando :values è presente."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute è richiesto quando nessuno di :values è presente."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute è richiesto quando :values non è presente."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"Il campo :attribute è richiesto."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attribute e :other devono coincidere."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"When using :attribute it must be the only parameter in this request body"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere :size elementi."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere :size kilobyte."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve contenere :size caratteri."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve iniziare con uno dei seguenti: :values"}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere una stringa."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid timezone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":attribute è stato già utilizzato."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attribute non è stato caricato."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attribute deve essere un UUID valido."}}}},{ja:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"このアカウントを表すアイコン"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"スキャンするQRコード画像"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"よろしいですか?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"変更内容は失われます。よろしいですか?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"この操作はこのユーザーの権限に重大な影響を与えます。よろしいですか?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを削除してもよろしいですか?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"このグループを削除してもよろしいですか?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"このアカウントを削除してもよろしいですか?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーを削除してもよろしいですか?元に戻すことはできません。"}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"あなたは管理者でなくなります。本当によろしいですか?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"すべてのアカウントを破棄してもよろしいですか?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"すべての重複アカウントを破棄してもよろしいですか?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"このアカウントを破棄してもよろしいですか?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"これはあなた自身のアカウントです。よろしいですか?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"ログアウトしてもよろしいですか?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"以前のリクエストを削除してもよろしいですか?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーのパスワードをリセットしてもよろしいですか?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"このデバイスを失効させてもよろしいですか?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"このトークンを取り消してもよろしいですか?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth のドメインが有効なドメインではありません"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーによる中断"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"外部プロバイダが管理するアカウント"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth は認証プロキシ経由で動作するよう設定されていますが、プロキシは必要なヘッダーを返しませんでした。設定をご確認のうえ再度お試しください。"}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"プロキシ認証に失敗しました"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"認証システムが識別子つき認証情報 (discoverable credential) に対応していません"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"認証システムがユーザー認証に対応していません"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"お使いのデバイスは webauthn をサポートしていません。新しいブラウザでもう一度お試しください。"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"シークレットなしのOTPは作成できません"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"シークレットは解読できませんでした。2FAuth の .env 設定ファイルに間違った APP_KEY が設定されているか、データベース内のデータが破損している可能性が高いです。"}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"検出されたQRコードをデコードできません。画像をトリミングまたはシャープにしてください。"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"唯一の管理者アカウントは削除できません"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"唯一の管理者アカウントは降格できません"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"画像内にQRコードを検出できません。画像をトリミングしてください"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"変更に失敗しました。もう一度やり直してください"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"チェックが失敗しました。後ほどもう一度お試しください"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"データをサーバーから更新できません"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"このQRコードのデータは有効なOTP認証URIではありません。QRコードの内容:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーが作成した設定のみ削除できます"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"読み込めませんでした。暗号化されたデータのようです"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"暗号化キーの生成に失敗しました"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 データ取得中に問題が発生しました"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"復号に失敗しました。データベースは暗号化されたままです。1 つ以上のアカウントの暗号化データが壊れている可能性が高いです。"}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"暗号化に失敗しました。データベースの保護は行われていません"}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"アイコンの移行に失敗しました。設定を元の値に戻しました。"}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"認証に失敗しました。PATを再確認してください"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuthサーバーにアクセスできません。URLを確認してください"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"PATを解読できませんでした"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"キーの取得に失敗しました"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"PATの暗号化に失敗しました"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードを取得できませんでした"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"トークンの取得に失敗しました"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"ストアからの設定の読み込みに失敗しました"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"IV の再生成に失敗しました"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"アプリケーションの設定の取得に失敗しました"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"暗号ストアのデータの取得に失敗しました"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"自動ロックの遅延の設定に失敗しました"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"暗号化キーの設定に失敗しました"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"暗号化パラメーターの設定に失敗しました"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"暗号化されたPATの保存に失敗しました"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"このフィールドは有効なURLでなければなりません"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"必須項目です"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"ファイルのアップロードに失敗しました"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS 通信が必要です"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"※解読不能※"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"無効な 2 要素認証データです"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"無効または不明なPAT"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"指定されたアルゴリズムに対応する認証システムがありません"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"'public-key' 型の項目がありません"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"この種類で使用可能なアイコンはありません"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーにパスワードリセットはできません"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"読み取り可能なQRコードがありません"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"このQRコードに有効なOTPリソースがありません"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"このOTP形式は現在サポートされていません"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"許可されていない操作です"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"このQRコードは読み取れません"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QRコードのチェックサムが不正です"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"再読み込み"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"予約された名前です。他の名前を選択してください"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"リソースが見つかりません"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"デバイスは既に登録済みです"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティエラー: WEBAUTHN_ID 環境変数を確認してください"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"サーバーに問題が発生しました"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"不要なスペースは自動的に削除されます"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"このSSOプロバイダの .env ファイル設定が不完全です"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSOが無効です"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"同じメールアドレスを持つユーザーアカウントは既に存在しますが、あなたの外部アカウントIDと一致しません。 このアドレスで 2FAuth に登録済みの場合は、SSOを使用しないでください。"}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"SSO認証が拒否されました"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"新規登録は受け付けていません"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"クエリパラメータに一度に含まれるIDidが多すぎます。上限は 100 です"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"URIを復号できません"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"このリソースを表示したり、このアクションを実行する権限がありません。"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"許可されていません"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"PAT暗号化の不明なエラー"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"不明なエラー"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"対応しているどの形式とも一致しません"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"未対応のOTPタイプです"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"認証プロキシまたは SSO を使用する場合は適用されません"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"この認証手段は管理者専用です。ユーザーは SSO でログインしてください。"}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーアカウントを削除できませんでした。データは保存されたままです"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー ID は 1 文字以上 64 文字以内でなければなりません"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"現在のパスワードが間違っています。変更は行われていません"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードが正しくありません"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"名無 権兵衛"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"アカウント"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティコードを生成するアルゴリズム"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"アルゴリズム"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーが2FAuth拡張機能などのサードパーティアプリで認証するためのPATを作成できるようになります"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"PATの使用を許可"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"サーバーへ認証するパーソナルアクセストークン(PAT)です。 2FAuthのユーザーアカウントの設定 > OAuth ページから生成することができます"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"APIトークン"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"一定時間後に画面上のパスワードを自動で非表示にします。うっかりパスワードを表示させたまま、無駄なパスワード更新リクエストが送られるのを防ぎます。"}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"OTPを自動で隠す"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"自動ロック"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"この期間操作がないと、自動的にログアウトします。 プロキシが認証を処理していて、ログアウトURLが指定されていない場合は効果がありません。"}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"自動ロック"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"スキャンまたはQRコードをアップロードすると、「保存」ボタンを押さなくても新しいアカウントを自動的に登録します。"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"アカウントの自動保存"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"環境変数の変更や更新の後などにキャッシュのクリアが必要になる場合があります。ここから実行できます。"}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"キャッシュ管理"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth の新バージョンが GitHub で公開されているか自動(週 1 回)で確認し、通知します"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"更新を確認する"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"コードがクリップボードにコピーされた直後に検索欄を空にします"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"コピー後に検索欄を消去"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"生成されたパスワードをクリックしてコピー後、自動的に非表示にします。"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"コピーした後にOTPを閉じる"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"新しいパスワード(確認用)"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"画面に表示された瞬間に生成されたパスワードを自動的にコピーします。 ブラウザの制約により、最初の時間ベースワンタイムパスワード (TOTP)パスワードのみがコピーされ、更新後のものはコピーされません。"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"表示されたOTPをコピー"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"カウンタ値を編集すると、アカウントとサービスの認証サーバーの同期が崩れるおそれがあります。意味を理解している方のみ、錠のアイコンからこの項目の変更を許可してください。"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"初期カウンタ値"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"既定は 0 です"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"カウンタ"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"本人確認のため、現在のパスワードを入力してください"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"現在のパスワード"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"新規作成したアカウントが所属するグループ"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"既定のグループ"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"「選択画面を飛ばす」を有効にした際の読み込み方式"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"既定の読み込みモード"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"生成されるセキュリティコードの桁数"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"桁数"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"すべてのセキュリティデバイスを失効させます。デバイスを紛失したり、データが漏洩したと思われる場合に使用します。"}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"すべてのセキュリティデバイスを無効化"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"新規ユーザー登録を禁止します。上書き(下記参照)されない限り、SSOにも影響し、新規ユーザーはSSOでもサインインできなくなります。"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"登録を無効にする"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"アカウント一覧をリストで並べるかグリッドで並べるかを選択します。"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"表示モード"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"メールアドレス"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"訪問者が外部 ID のシングルサインオンを利用して認証できるようにします。"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"SSO を有効化"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"拡張機能のロックを解除するためのパスワード"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"現在のパスワード"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"拡張機能をロックし、必要に応じてデータを暗号化する新しいパスワード"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"新しいパスワード"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"拡張機能をロックし、必要に応じてデータを暗号化するパスワード"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"パスワード"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"アカウント追加時に2FAプロバイダの公式アイコンを取得(しようと)します。"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"公式アイコンを取得"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"アカウントに割り当てるグループ"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"グループ"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"この 2FAuth インスタンスの稼動状態を確認できる URL です。この URL は Docker HEALTHCHECK や Kubernetes HTTPS Liveness プローブの設定に使用できます。"}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"稼働状況エンドポイント"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"サインアップした2FAuthインスタンスのアドレス。例: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuthサーバーURL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"指定したバリエーションにアイコン取得を狭めます。バリエーションがない場合、2FAuthは通常のバリエーションにフォールバックしようとしません。"}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"厳密なアイコン取得"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"いくつかのアイコンは、ダークまたはライトモードのユーザーインターフェースに最適なバリエーションで使用できます。 最初に探したいバリエーションを設定します。通常のバリエーションはフォールバックとして取得されます。"}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"アイコンのバリエーション"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"アイコン"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーに管理者権限を付与します。管理者はアプリ全体(設定や他のユーザー)を管理する権限を持っていますが、所有していない2FA用のパスワードは生成できません。"}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"管理者権限"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"新規登録が無効でも、新規ユーザーがSSO経由で初回サインインすることは許可する"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO登録は許可する"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth のUIを表示するための言語。リストにある言語は翻訳済みです。いずれかを選択してブラウザ設定を上書きできます。"}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"言語"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"デバイスの名前を設定"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"名前"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"新しい名前"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"新しいパスワード"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth アカウントへの接続失敗があった時にメールを受け取る"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"ログイン失敗時"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"新しいデバイスから 2FAuth アカウントに接続した時にメールを受け取る"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"新規デバイス接続時"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"以下の項目は、必要がない限り空白のままで結構です。最も一般的な値が使用されます。"}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"OTPの表示方法と表示時間を設定します。"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"パスワードの表示方式"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"時間ベースのOTPか、HMACベースのOTPか、Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"OTPの種類を選択してください"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"読みやすさと覚えやすさの好みに合わせて、パスワードの数字の区切り方を変更します。"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"パスワードの整形"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"パスワード"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"生成されるセキュリティコードの有効期間(秒)"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"既定は 30 です"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"有効期間"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"次回アクセス時に最後に使用したグループフィルタを適用します。"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"グループフィルタを記憶"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"フィルタリスト"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"限られたメールアドレスでのみ登録可能にします。両方のルールを同時に使用できます。SSO経由での登録には影響しません。"}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"登録を制限する"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"正規表現に一致するメールアドレスを許可します。"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"フィルタルール"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"●で隠されたパスワードを一時的に表示できるようにします。"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"隠されたOTPを表示する"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティコードの生成に使用されるキー"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"シークレット"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"サービス"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"メイン画面にアカウントのアイコンを表示します。"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"アイコンを表示"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"直接メニューのリンクを表示する代わりに、ログイン中のユーザーのメールをフッターに表示します。メールアドレスをクリック/タップすると、リンクへのメニューが表示されます。"}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"フッターにメールを表示"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"次のパスワード(有効期限が切れた時に現在のパスワードを置き換えるパスワード)をプレビューします。現在の OTP の設定は次の設定にも適用されます (書式設定、ドットとして表示)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"オンにすると、並び替えで大文字と小文字のアカウント名を分離させます。"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"並び替えで大文字小文字を区別"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"アイコンをデータベースに保存"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"インスタンスのメール設定を確認するためのテストメールを送信します。 メール設定が正しくないと、ユーザーはパスワードリセットを要求できなくなります。"}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"メール設定テスト"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"配色を指定するか、システム/ブラウザ設定に任せるかを選択します。"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"配色"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"このアプリケーションで表示するすべての日付と時刻に適用されるタイムゾーン"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"タイムゾーン"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"QRコードを読み取る際に支障がある場合は、低機能ですが問題の起きにくいQRコードリーダーに切り替えることができます。"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"簡略版QRコードリーダーを使用"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"機密データ(2 要素認証シークレットやメールアドレス)が暗号化してデータベースに保存されます。暗号化キーとなるので、.env ファイル内の APP_KEY の値(またはファイル全体)は必ずバックアップしてください。キーが失われるとデータは復号できません。"}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"機密データを保護"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth にログインできる手段を SSO 限定にします。通常ユーザーはパスワードと Webauthn によるログインができなくなります。管理者はこの制限の影響を受けません。"}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"SSO のみ"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 以外を無効化"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"読み込み方式を選択する画面を表示するか、直接既定の読み込み画面を開くかを選択します。"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"選択画面を飛ばす"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"OTPをコピーした後、常に既定のグループに戻ります"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"コピー後に既定のグループを表示"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"このアプリについて"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"アクセスログ"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"アクセス"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"アカウントの復元"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"認証"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードを変更"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"危険な操作"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"データの読み込み"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"アカウントの削除"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"環境"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"全般"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"グループ一覧"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"インポート"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"最終アクセス一覧"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"ログイン"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"新規アカウント"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"新規グループ"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"新しいパスワード"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"新規トークン"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"新規ユーザー"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"通知"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"一般設定"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"パスワード"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"個人アクセストークン"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"設定"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"プロフィール"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QRコード"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"登録"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"デバイス名の変更"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"参照"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティデバイス"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティ"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"シングルサインオン (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO でログイン"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"ストレージ"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"対応する移行用フォーマット"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"許可されていません"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー管理"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn ログイン"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"1 日で"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 時間で"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 分で"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 分で"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 分で"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 分後"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 分で"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 分で"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"アカウント"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"最近使用したグループ"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"詳細フォーム"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"クリック/タップで"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"何もしなくても、ホーム画面にすべてのパスワードを表示"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"ホーム画面ですべて"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"すべて"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"アカウントをクリックして個別の画面でパスワードを開く"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"個別の画面で開く"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"アプリの機能"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"自動"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"戻る"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"ブラウザの設定"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"ブラウザー"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"キャンセル"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードを変更"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"すべて"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"今すぐ確認"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"アップロード"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"クリア"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"閉じる"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"常に表示"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"続行"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"クリップボードにコピー"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"コピー"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"作成"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"クレジット"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"ダーク"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"既定"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーを削除"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを削除"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"削除"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"端末"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"すべて破棄"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"重複をすべて破棄"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"完了する"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"エクスポート"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 分で"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 分で"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"生成"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"GitHub"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"グリッド"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"数字を前半と後半に区切る"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"半分ずつ"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"適当に取得"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"すべてインポート"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"インポート"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IPアドレス"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"発行者"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"ライト"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"リスト"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QRコードスキャナー"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"移動"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"私のデバイス"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"しない"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"追加"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"グループなし"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティコードをコピー後"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"1 日で"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 時間で"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 分で"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1ヶ月"}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1年"}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"ブラウザで開く"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"一般設定"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"数字を 2 桁ずつ区切る"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"2 桁ずつ"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"プレーンテキスト"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QRコードから転記"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QRコード"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"再読み込み"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"デバイスの登録"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"アイコンを削除"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"メールを再送信"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"取り消し"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"保存"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QRコードをスキャン"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"検索"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"リセット用リンクを送信"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"復元用リンクを送信"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"送信"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"サインイン"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"サインアウト"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"送信"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 分で"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"テスト"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"テキストファイル"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 分で"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"時刻"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"インポート"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"数字を 3 桁ずつ区切る"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"3 桁ずつ"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 分後"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 形式"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"ロック解除"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"更新"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QRコードをアップロード"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"環境変数"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:"ヶ月"}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (ブルガリア語)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (デンマーク語)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (ドイツ語)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (英語)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (スペイン語)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (フランス語)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (ヒンディー語)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano(イタリア語)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (日本語)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (韓国語)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (オランダ語)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (ポルトガル語、ブラジル語)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (ロシア語)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (トルコ語)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (簡体中国語)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"このアプリについて"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"管理者パネル"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"ホームへ戻る"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"設定"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"続行"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"新しいグループを作成"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーを作成"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"PATの作成方法"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"編集"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"新しいトークンを生成"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuthへ移動"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth の翻訳に協力"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"IDとパスワード"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"グループを管理"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"あとで"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"アカウントの復元"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"デバイス新規登録"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"新規登録"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"リセットする"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"拡張機能をリセット"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"スキャン"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティデバイス"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"ログ全体を見る"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"プロバイダを有効にする方法"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"設定"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"SSO なしでサインインできます"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"サインイン"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth エクスポートスキーマ"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"詳細フォームを記入"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"GitHub で見る"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"あなたの2要素認証 (2FA) アカウントを管理し、セキュリティコードを生成するウェブアプリ"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"あなたの2要素認証 (2FA) アカウントを管理し、セキュリティコードを生成するウェブアプリ"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" の完全なアクセスログ"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"このアカウントは OAuth 経由で "},{t:4,k:"provider"},{t:3,v:" アカウントにひも付けられています"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"あなたは "},{t:4,k:"provider"},{t:3,v:" アカウントのSSO経由でサインインしています。ここでは、"},{t:4,k:"provider"},{t:3,v:" 以外の情報は変更できません。"}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"アカウント復元メールを送信しました!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"以下の方法で最初のアカウントを追加しましょう"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"インスタンス上の登録ユーザーの管理や、新規作成を行います。"}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"すでに認証済みです。一度ログアウトしてください。"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"登録済みの方は"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"または"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps Lock がオンです!"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーアカウントと全2FAデータが削除されます。"}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"あなたのアカウントとすべての 2 要素認証データが削除されます。元に戻すことはできません。"}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth アカウントを削除しても、あなたの外部SSOアカウントに影響はありません。"}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"グループを削除しても、アカウントは削除されません"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"選択画面を飛ばす"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"デモモードでは無効な機能です"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"2 要素認証アプリからデータをエクスポートする際にパスワード保護や暗号化をかけないでください。2FAuth で読み込めなくなります。"}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"アカウントをお持ちでない方は"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:4,k:"email"},{t:3,v:" にメールを送信"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"エラーが発生しました"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"形式:1 行につき otpauth URI 1 件"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:" にログイン失敗"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"失敗"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードをお忘れですか?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"半角小文字を含む"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"半角数字を含む"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"半角記号を含む"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"半角大文字を含む"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"こんにちは、 "},{t:4,k:"username"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"管理者?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"元のアプリのエクスポート機能を使用して、QRコードやJSONファイルにデータを出力し、読み込ませてください。"}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"さまざまな 2 要素認証アプリから 2FAuth にデータを取り込めます。"}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"完了"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- 無効なアカウント -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"このリセットトークンは無効です"}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- 無効なサービス -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 文字以上"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:4,k:"date"},{t:3,v:"に最終ログイン"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"ロゴ:"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"デバイスをなくした?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"フレームワーク:"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"今すぐ必ずこの個人アクセストークンをコピーしてください。このトークンは二度と表示されません。"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"グループを作成して、アカウントを必要に応じて整理できます。 すべてのアカウントは、所属するグループにかかわらず、仮想的なグループ「すべて」の中で確認できます。"}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"必須条件"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"移動先を選ぶ"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"以下のオプションを有効にするには、1 つ以上デバイスを登録してください"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"初めてですか?"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"エントリなし"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"プロバイダがありません"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"該当なし"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- サービスなし -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"プロバイダーが見つかりませんか?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"なし"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"具体的な情報は以下の通りです"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"心当たりがある場合は、この通知を無視しても構いません。今後も行為が続く場合は、2FAuth の管理者に相談し、セキュリティ設定の見直しや攻撃者への対処を検討してください。"}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"あなたの 2FAuth アカウントへのログイン失敗が発生しました。"}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth へのログイン失敗発生"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"こんにちは"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"この接続の詳細は以下の通りです"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"心当たりがある場合は、この通知を無視しても構いません。アカウントへの不審な行為が疑われる場合は、パスワードをご変更ください。"}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"新しいデバイスがあなたの2FAuthアカウントに接続されました。"}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"新しいデバイスから 2FAuth に接続しました"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"よろしくお願いします"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"このメールはあなたの要望に応じて送信された、2FAuth インスタンスのメール設定検証用のテストメールです。"}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth テストメール"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"届いているようですね!"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"または外部認証を利用:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI は 2FA データの交換に使用される最も一般的な形式で、ウェブサイトで 2FA を有効にした時に QR コードなど形で表示されるものです。2FAuth から移行したい場合は、これを選択します。"}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"データを otpauth URI のリストとしてエクスポート"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"データを解析中..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"パスワードと WebAuthn ログインは無効です。"}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーには失効したパスワードリセット要求があります。つまり、このユーザーは有効期間内にパスワードを変更しませんでした。要求したのはユーザー自身である場合も、管理者である場合もあります。"}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"このユーザーにはパスワードリセット要求(送信時刻:"},{t:4,k:"datetime"},{t:3,v:")が送られています。つまり、このユーザーに送られたリンクはまだ有効で、パスワードは変更されていません。要求したのはユーザー自身である場合も、管理者である場合もあります。"}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"完全に同一のアカウントがすでに存在します"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを復元するため、2FAuth は Webauthn の設定を一部リセットし、メールアドレスとパスワードでログインできるようにします。"}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:4,k:"date"},{t:3,v:"に登録"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth はこのアドレスにパスワードリセット用のリンクを送信します。受信したメール内のリンクをクリックして、新しいパスワードを設定してください。"}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"常にSSOを使用してログインしていた場合は、一度ログアウトし、パスワードリセットの機能を使用して、ここに記入するパスワードを取得してください。"}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"デバイスの取り消しは元に戻せません"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"取り消したトークンは元に戻せません"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth にログインできる認証デバイス。セキュリティキー(Yubikey など)や生体認証機能を備えたスマートフォン(Apple FaceId/TouchId など)のようなものです。"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"サインインに使う SSO プロバイダを選択:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"ログイン方式:"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"ブラウザの設定言語で翻訳が欠けていますか?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"通常のユーザーは SSO でサインインする必要があります。他の手段は管理者専用です。"}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"認証は SSO のみ、"},{t:4,k:"auth_method"},{t:3,v:" は無効です"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"搭載されたカメラは未対応です"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"別のデバイス/カメラを使用してください。"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"カメラストリーミングにHTTPSが必要です"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"スキャンできません (´・ω・`)"}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"通常は、ブラウザのアドレスバーの横にある斜線の引かれたカメラアイコンをクリックすると起動できます。"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"カメラへのアクセス権限がありません"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"デバイスのカメラへのアクセスを許可してください。 以前にアクセスを拒否し、ブラウザが再度権限を要求しなくなった場合は、ブラウザのドキュメントに従って操作してください。"}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"カメラが見つかりません"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"ウェブカメラは正しく接続されていますか?"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"スキャナーの起動に失敗"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"カメラを使用中ですか?カメラを使っている他のアプリを止めて再度お試しください。"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"安全な通信が必要です"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"ライブスキャンにはHTTPSが必要です。コンピュータで 2FAuth を実行している場合は、localhost 以外の仮想ホストを使用しないでください。"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"このブラウザは Stream API に対応していません"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"最新のブラウザを使用してください。"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"移行データから以下の 2 要素認証アカウントが抽出されました。2FAuth にはまだ取り込まれていません。"}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:" にログイン成功"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:4,k:"logout_at"},{t:3,v:" にログアウト成功"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"対応形式:プレーンテキスト, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"対応形式:jpg, jpeg, png, bmp, gif, svg, webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"ここで削除すると、二度と元には戻りません!"}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"ログインの試行回数が多すぎます。"},{t:4,k:"seconds"},{t:3,v:" 秒後にお試しください。"}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"個人アクセストークンを使用して、任意のアプリから 2Fauth API で認証することができます。 アクセストークンは、クライアントアプリからのリクエストで認証ヘッダーに Bearer トークンとして指定する必要があります。"}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"復元可能なバックアップを作成する必要がある場合は、このオプションを選択してください。この形式はアイコンにも対応しています。"}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth の JSON スキーマでデータをエクスポート"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"スキーマ定義の説明は:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UIアイコン:"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"各ボタンから取り込むか破棄するかを選択してください。"}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"これからセキュリティデバイスを使用して認証を行います。キーは接続し、マスクや手袋は外しましょう。"}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:3,v:"有効なトークン"},{t:4,k:"count"},{t:3,v:" 件"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:3,v:"セキュリティデバイス (passkey)"},{t:4,k:"count"},{t:3,v:" 台"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:" に閲覧"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn ログインが無効です"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth へようこそ"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:3,v:"アカウント数"},{t:4,k:"count"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" が利用可能"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" 件選択中"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"最新版を使用しています"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを作成しました!"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを更新されました"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを削除しました"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを移動しました"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"認証失敗"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"自動ロックが作動し、ログアウトされました。"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"キャッシュが消去されました"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"コピーしました!"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"サーバー側の変更を反映してデータを更新しました"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"デバイスを失効させました!"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"デバイスを登録しました!"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"グループ名を保存しました"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"グループを作成しました"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"グループを削除しました"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"パスワードがリセットされました"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーの PAT が取り消されました"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"プロフィールを更新しました!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーのセキュリティデバイスが失効しました"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"設定を保存しました"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"トークンを取り消しました"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"アカウントを削除しました"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーを作成しました"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーの身分が更新されました"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"有効なアカウント"},{t:4,k:"count"},{t:3,v:" 件"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"次 »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« 前"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードは8文字以上で、確認欄と一致する必要があります。"}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"パスワードをリセットしました。"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"パスワードリマインダーを送信しました。"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"時間を置いて再度お試しください。"}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"このパスワードリセットトークンは無効です。"}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"このメールアドレスに一致するユーザーを見つけることが出来ませんでした。"}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー名、メールアドレス…"}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"見つかりません"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"このアプリについて"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"アカウント一覧"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"アプリの機能"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"認証"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー作成"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"アクセスログ"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー管理"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"ユーザー管理"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"自動ロック"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"QR読み取り"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"アカウント作成"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"グループ作成"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"アカウント編集"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"グループ編集"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"操作制限"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"エラー"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"グループ一覧"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"アカウントのインポート"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"ログイン"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"パスワードリセット"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"新しいパスワード"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"ユーザーアカウント"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"新規個人トークン"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuthトークン"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"一般設定"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn デバイス"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"デバイス編集"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"設定"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"アカウントのQRコード"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"新規アカウント"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"ロック解除"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"アカウントの復元"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"デバイス新規登録"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"検索を消去"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"選択をすべて解除"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:4,k:"pagetitle"},{t:3,v:"ページを閉じる"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"クリップボードにコピー"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"削除"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"これを破棄"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"選択したアカウントをエクスポート"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"テストパスワードを生成"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"グループ選択を閉じる"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードを非表示"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"これをインポート"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"ロックする"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"選択した項目をグループに移動"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"データを otpauth URI のリストとしてエクスポート"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"名前を変更"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーにパスワードリセットメールを再送信する"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーのパスワードをリセット"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードを表示"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーの全セキュリティデバイスを失効"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"このユーザーの全トークンを取り消し"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"取り消し"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"検索"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"すべて選択"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"グループ選択を開く"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"先月のエントリを表示"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"昨年からのエントリを表示"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QRコードを表示"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"過去6ヶ月間のエントリを表示"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"過去3ヶ月間のエントリを表示"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"セキュリティデバイスでログイン"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"昇順に並べ替え"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"古い順"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"新しい順"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"降順に並べ替え"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth の JSON スキーマでデータをエクスポート"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"ロックを解除(自己責任で)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QRコードからデータをかんたん記入"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:":otherが:valueの場合、:attributeを有効にする必要があります。"}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:":attributeを承認してください。"}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、有効なURLではありません。"}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:date以降の日付を指定してください。"}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:dateより後の日付を指定してください。"}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、半角の英数字('A-Z', 'a-z', '0-9')、ハイフン(-)、下線(_)のみ使用できます。"}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、半角英数字('A-Z', 'a-z', '0-9')のみ使用できます。"}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、半角英字('A-Z', 'a-z')のみ使用できます。"}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、配列を指定してください。"}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、英数字と記号(ASCII)のみ使用可能です。"}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:date以前の日付を指定してください。"}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:dateより前の日付を指定してください。"}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目は、:min個から:max個にしてください。"}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:min KBから:max KBまでのサイズのファイルを指定してください。"}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:minから、:maxまでの数字を指定してください。"}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:min文字から:max文字にしてください。"}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、'true'か'false'を指定してください。"}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:":attributeに禁止された値が含まれています。"}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attributeと:attribute確認が一致しません。"}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:":attributeに必須の値がありません。"}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"パスワードが違います。"}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:":attributeにコロンを含めることはできません。"}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"このメールアドレスは登録ルールに適合していません"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"このメールアドレスを使用するアカウントは見つかりませんでした。"}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"すべてのアドレスは有効かつ、パイプ ("},{t:2,i:[{t:3}],s:") で区切られている必要があります"}]}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"サポートされている形式は jpeg, png, bmp, gif, svg, webp です。"}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDはコンマで区切り、最後にはコンマを入れないでください。"}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"uri にはラベルが必要です。"}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:":attributeはサポートされていません。"}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"サポートされている形式は jpeg, png, bmp, gif, svg, webp です。"}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:":attributeは base32 エンコード文字列を指定してください。"}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:":attributeにコロンを含めることはできません。"}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、有効な otpauth uri ではありません。"}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attributeは:dateに等しい日付でなければなりません。"}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attributeの形式は、':format'と合いません。"}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、正しい日付ではありません。"}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:":otherが:valueの場合、:attributeを無効にする必要があります。"}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:":attributeを拒否する必要があります。"}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attributeと:otherには、異なるものを指定してください。"}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:min桁から:max桁にしてください。"}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:digits桁にしてください。"}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attributeの画像サイズが無効です"}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attributeの値が重複しています。"}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:":attributeは「:values」以外で終わる必要があります。"}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:":attributeは「:values」以外で始まる必要があります。"}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、有効なメールアドレス形式で指定してください。"}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、次のうちのいずれかで終わらなければなりません。: :values"}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"選択した:attributeは無効です。"}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"選択された:attributeは、有効ではありません。"}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute には、次のいずれかの拡張子が必要です: :values"}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeはファイルでなければいけません。"}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attributeは必須です。"}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目数は、:value個より大きくなければなりません。"}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:value KBより大きくなければなりません。"}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:valueより大きくなければなりません。"}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:value文字より大きくなければなりません。"}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目数は、:value個以上でなければなりません。"}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :value キロバイト以上でなければなりません。"}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :value 以上でなければなりません。"}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :value 文字以上でなければなりません。"}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:":attributeには正しい16進数カラーコードを指定してください。"}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、画像を指定してください。"}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:":attributeが:otherに存在しません。"}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"選択された:attributeは、有効ではありません。"}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、整数を指定してください。"}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、有効なIPアドレスを指定してください。"}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attributeはIPv4アドレスを指定してください。"}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attributeはIPv6アドレスを指定してください。"}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、有効なJSON文字列を指定してください。"}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:":attributeはリストにしてください。"}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:":attributeには小文字で入力してください。"}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目数は、:value個より小さくなければなりません。"}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:value KBより小さくなければなりません。"}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:valueより小さくなければなりません。"}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:value文字より小さくなければなりません。"}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目数は、:value個以下でなければなりません。"}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :value キロバイト以下でなければなりません。"}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :value 以下でなければなりません。"}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :value 文字以下でなければなりません。"}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":attributeはMACアドレスを指定してください。"}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :max 桁以下の数字でなければなりません。"}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目は、:max 個以下にしてください。"}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :max キロバイト以下でなければなりません。"}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :max 以下でなければなりません。"}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :max 文字以下でなければなりません。"}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:valuesタイプのファイルを指定してください。"}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:valuesタイプのファイルを指定してください。"}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :min 桁以上の数字でなければなりません。"}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目は、:min個以上にしてください。"}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:min KB以上のファイルを指定してください。"}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:min以上の数字を指定してください。"}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:min文字以上にしてください。"}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:":otherが :value の場合、:attributeには入力しないでください。"}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:":otherが :value 以外の場合、:attributeは入力しないでください。"}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:":values が全て指定されている場合、:attributeには入力しないでください。"}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:":values が指定されている場合、:attributeには入力しないでください。"}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:":attributeには入力しないでください。"}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:":attributeは :value の倍数でなければなりません。"}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"選択された:attributeは、有効ではありません。"}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attributeの形式が無効です。"}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、数字を指定してください。"}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"uri パラメータは単独または「custom_otp」パラメータと組み合わせて指定する必要があります。"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、英字を 1 文字以上含める必要があります。"}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、大文字と小文字をそれぞれ1文字以上含める必要があります。"}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、数字を 1 文字以上含める必要があります。"}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、記号を 1 文字以上含める必要があります。"}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"この:attributeはデータ漏洩の対象となった可能性があります。別の:attributeを選んでください。"}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:":otherが :value の場合、:attributeを必ず入力してください。"}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:":otherが :value 以外の場合、:attributeを必ず入力してください。"}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:":values が全て指定されている場合、:attributeも必ず入力してください。"}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:":values が指定されている場合、:attributeも必ず入力してください。"}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":attributeが存在している必要があります。"}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:":otherが:valueの場合、:attributeは入力しないでください。"}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:":otherが:values以外の場合、:attributeは入力しないでください。"}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:":attribute項目は入力しないでください。"}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:":attributeがある場合、:otherは存在できません。"}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、有効な正規表現を指定してください。"}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、「:values 」を含める必要があります。"}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:":otherが有効である場合、:attributeを指定してください。"}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:":otherが:valueの場合、:attributeを指定してください。"}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:":otherが:values以外の場合、:attributeを指定してください。"}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:":valuesが全て指定されている場合、:attributeも指定してください。"}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:":valuesが指定されている場合、:attributeも指定してください。"}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:":valuesが全て指定されていない場合、:attributeを指定してください。"}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:":valuesが指定されていない場合、:attributeを指定してください。"}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、必ず指定してください。"}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attributeと:otherが一致しません。"}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:":attributeを使用する場合、このリクエスト本文の唯一のパラメータにする必要があります。"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attributeの項目は、:size個にしてください。"}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:size KBのファイルを指定してください。"}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、:sizeを指定してください。"}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、:size文字にしてください。"}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、次のいずれかで始まる必要があります。:values"}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、文字を指定してください。"}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、有効なタイムゾーンを指定してください。"}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、有効なULIDでなければなりません。"}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"指定の:attributeは既に使用されています。"}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attributeのアップロードに失敗しました。"}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:":attributeには大文字で入力してください。"}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:":attributeには、正しいURLを指定してください。"}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attributeは、有効なUUIDでなければなりません。"}}}},{ko:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"계정을 설명하는 아이콘"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"스캔할 QR코드 이미지"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"정말 진행하시겠습니까?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"변경사항이 저장되지 않습니다. 계속하시겠습니까?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"이 사용자의 권한에 중요한 영향을 미칩니다. 계속하시겠습니까?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"정말 계정을 삭제하시겠습니까?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"정말 이 그룹을 삭제하시겠습니까?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"정말로 이 계정을 삭제하시겠습니까?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"정말 이 사용자를 삭제하시겠습니까? 되돌릴 수 없습니다."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"당신은 더 이상 관리자가 아니게 됩니다. 정말 계속하시겠습니까?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"정말 모든 계정을 삭제하시겠습니까?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"정말 모든 중복 항목을 삭제하시겠습니까?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"이 계정을 정말 삭제하시겠습니까?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"본인의 계정입니다. 계속하시겠습니까?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"정말 로그아웃 하시겠습니까?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"이전 요청을 정말 취소하시겠습니까?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"이 사용자의 비밀번호를 재설정하시겠습니까?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"이 장치를 삭제하시겠습니까?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"정말 이 토큰을 삭제하시겠습니까?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"정말로 공유 설정을 변경하시겠습니까?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"모든 사용자에게 이 계정 공유를 중단합니다. 정말로 진행하시겠습니까?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"모든 사용자에게 이 계정들의 공유를 중단합니다. 정말로 진행하시겠습니까?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"이 계정의 소유권을 잃게 됩니다. 정말로 진행하시겠습니까?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth의 도메인이 유효한 도메인이 아닙니다"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"사용자에 의해 중단됨"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"외부 제공업체가 관리하는 계정"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth가 인증 프록시 하에서 실행되도록 구성되었지만 프록시가 올바른 헤더를 반환하지 않습니다. 구성을 확인하고 다시 시도하세요."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"프록시 인증 실패"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"인증 방법에 검색 가능한 자격 증명 기능 없음"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"인증 방법에 사용자 확인 기능 없음"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"장치가 webauthn을 지원하지 않습니다. 최신 브라우저를 사용하여 다시 시도하세요."}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"시크릿키 없이는 OTP를 만들 수 없습니다."}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"암호를 해독할 수 없습니다. 이는 주로 2Fauth의 .env 구성 파일에 설정된 APP_KEY가 잘못되었거나 데이터베이스에 저장된 데이터가 손상된 경우 발생합니다."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"감지된 QR 코드를 인식할 수 없습니다. 이미지를 자르거나 선명한 이미지를 사용해보세요."}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"유일한 관리자 계정을 삭제할 수 없습니다"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"유일한 관리자 계정을 강등할 수 없습니다"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"이미지에서 QR 코드를 감지할 수 없습니다. 이미지를 잘라보세요."}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"변경 실패, 다시 시도해 주십시오"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"확인 실패, 나중에 다시 시도하세요"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"서버에서 데이터를 갱신할 수 없습니다"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"이 QR 코드의 데이터는 유효한 OTP 인증 URI가 아닙니다. QR 코드에 다음이 포함되어 있습니다:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"사용자가 만든 설정만 삭제할 수 있습니다"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"QR 코드 검색 중 오류 발생"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"이메일 전송 실패"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"읽을 수 없음, 데이터가 암호화되어 있음"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"암호화 키 생성 실패"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 데이터 가져오기 중 문제가 발생했습니다"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"암호 복호화에 실패했지만 데이터베이스는 여전히 보호됩니다. 이는 주로 하나 이상의 계정에 대해 암호화된 데이터의 무결성 문제로 인해 발생합니다."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"암호화에 실패하여 데이터베이스가 보호되지 않은 상태로 유지됩니다."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 마이그레이션에 실패했습니다. 이전 설정값으로 복원됩니다."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"인증 실패, PAT를 확인해 주십시오"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 서버 연결 불가, URL을 확인해 주십시오"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT 해독 실패"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"키 추출 실패"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT 암호화 실패"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 설정 실패"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"토큰 설정 실패"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"QR 스캔을 위한 스크립트 인젝트 실패"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"저장소 설정 불러오기 실패"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"IV 재생성 실패"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"애플리케이션 설정 검색 실패"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"암호화 저장소 데이터 불러오기 실패"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"자동 잠금 지연 시간 설정 실패"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"암호화 키 설정 실패"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"암호화 패러미터 설정 실패"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"암호화된 PAT 저장 실패"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"이 필드는 필수 항목이며 유효한 URL이어야 합니다"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"이 필드는 필수 항목입니다"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"파일 업로드 실패"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS context 필요"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*해독할 수 없음*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"유효하지 않은 2FA 데이터"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"유효하지 않거나 알 수 없는 개인 액세스 토큰"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"유효하지 않거나 읽을 수 없음 :appname 데이터"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"활성 탭 없음"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"지정된 알고리즘을 지원하는 인증서가 없습니다"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"'공개 키' 유형의 항목이 없습니다"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"이 변형에 대한 아이콘이 없습니다"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 팩에 항목 없음"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"이 사용자는 비밀번호를 재설정할 수 없습니다"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"사용 가능한 QR 이미지 데이터가 없습니다"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"페이지가 보이는 영역에서 유효한 QR 코드를 찾을 수 없습니다"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"인식 가능한 QR 코드 없음"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"이 QR코드에 유효한 OTP 리소스가 없습니다."}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"이 OTP 형식은 현재 지원되지 않습니다."}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"작업이 허용되지 않음"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"서버에서 OAuth 키 권한이 잘못되었습니다. 이 문제를 해결하려면 2FAuth 문서 사이트의 'v8로 업그레이드' 가이드를 참조하십시오."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"이 QR코드를 읽을 수 없습니다"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR 코드에 잘못된 체크섬이 있습니다."}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"새로고침"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"이미 존재하는 이름입니다. 다른 이름을 선택해 주십시오"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"문자, 숫자, 대시, 언더바, 공백 또는 작은따옴표만 사용해 주십시오"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"요청이 신뢰할 수 있는 프록시에서 오지 않았습니다"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"리소스를 찾을 수 없음"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"장치가 이미 등록됨"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"보안 오류: WEBAUTHN_ID 환경 변수를 확인하십시오"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"모든 사용자 공유 범위 비활성화"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"공유 기능 비활성화"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"서버에 문제가 발생했습니다."}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"불필요한 공백은 자동으로 제거됩니다."}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"이 SSO 제공자가 .env 파일에 올바르게 설정되어 있지 않습니다."}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO 비활성화됨"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"동일한 이메일 주소를 가진 사용자 계정이 이미 존재하지만 외부 계정 ID와 일치하지 않습니다. 이 이메일로 이미 2FAuth에 등록되어 있는 경우 SSO를 사용하지 마세요."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"SSO를 통한 인증이 거부됨"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"가입 비활성화됨"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"이 계정은 이미 모든 사용자에게 공유되어 있습니다."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"이 계정은 모든 사용자에게 공유되어 있지 않습니다"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"쿼리 매개 변수에 너무 많은 ID가 포함되었습니다(최대 100개 허용)"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"URI를 인식할 수 없습니다"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"이 리소스를 보거나 작업을 수행할 수 있는 권한이 없습니다"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"권한 없음"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"PAT 암호화 중 알려지지 않은 오류 발생"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"알 수 없는 오류"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"지원되는 데이터 형식이 아닙니다"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"지원되지 않는 OTP 형식"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"지원되지 않는 공유 범위"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"인증 프록시 또는 SSO를 사용하는 경우에는 적용할 수 없습니다"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"이 인증 방법은 관리자만 사용할 수 있습니다. 일반 사용자는 SSO로 로그인해야 합니다."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"사용자 계정 삭제 실패, 데이터가 삭제되지 않음"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"사용자 ID가 1~64자 사이가 아닙니다"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"현재 비밀번호가 잘못되어 변경사항이 저장되지 않습니다."}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"잘못된 비밀번호"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"홍길동"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"계정"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"보안 코드 보안에 사용되는 알고리즘"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"알고리즘"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"사용자가 개인용 액세스 토큰(PAT)을 생성하고 2FAuth 웹 확장과 같은 제3자 애플리케이션에 인증하는 데에 사용할 수 있도록 합니다"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"PAT 사용 허가"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능에서 서버 인증을 위한 개인 액세스 토큰(PAT)입니다. 2FAuth 사용자 계정의 설정 > OAuth 페이지에서 생성할 수 있습니다"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API 토큰"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"일정 시간이 지나면 화면에 표시된 비밀번호를 자동으로 숨깁니다. 비밀번호 보기를 닫는 것을 잊어버렸을 때 불필요한 비밀번호 요청을 피할 수 있습니다."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"OTP 자동 닫기"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능을 자동으로 잠가 데이터 불법 접근을 방지합니다"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"자동 잠금"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"활동이 없는 경우 사용자를 자동으로 로그아웃합니다. 프록시에 의해 인증이 처리되고 사용자 지정 로그아웃 Url이 지정되지 않은 경우에는 작동하지 않습니다."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"자동 잠금"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"QR코드를 스캔 또는 업로드하면 '저장' 버튼을 누르지 않아도 자동으로 새 계정을 등록할 수 있습니다."}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"계정 자동 저장"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"환경 변수를 변경하거나 업데이트한 후와 같은 경우 캐시를 삭제해야 할 수 있습니다. 아래에서 삭제할 수 있습니다."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"캐시 관리"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth의 새 릴리스가 Github에 게시되면 자동으로 확인(일주일에 한 번) 하고 알려줍니다."}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"새로운 버전 확인"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"코드를 클립보드에 복사한 직후 검색 창을 비웁니다."}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"복사 후 검색 창 지우기"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"생성된 비밀번호를 클릭하여 복사하면 화면에서 비밀번호가 자동으로 숨겨집니다."}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"복사 후 OTP 닫기"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"새 비밀번호 확인"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"생성된 비밀번호가 화면에 나타난 직후 자동으로 복사됩니다. 브라우저의 제한으로 인해 갱신된 비밀번호는 복사되지 않으며, 처음 Time-based One-Time Password (TOTP) 비밀번호만 복사됩니다."}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"OTP를 화면에 복사"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"카운터 값을 편집하면 계정과 서비스 인증 서버의 동기화가 해제될 수 있습니다. 이를 이해한 경우에만 자물쇠 아이콘을 통해 이 항목의 변경을 허용해 주세요."}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"초기 카운터 값"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"기본값 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"카운터"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"본인임을 확인하기 위해 현재 비밀번호를 입력하세요"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"현재 비밀번호"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"새로 만든 계정이 연결된 그룹"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"기본 그룹"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"직접 입력 옵션이 켜짐일 때 사용되는 기본 입력 모드"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"기본 입력 모드"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"생성된 보안 코드의 자릿수"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"자릿수"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"모든 보안 장치가 비활성화됩니다. 보안 장치를 분실했거나 보안 위협이 발생한 경우 이 옵션을 사용하세요."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"모든 보안 장치 비활성화"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"새 사용자 가입을 방지합니다. 재정의하지 않는 한(아래 참조), 이 설정은 SSO에도 영향을 미치므로 새 사용자는 SSO를 통해 로그인할 수 없습니다."}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"가입 비활성화"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"계정을 목록으로 표시할지 그리드로 표시할지 선택합니다."}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"보기 방식"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"이메일"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"사용자가 이 2FAuth 인스턴스의 다른 사용자와 2FA 계정을 공유하는 것을 허용합니다. 공유된 2FA 계정은 수신자를 공유하여 OTP 코드를 생성하는 데에 사용되며 열람할 수 있습니다. 계정의 소유자만 편집, 삭제 또는 내보낼 수 있으며 시크릿 키를 보거나 계정 공유 설정을 관리할 수 있습니다."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"공유 활성화"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"모든 사용자 범위는 2FAuth 인스턴스의 모든 사용자를 대상으로 할 수 있습니다. 계정이 이 수준으로 공유되면 설정 후 생성되는 계정을 포함하여 모든 사용자와 자동으로 공유됩니다."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"이 설정을 비활성화하면 모든 사용자 범위의 기존 공유가 비활성화되지만, 철회되지는 않습니다. 나중이 이 설정을 다시 활성화하면 그 동안 특정 사용자와의 공유가 설정되지 않는 한 이러한 공유가 다시 활성화됩니다."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"'모든 사용자' 공유 범위 활성화"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"방문자가 Single Sign-On 을 통해 외부 ID를 사용하여 인증할 수 있도록 허용"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"SSO 활성화"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능 잠금 해제를 위해 사용 중인 비밀번호"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"현재 비밀번호"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능을 잠그고 민감한 데이터를 암호화할 때 사용되는 새로운 비밀번호"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"새 비밀번호"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"이 확장 기능을 잠그고 민감한 데이터를 암호화할 때 사용되는 비밀번호"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"부분 검색은 사용자명에 지원되며, 이메일은 정확히 일치해야 합니다"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"공유할 사용자 찾기"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"계정을 추가할 때 가능한 경우, 2FA 발급자의 공식 아이콘을 불러옵니다."}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"공식 아이콘 불러오기"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"계정을 할당할 그룹"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"그룹"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 인스턴스 상태를 확인하기 위해 방문할 수 있는 URL입니다. 이 URL은 Docker HEALTHCHECK 또는 Kubernetes HTTPS Liveness probe를 설정하는 데에 사용할 수 있습니다."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health 엔드포인트"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"가입한 2FAuth 인스턴스 웹 주소. 예시: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 서버 URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"공식 아이콘이 필요할 때 가장 먼저 참조하는 아이콘 컬렉션"}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"선호하는 온라인 컬렉션"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"아이콘을 온라인 로고 컬렉션에서 가져올지, 로컬 아이콘 팩에서 가져올지 결정합니다. 아이콘 설정을 변경해도 이미 가져온 아이콘은 변경되지 않습니다."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"아이콘을 가져올 곳"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"공식 아이콘이 필요할 때 사용하는 아이콘 팩입니다. 아이콘 팩은 팩 디렉토리를 2FAuth 서버에 업로드하여 사용할 수 있습니다, 자세한 내용은 인스턴스 관리자에게 문의하십시오."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 팩"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"가져오는 범위를 지정된 버전으로 축소합니다. 2FAuth는 기본 버전을 예비로 가져오지 않습니다."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"엄격한 가져오기"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"일부 아이콘은 다크 모드 또는 라이트 모드 인터페이스 맞도록 다양한 버전으로 제공됩니다. 먼저 표시할 버전을 선택하십시오. 기본 버전은 자동으로 예비로 가져옵니다."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 버전"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"아이콘"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"사용자에게 관리자 권한을 부여합니다. 관리자는 '설정' 및 '사용자'와 같은 전체 앱을 관리할 수 있는 권한을 갖지만 자신이 소유하지 않은 2FA의 비밀번호를 생성할 수는 없습니다."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"관리자 여부"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"등록은 비활성화 되었어도 신규 사용자가 SSO를 통해 처음 로그인할 수 있도록 허용"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO 가입을 활성화된 상태로 유지"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 사용자 인터페이스를 번역하는 데 사용되는 언어입니다. 표시된 언어는 번역이 완료된 언어이며, 원하는 언어로 설정하여 브라우저 기본 설정을 무시할 수 있습니다."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"언어"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"장치 이름"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"이름"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"새 이름"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"이 계정의 소유권이 이전될 사용자."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"신규 소유자"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"새 비밀번호"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 계정에 로그인 시도가 실패할 때마다 이메일 받기"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"로그인 실패 시"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"새 장치가 2FAuth 계정에 처음으로 연결되면 이메일 받기"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"새로운 기기 연결 시"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"설정 방법을 모른다면 다음 옵션을 비워 두어도 됩니다. 가장 일반적으로 사용되는 값이 적용됩니다."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords OTP가 표시되는 방법과 시기를 설정합니다"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 표시"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"시간 기반 OTP, HMAC 기반 OTP, Steam OTP 중 선택 가능"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"생성할 OTP 유형"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호를 더 쉽게 읽고 기억할 수 있도록 숫자를 그룹화하여 표시 방식을 변경합니다."}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 서식 지정"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"생성된 보안 코드의 유효 기간(초)"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"기본값 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"주기"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"다음 접속 시 마지막으로 사용한 그룹 필터를 적용합니다."}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"그룹 필터 기억"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"이 목록에 있는 이메일 주소는 등록이 허용됩니다. 주소는 파이프('|')로 구분하십시오"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"필터링 목록"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"제한된 이메일 주소만 가입할 수 있도록 설정합니다. 두 규칙을 동시에 사용할 수 있습니다. 이는 SSO를 통한 가입에는 영향을 미치지 않습니다."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"가입 제한"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"이 정규식과 일치하는 이메일은 가입이 허용됩니다."}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"필터링 규칙"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"점으로 가려진 비밀번호를 일시적으로 표시합니다."}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"가려진 OTP 보기"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"보안 코드를 생성하는 데 사용되는 키"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"시크릿키"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"서비스"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"메인 화면에 계정 아이콘을 표시합니다"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 표시"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"하단 영역에 직접 네비게이션 링크 대신 로그인된 사용자의 이메일을 표시합니다. 이메일을 클릭/탭하여 표시되는 메뉴에서 링크에 접근할 수 있습니다."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"하단 영역에 이메일을 표시합니다"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"기본 보기의 그룹 선택기에 이 그룹을 칩으로 표시합니다. 사용자 설정에서 '칩을 사용하여 토글'을 비활성화하면 아무런 영향을 미치지 않습니다."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"칩 토글로 표시"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"다음 패스워드(현재 패스워드가 만료될 때 대체할 패스워드)를 미리 봅니다. 현재 OTP 설정이 동일하게 적용됩니다. (서식 지정, 점으로 표시)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"다음 OTP 표시"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"보안 유지를 위해 생성된 패스워드 문자를 ***으로 표시합니다. 복사/붙여넣기 기능에는 영향을 미치지 않습니다"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"생성된 OTP를 점으로 표시"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"특정 긴 페이지 옆에 탐색 메뉴를 추가하여 특정 섹션으로 바로 스크롤할 수 있습니다. 이 기능은 데스크톱에서만 사용할 수 있습니다. 모바일이나 태블릿에서는 메뉴가 표시되지 않습니다."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"빠른 탐색 메뉴 표시"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"‘그룹 없는 계정’, ‘나와 공유됨/내가 공유함’ 등 가상 그룹의 칩 표시"}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"가상 그룹 표시"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"정렬 함수가 호출되면 대소문자를 구분하여 계정을 정렬하도록 강제합니다."}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"대소문자 구분 정렬"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"업로드된 아이콘은 파일 시스템 저장소 외에도 캐시로 사용되는 데이터베이스에 등록됩니다. 이를 통해 데이터베이스만 백업하면 되므로 2FAuth 백업 생성이 훨씬 쉬워집니다."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"그러나 이 방법의 단점이 있을 수 있으므로 주의하십시오: 인스턴스가 많은 큰 아이콘을 호스트할 경우 데이터베이스 크기가 매우 커질 수 있습니다. 또한 파일 시스템이 데이터베이스 동기화를 위해 더 자주 액세스해야 하므로 앱 성능에 영향을 줄 수 있습니다."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"데이터베이스에 아이콘 저장"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"인스턴스의 이메일 설정을 확인하기 위해 테스트 이메일을 보내세요. 설정이 정상적으로 되어 있지 않으면, 사용자가 비밀번호 재설정을 요청할 수 없습니다."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"이메일 구성 테스트"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"특정 테마를 강제로 적용하거나 시스템/브라우저에 설정된 테마를 적용합니다."}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"테마"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"서비스에 표시되는 모든 날짜와 시간에 적용되는 표준 시간대"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"시간대"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"QR 코드를 캡처할 때 문제가 발생하는 경우 이 옵션을 활성화하여 기본 QR 코드 리더기를 사용할 수 있습니다."}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"기본 QR 코드 리더기 사용"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"2FA 계정 목록 위에 그룹 전환용 칩을 표시합니다. 비활성화하면 활성 그룹 이름이 라벨로 표시되며, 그룹 선택기를 열려면 해당 라벨을 클릭해야 합니다."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"칩을 사용하여 토글"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"민감한 데이터인 2FA 시크릿키와 이메일은 데이터베이스에 암호화되어 저장됩니다. .env 파일(또는 전체 파일)의 APP_KEY 값은 키 암호화 역할을 하므로 반드시 백업하세요. 이 키 없이는 암호화된 데이터를 복호화할 방법이 없습니다."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"민감한 데이터 보호"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 로그인 수단을 SSO만으로 제한합니다. 일반 사용자의 비밀번호 로그인과 웹 인증(WebAuthn)이 비활성화됩니다. 관리자는 이 제한의 영향을 받지 않습니다."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"SSO만 사용"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn을 2FAuth 계정에 로그인하는 유일한 방법으로 설정합니다. WebAuthn의 강화된 보안을 활용하기 위해 권장되는 설정입니다."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"장치를 분실한 경우, 이 옵션을 재설정해 이메일과 비밀번호로 로그인하여 계정을 복구할 수 있습니다."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"주의! 이 옵션이 활성화되어 있어도 이메일과 비밀번호 입력 양식은 계속 사용할 수 있지만, 항상 '인증 실패' 응답을 반환합니다."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn만 사용"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"사용 가능한 입력 모드 중에서 입력 모드를 선택하라는 메시지를 표시할지 아니면 직접 입력 모드를 바로 사용할지 선택합니다."}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"직접 입력"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"OTP를 복사 한 후 항상 기본 그룹으로 돌아갑니다."}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"복사 후 기본 그룹 표시"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"정보"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"접속 로그"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"접근"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"계정 복구"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA 계정"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"공유"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"공유 설정"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"인증"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"브라우저 제한사항"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 변경"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"위험 구역"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"데이터 입력"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"계정 삭제"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"계정 편집"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"그룹 편집"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"환경"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"일반"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"그룹"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"아이콘"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"가져오기"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"마지막 접속"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"로그인"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"새 계정"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"새 그룹"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"새 비밀번호"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"새 공유"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"새 토큰"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"새로운 사용자"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"알림"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"옵션"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"일회용 비밀번호"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP 생성 로그"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"개인 액세스 토큰"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"설정"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"프로필"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"목적"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR코드"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"등록"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"가입"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"장치 이름 변경"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능 리셋"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"패스워드 재설정"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"리소스"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"보안 장치"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"보안"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"서버 파라미터"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"세션"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"설정"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"통합 인증(SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO 로그인"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"저장공간"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"지원되는 마이그레이션 형식"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"사용자"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"소유권 이전"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 웹 확장"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"권한 없음"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"프로필 업데이트"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"사용자 관리"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"사용자"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 로그인"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"1일 후"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"1시간 후"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1분 후"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10분 후에"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15분 후"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2분 후"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30분 후"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5분 후"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"정보"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"계정"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"나에게 공유된 계정"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"내가 공유하는 계정"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"동작"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"활성 그룹"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth에 추가"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"관리자"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"고급 양식"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"클릭/탭 후"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"아무것도 하지 않아도 메인 화면에 모든 비밀번호를 표시"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"홈 화면의 모든 것"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"전체"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"모든 계정"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"그룹 없음"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"그룹이 없는 계정"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"계정을 클릭하여 개별 화면에서 비밀번호 열기"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"개별 화면으로 열기"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"앱 설정"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"적용"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"인증"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"자동"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"뒤로"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"브라우저 설정"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"브라우저"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"취소"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 변경"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"전체"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"지금 확인"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"업로드"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"삭제"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"닫기"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"항상"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"계속"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"클립보드로 복사"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"복사"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"카운터"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"생성"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"크레딧"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"다크"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"기본값"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"이 사용자 삭제"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"계정 삭제"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"삭제"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"데모"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR 코드 탐지"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"장치"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"모두 삭제"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"모든 중복 삭제"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"문서"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"완료"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"편집"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"내보내기"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15분 후"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5분 후"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"생성"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"그리드"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"숫자를 두 개의 동일한 그룹으로 분할"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"절반씩"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"자동으로 불러오기"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"업로드된 팩"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"모두 가져오기"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"가져오기"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP 주소"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"발행자"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"라이트"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"목록"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR 실시간 스캔"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"관리"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"나중에"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"이동"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"내 장치"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"안 함"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"추가"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"그룹 없음"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- 팩 없음 -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"공유되지 않음"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"그룹에서 제거"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"보안 키가 복사될 때"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"1일 후"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"1시간 후"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1분 후"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"한 달."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1년."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"온라인 컬렉션"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"브라우저에서 열기"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"운영 체제"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"옵션"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"숫자를 두 자리씩 그룹화"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"두 자리씩"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"일반 텍스트"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR코드로 부터 자동 입력"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR코드"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR코드 업로드"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"새로고침"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"장치 등록"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"등록"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"자동 설정"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 제거"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"이메일 재전송"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능 리셋"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"패스워드 재설정"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"리셋"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"삭제"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"저장"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR코드 스캔"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"검색"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"표시할 계정 선택"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 재설정 링크 전송"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"복구 링크 전송"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"전송"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"공유"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"공유됨"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"내가 공유함"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"나와 공유됨"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"전체 사용자"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"특정 사용자"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"표시"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"로그인"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"로그아웃"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"완료"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10분 후에"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"테스트"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"텍스트 파일"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30분 후"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"시간"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"가져오기"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"이전"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"소유권 이전"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"숫자를 세 자리씩 그룹화"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"세 자리씩"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2분 후"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 형식"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"잠금해제"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"공유 해제"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"업데이트"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR코드 업로드"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"업로드"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"사용자"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"변수"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"웹 확장 기능"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" 달."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (불가리아어)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (덴마크어)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (독일어)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (영어)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (스페인어)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (프랑스어)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (힌디어)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (이탈리아어)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (일본어)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (네덜란드어)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (포르투갈어)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Pусский (러시아어)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (튀르키예어)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (중국어 간체)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"정보"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"공유 추가"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"사용자 추가"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"관리자 패널"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"홈으로 돌아가기"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"설정"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"계속"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"새 그룹 만들기"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"사용자 추가"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"첫 번째 그룹을 만들어 보세요"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT 생성 방법"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"편집"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"새 토큰 생성"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 이동"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 번역 기여"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 문서"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"로그인 및 암호"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"그룹 관리"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"공유 관리"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"관리"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"나중에 하기"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth를 열어 그룹 만들기"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP 생성 로그"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"계정 복구"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"장치 등록"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"계정 등록"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"재설정"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능 리셋"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 재설정"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"스캔"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"보안 장치"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"모든 로그 보기"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"제공자를 활성화하는 방법 보기"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"설정"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"공유 문서"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"SSO 없이 로그인할 수 있습니다"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"로그인"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"소유권 이전"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth schema 내보냄"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"고급 양식 사용"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR 코드로 보기"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Github에서 보기"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"왜 이 화면이 표시되나요?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"2단계 인증(2FA) 계정을 관리하고 보안 코드를 생성할 수 있는 웹 앱"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"2단계 인증(2FA) 계정을 관리하고 보안 코드를 생성할 수 있는 웹 앱"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"로그에는 더 많은 항목이 포함되어 있습니다."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" 사용자에 대한 전체 접속 로그"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"이 계정은 OAuth를 통해 "},{t:4,k:"provider"},{t:3,v:" 계정과 연결되어 있습니다"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:4,k:"provider"},{t:3,v:" 계정을 사용하여 SSO를 통해 로그인했습니다. 여기에서 정보를 변경할 수 없고 "},{t:4,k:"provider"},{t:3,v:"에서 변경할 수 있습니다."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"계정 복구 이메일 전송됨!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"다음과 같은 방법으로 첫 번째 계정을 추가하세요."}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"이 계정을 공유할 첫 번째 사용자 추가"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"인스턴스에 등록된 사용자를 관리하거나 새 사용자를 추가합니다."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"이 계정을 2FAuth 인스턴스의 다른 모든 사용자와 공유하려면 '전체 사용자'로 설정합니다. 기존 사용자와 신규 사용자가 모두 포함됩니다."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"이미 인증되었습니다. 먼저 로그아웃해주세요."}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"이미 가입하셨습니까?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"이미 공유됨"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"다른 방법"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"인증은 역방향 프록시를 통해 처리되며, 아래 설정은 비활성화됩니다."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"서버와의 인증 실패."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 웹 애플리케이션을 위한 완벽한 동반자"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":platform 플랫폼의 :browser 브라우저"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps Lock 켜짐"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"사용자 계정은 모든 2FA 데이터와 함께 삭제됩니다."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"사용자 계정과 모든 2FA 데이터가 삭제됩니다. 되돌릴 수 없습니다."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 계정을 삭제해도 외부 SSO 계정에는 영향을 미치지 않습니다."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"그룹을 삭제해도 계정은 삭제되지 않습니다"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"탐지를 시작하고 코드를 선택하세요, 나머지는 제가 처리하겠습니다."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"직접 입력"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"데모에서 비활성화된 기능"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"2FA 인증 앱에서 데이터를 내보낼 때 비밀번호 보호 및 암호화를 적용하지 마세요. 2FAuth로 데이터를 불러올 수 없습니다."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"아직 계정이 없으신가요?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"이 작업은 (당신이) 취소할 수 없으므로 진행하기 전에 다시 한 번 확인하십시오. 또한 사용자가 이 2FA 계정을 완전히 통제할 수 있으므로 소유권을 이전할 사용자를 신뢰할 수 있어야 합니다."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"이메일이 "},{t:4,k:"email"},{t:3,v:"로 전송됩니다."}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 인증을 활성화하여 2FAuth 계정 보안을 강화할 수 있습니다."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"이메일을 열 때는 당신이 완전히 소유한 기기에서 열어야 합니다."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"오류 발생:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"형식: 1행에 1개의 otpauth URI"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:4,k:"days_to_expiration"},{t:3,v:"일 후 만료됨"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:4,k:"expired_at"},{t:3,v:" 이후 만료됨"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:"에서 로그인 실패"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"실패"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"데이터 불러오는 중..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"계정 공유는 공유받은 사람에게 2FA 계정의 민감한 데이터에 접근할 수 있는 권한은 부여되지 않으며 OTP 코드 생성 권한만 부여됩니다."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"현재 브라우저(Firefox)는 웹페이지에서 QR코드를 캡처할 때 확장 기능이 자동으로 열리도록 하기 위해 특별한 설정이 필요합니다."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호를 잊으셨나요?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"requester"},{t:3,v:"이(가) "},{t:4,k:"generated_at"},{t:3,v:"에 "},{t:4,k:"otp"},{t:3,v:" 생성"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"소문자 포함"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"숫자 포함"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"특수문자 포함"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"대문자 포함"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"도움말: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:"님, 연결 확인"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"'운을 시험해보기' 버튼은 선택한 아이콘 모음집에서 표준 아이콘을 가져오려 시도합니다. 서비스 필드 값이 단순할수록 예상했던 아이콘을 찾을 가능성이 높아집니다: 확장자(예를 들어 '.com')를 추가하지 마시고, 정확한 서비스 이름을 사용하며, 특수 문자의 사용을 피하십시오."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"관리자입니까?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"다른 앱의 내보내기 기능을 사용하여 QR 코드 또는 JSON 파일과 같은 마이그레이션 리소스를 가져온 다음 여기에 불러옵니다."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth는 다양한 2FA 앱에서 데이터를 가져올 수 있습니다."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"불러옴"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- 올바르지 않은 계정 -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"이 재설정 토큰은 유효하지 않습니다."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- 올바르지 않은 서비스 -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8자 이상"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"개인 액세스 토큰이 여전히 유효한가요?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"전체 사용자에게 공유됨"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"모든 현재 및 신규 2FAuth 인스턴스 사용자는 이 계정을 열람하고 패스워드를 생성할 수 있습니다."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"마지막 접속 "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"로고:"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"기기를 분실하셨나요?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"다음으로 개발됨:"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"개인 액세스 토큰을 복사해두세요. 다시 확인할 수 없습니다!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"계정을 프록시 레벨에서 관리합니다."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"인증을 프록시 레벨에서 관리합니다."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"원하는 방식으로 계정을 분류하여 그룹을 만들 수 있습니다. 모든 계정은 소속 그룹과 관계없이 가상 그룹 '전체'에서 계속 표시됩니다."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"필수"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"다음으로 선택 항목 이동"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"이 페이지에 표시된 QR 코드 중 하나를 2FAuth에 가져와야 합니까?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"그룹별 Or 필터 계정"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"이 2FA 계정의 소유권을 다른 사용자에게 이전할 수 있습니다. 신규 소유자가 이 계정을 완전히 통제할 수 있습니다."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"계정의 기존 공유 설정은 소유권 이전에 영향을 받지 않습니다."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"현재 이 계정이 전체 사용자에게 공유되고 있다면 OTP를 계속 생성할 수 있을 것입니다."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"현재 이 계정이 특정 사용자에게 공유되고 있다면 신규 소유자가 나중에 공유하지 않는 이상 더 이상 열람할 수 없습니다."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"다음 옵션을 사용하도록 하나 이상의 장치를 설정합니다."}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"처음이신가요?"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"아직 항목 없음"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"아직 그룹 없음"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"클립보드에 이미지 없음"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"일치 항목 없음"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"제공자 없음"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"결과 없음"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- 서비스 없음 -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"제공자를 찾을 수 없습니까?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"공유되지 않음"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"없음"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"이 로그인 시도에 대한 자세한 내용은 다음과 같습니다."}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"사용자 본인이라면 이 경고를 무시해도 됩니다. 추가 시도가 실패하면 2FAuth 관리자에게 연락하여 보안 설정을 검토하고 이 공격자에 대한 조치를 취해야 합니다."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"사용자의 2FAuth 계정에서의 로그인 시도가 실패했습니다."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 로그인 실패"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"안녕하세요 :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"안녕하세요"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"이 연결에 대한 자세한 내용은 다음과 같습니다."}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"이 경우 이 알림을 무시해도 됩니다. 계정에서 의심스러운 활동이 의심되는 경우 비밀번호를 변경하시기 바랍니다."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"새 장치가 방금 2FAuth 계정에 연결되었습니다."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"새로운 기기에서 2fAuth에 연결했습니다."}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"이 2FA 계정은 소유권을 이전하기 전에 다른 사용자에게 공유되었을 수 있으므로, 계정 공유 설정이 지금도 적절한지 검토해야 합니다."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:":actor이(가) 2FA 계정 :twofaccount의 소유권을 당신에게 이전했습니다. 이제 당신은 이 2FA 계정의 소유자이며 완전히 통제할 수 있습니다."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA 계정 소유권 이전"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"더 이상 이 2FA 계정을 열람하거나 OTP를 생성하는 데에 사용할 수 없습니다."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:":actor이(가) 2FA 계정 :twofaccount의 전체 사용자 공유를 철회했습니다."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:":actor이(가) 2FA 계정 :twofaccount의 당신에 대한 공유를 철회했습니다."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA 계정 공유 철회됨"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:":actor이(가) 2FA 계정 :twofaccount을(를) 전체 사용자에게 공유했습니다."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:":actor이(가) 2FA 계정 :twofaccount을(를) 당신에게 공유했습니다."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA 계정이 당신에게 공유되었습니다"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"이제 공유가 활성화되어 있는 한 이 2FA 계정을 열람하고 OTP를 생성할 수 있습니다."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"만나서 반갑습니다"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 비밀번호 초기화"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"귀하께서 2FAuth 계정의 비밀번호 초기화를 요청했기 때문에 이 메일을 수신하였습니다."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"이 비밀번호 초기화 링크는 :count 분 후에 만료됩니다."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 초기화를 요청하지 않은 경우, 추가 조치는 필요하지 않습니다."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 인스턴스의 이메일 설정을 확인하기 위해 테스트 이메일을 요청했으므로 이 이메일이 전송되었습니다."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 테스트 이메일"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"좋은 소식이네요, 잘 작동합니다 :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"권장됨 (강력히)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"다른 방법으로 로그인:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI는 웹사이트에서 2FA를 활성화할 때 사용되는 QR 코드와 같이 2FA 데이터를 교환하는 데에 사용되는 가장 보편적인 형식입니다. 2FAuth에서 다른 서비스로 전환하는 경우에 선택하십시오."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"데이터를 otpauth URIs 형식으로 내보내기"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"데이터 파싱 중..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 로그인과 WebAuthn이 비활성화됩니다."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"이 사용자에 대한 비밀번호 재설정 요청이 있지만 만료되었으므로 사용자가 제때 비밀번호를 변경하지 않았음을 의미합니다. 이 요청은 사용자 본인 또는 관리자에 의한 것일 수 있습니다."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"이 사용자에 대한 비밀번호 재설정 요청이 있습니다(요청이 "},{t:4,k:"datetime"},{t:3,v:"에 전송됨). 이는 사용자가 아직 비밀번호를 변경하지 않았지만 전송된 링크가 여전히 유효하다는 의미입니다. 이 요청은 사용자 본인 또는 관리자에 의한 것일 수 있습니다."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"완전히 동일한 계정이 이미 존재합니다"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"이 웹 확장 기능은 2FAuth 웹 애플리케이션의 확장 기능입니다. 2FAuth 사용자 계정의 2FA 데이터를 확인하여 브라우저 바에서 직접 OTP를 생성할 수 있습니다."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 사용자 계정을 보유하고 해당 계정을 확장 기능에 연결해야 이 기능을 사용할 수 있습니다. 이를 위해서는 2FAuth 서버 주소와 개인 액세스 토큰(PAT)이 필요합니다."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"계정을 복구하기 위해 2FAuth는 일부 Webauthn 설정을 초기화하여 이메일과 비밀번호를 사용하여 로그인할 수 있도록 합니다."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth는 이 이메일 주소로 복구 링크를 보내드릴 것입니다. 수신한 이메일 내의 링크를 클릭하여 안내에 따라 주십시오."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"가입일 "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능에서 2단계 인증은 아직 지원되지 않습니다. 2FAuth 앱을 방문하여 첫 번째 2FA를 추가해 주십시오."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"'이메일 재발송'으로 사용자에게 비밀번호 재설정 이메일을 다시 전송하여 새 비밀번호를 설정할 수 있도록 합니다. 이 경우 현재 비밀번호는 그대로 유지되며, 이전에 제출된 모든 요청은 취소됩니다."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능 비밀번호를 잊어버린 경우 이 옵션을 이용하십시오."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능에서 현재 구성 및 2FAuth 데이터를 제거합니다. 이후 2FAuth 사용자 계정에 다시 연결하여 사용할 수 있습니다."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"새 비밀번호 설정을 위한 이메일 발송 전에 '비밀번호 재설정'으로 비밀번호를 강제로 재설정합니다(임시 비밀번호를 설정합니다). 이전에 제출된 모든 요청은 취소됩니다."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth에서 이 주소로 비밀번호 재설정 링크를 보내드립니다. 받은 이메일의 링크를 클릭하여 새 비밀번호를 설정하세요."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"항상 SSO를 사용하여 로그인하는 경우 로그아웃한 다음 비밀번호 재설정 기능을 사용하여 여기에 입력할 수 있는 비밀번호를 확인하세요."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"(일시적인 문제일 수 있으니) 새로고침을 시도하거나, 확장 기능을 리셋하고 새 토큰을 입력해 주십시오."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"디바이스 비활성화는 영구적입니다."}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"토큰 비활성화는 영구적입니다."}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"보안 키(예: Yubikey) 또는 생체 인식 기능이 있는 스마트폰(예: Apple FaceId/TouchId)과 같은 2FAuth 로그인에 사용할 수 있는 인증 장치"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"이 계정을 원하는 사용자에게 공유하려면 '특정 사용자'로 설정하십시오."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"어떤 설정은 관리자에 의해 제어됩니다"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"이 2FA 계정을 이 2FAuth 인스턴스의 다른 사용자와 공유해 보세요."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"공유 계정은 다른 사용자가 OTP 코드를 생성하기 위해 열람 및 사용할 수 있지만, 소유자만 계정을 편집 또는 삭제하거나 시크릿 키를 확인할 수 있습니다."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:"이(가) 공유"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:4,k:"date"},{t:3,v:"부터"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"모두와 공유"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"특정 사용자와 공유"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"이메일 주소 "},{t:4,k:"email"},{t:3,v:" 및 비밀번호 "},{t:4,k:"password"},{t:3,v:"를 사용해 로그인할 수 있습니다"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"로그인할 SSO 제공자 선택:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"로그인 방식:"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"브라우저의 기본 언어에서 일부 번역이 누락되었나요?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"일반 사용자는 SSO 인증으로 로그인해야 합니다. 기타 방식은 관리자만 사용할 수 있습니다."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"SSO 인증만이 허용되어 "},{t:4,k:"auth_method"},{t:3,v:" 방식은 사용할 수 없습니다"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"연결된 카메라가 지원되지 않습니다"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"다른 장치나 카메라를 사용해주세요."}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"카메라 스트리밍을 위해 HTTPS 필요"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"스캔할 수 없습니다 (ㅠ_ㅠ)"}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"일반적으로 브라우저의 주소 표시줄 안 또는 옆에 있는 카메라 아이콘을 클릭하여 권한을 허용할 수 있습니다."}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"카메라에 액세스할 수 있는 권한이 없습니다"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"장치의 카메라 접근을 허용해 주세요. 이전에 액세스를 거부하여 브라우저가 다시 권한을 요청하지 않을 경우 브라우저 문서를 참고해 권한을 허용해주세요."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"기기에 카메라 없음"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"웹캠을 연결하는 것을 잊지 않았나요?"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"스캐너 로드 실패"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"카메라가 이미 사용 중입니까? 다른 앱에서 카메라를 사용하지 않도록 하고 다시 시도해주세요."}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"보안 context 필요"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"스캔을 위해서는 HTTPS가 필요합니다. 컴퓨터에서 2FAuth를 실행하는 경우 로컬 호스트 이외의 가상 호스트를 사용하지 마십시오."}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"이 브라우저에서 Stream API가 지원되지 않습니다"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"최신 브라우저를 사용해주세요."}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"마이그레이션 리소스에 다음 2FA 계정이 있습니다. 2FAuth에는 아직 추가되지 않았습니다."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:"에서 로그인"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:4,k:"logout_at"},{t:3,v:"에서 로그아웃 성공"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"허용되는 형식: 일반 텍스트, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"허용되는 형식: jpg, jpeg, png, bmp, gif, svg, webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"이 계정은 현재 "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"이는 영구 삭제이며, 되돌릴 수 없습니다."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"이 양식은 계정의 기존 공유에 영향을 미치지 않습니다. 사용자와의 계정 공유를 중지하려면 공유 설정에서 공유를 철회해야 합니다."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"로그인 시도가 너무 많습니다. "},{t:4,k:"seconds"},{t:3,v:"초 후에 다시 시도하십시오."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"개인 액세스 토큰을 사용하면 모든 앱이 2FAuth API에 인증할 수 있습니다. 클라이언트 앱 요청의 authorization 헤더에 액세스 토큰을 Bearer token으로 지정해야 합니다."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"이 작업은 현재 사용 중인 개인 액세스 토큰을 철회하지 않습니다."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"백업 데이터를 저장하는 경우에는 이 형식을 사용하는 것이 좋습니다. 아이콘을 보존합니다."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth json schema를 사용하여 데이터 내보내기"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"Schema 정의 서술:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 서버에서 생성된 2단계 인증 보안 코드를 가져오기 위한 브라우저 확장 기능입니다."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI 아이콘:"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"데이터 보호를 위해 확장 기능이 잠겨 있습니다. 2단계 인증 액세스를 위해 확장 기능 비밀번호를 입력하십시오."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"각 버튼을 사용하여 가져올지 삭제할지 선택해 주세요."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"보안 기기로 인증할 준비를 하세요. 보안키를 연결하거나, 마스크나 장갑을 벗는 등의 준비를 해주세요."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"이메일 주소 "},{t:4,k:"email"},{t:3,v:" 및 비밀번호 "},{t:4,k:"password"},{t:3,v:"를 사용하십시오"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"인증 프록시를 통해 제공되는 사용자 계정."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:"개의 활성 토큰"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:"개의 보안 장치 (패스키)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:4,k:"login_at"},{t:3,v:"에서 열람"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"서버에서 아이콘 팩을 찾을 수 없습니다."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn 로그인 비활성화"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn은 신뢰할 수 있는 장치(Yubikey 또는 생체 인식 기능이 있는 스마트폰)를 사용해 더 빠르고 안전하게 로그인할 수 있도록 합니다."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth를 시작해보세요"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 데모에 오신 것을 환영합니다."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 테스트 환경에 오신 것을 환영합니다"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"1분도 걸리지 않는 간단한 설정입니다. 이 기능을 활성화할 수 있도록 단계별 가이드를 준비했습니다."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:"개의 계정"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:3,v:"새"},{t:4,k:"version"},{t:3,v:" 버전 이용 가능"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:"개 선택됨"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"최신 버전입니다"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"클립보드를 붙여넣을 수도 있습니다"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"언제든지 공유 설정을 전환할 수 있습니다"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"계속 진행하려면 계정이 필요합니다, 계정을 등록해 주십시오."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"계정이 생성되었습니다!"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"계정이 업데이트되었습니다"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"계정이 삭제되었습니다"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"계정이 이동되었습니다"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"인증 실패"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"자동 잠금이 설정되어 로그아웃되었습니다"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"캐시 삭제됨"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"클립보드에 복사됨"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"서버 측 변경 사항을 반영하기 위해 데이터가 갱신되었습니다"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"장치가 성공적으로 비활성화됨"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"장치가 성공적으로 등록됨"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"그룹 이름이 저장됨"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"그룹이 추가됨"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"그룹이 삭제됨"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"사용 가능한 아이콘 팩 없음"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 변경됨"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 변경 완료"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호가 성공적으로 재설정됨"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"사용자의 PATs가 비활성화되었습니다."}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"프로필이 업데이트되었습니다!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"사용자의 보안 장치가 비활성화됨"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"설정 저장됨"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"테스트 이메일 전송, 메일함을 확인하십시오"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"토큰이 성공적으로 비활성화됨"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"계정을 성공적으로 삭제했습니다"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"사용자가 추가됨"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"사용자 역할 업데이트됨"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:"개의 유효한 계정 찾음"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"다음 »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« 이전"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호는 8자리 이상이어야 하며 비밀번호 확인과 일치해야 합니다."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호가 재설정 되었습니다!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 재설정 링크를 이메일로 전송했습니다!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"잠시 후 다시 시도해주세요."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"이 비밀번호 재설정 토큰은 유효하지 않습니다."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"입력한 이메일 주소로 사용자를 찾을 수 없습니다."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"사용자 이름, 이메일..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"항목을 찾을 수 없음"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"정보"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"계정"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"계정 공유"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"앱 설정"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"인증"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"사용자 생성"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"접속 로그"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"사용자 관리"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"사용자 관리"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"자동 잠금"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"QR 스캔"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"계정 생성"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"그룹 생성"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"계정 수정"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"그룹 편집"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"너무 많은 요청"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"오류"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"그룹"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"계정 가져오기"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"랜딩"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"로그인"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP 생성 로그"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 재설정"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"새 비밀번호"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"확장 기능 리셋"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"신규 계정 등록"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"사용자 계정"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"새 개인 토큰"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth 토큰"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"옵션"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 장치"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"장치 편집"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"설정"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"계정 공유하기"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"계정 QR 코드"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"새 계정"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"소유권 이전"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"잠금해제"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"계정 복구"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"장치 등록"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"검색 창 지우기"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"선택 취소"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:4,k:"pagetitle"},{t:3,v:" 페이지 닫기"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"새 그룹 만들기"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"다음 패스워드를 클립보드에 저장"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"클립보드로 복사"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"삭제"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"계정 삭제"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"선택한 계정 삭제"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"현재 열려 있는 웹 페이지에서 QR 코드 감지"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"이 계정 삭제"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"계정 편집"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"그룹 편집"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"공유 편집"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"선택한 계정 내보내기"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"테스트 비밀번호 생성"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:4,k:"pagetitle"},{t:3,v:" 페이지로 돌아가기"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"그룹 선택 닫기"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 숨김"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"이 계정 가져오기"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"잠그기"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"관리"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"그룹 관리"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"선택 항목을 그룹으로 이동"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"데이터를 otpauth URIs 형식으로 내보내기"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"아이콘 팩 목록 새로고침"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"이름 바꾸기"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"사용자에게 비밀번호 재설정 이메일 재전송"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"사용자 비밀번호 재설정"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호 표시"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"모든 사용자의 보안 장치 비활성화"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"모든 사용자의 토큰 비활성화"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"삭제"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"검색"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"모두 선택"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"이 계정 공유"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"새 사용자 공유 추가"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"모두와 공유"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"그룹 선택 열기"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"지난 달 항목 표시"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"지난 해 항목 표시"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR코드 표시"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"지난 6개월 항목 표시"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"지난 3개월 항목 표시"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"보안 장치로 로그인"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"오름차순 정렬"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"오래된 순으로 표시"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"최신 순으로 표시"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"내림차순 정렬"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:"이(가) 이 계정을 당신과 공유"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"이 계정을 모든 사용자와 공유합니다"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"이 계정을 특정 사용자와 공유합니다"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth json schema를 사용하여 데이터 내보내기"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"잠금 해제 (본인 책임)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"선택한 계정의 공유 철회"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR 코드를 사용하여 마법처럼 양식을 채우세요"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:4,k:"website"},{t:3,v:" 방문"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"':other'가 :value일땐 ':attribute'에 반드시 동의해야 합니다."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:":attribute을(를) 동의해주세요."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 유효한 URL이 아닙니다."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :date 이후 날짜이거나 같은 날짜여야 합니다."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 반드시 :date 이후 날짜여야 합니다."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 영어나 숫자, 하이픈으로만 입력하실 수 있습니다."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 문자와 숫자만 포함할 수 있습니다."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 문자만 포함할 수 있습니다."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 배열이어야 합니다."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:":attribute(은)는 1바이트 영어 및 숫자와 특수문자만 포함해야 합니다."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":Attribute은(는) :date 이전 날짜이거나 같은 날짜여야 합니다."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :date 이전의 날짜여야 합니다."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 반드시 :min 과 :max 사이여야 합니다."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute의 용량은 :min에서 :max KB 사이여야 합니다."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :min과 :max 사이의 값이어야 합니다."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 반드시 :min 자에서 :max 자 사이여야 합니다."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) true 또는 false 이어야 합니다."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역에 허용되지 않은 값이 포함되어 있습니다."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute 확인이 일치하지 않습니다."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역에 필요한 값이 없습니다."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"비밀번호가 일치하지 않습니다."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 콜론을 포함할 수 없습니다."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"이 이메일 주소는 가입 정책을 준수하지 않습니다."}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"이 이메일을 사용하는 사용자를 찾지 못함"}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"모든 이메일은 유효해야 하며 세로 막대("},{t:2,i:[{t:3}],s:")로 구분해야 합니다."}]}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"지원되는 형식은 jpeg, png, bmp, gif, svg, 또는 webp입니다."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"ID는 쉼표로 구분해야 하며 마지막에는 쉼표가 없어야 합니다."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"Uri에는 라벨이 필요합니다."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:":attribute이(가) 지원되지 않습니다."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"지원되는 형식은 jpeg, png, bmp, gif, svg, 또는 webp입니다."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) base32로 인코딩된 문자여야 합니다."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 콜론을 포함할 수 없습니다."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 올바른 otpauth uri가 아닙니다."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :date와 같은 날짜여야 합니다."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute이(가) :format 형식과 일치하지 않습니다."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute는 올바른 날짜가 아닙니다."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 소수점 :decimal 자리여야 합니다."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:":other이(가) :value일때 :attribute은(는) 거부되어야 합니다."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 거부되어야 합니다."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute와(과) :other은(는) 서로 달라야 합니다."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :min에서 :max 자리여야 합니다."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 반드시 :digits 자릿수여야 합니다."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute의 이미지 크기가 올바르지 않습니다."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute 필드에 중복된 값이 있습니다."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 다음 중 하나로 끝날 수 없습니다: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 다음 중 하나로 시작할 수 없습니다: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 유효한 이메일 주소이여야 합니다."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 다음 중 하나로 끝나야 합니다: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"선택된 :attribute은(는) 올바르지 않습니다."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"선택된 :attribute은(는) 올바르지 않습니다."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 다음 확장 중 하나를 포함해야 합니다: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 파일이어야 합니다."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 필수 사항입니다."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value개 이상이어야 합니다."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute의 용량은 :value KB 이상이어야 합니다."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute의 값은 :value보다 커야 합니다."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute는 :value자 이상이어야합니다."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value개 이상이어야합니다."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute의 크기는 :value 킬로바이트 이상이어야 합니다."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value 이상이어야 합니다."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value 자 이상이어야 합니다."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 유효한 16진수 색상이어야 합니다."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"서버에서 아이콘 팩을 찾을 수 없습니다."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 이미지여야 합니다."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:":other에 :attribute이(가) 존재하지 않습니다."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"선택된 :attribute은(는) 올바르지 않습니다."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":Attribute은(는) 정수여야 합니다."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 유효한 IP 주소여야 합니다."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 유효한 IPv4 주소여야 합니다."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 유효한 IPv6 주소여야 합니다."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 유효한 JSON 문자여야 합니다."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 목록이어야 합니다."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 소문자여야 합니다."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value개 미만이어야 합니다."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value KB 미만이어야 합니다."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value 미만이어야 합니다."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value 자 미만이어야 합니다."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value개 이하여야 합니다."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value KB 이하이어야 합니다."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value 이하이어야 합니다."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value 자 이하이어야 합니다."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 올바른 MAC 주소여야 합니다."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute은 :max 자를 넘지 않아야 합니다."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :max개보다 많을 수 없습니다."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :max KB보다 클 수 없습니다."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :max보다 클 수 없습니다."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :max 자보다 많을 수 없습니다."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attribute은 :values 형식의 파일이어야 합니다."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attribute은 :values 형식의 파일이어야 합니다."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :min 자릿수 이상이어야 합니다."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :min 개 이상이어야 합니다."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :min KB 이상이어야 합니다."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :min 이상이어야 합니다."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :min 자 이상이어야 합니다."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :other이(가) :value일 경우 빈 값이어야 합니다."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :other이(가) :value이(가) 아닐 경우 빈 값이어야 합니다."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :value이(가) 존재하는 경우 빈 값이어야 합니다."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :value이(가) 존재하는 경우 빈 값이어야 합니다."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 빈 값이어야 합니다."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :value 의 배수여야 합니다."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"선택된 :attribute은(는) 유효하지 않습니다."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute의 형식이 올바르지 않습니다."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"새 소유주는 현재 소유주가 아니어야 합니다."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":Attribute은(는) 숫자여야 합니다."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"Uri 매개변수는 단독으로 제공하거나 'custom_otp' 매개변수와 함께 제공해야만 합니다."}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 반드시 1개 이상의 문자가 포함되야 합니다."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:":attribute에는 하나 이상의 대문자와 하나의 소문자가 포함되어야 합니다."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:":attribute 은(는) 적어도 하나의 숫자를 포함해야 합니다."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 1개 이상의 특수문자가 포함되어야 합니다."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"주어진 :attribute 가 데이터 유출로 보입니다. 다른 :attribute 를 선택해주세요."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :other이(가) :value일 경우 필수값입니다."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :other이(가) :value일 경우 필수값입니다."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :value이(가) 존재하는 경우 필수값입니다."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :value이(가) 존재하는 경우 필수값입니다."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":attribute 항목은 필수입니다."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:":attribute 필드는 :other 가 :value 일때 금지됩니다."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:":attribute (은)는 :other 이(가) :value 이(가) 아닌 경우 금지되어 있습니다."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:":attribute (은)는 금지되어 있습니다."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 필드는 :other 이(가) 금지되어 있습니다."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute의 형식이 올바르지 않습니다."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:":attribute 필드는 :values에 대한 항목을 포함해야 합니다."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:":other이(가) 승인되면 :attribute 필드가 필요합니다."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역은 :other이(가) 거부된 경우 필수값입니다."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:":other이(가) :value 일때 :attribute 필드는 필수입니다."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:":values에 :other이 아닌 이상 attribute 항목은 필수입니다."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:":values이(가) 있는 경우 :attribute 필드는 필수입니다."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:":values이(가) 있을 경우 :attribute 항목은 필수입니다."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:":values(이)가 모두 없을 때 :attribute 항목은 필수입니다."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:":values가 없는 경우 :attribute 필드는 필수입니다."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":attribute 항목은 필수입니다."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attribute와(과) :other이(가) 일치하지 않습니다."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:":attribute 사용 시 이 요청 본문에서 유일한 매개변수여야 합니다."}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :size 개의 항목을 포함해야 합니다."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 는 :size kilobytes 여야 합니다."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :size여야 합니다."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) :size자여야 합니다."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 는 반드시 다음으로 시작해야 합니다: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 반드시 문자열이어야 합니다."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:":attribute 는 올바른 시간대여야 합니다."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:":attribute 영역에 유효한 ULID가 필요합니다."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 이미 사용중 입니다."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attribute을(를) 업로드하지 못했습니다."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 대문자여야 합니다."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:":attribute 는 반드시 올바른 URL이어야 합니다."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attribute은(는) 반드시 올바른 UUID여야 합니다."}}}},{nl:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Icoon dat de account illustreert"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Afbeelding van een QR-code om te scannen"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Wijzigingen zullen verloren gaan. Weet je het zeker?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Dit zal ernstige gevolgen hebben voor de rechten van deze gebruiker. Weet je het zeker?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je je account wilt verwijderen?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat u deze groep wilt verwijderen?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je dit account wilt verwijderen?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je deze gebruiker wilt verwijderen? Er is geen weg terug."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Je zult niet langer beheerder zijn. Weet je het zeker?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je alle accounts wilt verwijderen?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je alle duplicaten wilt verwijderen?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je dit account wilt verwijderen?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Dit is je eigen account. Weet je het zeker?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je wilt uitloggen?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je de vorige aanvraag wilt intrekken?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Weet je zeker dat je het wachtwoord van deze gebruiker opnieuw wilt instellen?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Weet u zeker dat u dit apparaat wilt verwijderen?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Weet u zeker dat u deze token wilt intrekken?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domein is geen geldig domein"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Geannuleerd door gebruiker"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Account wordt beheerd door een externe provider"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth is geconfigureerd om achter een authenticatie-proxy uit te voeren, maar uw proxy geeft de verwachte header niet terug. Controleer uw configuratie en probeer het opnieuw."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy authenticatie mislukt"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator mist detecteerbare referentie ondersteuning"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator mist ondersteuning voor verificatie"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Je apparaat ondersteunt geen webauthn. Probeer het later opnieuw met een modernere browser"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Kan geen OTP maken zonder een geheim"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Het geheim kan niet worden ontcijferd. Dit wordt voornamelijk veroorzaakt door een verkeerde APP_KEY set in de . nv configuratiebestand van 2Fauth of beschadigde gegevens opgeslagen in de database."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Kan QR-code niet decoderen, probeer de afbeelding bij te snijden of te verscherpen"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Kan de enige admin account niet verwijderen"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Kan de enige admin account niet degraderen"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Kan geen QR-code vinden op de afbeelding, probeer de afbeelding bij te snijden"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Controle mislukt, probeer het later opnieuw"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Gegevens kunnen niet worden vernieuwd vanaf server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"De gegevens van deze QR code zijn geen geldige OTP Auth URI. De QR-code bevat het volgende:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Alleen gebruiker-gemaakte instelling kan worden verwijderd"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Onleesbaar, de data lijkt versleuteld"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Er is iets misgegaan tijdens het ophalen van gegevens"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Ontsleuteling mislukt, uw database wordt nog steeds beschermd. Dit wordt voornamelijk veroorzaakt door een integriteitsprobleem van versleutelde data voor een of meer accounts."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Versleuteling mislukt, je database blijft onbeschermd."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Bestand uploaden mislukt"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS context vereist"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*onbeschrijfbaar*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Ongeldige 2FA gegevens"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Geen authenticators ondersteunen opgegeven algoritmen"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Geen item van het type 'public key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord herstellen niet beschikbaar voor deze gebruiker"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Geen leesbare QR- code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Geen geldige OTP bron in deze QR code"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Dit OTP formaat wordt momenteel niet ondersteund"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Actie niet toegestaan"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Deze QR code is onleesbaar"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code heeft een ongeldige controlesom"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Vernieuwen"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Bron niet gevonden"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Apparaat is al geregistreerd"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Er is iets mis met je server"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Ongewenste spaties worden automatisch verwijderd"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Deze SSO provider is niet volledig ingesteld in uw .env bestand"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is uitgeschakeld"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Een gebruikersaccount met hetzelfde e-mailadres bestaat al, maar komt niet overeen met uw account-ID. Gebruik geen SSO als je al op 2FAuth geregistreerd bent met dit e-mailadres."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Verificatie via SSO geweigerd"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registraties zijn uitgeschakeld"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"te veel id's zijn opgenomen in de query parameter, max 100 toegestaan"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Kan uri niet ontsleutelen"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"U heeft geen rechten om dit document te bekijken of deze actie uit te voeren"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Niet geautoriseerd"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Onbekende fout"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Gegevens komen niet overeen met een ondersteund formaat"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Niet ondersteund OTP type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikersaccount verwijderen mislukt, er zijn geen gegevens verwijderd"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikers ID was niet tussen 1 en 64 tekens"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Onjuist huidig wachtwoord, niets is veranderd"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Het algoritme dat wordt gebruikt om uw beveiligingscodes te beveiligen"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algoritme"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch het scherm-wachtwoord verbergen na een time-out. Dit voorkomt onnodige verzoeken voor nieuwe wachtwoorden als u de wachtwoordweergave vergeet te sluiten."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch vergrendelen"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log de gebruiker automatisch uit bij inactiviteit. Heeft geen effect wanneer authenticatie wordt afgehandeld door een proxy en er geen aangepaste logout-url is opgegeven."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch vergrendelen"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe accounts worden automatisch geregistreerd na het scannen of uploaden van een QR-code, het is niet nodig op de knop Opslaan te klikken"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Accounts automatisch opslaan"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Soms moet de cache worden geleegd, bijvoorbeeld na een wijziging in omgevingsvariabelen of een update. Je kunt dit hier doen."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cachebeheer"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Controleer automatisch (eenmaal per week) en waarschuw wanneer er een nieuwe release van 2FAuth wordt gepubliceerd op Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Controleer op nieuwe versie"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Leeg het zoekvak rechts nadat een code is gekopieerd naar het klembord"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Zoekopdracht wissen bij kopiëren"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Klik op een gegenereerd wachtwoord om het automatisch te kopiëren op het scherm"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Bevestig nieuw wachtwoord"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch een gegenereerd wachtwoord kopiëren direct nadat het op het scherm verschijnt. Vanwege de beperkingen van browsers wordt alleen het eerste Time-based One-Time Password (TOTP) wachtwoord gekopieerd, niet de roterende wachtwoord"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Het is riskant om de teller te bewerken omdat je het account kunt desynchroniseren met de verificatieserver van de service. Gebruik het vergrendelingspictogram om wijziging in te schakelen, maar alleen als u weet dat u dit doet"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"De initiële tellerwaarde"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Standaardwaarde is 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Teller"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Vul je huidige wachtwoord in om te bevestigen dat jij het bent"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Huidig wachtwoord"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"De groep waaraan de nieuwe accounts zijn gekoppeld"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Standaard groep"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Standaard invoermodus wordt gebruikt wanneer de optie voor directe invoer ingeschakeld is"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Standaard input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Het aantal cijfers van de gegenereerde beveiligingscodes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Cijfers"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Al uw beveiligingsapparaten zullen worden ingetrokken. Gebruik deze optie als u één hebt verloren, of als de beveiliging is aangetast."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Alle beveiligingsapparaten uitschakelen"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Voorkom de registratie van nieuwe gebruikers. Tenzij hieronder overschreven (zie hieronder), heeft dit invloed op SSO, zodat nieuwe gebruikers niet kunnen inloggen via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Schakel registratie uit"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Kies of je accounts wilt weergeven als lijst of als raster"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Weergavemodus"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"E-mail"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Sta bezoekers toe om zich te verifiëren met behulp van een extern ID via het Single Sign-On schema"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Huidig wachtwoord"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nieuw wachtwoord"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Probeer om) Krijg het officiële icoon van de 2FA-uitgever bij het toevoegen van een account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Officiële iconen verkrijgen"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icoon"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Geef beheerder rechten aan gebruiker. Beheerders hebben rechten om de hele app te beheren, o.a. Instellingen en andere gebruikers, maar kunnen geen wachtwoord genereren voor een 2FA waarvan ze geen eigenaar zijn."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is beheerder"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Sta nieuwe gebruikers toe om voor de eerste keer via SSO in te loggen terwijl registratie is uitgeschakeld"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO-registratie ingeschakeld houden"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"De taal die wordt gebruikt om de 2FAuth gebruikersinterface te vertalen. Benoemde talen zijn compleet, stel een van uw keuze in om de voorkeur van uw browser te overschrijven."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Taal"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Naam van dit apparaat"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Naam"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe naam"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nieuw wachtwoord"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Ontvang een e-mail telkens wanneer een poging om verbinding te maken met je 2FAuth account mislukt"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"Bij mislukte aanmelding"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Ontvang een e-mail wanneer een nieuw apparaat voor de eerste keer verbinding maakt met je 2FAuth account"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"Op een nieuw apparaat"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Je kunt de volgende opties leeg laten als je niet weet hoe ze in te stellen. De meest gebruikte waarden zullen worden toegepast."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Stel in hoe en wanneer One-Time Passwords (OTP) worden weergegeven"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Toon wachtwoord"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Op tijd gebaseerde OTP of HMAC-gebaseerde OTP of Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Verander hoe de wachtwoorden worden weergegeven door cijfers te groeperen om leesbaarheid en geheugen te vergemakkelijken"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord opmaak"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"De geldigheidsduur van de gegenereerde beveiligingscodes in de tweede"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Standaardwaarde is 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Periode"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Sla het laatste groepsfilter op en herstel het tijdens uw volgende bezoek"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Groepfilter onthouden"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filter lijst"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Maak registratie alleen beschikbaar voor een beperkt aantal e-mailadressen. Beide regels kunnen tegelijkertijd worden gebruikt. Dit heeft geen effect op de registratie via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Registratie beperken"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"E-mails die overeenkomen met deze reguliere expressie zijn toegestaan om te registreren"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Regels filteren"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Laat de mogelijkheid om tijdelijk Dot-Obscured wachtwoorden te onthullen"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"De sleutel die gebruikt wordt om uw beveiligingscodes te genereren"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Geheim"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Service"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Toon symbolen"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Wanneer aangedrongen, forceer de sorteerfunctie om rekeningen op een hoofdgevoelige basis te sorteren"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Soort hoofdlettergevoelig"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Stuur een test e-mail om de e-mailconfiguratie van uw instantie te beheren. Het is belangrijk om een werkende configuratie te hebben, anders kunnen gebruikers geen nieuw wachtwoord aanvragen."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"E-mail configuratie test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Forceer een specifiek thema of pas het thema toe dat is gedefinieerd in uw systeem/browser voorkeuren"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Thema"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"De tijdzone is van toepassing op alle datums en tijden die in de applicatie worden weergegeven"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Tijdzone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Als u problemen ondervindt bij het opnemen van QR-codes kunt u deze optie overschakelen naar een meer fundamentele maar betrouwbaardere QR code lezer"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Gebruik standaard QR code lezer"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Gevoelige gegevens, de 2FA-geheimen en e-mails, worden versleuteld in de database. Zorg ervoor dat u een back-up maakt van de APP_KEY waarde van uw . nv bestand (of het hele bestand) wordt gebruikt als sleutelencryptie. Er is geen manier om gecodeerde data te decyperen zonder deze sleutel."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Bescherm gevoelige gegevens"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Gebruik alleen WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Kies of u gevraagd wilt worden om een invoermodus te kiezen tussen de beschikbare of dat u direct de standaard invoermodus wilt gebruiken"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Directe invoer"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Altijd terugkeren naar de standaardgroep wanneer een OTP is gekopieerd"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Standaardgroep bij kopiëren weergeven"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Over"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Toegang logboek"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Toegang"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Accountherstel"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Authenticatie"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Wijzig wachtwoord"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Gevarenzone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Gegevensinvoer"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Account verwijderen"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Omgeving"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Algemeen"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groepen"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Importeren"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Laatst geopend"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Inloggen"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Nieuw account"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe groep"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nieuw wachtwoord"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe gebruiker"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Meldingen"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Opties"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Persoonlijke toegangstokens"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Voorkeuren"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profiel"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registraties"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Apparaat hernoemen"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Bronnen"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Beveiligingsapparaten"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Beveiliging"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Ondersteunde migratie formaten"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Niet geautoriseerd"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikersbeheer"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikers"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn inloggen"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Na 1 dag"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Na 1 uur"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 1 minuut"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 5 minuten"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 15 minuten"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 2 minuten"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 30 minuten"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 5 minuten"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Actieve groep"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Geavanceerd formulier"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Na een klik/tik"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Alle wachtwoorden in de hoofdweergave weergeven, zonder iets te doen"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Alles, op start"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Klik op een account om een wachtwoord te krijgen in een speciale weergave"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alleen, in zijn eigen weergave"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App instellen"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Terug"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Browser voorkeuren"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Annuleren"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Wijzig wachtwoord"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Controleer nu"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Wissen"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Sluiten"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constant"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Doorgaan"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Kopiëren naar klembord"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Kopiëren"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Aanmaken"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Credits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Donker"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Standaard"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Deze gebruiker verwijderen"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Verwijder je account"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Verwijderen"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Apparaat"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Alles annuleren"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Duplicaten verwijderen"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Gereed"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Exporteren"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 15 minuten"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 5 minuten"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Genereren"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Raster"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Splits cijfers in twee gelijkwaardige groepen"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"door de helft"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Probeer mijn geluk"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Importeer alles"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Importeren"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP-adres"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Verstrekker"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Licht"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Lijst"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Beheren"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Verplaats"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Mijn apparaat"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Nooit"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Nieuw"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Geen groep"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"Bij beveiligingscode kopiëren"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Na 1 dag"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Na 1 uur"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 1 minuut"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 ma."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yr."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Openen in de browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Opties"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Groepeer cijfers twee door twee"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"bij Paar"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Platte tekst"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Prefill met behulp van een QR Code"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Vernieuwen"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Apparaat registreren"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Verwijder icoon"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"E-mail opnieuw versturen"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Intrekken"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Opslaan"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scan een QR code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Zoeken"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord herstel link sturen"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Herstellink verzenden"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Verzenden"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Inloggen"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Uitloggen"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Verzenden"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 5 minuten"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Tekst bestand"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 30 minuten"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Tijd"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Importeren"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Groepeer cijfers twee door twee"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"door drie"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Na 2 minuten"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Ontgrendel"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Bijwerken"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Upload een QR code"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikers"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variabelen"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Duits (Deutsch)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"Engels (English)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Frans (French)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"barometertels ½ (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japans)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russisch)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Turk (Turks)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Over"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Admin panel"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Terug naar start"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Doorgaan"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Maak nieuwe groep"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Een gebruiker aanmaken"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Bewerken"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe token genereren"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Help 2FAuth te vertalen"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"lnloggen & wachtwoord"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Beheer groepen"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Beheren"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Misschien later"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Herstel je account"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Registreer een nieuw apparaat"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Herstellen"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"een beveiligingsapparaat"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Bekijk volledige log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Instellingen"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Inloggen"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Gebruik het geavanceerd formulier"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Bekijk op GitHub"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Een webapp om je tweestapsverificatie (2FA) accounts te beheren en hun beveiligingscodes te genereren"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Een webapp om je tweestapsverificatie (2FA) accounts te beheren en hun beveiligingscodes te genereren"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Volledige toegangslog voor gebruiker "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Dit account is gekoppeld aan een "},{t:4,k:"provider"},{t:3,v:" account via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"U bent ingelogd via SSO met behulp van uw "},{t:4,k:"provider"},{t:3,v:" account. Uw gegevens kunnen hier niet worden gewijzigd, maar op "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Account herstel e-mail verzonden!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Kies een methode en voeg je eerste account toe"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Beheer gebruikers die geregistreerd zijn op uw instantie of maak nieuwe."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Al geauthenticeerd, log eerst uit"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Al geregistreerd?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternatieve methodes"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock is aan"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"De gebruikersaccount zal worden verwijderd evenals alle 2FA-gegevens."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Je gebruikers account wordt verwijderd, evenals al uw 2FA-gegevens. Er is geen weg terug."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Het verwijderen van je 2FAuth account heeft geen invloed op je externe SSO-account."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Het verwijderen van een groep verwijdert geen accounts"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Directe invoer"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Functie uitgeschakeld in Demo modus"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Schakel wachtwoordbescherming of versleuteling NIET in als je gegevens van een 2FA-app exporteert, anders kunnen 2FAuth ze niet ontcijferen."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Heb je nog geen account?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"De e-mail zal worden verzonden naar "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Er is een fout opgetreden:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Verwachte lijst van otpauth URI, een voor regel"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Mislukte aanmelding op "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Mislukt"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Je wachtwoord vergeten?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Heeft kleine letters"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Heeft nummers"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Heeft speciale teken"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Heeft hoofdletters"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Gebruik de Exportfunctie van deze apps om een migratiebron zoals een QR code of een JSON-bestand te krijgen en het hier te laden."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth kan gegevens importeren uit verschillende 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Geïmporteerd"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- ongeldig account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Deze reset token is ongeldig."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- ongeldige service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"Minimaal 8 karakters."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Laatst gezien "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logo's door"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Je apparaat verloren?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Gemaakt met"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Zorg ervoor dat je het persoonlijke toegangs-token nu kopieert of opschrijft. Je kunt het later niet meer zien!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Je kunt groepen maken om je accounts te organiseren zoals je wilt. Alle accounts blijven zichtbaar in de pseudo-groep met de naam 'Alle', ongeacht de groep waartoe ze behoren."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Verplicht"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Verplaats selectie naar"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Stel ten minste één apparaat in om de volgende opties in te schakelen"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Geen 2FA hier!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Nog geen invoer"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Geen resultaat"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- geen service -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"niets"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Hier zijn de details van deze verbindingspoging"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Als jij dit was, kan je deze melding negeren. Als verdere pogingen mislukken, moet u contact opnemen met de 2FAuth beheerder om de beveiligingsinstellingen te bekijken en actie ondernemen tegen deze aanvaller."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"Er is een mislukte inlog poging gedaan voor je 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Mislukte login naar 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hallo"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Hier zijn de details van deze verbinding"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Als u dit was, kunt u deze waarschuwing negeren. Als u vermoedt dat er sprake is van een verdachte activiteit op uw account, wijzig dan uw wachtwoord."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Een nieuw apparaat heeft zojuist verbinding gemaakt met je 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Verbinding met 2FAuth vanaf een nieuw apparaat"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Groeten"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Je ontvangt deze e-mail omdat je een test e-mail hebt aangevraagd om de e-mailinstellingen van je 2FAuth installatie te valideren."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test e-mail"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Goed nieuws, het werkt :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Je kunt ook doorgaan met:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Gegevens verwerken..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Er bestaat een wachtwoord reset verzoek voor deze gebruiker (verzoek verzonden op: datetime), dit betekent dat de gebruiker zijn wachtwoord nog niet heeft gewijzigd, maar dat de link die hij heeft ontvangen nog steeds geldig is. Dit kan een verzoek zijn van de gebruiker zelf of van een beheerder."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Er bestaat een wachtwoord reset verzoek voor deze gebruiker (verzoek verzonden op "},{t:4,k:"datetime"},{t:3,v:"), dit betekent dat de gebruiker zijn wachtwoord nog niet heeft gewijzigd, maar dat de link die hij heeft ontvangen nog steeds geldig is. Dit kan een verzoek zijn van de gebruiker zelf of van een beheerder."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Een account met dezelfde gegevens bestaat al"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Om uw account te herstellen, stelt 2FAuth een aantal Webauthn instellingen opnieuw in, zodat u kunt inloggen met uw e-mailadres en wachtwoord."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Geregistreerd "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth zal u een wachtwoord reset link sturen naar dit adres. Klik op de link in de ontvangen e-mail om een nieuw wachtwoord in te stellen."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Als je SSO altijd hebt gebruikt om in te loggen, log uit en gebruik de reset wachtwoord functie om een wachtwoord te krijgen zodat u dit formulier kunt invullen."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Een apparaat intrekken is permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Het intrekken van een token is permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Verificatieapparaten die u kunt gebruiken om in 2FAuth, zoals beveiligingstoetsen (bijv. e Yubikey) of smartphones met biometrische mogelijkheden (zoals Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Inloggen met"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Sommige vertalingen ontbreken met behulp van de voorkeurstaal van de browser?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Geïnstalleerde camera's zijn niet geschikt"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Gebruik a.u.b. een ander apparaat/camera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS vereist voor camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan kan niet starten :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"Meestal wordt dit gedaan door te klikken op een schuin camerapictogram in of naast de adresbalk van de browser"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth heeft geen toegang tot je camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Je moet toestemming geven om je apparaat camera te gebruiken. Als u het al heeft geweigerd en uw browser u niet opnieuw vraagt verwijst u naar de browserdocumentatie om erachter te komen hoe u toestemming kunt verlenen."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"Geen camera op dit apparaat"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Misschien ben je vergeten je webcam aan te sluiten"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Laden scanner mislukt"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is de camera al in gebruik? Zorg ervoor dat geen andere app je camera gebruikt en probeer het opnieuw"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Veilige context vereist"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is vereist voor live scan. Als je 2FAuth vanaf je computer draait, gebruik dan geen andere virtuele host dan localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API wordt niet ondersteund in deze browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Je moet een moderne browser gebruiken"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"De volgende 2FA-accounts werden gevonden in de migratie-bron. Tot nu toe zijn geen van deze aan 2FAuth toegevoegd."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Succesvolle aanmelding op "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Succesvol uitgelogd op "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Geaccepteerd: platte tekst, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Geaccepteerd: jpg, jpeg, png, bmp, gif, svg of webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Dit is geen zachte verwijdering, er is geen weg terug."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Te veel inlogpogingen. Probeer het opnieuw over "},{t:4,k:"seconds"},{t:3,v:" seconden."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Persoonlijke toegangstokens staan elke app toe om te verifiëren via de 2Fauth API. U moet het toegangstoken opgeven als een Bearer token in de autorisatie-header van verzoeken om autorisatie apps."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI iconen door"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Gebruik de beschikbare knoppen om ze permanent op uw 2FA-collectie te slaan of ze te negeren."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Maak je klaar om te verifiëren met (één van) je beveiligingsapparaten. Steek je beveiligingsapparaat in, verwijder gezicht masker of handschoenen etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" actieve token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" beveiligingsapparaten (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Bekeken op "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn inloggen uitgeschakeld"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Welkom bij 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" accounts"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is beschikbaar"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" geselecteerd"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Deze server is up-to-date"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Account succesvol aangemaakt"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Account succesvol bijgewerkt"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) succesvol verwijderd"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) succesvol verplaatst"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authenticatie mislukt"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch vergrendelen geactiveerd, je bent uitgelogd"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache geleegd"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Gekopiëerd naar klembord"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Gegevens zijn vernieuwd om server-side wijzigingen weer te geven"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Apparaat succesvol ingetrokken"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Apparaat succesvol geregistreerd"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Groepsnaam opgeslagen"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Groep succesvol aangemaakt"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Groep succesvol verwijderd"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord succesvol hersteld"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"PAT's van gebruiker succesvol ingetrokken"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profiel succesvol bijgewerkt!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Toegangsapparaten van gebruiker succesvol ingetrokken"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Instellingen opgeslagen"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token succesvol ingetrokken"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikersaccount succesvol verwijderd"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"gebruiker succesvol aangemaakt"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikersrol bijgewerkt"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" geldige accounts gevonden"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Volgende »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Vorige"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoorden moeten minstens acht tekens bevatten en overeenkomen."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Je wachtwoord is gereset!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"We hebben uw wachtwoord reset link gemaild!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Gelieve even te wachten voor u het opnieuw probeert."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Dit wachtwoord reset token is ongeldig."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"We kunnen geen gebruiker vinden met dat e-mailadres."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikersnaam, e-mail..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Item niet gevonden"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Over"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Accounts"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App instellen"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authenticatie"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe gebruiker"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Toegang logboek"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Beheer gebruiker"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikersbeheer"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Automatisch vergrendelen"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Account aanmaken"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Groep aanmaken"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Account wijzigen"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Groep wijzigen"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Vloed"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Fout"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groepen"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importeer accounts"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Inloggen"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Wachtwoord herstellen"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nieuw wachtwoord"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Gebruikersaccount"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe persoonlijke token"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth tokens"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Opties"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn apparaten"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Apparaat wijzigen"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Instellingen"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Account als QR code"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Nieuw account"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Ontgrendel"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Accountherstel"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Registreer een nieuw apparaat"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Wis zoekopdracht"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Selectie wissen"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Sluit de "},{t:4,k:"pagetitle"},{t:3,v:" pagina"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Kopiëren naar klembord"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Verwijderen"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Dit account verwijderen"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Genereer een test wachtwoord"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Verberg gropeskiezer"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Verberg wachtwoord"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Importeer dit account"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Vergrendel het"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Beheren"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Verplaats geselecteerde naar een groep"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Hernoemen"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Stuur een wachtwoord reset e-mail opnieuw naar de gebruiker"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Herstel het wachtwoord van de gebruiker"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Toon wachtwoord"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Alle beveiligingsapparaten van gebruikers intrekken"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Alle tokens van gebruiker intrekken"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Intrekken"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Zoeken"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Alles selecteren"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Toon groepskiezer"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Toon items van de laatste maand"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Toon items van het afgelopen jaar"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Toon QR-code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Toon items van de laatste 6 maanden"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Toon items van de laatste 3 maanden"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Log in met een beveiligingsapparaat"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Soorter oplopend"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Toon minst recent eerst"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Toon meest recente eerst"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sorteer aflopend"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Ontgrendel het (op eigen risico)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Gebruik een QR code om het formulier magisch in te vullen"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet worden geaccepteerd als :other :value is."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet geaccepteerd worden."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute is geen geldige URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een datum na of gelijk aan :date zijn."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een datum na :date zijn."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag alleen letters, cijfers, streepjes en underscores bevatten."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag alleen letters en nummers bevatten."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag alleen letters bevatten."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een reeks zijn."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een datum zijn voor of gelijk aan :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een datum vóór :date zijn."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet tenminste :min en :max items bevatten."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet tussen de :min en :max kilobytes zijn."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet tussen :min en :max zijn."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet tussen :min en :max karakters zijn."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ja of nee zijn."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute bevestiging komt niet overeen."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Het wachtwoord is onjuist."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag leestekens bevatten."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Dit e-mailadres voldoet niet aan het registratie beleid"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Geen account gevonden met dit e-mailadres."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Alle e-mailadressen moeten geldig zijn en gescheiden worden door een buis"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Ondersteunde formaat zijn jpeg, png, bmp, gif, svg of webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"ID's moeten met een komma gescheiden, zonder een komma."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"De uri moet een label hebben."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute wordt niet ondersteund."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Ondersteunde formaat zijn jpeg, png, bmp, gif, svg of webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een base32 gecodeerde tekenreeks zijn."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag geen leestekens bevatten."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute is geen geldige otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een datum gelijk aan :date zijn."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute komt niet overeen met het formaat :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute is geen geldige datum."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet worden afgewezen als :other :value is."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribuut moet worden afgewezen."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute en :other moeten verschillend zijn."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet bestaan uit minimaal :min en maximaal :max cijfers."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet bestaan uit :digits cijfers."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute heeft ongeldige afbeeldings dimensies."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute veld heeft een reeds bestaande waarde."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet eindigen met een van de volgende: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet beginnen met een van de volgende: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldig e-mailadres zijn."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet eindigen met een van de volgende: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"Het geselecteerde :attribute is ongeldig."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"Het geselecteerde :attribute is ongeldig."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een bestand zijn."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"Het veld :attribute moet een waarde bevatten."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet meer dan :value waardes bevatten."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet groter zijn dan :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet groter zijn dan :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet groter zijn dan de :value tekens."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet :value items of meer hebben."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute moet groter of gelijk zijn aan :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute moet groter of gelijk zijn aan :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute moet minimaal :value tekens bevatten."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"De :attribute moet een afbeelding zijn."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld bestaat niet in :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"De geselecteerde :attribute is ongeldig."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet van het type integer zijn."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldig IP-adres zijn."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldig IPv4 adres zijn."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldig IPv6 adres zijn."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldige JSON string zijn."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet minder dan :value items hebben."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet kleiner zijn dan :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet kleiner zijn dan :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet groter zijn dan de :value tekens."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet meer dan :value items hebben."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet kleiner zijn dan of gelijk zijn aan :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet kleiner zijn dan of gelijk zijn aan :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet kleiner zijn dan of gelijk aan :value tekens."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldig MAC-adres zijn."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet meer dan :max cijfers hebben."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet meer dan :max items hebben."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet groter zijn dan :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet groter zijn dan :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute mag niet groter zijn dan de :max tekens."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een bestand zijn van het type: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een bestand zijn van het type: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ten minste :min cijfers hebben."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ten minste :min items hebben."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ten minste :min kilobytes zijn."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ten minste :min items hebben."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min characters."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a multiple of :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Het geselecteerde :attribute is ongeldig."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"Het formaat van :attribute is ongeldig."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een cijfer zijn."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"De uri parameter moet alleen of alleen worden verstrekt in combinatie met de 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet minimaal één letter bevatten."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ten minste één hoofdletter en één kleine letter bevatten."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ten minste één getal bevatten."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet minimaal één symbool bevatten."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"Het opgegeven :attribute komt voor in een datalek. Kies een ander :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld moet aanwezig zijn."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verboden als :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verboden tenzij :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verboden."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld verbiedt de aanwezigheid van :other."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"Het formaat van :attribute is ongeldig."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld moet items bevatten voor: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verplicht wanneer :other is geaccepteerd."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"Het veld :attribute is verplicht als :other gelijk is aan :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verplicht tenzij :other is in :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verplicht als :values aanwezig zijn."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"Het veld :attribute is verplicht als :values ingesteld staan."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verplicht wanneer geen van de :values aanwezig zijn."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"Het veld :attribute is verplicht als :values niet ingesteld staan."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute veld is verplicht."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute en :other moeten gelijk zijn."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Bij gebruik van :attribute moet het de enige parameter zijn in de body van de aanvraag"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet :size items bevatten."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet ten minste :min kilobytes zijn."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet :size zijn."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet zijn :size karakters zijn."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet beginnen met een van de volgende: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een tekenreeks zijn."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldige tijdzone zijn."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute is al in gebruik."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"Het uploaden van :attribute is mislukt."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldig URL zijn."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"Het :attribute moet een geldig UUID zijn."}}}},{pl:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Ikona ilustrująca konto"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Zdjęcie kodu QR do skanowania"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Czy jesteś pewien?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Zmiany zostaną utracone. Czy jesteś pewien?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Będzie to miało poważny wpływ na uprawnienia tego użytkownika. Czy na pewno?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz usunąć swoje konto?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz usunąć tę grupę?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz usunąć to konto?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz usunąć tego użytkownika? Nie ma od tego odwrotu."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Nie będziesz już administratorem. Naprawdę na pewno?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz porzucić wszystkie konta?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz porzucić wszystkie duplikaty?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz porzucić to konto?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"To jest Twoje własne konto. Czy na pewno?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz się wylogować?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz odwołać poprzednią prośbę?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz zresetować hasło tego użytkownika?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz unieważnić to urządzenie?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Czy na pewno chcesz unieważnić ten token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"Domena 2FAuth nie jest poprawną domeną"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Przerwane przez użytkownika"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Konto zarządzane przez zewnętrznego dostawcę"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth jest skonfigurowany do uruchamiania za pomocą serwera proxy uwierzytelniającego, ale serwer proxy nie zwraca oczekiwanego nagłówka. Sprawdź konfigurację i spróbuj ponownie."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Uwierzytelnianie poprzez proxy nie powiodło się"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing discoverable credential support"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Brak wsparcia weryfikacji uwierzytelniania użytkownika"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Twoje urządzenie nie obsługuje webauth. Spróbuj ponownie później używając nowszej przeglądarki"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Nie można utworzyć OTP bez klucza"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"The secret cannot be deciphered. This is mainly caused by a wrong APP_KEY set in the .env configuration file of 2Fauth or a corrupted data stored in database."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Nie można zdekodować wykrytego kodu QR, spróbuj przyciąć lub wyostrzyć obraz"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Nie można usunąć jedynego konta administratora"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Nie można zdegradować jedynego konta administratora"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Nie można wykryć kodu QR w obrazie, spróbuj przyciąć obraz"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Zmiana nie powiodła się, spróbuj ponownie"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Sprawdzenie nie powiodło się, spróbuj ponownie później"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Dane nie mogą być odświeżone z serwera"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"The data of this QR code is not a valid OTP Auth URI. The QR code contains:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Tylko ustawienia utworzone przez użytkownika mogą zostać usunięte"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Nieczytelne, dane mogą być szyfrowane"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generowanie klucza szyfrowania nie powiodło się"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Coś poszło nie tak podczas pobierania danych"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Decryption failed, your database is still protected. This is mainly caused by an integrity issue of encrypted data for one or more accounts."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Encryption failed, your database remains unprotected."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migracja ikon nie powiodła się. Ustawienie zostało przywrócone do poprzedniej wartości."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się rozszyfrować PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się odczytać klucza"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się zaszyfrować PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się uzyskać hasła"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się uzyskać tokena"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się wczytać ustawień ze sklepu"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się zregenerować IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się uzyskać ustawień aplikacji"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się uzyskać danych magazynu szyfrowania"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się ustawić opóźnienia automatycznej blokady"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się ustawić klucza szyfrowania"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się ustawić parametrów szyfrowania"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"File upload failed"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS context required"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecipherable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Invalid 2FA data"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"No authenticators support specified algorithms"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Password reset unavailable for this user"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No readable QR code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"No valid OTP resource in this QR code"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"This OTP format is not currently supported"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operation not allowed"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"This QR code is unreadable"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code has invalid checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Resource not found"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device already registered"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Something is wrong with your server"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"This SSO provider is not fully setup in your .env file"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is disabled"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication via SSO rejected"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrations are disabled"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"too many ids were included in the query parameter, max 100 allowed"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Unable to decrypt uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"You do not have permissions to view this resource or to perform this action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Data do not match any supported format"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported OTP type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"User account deletion failed, no data have been deleted"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"User ID was not between 1 and 64 chars"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong current password, nothing has changed"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Nieprawidłowe hasło"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Jan Kowalski"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Konto"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Algorytm używany do zabezpieczenia Twoich kodów bezpieczeństwa"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorytm"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Pozwól użytkownikom tworzyć osobiste tokeny dostępu i używać ich do uwierzytelniania w aplikacjach innych firm, takich jak rozszerzenie przeglądarki 2FAuth"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Zezwalaj na użycie PAT"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Automatyczne blokowanie"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Automatyczne blokowanie"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache management"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically check (once a week) and warn when a new release of 2FAuth is published on Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Sprawdź dostępność aktualizacji"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Empty the Search box right after a code has been copied to the clipboard"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Clear Search on copy"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Click on a generated password to copy it automatically hides it from the screen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirm new password"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first Time-based One-Time Password (TOTP) password will be copied, not the rotating ones"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Edycja licznika jest ryzykowna, ponieważ możesz zdesynchronizować konto na serwerze weryfikacyjnym usługi. Użyj ikony blokady aby włączyć modyfikację, ale tylko jeśli wiesz co robisz"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"Początkowa wartość licznika"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Domyślnie 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Licznik"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Wpisz aktualne hasło, aby potwierdzić, że to Ty"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Aktualne hasło"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Grupa, do której przypisywane będą nowo utworzone konta"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Domyślna grupa"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode used when the Direct input option is On"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"The number of digits of the generated security codes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Cyfry"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"All your security devices will be revoked. Use this option if you have lost one or its security has been compromised."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Wyłącz wszystkie urządzenia zabezpieczające"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Wyłącz rejestrację"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want accounts to be displayed as a list or as a grid"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Sposób podglądu"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Adres e-mail"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Włącz SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Aktualne hasło"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nowe hasło"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Hasło"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Try to) Get the official icon of the 2FA issuer when adding an account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Get official icons"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Language used to translate the 2FAuth user interface. Named languages are complete, set the one of your choice to override your browser preference."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Language"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Name this device"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Name"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Nowa nazwa"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nowe hasło"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords (OTP) are displayed"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Show Password"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Password formatting"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"The period of validity of the generated security codes in second"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Period"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Remember group filter"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Let the ability to temporarily reveal Dot-Obscured passwords"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"The key used to generate your security codes"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Usługa"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Show icons"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Email configuration test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Theme"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"The time zone applied to all dates and times displayed in the application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Time zone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"If you experiences issues when capturing QR codes enables this option to switch to a more basic but more reliable QR code reader"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Use basic QR code reader"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protect sensitive data"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Use WebAuthn only"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"O nas"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Dziennik dostępu"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Dostęp"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Odzyskiwanie konta"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Danger Zone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Data input"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Environment"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"General"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupy"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Last accesses"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Zaloguj"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Nowe konto"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"New group"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nowe hasło"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"New token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Nowy użytkownik"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Personal access tokens"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferences"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Rejestracje"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Rename device"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Resources"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Security devices"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Security"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Supported migration formats"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Zarządzanie użytkownikiem"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn login"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Active group"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Zaawansowany formularz"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"After a click/tap"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Show all passwords in the main view, without doing anything"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"All of them, on home"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alone, in its own view"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia aplikacji"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Back"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Preferencje przeglądarki"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Anuluj"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Sprawdź teraz"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Close"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantly"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copy"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Create"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Credits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Dark"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Default"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Delete this user"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete your account"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Device"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Discard all"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Discard duplicates"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Done"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Export"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Generate"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Grid"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Split digits into two equals groups"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"by Half"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Try my luck"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Import all"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Address"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Wystawca"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Light"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"List"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Move"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"My device"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Never"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"New"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"No group"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"On security code copy"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mo."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yr."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Open in browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits two by two"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"by Pair"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Plain text"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Prefill using a QR Code"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a device"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Remove icon"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Wyślij ponownie wiadomość e-mail"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Save"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scan a QR code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Send password reset link"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Send recovery link"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Send"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Sign out"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Submit"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Text file"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Time"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits three by three"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"by Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Update"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Upload a QR code"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Users"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Bułgarski (język bułgarski)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Duński (język duński)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Niemiecki (język niemiecki)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"Angielski (English)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Hiszpański (język hiszpański)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Francuski (język francuski)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"Hindi (język hinduski)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Włoski (język włoski)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"Japoński (język japoński)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"Koreański (język koreański)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Holenderski (język niderlandzki)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Portugalski (język portugalski)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Rosyjski (język rosyjski)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Turecki (język turecki)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"Chiński uproszczony (język chiński uproszczony)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"O nas"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Panel administratora"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Back to home"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Create new group"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Utwórz użytkownika"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generate a new token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Help translate 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"login & password"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage groups"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recover your account"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Zarejestruj nowe urządzenie"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset it"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"a security device"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"See full log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Use the advanced form"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"View on Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"This account is bound to a "},{t:4,k:"provider"},{t:3,v:" account via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery email sent!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Pick a method and add your first account"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Zarządzaj użytkownikami zarejestrowanymi w Twojej instancji lub twórz nowych."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Already authenticated, please log out first"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Already registered?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative methods"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps Lock jest włączony"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"The user account will be deleted as well as all its 2FA data."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Your user account will be deleted as well as all your 2FA data. There is no going back."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Deleting your 2FAuth account has no impact on your external SSO account."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Deleting a group does not delete accounts"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Feature disabled in Demo mode"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Nie włączaj ochrony haseł ani szyfrowania podczas eksportowania danych z aplikacji 2FA, w przeciwnym razie 2FA nie będzie w stanie ich rozszyfrować."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Don't have your account yet?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"An error occured:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Failure"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Forgot your password?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Has lower case"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Has number"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Has special char"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Has upper case"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use the Export feature of these apps to get a migration resource like a QR code or a JSON file then load it here."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Imported"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"This reset token is invalid."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 characters min."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Ostatnio widziany "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos by"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Lost your device?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Made with"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Make sure to copy your personal access token now. You won’t be able to see it again!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can create groups to organize your accounts the way you want. All accounts remain visible in the pseudo group named 'All', regardless of the group they belong to."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Mandatory"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Move selected to"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Set at least one device to enable the following options"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"No 2FA here!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"No entry yet"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"No result"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- no service -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nothing"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Jeśli to Ty, możesz zignorować ten alert. Jeśli kolejne próby nie powiodą się, powinieneś skontaktować się z administratorem 2FA w celu sprawdzenia ustawień zabezpieczeń i podjęcia działań przeciwko temu atakującemu."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Witaj"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"You can also continue with:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Przetwarzanie danych..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Dla tego użytkownika istnieje żądanie zresetowania hasła, ale wygasło, co oznacza, że użytkownik nie zmienił swojego hasła na czas. Może to być prośba od samego użytkownika lub od administratora."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Dla tego użytkownika istnieje żądanie zresetowania hasła (żądanie wysłane o godzinie "},{t:4,k:"datetime"},{t:3,v:"), co oznacza, że użytkownik nie zmienił jeszcze hasła, ale otrzymany link jest nadal ważny. Może to być prośba od samego użytkownika lub od administratora."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"An account with the exact same data already exists"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"To recover your account, 2FAuth resets some Webauthn settings so you will be able to sign in using your email and password."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Zarejestrowany "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a password reset link to this address. Click the link in the received email to set a new password."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a device is permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a token is permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Authentication devices you can use to sign in 2FAuth, like security keys (i.e Yubikey) or smartphones with biometric capabilities (i.e. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Some translations are missing using the browser preferred language?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Please use another device/camera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan can't start :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No camera on this device"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Maybe you forgot to plug in your webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fail to load scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is the camera already in use? Ensure that no other app use your camera and try again"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Secure context required"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"You should use a modern browser"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: jpg, jpeg, png, bmp, gif, svg, or webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Too many login attempts. Please try again in "},{t:4,k:"seconds"},{t:3,v:" seconds."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI Icons by"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use the available buttons to permanently save them to your 2FA collection or discard them."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Get ready to authenticate using (one of) your security devices. Plug your key in, remove face mask or gloves, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" active token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" security device(s) (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn login disabled"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" accounts"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selected"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"This instance is up-to-date"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully created"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully updated"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully deleted"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully moved"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Auto-lock triggered, you've been logged out"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cleared"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copied to clipboard"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data has been refresh to reflect server-side changes"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully revoked"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully registered"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Group name saved"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully created"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully deleted"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully reset"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's PATs successfully revoked"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profile successfully updated!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Settings saved"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token successfully revoked"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"User account successfully deleted"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"Szybkie filtrowanie"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Uprawnienia użytkownika zmodyfikowane"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" valid accounts found"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Następna »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Poprzednia"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwords must be at least eight characters and match the confirmation."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Your password has been reset!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"We have emailed your password reset link!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Proszę poczekać przed ponownym próbą."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"This password reset token is invalid."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"We can't find a user with that email address."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Nazwa użytkownika, e-maill..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono elementu"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"O nas"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Konta"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia aplikacji"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Utwórz użytkownika"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Dziennik dostępu"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Zarządzaj użytkownikami"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Zarządzanie użytkownikami"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Automatyczne blokowanie"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Przechwyć QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Utwórz konto"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Utwórz grupę"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Edycja konta"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Edytuj grupę"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Błąd"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupy"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importuj konta"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Zaloguj"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Resetuj hasło"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nowe hasło"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Konto użytkownika"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Nowy token osobisty"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"Tokeny OAuth"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Urządzenia WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Edycja urządzenia"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Konto w postaci kodu QR"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Nowe konto"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Odzyskiwanie konta"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Zarejestruj nowe urządzenie"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Clear search"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Clear selection"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Close the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Discard this account"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generate a test pasword"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Hide group selector"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Hide password"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Import this account"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Lock it"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Move selected into a group"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Rename"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Ponowne wysyłanie wiadomości e-mail z prośbą o zresetowanie hasła do użytkownika"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Reveal password"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's security devices"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's tokens"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Select all"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Show group selector"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Show QR code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using a security device"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Sort ascending"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sort descending"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock it (at your own risk)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Use a QR code to fill the form magically"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"To atrybut pola musi zostać zaakceptowane gdy :other jest :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"To :attribute pole musi zostać zaakceptowane."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"Pole :attribute musi zawierać prawidłowy URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"To :attribute pole musi być data po lub równa :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"Pole :attribute musi być datą po :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"Pole :attribute może zawierać jedynie litery, cyfry, myślniki i podkreślenia."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"To :attribute pole musi zawierać tylko litery i cyfry."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"Pole :attribute może zawierać jedynie litery."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an array."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before or equal to :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have between :min and :max items."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max characters."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be true or false."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field confirmation does not match."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"The password is incorrect."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"This email address does not comply with the registration policy"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No account found using this email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"All emails must be valid and separated with a pipe"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"Identyfikatory muszą być oddzielone przecinkami."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"The uri must have a label."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not supported."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a base32 encoded string."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not a valid otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date equal to :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match the format :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid date."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined when :other is :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field and :other must be different."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max digits."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :digits digits."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has invalid image dimensions."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has a duplicate value."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not end with one of the following: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not start with one of the following: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid email address."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must end with one of the following: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have a value."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have more than :value items."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value characters."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :value items or more."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value characters."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an image."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must exist in :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an integer."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IP address."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv4 address."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv6 address."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid JSON string."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have less than :value items."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value characters."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :value items."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value characters."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid MAC address."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max digits."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max items."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max characters."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min digits."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min items."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min characters."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a multiple of :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a number."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"The uri parameter must be provided alone or only in combination with the 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:":attribute musi zawierać przynajmniej jedną literę."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one uppercase and one lowercase letter."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one number."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one symbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"The given :attribute has appeared in a data leak. Please choose a different :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited when :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited unless :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field prohibits :other from being present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain entries for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is accepted."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required unless :other is in :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values are present."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is present."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when none of :values are present."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :values is not present."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"When using :attribute it must be the only parameter in this request body"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain :size items."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size characters."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must start with one of the following: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a string."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid timezone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute has already been taken."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute failed to upload."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid UUID."}}}},{"pt-BR":{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Ícone que ilustra a conta"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Imagem de um QR code para escanear"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"As alterações serão perdidas. Tem certeza?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Isto terá sérios impactos nas permissões deste usuário. Tem certeza?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza que deseja excluir sua conta?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza de que deseja excluir esse grupo?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza de que quer apagar esta conta?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza de que deseja excluir este usuário? Não há a opção de 'desfazer'."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Você não será mais um administrador. Deseja realmente continuar?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza de que deseja excluir todas as contas?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Você tem certeza que deseja excluir todas as duplicatas?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza que deseja excluir sua conta?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Esta é a sua própria conta. Tem certeza?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza que deseja sair?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza de que deseja revogar a solicitação anterior?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Você tem certeza que deseja redefinir a senha deste usuário?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza de que deseja excluir este dispositivo?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza de que deseja revogar este token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"O domínio de 2FAuth não é um domínio válido"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Cancelado pelo usuário"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Conta gerenciada por um provedor externo"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth está configurado para ser executado atrás de um proxy autenticado, mas seu proxy não retorna o cabeçalho esperado. Verifique sua configuração e tente novamente."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Falha na autenticação do proxy"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"O autenticador não possui suporte de credenciais detectável"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Suporte à verificação de usuário faltando na autenticação"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Seu dispositivo não suporta webauth. Tente novamente mais tarde usando um navegador mais moderno"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Não é possível criar um OTP sem um segredo"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"O segredo não pode ser decifrado. Isso é causado principalmente por um APP_KEY errado definido no arquivo .env de configuração do 2Fauth, ou de dados corrompidos armazenados na base de dados."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Não é possível decodificar o código QR detectado, tentar cortar ou desembaçar a imagem"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Não é possível excluir a única conta de administrador"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Não é possível rebaixar a única conta de administrador"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Não é possível detectar um código QR na imagem, tente recortar a imagem"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Falha na busca, tente novamente mais tarde"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Os dados não podem ser atualizados a partir do servidor"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Os dados deste código QR não são um URI de Autenticação OTP válido. O código QR contém:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Apenas configuração criada pelo usuário pode ser excluída"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Inlegível, os dados parecem criptografados"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Algo deu errado durante a obtenção de dados"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Falha na descriptografia, seu banco de dados ainda está protegido. Isso é causado principalmente por um problema de integridade de dados criptografados para uma ou mais contas."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Falha na criptografia, seu banco de dados permanece desprotegido."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Houve um erro ao migrar os ícones. A configuração foi restaurada para o valor anterior."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get password"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Falha ao obter as configurações do sistema"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Falha no upload do arquivo"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Contexto HTTPS requerido"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecifrável*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Dados 2FA inválidos"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Nenhum autenticador suporta algoritmos especificados"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma entrada é do tipo 'chave pública'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Redefinição de senha indisponível para este usuário"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Nenhum código QR legível"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Nenhum OTP válido neste código QR"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Este formato OTP não é suportado no momento"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operação não permitida"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Este código QR é ilegível"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code possui checksum inválido"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Esse nome não pode ser usado, selecione outro nome"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Recurso não encontrado"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo já registrado"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Algo está errado com o seu servidor"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Espaços indesejados serão removidos automaticamente"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Este provedor SSO não está totalmente configurado no seu arquivo .env"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO está desativado"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Uma conta de usuário com o mesmo endereço de e-mail já existe, mas não corresponde ao seu ID de conta externa. Não use SSO se você já estiver registrado no 2FAuth com este e-mail."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Autenticação via SSO rejeitada"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Os registros estão desativados"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"muitos IDs foram incluídos no parâmetro de consulta, é permitido o máximo 100"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Não foi possível descriptografar a uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"Você não tem permissão para visualizar este recurso ou para executar esta ação"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Não autorizado"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Erro desconhecido"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Os dados não correspondem a qualquer formato suportado"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Tipo de OTP não suportado"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Não aplicável ao usar um proxy de autenticação ou SSO."}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Este método de autenticação é apenas para administradores. Usuários devem fazer login com SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"A exclusão da conta do usuário falhou, nenhum dado foi excluído"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"O ID do usuário não estava entre 1 e 64 caracteres"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Senha atual incorreta, nada foi alterado"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"João da Silva"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Conta"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"O algoritmo usado para proteger seus códigos de segurança"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algoritmo"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Ocultar automaticamente a senha na tela após um tempo limite. Isso evita solicitações desnecessárias de novas senhas se você esquecer de fechar a tela de senha."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Fechar OTP Automaticamente"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueio automático"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Desconecta automaticamente o usuário em caso de inatividade. Não tem efeito quando a autenticação é tratada por um proxy e nenhuma URL personalizada de logout é especificada."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueio automático"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Novas contas são registradas automaticamente após a verificação ou envio de um código QR, não é necessário clicar num botão Salvar"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Salvar contas automaticamente"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Às vezes, o cache precisa ser limpo, por exemplo, após uma alteração de variáveis de ambiente ou de uma atualização. Você pode fazer isso a partir daqui."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciamento de Cache"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Verificar automaticamente (uma vez por semana) e avisar quando uma nova versão do 2FAuth for publicada no Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Verificar por atualizações"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Limpar a caixa de pesquisa logo após um código ser copiado para a área de transferência"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Limpar pesquisa ao copiar"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Clicar para copiar uma senha gerada a ocultará automaticamente da tela"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Fechar OTP após cópia"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirmar nova senha"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Copiar automaticamente uma senha gerada depois que ela aparecer na tela. Devido a limitações de navegadores, apenas a primeira senha Time-based One-Time Password (TOTP) será copiada, não as rotativas"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copiar automaticamente ao abrir OTP"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"É arriscado editar o contador, pois você pode dessincronizar a conta com o servidor de verificação do serviço. Use o ícone de bloqueio para ativar a modificação, mas apenas se você sabe que está fazendo"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"O valor inicial do contador"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"O padrão é 0."}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Contador"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Preencha com sua senha atual para confirmar que é você"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Senha atual"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"O grupo ao qual as contas recém criadas serão associadas"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Grupo padrão"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Modo de entrada padrão usado quando a opção de entrada direta está ligada"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Modo de entrada padrão"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"O número de dígitos dos códigos de segurança gerados"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Dígitos"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Todos os seus dispositivos de segurança serão revogados. Use esta opção se você perdeu um ou sua segurança foi comprometida."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Desativar todos os dispositivos de segurança"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Impedir novos registros. A menos que sobrescrito (veja abaixo), isto afeta SSO também, então novos usuários não serão capazes de entrar via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Desabilitar registo"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Escolher se quer que as contas sejam exibidas como uma lista ou como grade"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Modo de exibição"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"E-mail"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Permitir que os visitantes autentiquem usando um ID externo por meio do esquema de logon SSO"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Habilitar sistema de login únicio"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Senha atual"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Nova senha"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Senha"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Tentar) Obter o ícone oficial do emissor do 2FA ao adicionar uma conta?"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Obter ícones oficiais"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"O grupo ao qual a conta deve ser atribuída"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Grupo"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL que você pode verificar o status de saúde desta instância do 2FAuth. A URL pode ser usada para configurar um **HEALTHCHECK** no Docker ou uma **Sondagem de logs ao vivo de HTTPS** no Kubernetes."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Status do endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Ícone"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Concede direitos de administrador ao usuário. Os administradores podem gerenciar o aplicativo, ou seja, modificar suas configurações e gerenciar seus usuários. Um administrador não tem como visualizar os dados 2FA de outro usuário ou gerar códigos para eles."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"É administrador"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Permite que novos usuários façam login pela primeira vez via SSO enquanto os registros estão desativados"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Mantenha o registro SSO ativado"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Idioma usado para traduzir a interface de usuário 2FAuth. Idiomas nomeados são concluídos, defina a escolha para substituir a preferência do seu navegador."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Idioma"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Nomear esse dispositivo"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Nome"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Novo nome"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nova senha"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Receber um e-mail sempre que uma tentativa de conectar sua conta 2FAuth falhar"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"Ao acessar com falha"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Receba um e-mail quando um novo dispositivo se conectar à sua conta 2FAuth pela primeira vez"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"Em novo dispositivo"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Você pode deixar as seguintes opções em branco se você não sabe como configurá-los. Os valores mais usados serão aplicados."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Defina como e quando One-Time Passwords (OTP) são exibidos"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Exibir senha"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"OTP baseado no tempo ou HMAC baseado em OTP ou OTP Steam"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Escolha o método de OTP que deseja criar"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Altere como as senhas são exibidas pelo agrupamento de dígitos para facilitar a legibilidade e memorização"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Formatação de senha"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Senha"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"O período de validade dos códigos de segurança gerados no segundo"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"O padrão é 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Validade"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Salvar o último filtro de grupo aplicado e restaurá-lo na sua próxima visita"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Lembrar filtro de grupos"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Listas de filtros"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Tornar o registro disponível apenas para um intervalo limitado de endereços de e-mail. Ambas as regras podem ser usadas simultaneamente. Isso não tem efeito sobre o registro via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restringir registro"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"E-mails que correspondem a esta expressão regular terá permissão para registrar"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtrando regras"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Permitir a capacidade de revelar temporariamente senhas obscurecidas por pontos"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Revelar OTP ocultado"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"A chave usada para gerar os seus códigos de segurança"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Chave"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Serviço"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Exibir ícones das contas na visão das contas"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar Ícones"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Exiba o e-mail do usuário logado no rodapé em vez de links de navegação diretos. Neste caso os links ficam disponíveis em um menu acessível ao clicar/tocar no endereço de e-mail."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Exibir e-mail no rodapé?"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Visualize a próxima senha, ou seja, a senha que substituirá a senha atual quando ela expirar. As preferências definidas para a OTP atual também se aplicam à próxima (formatação, exibir como ponto)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar próxima OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Substitua os caracteres da senha gerada por *** para garantir a confidencialidade. Isso não afeta o recurso de copiar/colar"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar OTP's como pontos"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Quando acionado, forçar a função Ordenar a organizar as contas de forma que diferencie entre maiúsculas e minúsculas"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Ordenar com distinção entre maiúsculas e minúsculas"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Armazenar ícones no banco de dados"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Envie um e-mail de teste para verificar a capacidade da sua instância de usar e-mail. É importante ter uma configuração funcional, caso contrário os usuários não poderão solicitar redefinição de senha, por exemplo."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Teste de configuração de e-mail"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Forçar um tema específico ou aplicar o tema definido nas preferências do sistema/navegador"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Tema"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"O fuso horário aplicado a todas as datas e horas exibidas na aplicação"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Fuso horário"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Se você tiver problemas ao capturar QR code permite que essa opção mude para um leitor de QR code mais básico, mas mais confiável"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Usar leitor de QR code"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Dados confidenciais, segredos e e-mails 2FA são armazenados criptografados no banco de dados. Certifique-se de salvar o valor APP_KEY do seu arquivo .env (ou do arquivo inteiro), pois ele serve como chave de criptografia. Não há como descriptografar dados criptografados sem essa chave."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Proteja dados confidenciais"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Faça do SSO o único método disponível para fazer login no 2FAuth. O login por senha e o Webauth são então desativados para usuários comuns. Os administradores não são afetados por essa restrição."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Usar somente sistema de login único"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Usar somente o WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Escolha se você quer ser solicitado a escolher um modo de entrada entre os disponíveis ou se você quiser usar diretamente o modo de entrada padrão"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Entrada direta"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Sempre retornar ao grupo padrão quando um OTP for copiado"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Visualizar grupo padrão na cópia"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Sobre"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Logs de acesso"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Acesso"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Recuperar conta"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Autenticação"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Alterar senha"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Zona de perigo"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Entrada de dados"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Excluir conta"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Ambiente"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Geral"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupos"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Importar"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Últimos acessos"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Nova conta"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Novo grupo"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Nova senha"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Novo token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Novo usuário"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notificações"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Opções"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Senha"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Tokens de acesso pessoal"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferências"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Perfil"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Código QR"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Registos"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Renomear dispositivo"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Recursos"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivos de segurança"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Segurança"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Sistema de login único"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"Login com SSO"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Armazenamento de dados"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Formatos de migração suportados"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Não autorizado"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciamento de usuários"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Usuários"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"Entrar com WebAuthn"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Após 1 dia"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Após 1 hora"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 1 minuto"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 10 minutos"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 15 minutos"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 2 minutos"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 30 minutos"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 5 minutos"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Conta"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Ativar grupo"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Forma avançada"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Após clicar/tocar"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar todas as senhas na visualização principal, sem fazer nada"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Todos eles, em casa"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Todos"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Clique em uma conta para obter uma senha em uma exibição dedicada"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Sozinho, na sua própria exibição"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Configuração do App"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Automático"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Voltar"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Padrão do navegador"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Navegador"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Cancelar /Voltar"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Alterar senha"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Todos"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Verificar agora"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Enviar"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Apagar"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Fechar"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantemente"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continuar"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiar para área de transferência"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copiar"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Criar"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Créditos"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Escuro"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Padrão"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Excluir este usuário"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Excluir sua conta"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Excluir"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Descartar tudo"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Descartar duplicatas"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Concluir"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Exportar"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 15 minutos"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 5 minutos"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Gerar"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Grade"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Dividir dígitos em dois grupos iguais"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"pela Metade"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Tente a minha sorte"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Importar todos"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Importar"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"Endereço IP"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Emissor"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Claro"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Lista"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciar"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Mover"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Meu dispositivo"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Nunca"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Novo"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Sem grupo"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"Quando copiar código de segurança"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Após 1 dia"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Após 1 hora"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 1 minuto"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mês."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 ano."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Abrir no navegador"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"Sistema Operacional"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Opções"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"Parametros da URIs de otpauth"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Agrupar dígitos dois por dois"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"por Par"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Texto sem formatação"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Prepreencha usando um código QR"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"Código QR"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Registra um dispositivo"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Excluir ícone"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Reenviar e-mail"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revogar"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Salvar"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Escanear QR code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Buscar"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Enviar link para redefinir senha"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Enviar link de recuperação"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Enviar"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Entrar"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Encerrar Sessão"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Enviar"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 10 minutos"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Testar"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Arquivo de texto"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 30 minutos"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Hora"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Importar"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Agrupar dígitos três por três"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"por Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Após 2 minutos"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"Formato 2FAuth"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloquear"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Enviar um código QR"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Usuários"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variáveis"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" meses."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Búlgaro)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Dinamarquês)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Alemão)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Inglês)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Espanhol)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Francês)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Indiano)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italiano)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japonês)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Coreano)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Holandês)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Português, Brasil)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russo)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turco)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinês Simplificado)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Sobre"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Administração"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Voltar à página inicial"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continuar"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Criar um novo grupo"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Criar usuário"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Editar"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Gerar um novo token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Ajude a traduzir 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"usuário e senha"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciar grupos"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciar"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Farei isso depois"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recupere sua conta"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Registrar um novo dispositivo"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Redefinir"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Ler"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"um dispositivo de segurança"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Ver registro completo"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Veja como habilitar um provedor"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Configurações"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Você pode fazer entrar sem SSO."}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Entrar"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"Esquema de exportação do 2FAuth"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Use o formulário avançado"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Ver no GitHub"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Um aplicativo web para gerenciar suas contas de Autenticação em Duas Etapas (2FA) e gerar códigos de segurança"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Um aplicativo web para gerenciar suas contas de Autenticação em Duas Etapas (2FA) e gerar códigos de segurança"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Registro de acesso completo para o usuário "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Esta conta está vinculada a uma conta "},{t:4,k:"provider"},{t:3,v:" via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"Você entrou via SSO usando a sua conta "},{t:4,k:"provider"},{t:3,v:". Sua informação não pode ser alterada aqui mas em "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"E-mail de recuperação da conta enviado!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Escolha um método e adicione sua primeira conta"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciar usuários registrados ou criar em sua instância."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Já autenticado, por favor, saia primeiro"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Já possui cadastro?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Métodos alternativos"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps Lock está ativado"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"A conta de usuário será excluída assim como todos os seus dados de 2FA."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Sua conta de usuário será excluída, assim como todos os seus dados de 2FA. Não há volta."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Excluir a sua conta 2FAuth não tem impacto na sua conta SSO externa."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Excluir um grupo não exclui contas"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Entrada direta"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Recurso desativado no modo Demonstração"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Não habilite a proteção de senha ou criptografia quando você exportar dados de um aplicativo 2FA caso contrário, 2FAuth não será capaz de decifrá-los."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Ainda não tem uma conta?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"O e-mail será enviado para "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Ocorreu um erro:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Esperado: Uma lista de otpauth URI, uma por linha"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Falha no login em "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Falha"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Esqueceu sua senha?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Tem minúsculas"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Tem número"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Tem caractere especial"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Tem maiúsculas"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrador?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use o recurso de exportação destes aplicativos para obter um recurso de migração como um código QR ou um arquivo JSON, então carregue-o aqui."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth pode importar dados de vários aplicativos 2FA."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Importado"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- conta inválida -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Esse token de redefinição é válido."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- serviço inválido -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"Mínimo 8 caracteres"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Visto por último "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logotipos por"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Perdeu seu dispositivo?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Feito com"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Certifique-se de salvar seu token de acesso pessoal agora. Você não poderá vê-lo novamente!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Você pode criar grupos para organizar suas contas da forma que quiser. Todas as contas permanecem visíveis no pseudo grupo chamado 'Todos', independentemente do grupo ao qual pertencem."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Obrigatório"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Mover selecionados para"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Defina pelo menos um dispositivo para ativar as seguintes opções"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Sem 2FA aqui!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma entrada ainda"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"Não existe provedor"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Nenhum resultado"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- sem serviço -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"O provedor está faltando?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nada"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Aqui estão os detalhes desta tentativa de conexão"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Se foi você, pode ignorar este alerta. Se outras tentativas falharem, você deve entrar em contato com o administrador do 2FAuth para rever as configurações de segurança e tomar ações contra este atacante."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"Houve uma tentativa de login falhada em sua conta 2FAuth."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Falha no login para 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Olá"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Aqui estão os detalhes desta conexão"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Se foi você, você pode ignorar este alerta. Se suspeitar de qualquer atividade suspeita em sua conta, altere sua senha imediatamente."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Um novo dispositivo acabou de se conectar à sua conta 2FAuth."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Conexão com o 2FAuth de um novo dispositivo"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Atenciosamente"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Você está recebendo este e-mail porque você solicitou um e-mail de teste para validar as configurações de e-mail da sua instância 2FAuth."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"E-mail de teste 2FAuth"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Boas notícias, funcionou :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Você também pode continuar com:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporte dados em lista de URIs otpauth"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Processando dados..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"O login com senha e o WebAuthn estão desativados."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Uma solicitação de redefinição de senha existe para este usuário, mas expirou, o que significa que o usuário não alterou sua senha a tempo. Esta pode ser uma requisição do próprio usuário ou de um administrador."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Uma solicitação de redefinição de senha existe para este usuário (solicitação enviada em "},{t:4,k:"datetime"},{t:3,v:"), o que significa que o usuário ainda não alterou sua senha, mas o link que recebeu ainda é válido. Esta pode ser uma requisição do próprio usuário ou de um administrador."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Uma conta com os mesmos dados já existe"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Para recuperar sua conta, o 2FAuth redefine algumas configurações de Webauthn para que possa entrar usando seu e-mail e senha."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registrado em "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth enviará um link de redefinição de senha para este endereço. Clique no link no e-mail recebido para definir uma nova senha."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Se você sempre usou o SSO para entrar, saia e use o recurso de redefinição. Ao receber uma senha, preencher esse formulário."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revogar um dispositivo é permanente"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revogar um token é permanente"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Os dispositivos de autenticação que você pode usar para entrar no 2FAuth, como chaves de segurança (ex: Yubikey) ou smartphones com recursos biométricos (ex: Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Algumas configurações estão sendo gerenciadas pelo seu administrador"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Escolha um provedor de SSO para fazer login:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Entrar usando"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Algumas traduções estão faltando utilizando o idioma preferido do navegador?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Usuários comuns devem fazer login com SSO. Outros métodos são apenas para administradores."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"A autenticação está restrita apenas ao SSO, "},{t:4,k:"auth_method"},{t:3,v:" está desativado."}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Câmeras instaladas não são adequadas"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Por favor, use outro dispositivo/câmera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS necessário para streaming de câmera"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Verificação ao vivo não pode iniciar :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"É geralmente feito clicando no ícone da câmera na barra de endereços do navegador ou ao lado da barra de endereços"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"O 2FAuth não tem permissão para acessar sua câmera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Você precisa conceder permissão para usar a câmera do seu dispositivo. Se você já negou e o seu navegador não solicita novamente, consulte a documentação do navegador para descobrir como conceder a permissão."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma câmera neste dispositivo"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Talvez você tenha se esquecido de conectar sua câmera."}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Falha ao carregar o scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"A câmera já está em uso? Certifique-se de que nenhum outro app usa a câmera e tente novamente"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Contexto HTTPS requerido"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS é necessário para varredura ao vivo. Se você executar 2FAuth a partir do seu computador, não use outro host virtual além do localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API não é suportada neste navegador"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Você deve usar um navegador moderno"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"As seguintes contas 2FA foram encontradas no recurso de migração. Até agora, nenhuma delas foi adicionada ao 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Login bem-sucedido em "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Logout bem-sucedido em "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Aceito: Texto simples, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Aceito: jpg, jpeg, png, bmp, gif, svg ou webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Não se trata de uma exclusão suave, não se pode retroceder."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Muitas tentativas de login. Por favor, tente novamente em "},{t:4,k:"seconds"},{t:3,v:" segundos."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Tokens de Acesso Pessoal permitem que qualquer aplicativo se autentique na API 2Fauth. Você deve especificar o token de acesso como um token Bearer no cabeçalho de autorização das solicitações dos aplicativos."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"Você pode optar por esta opção caso você precisar criar um backup que possa ser restaurado. Este formato inclui ícones."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporte dados usando o esquema JSON do 2FAuth"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"A descrição de definição do esquema:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"Ícones de UI por"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use os botões disponíveis para salvá-los permanentemente em sua coleção de 2FA ou descartá-los."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Prepare-se para autenticar usando (um dos) seus dispositivos de segurança. Conecte sua chave, remova a máscara de rosto ou luvas, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" token(s) ativo(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" dispositivo(s) de segurança (chaves)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Visualizado em "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Login via Webauthn desativado"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Bem-vindo(a) ao 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" contas"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" está disponível"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:3}],s:"[count] selecionado(s)"}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Esta instância está atualizada"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Conta criada com sucesso!"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Conta atualizada com sucesso"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Conta(s) excluídas com êxito"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Conta(s) movidas com sucesso"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Falha na autenticação"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueio automático acionado, você foi desconectado"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache apagado"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiado para a área de transferência"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Os dados foram atualizados para refletir as alterações no lado do servidor"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo revogado com sucesso"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivo registrado com sucesso"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Nome do grupo salvo"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Grupo criado com sucesso"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Grupo excluído com sucesso"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Senha redefinida com sucesso"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"PATs do usuário revogado com sucesso"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Perfil atualizado com sucesso!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivos de segurança do usuário revogado com sucesso"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Configurações salvas"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token revogado com sucesso"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Conta excluída com sucesso"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"usuário criado com sucesso"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Função do usuário atualizada"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"Encontradas"},{t:4,k:"count"},{t:3,v:" contas válidas"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Próximo »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Anterior"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"A senha deve conter pelo menos oito caracteres e ser igual à confirmação."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Sua senha foi redefinida!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Enviamos o link de redefinição de senha por e-mail!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Por favor aguarde antes de tentar novamente."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Este token de redefinição de senha é inválido."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Não foi encontrado nenhum usuário com este endereço de e-mail."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Nome de usuário, e-mail..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Item não encontrado"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Sobre"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Contas"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Configuração do App"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Autenticação"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Criar usuário"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Logs de acesso"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Administrar usuário"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciamento de usuários"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Bloqueio automático"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Ler código QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Criar conta"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Criar grupo"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Editar conta"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Editar grupo"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Erro Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Erro"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupos"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Importar contas"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Redefinir senha"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Nova senha"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Conta de usuário"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Novo token pessoal"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"Código OAuth"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Opções"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Dispositivos WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Editar dispositivo"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Configurações"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Conta como QR code"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Nova conta"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloquear"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Recuperar conta"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Registrar um novo dispositivo"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Limpar pesquisa"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Limpar seleção"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Feche a página "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copiar próxima senha para área de transferência"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copiar para área de transferência"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Excluir"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Descartar esta conta"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Exportar contas selecionadas"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Gerar senha de teste"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Ocultar seletor de grupo"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Ocultar Senha"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Importar esta conta"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Bloquear"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Gerenciar"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Mover selecionados para um grupo"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporte dados em lista de URIs otpauth"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Renomear"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Reenviar um e-mail de redefinição de senha ao usuário"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Redefinir a senha do usuário"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar senha"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revogar os dispositivos de segurança de todos os usuários"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revogar o token de todos os usuários"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revogar"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Buscar"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Selecionar tudo"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar seletor de grupo"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas do último mês"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas do último ano"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar QR Code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas dos últimos 6 meses"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar entradas dos últimos 3 meses"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Fazer login usando um dispositivo de segurança"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Ordenar crescente"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar o mais antigo primeiro"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Mostrar o mais recente primeiro"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Ordenar decrescente"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Exporte dados usando o esquema JSON do 2FAuth"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Desbloqueie (por sua conta e risco)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Use um código QR para preencher o formulário magicamente"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser aceito quando :other for :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ser aceito."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não é uma URL válida."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma data posterior ou igual a :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma data posterior a :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter apenas letras, números, traços e sublinhados."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter apenas letras e números."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter apenas letras."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma matriz."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve conter apenas caracteres alfanuméricos e símbolos de um único byte."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma data anterior ou igual a :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma data anterior a :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter entre :min e :max itens."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter entre :min e :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve estar entre :min e :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter entre :min e :max caracteres."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ser verdadeiro ou falso."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute contém um valor não autorizado."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"A confirmação de :attribute não corresponde."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute está faltando um valor obrigatório."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"A senha está incorreta."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve conter dois-pontos."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Este endereço de e-mail não está em conformidade com a política de registro."}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma conta encontrada usando este e-mail."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Todos os e-mails devem ser válidos e separados por um pipe."}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Os formatos suportados são jpeg, png, bmp, gif, svg ou webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs devem ser separados por vírgula, sem vírgula no final."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"A URI deve ter um rótulo."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não é suportado."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Os formatos suportados são jpeg, png, bmp, gif, svg ou webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma string codificada em base32."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve conter dois-pontos."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não é uma URI otpauth válida."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma data igual a :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não corresponde ao formato :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não é uma data válida."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ter :decimal casas decimais."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser recusado quando :other for :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser recusado."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute e :other devem ser diferentes."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter entre :min e :max dígitos."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter :digits dígitos."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute tem dimensões de imagem inválidas."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute tem um valor duplicado."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não pode terminar com um dos seguintes: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não pode começar com um dos seguintes: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um endereço de e-mail válido."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve terminar com um dos seguintes: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute selecionado é inválido."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute selecionado é inválido."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ter uma das seguintes extensões: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um arquivo."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ter um valor."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter mais de :value itens."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser maior que :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser maior que :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser maior que :value caracteres."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter :value itens ou mais."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser maior ou igual a :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser maior ou igual a :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser maior ou igual a :value caracteres."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ser uma cor hexadecimal válida."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma imagem."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute não existe em :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute selecionado é inválido."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um número inteiro."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um endereço IP válido."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um endereço IPv4 válido."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um endereço IPv6 válido."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um padrão regex válido."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma string JSON válida."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ser uma lista."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar em letras minúsculas."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter menos de :value itens."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser menor que :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser menor que :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser menor que :value caracteres."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve ter mais de :value itens."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser menor ou igual a :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser menor ou igual a :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser menor ou igual a :value caracteres."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um endereço MAC válido."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve ter mais de :max dígitos."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve ter mais de :max itens."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve ser maior que :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve ser maior que :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute não deve ser maior que :max caracteres."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um arquivo do tipo: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um arquivo do tipo: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter pelo menos :min dígitos."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter pelo menos :min itens."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter pelo menos :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser pelo menos :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter pelo menos :min caracteres."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar ausente quando :other é :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar ausente, a menos que :other seja :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar ausente quando :values estiverem presentes."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar ausente quando :values estiver presente."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar ausente."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um múltiplo de :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute selecionado é inválido."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"O formato de :attribute é inválido."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um número."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"O parâmetro uri deve ser fornecido sozinho ou apenas em combinação com o parâmetro 'custom_otp'"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter pelo menos uma letra."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter pelo menos uma letra maiúscula e uma letra minúscula."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter pelo menos um número."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter pelo menos um símbolo."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute fornecido apareceu em um vazamento de dados. Escolha um :attribute diferente."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar presente quando :other for :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar presente, a menos que :other seja :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar presente quando :values estiverem presentes."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar presente quando :values estiver presente."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar presente."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é proibido quando :other for :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é proibido, a menos que :other esteja em :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é proibido."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute proíbe :other de estar presente."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"O formato de :attribute é inválido."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve conter entradas para: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório quando :other for aceito."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório quando :other for recusado."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório quando :other for :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório, a menos que :other esteja em :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório quando :values estão presentes."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório quando :values está presente."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório quando nenhum dos :values está presente."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório quando :values não está presente."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute é obrigatório."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute e :other devem coincidir."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Ao usar :attribute, ele deve ser o único parâmetro no corpo da solicitação"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve conter :size itens."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ter :size caracteres."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve começar com um dos seguintes: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma string."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um fuso horário válido."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve ser um é um identificador único válido."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute já foi utilizado."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute falhou ao ser enviado."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deve estar em letras maiúsculas."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser uma URL válida."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"O :attribute deve ser um UUID válido."}}}},{"pt-PT":{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Ícone que representa a conta"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Imagem de um código QR para digitalizar"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"As alterações serão perdidas. Tem certeza?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Isto terá impacto nas permissões deste utilizador. Tem certeza?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza que quer apagar a sua conta?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza que quer apagar este grupo?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Tem certeza que quer apagar esta conta?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to delete this user? There is no going back."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"You will no longer be an administrator. Really sure?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all accounts?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard all duplicates?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to discard this account?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"This is your own account. Are you sure?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to log out?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke the previous request?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to reset this user's password?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this device?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to revoke this token?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth's domain is not a valid domain"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Aborted by user"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Account managed by an external provider"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth is configured to run behind an authentication proxy but your proxy does not return the expected header. Check your configuration and try again."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy authentication failed"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing discoverable credential support"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Authenticator missing user verification support"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Your device does not support webauthn. Try again later using a more modern browser"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Cannot create an OTP without a secret"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"The secret cannot be deciphered. This is mainly caused by a wrong APP_KEY set in the .env configuration file of 2Fauth or a corrupted data stored in database."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Cannot decode detected QR code, try to crop or sharpen the image"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot delete the only admin account"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Cannot demote the only admin account"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Cannot detect a QR code in the image, try to crop the image"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Change failed, please retry"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Check failed, please retry later"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Data cannot be refreshed from server"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"The data of this QR code is not a valid OTP Auth URI. The QR code contains:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Only user-created setting can be deleted"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Email sending failed"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Unreadable, the data seem encrypted"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Generation of encryption key failed"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Something went wrong during data fetching"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Decryption failed, your database is still protected. This is mainly caused by an integrity issue of encrypted data for one or more accounts."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Encryption failed, your database remains unprotected."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Migration of icons failed. The setting has been restored to its previous value."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed, check your PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server unreachable, check the URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to decipher PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to derive key"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to encrypt PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Falha ao obter a senha"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Failed to get token"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to load settings from the store"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Failed to regenerate IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve application settings"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Failed to retrieve encryption store data"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set the auto-lock delay"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption key"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Failed to set encryption parameters"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Failed to store encrypted PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"The field is required and must be a valid URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"The field is required"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"File upload failed"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS context required"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*indecipherable*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Invalid 2FA data"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unknown personal access token"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"No authenticators support specified algorithms"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"No icon available in this variant"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No match in the icon pack"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Password reset unavailable for this user"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"No readable QR code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"No valid OTP resource in this QR code"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"This OTP format is not currently supported"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Operation not allowed"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"This QR code is unreadable"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR code has invalid checksum"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Reserved name, please choose something else"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Please only use letters, numbers, dashes, underscores, spaces or single quotation marks"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Resource not found"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device already registered"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Something is wrong with your server"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"This SSO provider is not fully setup in your .env file"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO is disabled"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication via SSO rejected"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Registrations are disabled"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"too many ids were included in the query parameter, max 100 allowed"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Unable to decrypt uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"You do not have permissions to view this resource or to perform this action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error during PAT encryption"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Unknown error"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Data do not match any supported format"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported OTP type"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Not applicable when using an auth proxy or SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"This authentication method is for administrators only. Users must log in with SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"User account deletion failed, no data have been deleted"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"User ID was not between 1 and 64 chars"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong current password, nothing has changed"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong password"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"The algorithm used to secure your security codes"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algorithm"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Let users create personal access tokens and use them to authenticate with third party application like the 2FAuth web extension"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Allow PAT usage"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"The Personal Access Token (PAT) to authenticate the extension to the server. You can generate one from the Settings > OAuth page of your 2FAuth user account"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API token"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Auto close OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Lock the extension automatically to prevent illegitimate access to its data"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Auto-save accounts"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Cache management"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically check (once a week) and warn when a new release of 2FAuth is published on Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Check for new version"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Empty the Search box right after a code has been copied to the clipboard"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Clear Search on copy"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Click on a generated password to copy it automatically hides it from the screen"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Close OTP after copy"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Confirm new password"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first Time-based One-Time Password (TOTP) password will be copied, not the rotating ones"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Copy OTP on display"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"The initial counter value"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Fill in your current password to confirm that it's you"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the newly created accounts are associated"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Default group"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode used when the Direct input option is On"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Default input mode"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"The number of digits of the generated security codes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Digits"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"All your security devices will be revoked. Use this option if you have lost one or its security has been compromised."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Disable all security devices"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Disable registration"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want accounts to be displayed as a list or as a grid"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Display mode"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Email"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow visitors to authenticate using an external ID via the Single Sign-On scheme"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Enable SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password currently used to unlock the extension"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Current password"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Try to) Get the official icon of the 2FA issuer when adding an account"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Get official icons"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the account is to be assigned"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Group"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth server URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favorite online collection"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Fetch icons from"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Icon pack"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Strict fetch"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Icon variant"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Is administrator"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Keep SSO registration enabled"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Language used to translate the 2FAuth user interface. Named languages are complete, set the one of your choice to override your browser preference."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Language"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Name this device"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Name"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"New name"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"On failed login"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"On new device"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords (OTP) are displayed"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Show Password"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Choose the type of OTP to create"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Password formatting"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"The period of validity of the generated security codes in second"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Default is 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Period"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Remember group filter"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtering list"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Restrict registration"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtering rule"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Let the ability to temporarily reveal Dot-Obscured passwords"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"The key used to generate your security codes"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Secret"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Service"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Show account icons in the main view"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Show icons"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Show email in footer"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Show next OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Show generated OTP as dot"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Store icons to database"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Email configuration test"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Theme"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"The time zone applied to all dates and times displayed in the application"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Time zone"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"If you experiences issues when capturing QR codes enables this option to switch to a more basic but more reliable QR code reader"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Use basic QR code reader"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Protect sensitive data"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Use SSO only"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Attention! The Email & Password form remains available despite this option being enabled, but it will always return an 'Authentication failed' response."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Use WebAuthn only"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Access"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Danger Zone"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Data input"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Environment"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"General"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groups"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Last accesses"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"New account"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"New group"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"New token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Novo utilizador"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Notifications"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Password"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Personal access tokens"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Preferences"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Purpose"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Inscrições"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Rename device"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Resources"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Security devices"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Security"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Setup"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO login"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Storage"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Supported migration formats"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth webext"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Unauthorized"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profile update"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"User management"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Utilizadores"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn login"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Account"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Active group"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Advanced form"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"After a click/tap"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Show all passwords in the main view, without doing anything"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"All of them, on home"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"All accounts"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Group-less"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Group-less accounts"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alone, in its own view"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Apply"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Back"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Browser preference"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Browser"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Cancel"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Change password"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"All"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Check now"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Close"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Constantly"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Copy"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Create"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Credits"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Dark"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Default"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Delete this user"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete your account"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Device"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Discard all"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Discard duplicates"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Docs"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Done"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Export"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Extension"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 15 minutes"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 5 minutes"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Generate"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Grid"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Split digits into two equals groups"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"by Half"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Try my luck"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded pack"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Import all"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Address"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Issuer"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Light"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"List"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Move"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"My device"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Never"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"New"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"No group"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- No pack -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"On security code copy"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"After 1 day"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"After 1 hour"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 1 minute"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 mo."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yr."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Online collection"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Open in browser"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"OS"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URIs"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits two by two"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"by Pair"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Plain text"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Prefill using a QR Code"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR code upload"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a device"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Regular"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Remove icon"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Resend email"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Save"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Scan a QR code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Select accounts to show"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Send password reset link"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Send recovery link"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Send"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Sign out"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Submit"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 10 minutes"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Test"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Text file"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 30 minutes"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Time"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Import"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Group digits three by three"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"by Trio"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"After 2 minutes"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth format"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Update"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Upload a QR code"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Upload"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Utilizadores"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Variables"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web extension"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" mos."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarian)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danish)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (German)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (English)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Spanish)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (French)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hindi)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Italian)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japanese)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korean)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Dutch)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portuguese, Brazilian)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Russian)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Painel de administração"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Back to home"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Configure"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Continue"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Create new group"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Criar um utilizador"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"How to create a PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Generate a new token"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Go to 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Help translate 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"login & password"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage groups"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Recover your account"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Register a new device"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Register"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Reset it"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Reset your password"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Scan"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"a security device"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"See full log"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"You can sign without SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Sign in"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Use the advanced form"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"View on Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Why do I see this?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Full access log for user "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"This account is bound to a "},{t:4,k:"provider"},{t:3,v:" account via OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery email sent!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Pick a method and add your first account"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Gerir utilizadores registados na sua instância ou criar novos."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Already authenticated, please log out first"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Already registered?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternative methods"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Authentication handled by a reverse proxy, below settings are disabled."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication against the server failed."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser on :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock is On"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"The user account will be deleted as well as all its 2FA data."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Your user account will be deleted as well as all your 2FA data. There is no going back."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Deleting your 2FAuth account has no impact on your external SSO account."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Deleting a group does not delete accounts"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Direct input"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Feature disabled in Demo mode"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Don't have your account yet?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"An error occured:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Failed login on "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Failure"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Fetching data..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Forgot your password?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Has lower case"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Has number"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Has special char"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Has upper case"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Help: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Hi "},{t:4,k:"username"},{t:3,v:", it's all good"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use the Export feature of these apps to get a migration resource like a QR code or a JSON file then load it here."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Imported"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"This reset token is invalid."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 characters min."}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Is your personal access token still valid?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Last seen "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logos by"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Lost your device?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Made with"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Make sure to copy your personal access token now. You won’t be able to see it again!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage the account at proxy level."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can create groups to organize your accounts the way you want. All accounts remain visible in the pseudo group named 'All', regardless of the group they belong to."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Mandatory"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Move selected to"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Or"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Or filter accounts by group"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Set at least one device to enable the following options"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"No 2FA here!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"No entry yet"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"no provider"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"No result"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- no service -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Provider is missing?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"nothing"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection attempt"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Failed login to 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Hello :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Hello"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Here are the details of this connection"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"A new device has just connected to your 2FAuth account."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Connection to 2FAuth from a new device"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Regards"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth test email"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Good news, it works :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"You can also continue with:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI is the most common format used to exchange 2FA data, for example in the form of a QR code when you enable 2FA on a web site. Select this if you want to switch from 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Parsing data..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"A password reset request exists for this user but has expired, meaning that the user has not changed their password in time. This may be a request from the user themselves or from an administrator."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"A password reset request exists for this user (request sent at "},{t:4,k:"datetime"},{t:3,v:"), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"An account with the exact same data already exists"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"To recover your account, 2FAuth resets some Webauthn settings so you will be able to sign in using your email and password."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Registered "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a password reset link to this address. Click the link in the received email to set a new password."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a device is permanent"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Revoking a token is permanent"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Authentication devices you can use to sign in 2FAuth, like security keys (i.e Yubikey) or smartphones with biometric capabilities (i.e. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Some translations are missing using the browser preferred language?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Please use another device/camera"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Live scan can't start :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"No camera on this device"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Maybe you forgot to plug in your webcam"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Fail to load scanner"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is the camera already in use? Ensure that no other app use your camera and try again"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Secure context required"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"You should use a modern browser"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Successful login on "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Successful logout on "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: Plain text, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Accepted: jpg, jpeg, png, bmp, gif, svg, or webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"O número limite de tentativas de login foi atingido. Por favor tente novamente dentro de "},{t:4,k:"seconds"},{t:3,v:" segundos."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"The schema definition is described here:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI Icons by"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Use the available buttons to permanently save them to your 2FA collection or discard them."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Get ready to authenticate using (one of) your security devices. Plug your key in, remove face mask or gloves, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Use email address "},{t:4,k:"email"},{t:3,v:" and password "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" active token(s)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" security device(s) (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Viewed on "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack found on the server."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn login disabled"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth demo."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Welcome to the 2FAuth testing instance"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" accounts"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" is available"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" selected"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"This instance is up-to-date"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully created"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Account successfully updated"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully deleted"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully moved"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Authentication failed"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Auto-lock triggered, you've been logged out"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Cache cleared"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copied to clipboard"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data has been refresh to reflect server-side changes"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully revoked"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Device successfully registered"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Group name saved"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully created"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Group successfully deleted"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"No icon pack available"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password changed"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully changed"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Password successfully reset"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's PATs successfully revoked"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profile successfully updated!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Settings saved"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token successfully revoked"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"User account successfully deleted"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"utilizador criado com sucesso"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"User role updated"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" valid accounts found"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Próxima »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Anterior"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwords must be at least eight characters and match the confirmation."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"A palavra-passe foi redefinida!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"O lembrete para a palavra-passe foi enviado!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Por favor aguarde, antes de tentar novamente."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Este código de recuperação da palavra-passe é inválido."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Não existe nenhum utilizador com o e-mail indicado."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Nome de utilizador, e-mail..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Item not found"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"About"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Accounts"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"App setup"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Create user"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Access log"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Manage user"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Users management"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Auto lock"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Create account"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Create group"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Account edit"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Group edit"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Error"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Groups"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Import accounts"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Login"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Reset password"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"New password"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Reset extension"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Register new account"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"User account"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"New personal token"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth tokens"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Options"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn devices"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Device edit"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Account as QR code"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"New account"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Account recovery"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Register a new device"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Clear search"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Clear selection"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Close the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Copy next password to clipboard"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Copy to clipboard"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Delete"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Discard this account"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Export selected accounts"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Generate a test pasword"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Hide group selector"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Hide password"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Import this account"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Lock it"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Manage"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Move selected into a group"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Rename"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Resend a password reset email to the user"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Reveal password"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's security devices"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all user's tokens"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Revoke"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Search"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Select all"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Show group selector"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last month"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last year"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Show QR code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Sign in using a security device"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Sort ascending"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Show least recent first"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Show most recent first"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Sort descending"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Unlock it (at your own risk)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Use a QR code to fill the form magically"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Visit "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted when :other is :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be accepted."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after or equal to :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date after :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters, numbers, dashes, and underscores."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters and numbers."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain letters."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an array."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must only contain single-byte alphanumeric characters and symbols."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before or equal to :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date before :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have between :min and :max items."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max kilobytes."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max characters."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deverá conter o valor verdadeiro ou falso."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field contains an unauthorized value."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field confirmation does not match."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is missing a required value."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"The password is incorrect."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"This email address does not comply with the registration policy"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"No account found using this email."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"All emails must be valid and separated with a pipe"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDs must be comma separated, without trailing comma."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"The uri must have a label."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not supported."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Supported format are jpeg, png, bmp, gif, svg, or webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a base32 encoded string."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not contain colon."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is not a valid otpauth uri."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a date equal to :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match the format :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid date."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :decimal decimal places."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined when :other is :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be declined."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field and :other must be different."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be between :min and :max digits."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :digits digits."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field has invalid image dimensions."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute contém um valor duplicado."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not end with one of the following: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not start with one of the following: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid email address."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must end with one of the following: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"The selected :attribute is invalid."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"O valor selecionado para o campo :attribute é inválido."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have one of the following extensions: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have more than :value items."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value kilobytes."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than :value characters."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have :value items or more."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value kilobytes."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be greater than or equal to :value characters."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid hexadecimal color."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack cannot be found on the server."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an image."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must exist in :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute não contém um valor válido."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be an integer."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IP address."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv4 address."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid IPv6 address."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid JSON string."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a list."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be lowercase."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have less than :value items."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value kilobytes."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than :value characters."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :value items."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value kilobytes."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be less than or equal to :value characters."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid MAC address."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max digits."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not have more than :max items."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max kilobytes."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must not be greater than :max characters."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a file of type: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min digits."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must have at least :min items."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min kilobytes."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be at least :min characters."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :other is :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing unless :other is :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values are present."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing when :values is present."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be missing."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a multiple of :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute contém um valor inválido."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a number."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"The uri parameter must be provided alone or only in combination with the 'custom_otp' parameter"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one letter."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one uppercase and one lowercase letter."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one number."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain at least one symbol."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"The given :attribute has appeared in a data leak. Please choose a different :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :other is :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present unless :other is :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values are present."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be present when :values is present."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"O campo :attribute deverá estar presente."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited when :other is :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited unless :other is in :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is prohibited."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field prohibits :other from being present."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field format is invalid."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain entries for: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is accepted."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field is required when :other is declined."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute quando o valor do campo :other é igual a :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute a menos que :other esteja presente em :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute quando um dos :values está presente."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute quando :values está presente."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute quando nenhum dos :values está presente."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute quando :values não está presente."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"É obrigatória a indicação de um valor para o campo :attribute."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must match :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"When using :attribute it must be the only parameter in this request body"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must contain :size items."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size kilobytes."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be :size characters."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must start with one of the following: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a string."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid timezone."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"O valor indicado para o campo :attribute já se encontra registado."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"O upload do ficheiro :attribute falhou."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be uppercase."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute field must be a valid UUID."}}}},{ru:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Значок, который иллюстрирует учётную запись"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Изображение QR-кода для сканирования"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Изменения будут утеряны. Вы уверены?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Это серьёзно повлияет на права этого пользователя. Вы уверены?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите удалить свой профиль?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите удалить эту группу?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите удалить эту учётную запись?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите удалить этого пользователя? Это действие невозможно отменить."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Вы больше не будете администратором. Точно уверены?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите отклонить все учётные записи?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите отклонить все дубликаты?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите отклонить эту учётную запись?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Это ваш собственный профиль. Вы уверены?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите выйти?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите отозвать предыдущий запрос?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите сбросить пароль этого пользователя?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите отозвать это устройство?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите отозвать этот токен?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Вы уверены, что хотите изменить настройки общего доступа?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Общий доступ к этой записи для всех пользователей будет отключён. Вы уверены?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"Общий доступ к этим записям будет отключён. Вы уверены?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Вы собираетесь потерять право собственности на эту учётную запись. Вы уверены?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"Домен 2FAuth недопустим"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Прервано пользователем"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Профиль управляется внешним провайдером"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth настроен на работу за прокси-аутентификацией, но ваш прокси не возвращает ожидаемый заголовок. Проверьте настройки и повторите попытку."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Прокси-аунтификация не удалась"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"В аутентификаторе отсутствует обнаруживаемая поддержка учётных данных"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"В аутентификаторе отсутствует поддержка проверки пользователя"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Ваше устройство не поддерживает WebAuthn. Повторите попытку позже, используя более современный браузер"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Невозможно создать OTP без секретного ключа"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Секретный ключ не может быть расшифрован. В основном это может быть вызвано неправильным APP_KEY в .env файле 2Fauth или из-за повреждения данных в базе."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Не удается декодировать обнаруженный QR-код, попробуйте обрезать или сделать изображение более резким"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Невозможно удалить единственный профиль администратора"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Невозможно разжаловать единственный профиль администратора"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Невозможно обнаружить QR-код на изображении, попробуйте обрезать изображение"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Изменение не удалось, повторите попытку"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Проверка не удалась, повторите попытку позже"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось обновить данные с сервера"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Данные этого QR-кода — не корректный OTP Auth URI. QR-код содержит:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Могут быть удалены только настройки, созданные пользователем"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Ошибка при получении QR-кода"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось отправить письмо"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Нечитаемо, данные кажутся зашифрованными"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Сгенерировать ключ шифрования не удалось"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Что-то пошло не так во время получения данных"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Сбой расшифровки, ваша база данных по-прежнему защищена. В основном, это вызвано проблемой целостности шифрованных данных для одной или нескольких учётных записей."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Сбой шифрования, ваша база данных остаётся незащищённой."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось перенести значки. Настройки были восстановлены в предыдущее значение."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Ошибка аутентификации, проверьте PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"Сервер 2FAuth недоступен, проверьте URL-адрес"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось расшифровать PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось получить ключ"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось зашифровать PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось получить пароль"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось получить токен"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось запустить скрипт сканирования QR"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось загрузить настройки из хранилища"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось регенерировать IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось получить настройки приложния"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось получить данные зашифрованного хранилища"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось установить задержку автоблокировки"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось установить ключ шифрования"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось установить параметры шифрования"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось сохранить зашифрованный PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"Поле обязательно и должно содержать корректный URL-адрес"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"Это поле обязательно"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось загрузить файл"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Требуется HTTPS контекст"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*неразборчиво*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Неверные данные 2FA"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Неправильный или неизвестный токен персонального доступа"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Неверные или нечитаемые данные :appname"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"Активная вкладка не найдена"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Ни один аутентификатор не поддерживает указанные алгоритмы"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Запись типа 'Публичный ключ' не найдена"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"Нет доступных значков в этом варианте"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Нет совпадений в наборе значков"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Для этого пользователя сброс пароля недоступен"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"Нет доступных QR-изображений"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"В видимой области страницы не найдено действительных QR-кодов"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Нет читаемого QR кода"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"В этом QR-коде нет допустимых OTP ресурсов"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Этот формат OTP в настоящее время не поддерживается"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Операция не разрешена"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"Разрешения ключа OAuth некорректны на сервере. Чтобы решить эту проблему, пожалуйста, обратитесь к руководству по обновлению до v8 (Upgrading to v8) на сайте документации 2FAuth."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Этот QR-код нечитаем"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR-код имеет некорректную контрольную сумму"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Обновить"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Зарезервированное имя, пожалуйста, выберите что-то другое"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Пожалуйста, используйте только буквы, цифры, тире, знаки подчеркивания, пробелы или одинарные кавычки"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Запрос получен не от доверенного прокси"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Ресурс не найден"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Устройство уже зарегистрировано"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Ошибка безопасности: проверьте вашу переменную окружения WEBAUTHN_ID"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Функция предоставления общего доступа группе «Все пользователи» отключена"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Функция общего доступа отключена"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Что-то не так с вашим сервером"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Нежелательные пробелы будут автоматически удалены"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Этот SSO провайдер не полностью настроен в вашем .env файле"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO отключено"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Профиль с таким же адресом электронной почты уже существует, но не соответствует вашему внешнему идентификатору учётной записи. Не используйте SSO, если вы уже зарегистрированы на 2FAuth с этим email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Аутентификация по SSO отклонена"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Регистрация отключена"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Эта учётная запись уже доступна всем пользователям."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Эта учётная запись не доступна всем пользователям"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"в параметр запроса было включено слишком много идентификаторов, разрешено максимум 100"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось расшифровать uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"У вас нет разрешения на просмотр этого ресурса или выполнение этого действия"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Авторизация не выполнена"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Неизвестная ошибка во время шифрования PAT"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Неизвестная ошибка"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Данные не соответствуют ни одному поддерживаемому формату"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Неподдерживаемый тип OTP"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Неподдерживаемая область действия общего доступа"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Не применимо при использовании прокси-аутентификации или SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Этот метод аутентификации предназначен только для администраторов. Пользователи должны войти в систему с помощью SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось удалить учётную запись пользователя, данные не были удалены"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"Идентификатор пользователя не был от 1 до 64 символов"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Неверный текущий пароль"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Неверный пароль"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Иван Иванов"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Учётная запись"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Алгоритм, используемый для защиты ваших кодов безопасности"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Алгоритм"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Позволить пользователям создавать персональные токены доступа и использовать их для аутентификации с помощью сторонних приложений, таких как веб-расширение 2FAuth"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Разрешить использование PAT"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"Персональный токен доступа (PAT) для аутентификации расширения на сервере. Вы можете сгенерировать на странице Настройки > OAuth вашей учётной записи 2FAuth"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API токен"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматически скрывать код с экрана по истечении времени ожидания. Это избавляет от необходимости запрашивать код заново, если вы забыли закрыть его отображение."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Автозакрытие OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Блокировать расширение автоматически для предотвращения незаконного доступа к его данным"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Автоблокировка"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Выйти из учётной записи автоматически в случае неактивности. Не имеет эффекта, когда аутентификация обрабатывается прокси и не задан пользовательский адрес выхода."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Автоблокировка"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Новые учётные записи автоматически регистрируются после сканирования или загрузки QR-кода без необходимости нажимать кнопку 'Сохранить'"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Автосохранение учётных записей"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Иногда кэш должен быть очищен, например, после изменения переменных окружения или обновления приложения. Вы можете сделать это отсюда."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Управление кэшем"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматически проверять (раз в неделю) и предупреждать о выходе новой версии 2FAuth на Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Проверить обновления"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Очистить строку поиска сразу после копирования кода в буфер обмена"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Очистить поиск при копировании"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Нажатие на сгенерированный код, чтобы скопировать его, автоматически скроет его с экрана"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Закрыть OTP после копирования"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Подтвердить новый пароль"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматически копировать сгенерированный код сразу после его появления на экране. Из-за ограничений браузеров, будет скопирован только первый код TOTP (Time-based One-Time Password), а не последующие"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Копировать OTP при отображении"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Редактирование счётчика рискованно: значение может разойтись с сервером проверки. Используйте иконку замка, чтобы разрешить изменение — но только если точно понимаете, что делаете."}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"Начальное значение счётчика"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"По умолчанию - 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Счётчик"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Введите ваш текущий пароль для подтверждения, что это действительно вы"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Текущий пароль"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Группа, к которой будут привязаны новые учётные записи"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Группа по умолчанию"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Способ ввода по умолчанию, который будет использоваться при включённой опции быстрого ввода"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Способ ввода по умолчанию"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Количество цифр в генерируемом коде безопасности"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Количество цифр"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Все ваши устройства безопасности будут отозваны. Используйте эту опцию, если вы потеряли их или их безопасность была скомпрометирована."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Отключить все устройства безопасности"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Запретить регистрацию новых пользователей. Если не переопределено (см. ниже), это также влияет на SSO, так что новые пользователи не смогут войти через SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Отключить регистрацию"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Выберите, хотите ли вы отображать учётные записи как список или как сетку"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Режим отображения"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Электронная почта"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Разрешить пользователям делиться своими 2FA учётными записями с другими пользователями этого экземпляра 2FAuth. При совместном использовании учётные записи 2FA могут быть просмотрены и использованы получателями для создания OTP кодов. Только владелец учётной записи может редактировать, удалять или экспортировать её, а также просматривать её секретный ключ или управлять конфигурацией общего доступа к такой учётной записи."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Включить общий доступ"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"Область действия «Все пользователи» позволяет ориентироваться на всех пользователей системы 2FAuth. Когда общий доступ к учётной записи используется на этом уровне, она автоматически передается всем пользователям, включая новых, которые были созданы после предоставления общего доступа."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Отключение этого параметра выключит существующий общий доступ с областью действия «Все пользователи», но доступ не будет отозван. Если позже вы включите эту настройку обратно, доступ снова станет активным, если за это время общий доступ не будет предоставлен конкретным пользователям."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Включить Общий доступ для группы «Все пользователи»"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Разрешить посетителям аутентифицироваться с использованием внешнего ID через схему Single Sign-On"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Включить SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Пароль, используемый для разблокировки расширения"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Текущий пароль"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Новый пароль, который будет использоваться для блокировки этого расширения и шифрования конфиденциальных данных при необходимости"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Новый пароль"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Пароль, который будет использоваться для блокировки этого расширения и шифрования конфиденциальных данных при необходимости"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Пароль"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"По имени пользователя можно искать частично, адрес email должен совпадать полностью"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Поиск пользователей, с которыми вы хотите поделиться"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Пробовать) Получать официальные значки эмитента 2FA при добавлении учётной записи"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Получить официальные значки"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"Группа, к которой будет привязана учётная запись"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Группа"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL, который вы можете посетить, чтобы проверить состояние этого экземпляра 2FAuth. Этот URL-адрес может быть использован для HEALTHCHECK в Docker или HTTPS Liveness probe в Kubernetes."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Health endpoint"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"Веб-адрес экземпляра 2FAuth, на котором вы зарегистрировались. Например: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"URL-адрес сервера 2FAuth"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"При необходимости в официальном значке будет запрошена коллекция значков."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Предпочитаемая онлайн коллекция"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Настройка получения значков из коллекции логотипов онлайн или локального набора. Изменение следующих настроек значков не обновит уже загруженные значки."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Получать значки из"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"Набор значков, который будет использоваться, когда необходима официальная иконка. Чтобы добавить набор значков, загрузите его в папку на сервере 2FAuth, спросите у администратора вашего экземпляра если хотите знать больше."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Набор значков"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Сузить размер выборки до указанного варианта. Если вариант отсутствует, то 2FAuth не будет пытаться вернуться к обычному варианту."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Строгая выборка"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Некоторые значки доступны в разных цветах, чтобы лучше смотреться в тёмной или светлой теме интерфейса. Установите тот, который вы хотите сначала искать. Обычный вариант будет автоматически загружен как запасной."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Вариант значка"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Значок"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Даёт пользователю права администратора. Администраторы имеют разрешения на управление всем приложением, то есть настройками и другими пользователями, но не могут генерировать пароли для 2FA, которыми они не владеют."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Администратор"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Разрешить новым пользователям входить в систему впервые через SSO, пока регистрация отключена"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Сохранить SSO регистрацию включённой"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Языки, отмеченные как готовые, переведены полностью — выберите нужный, чтобы переопределить язык браузера."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Язык"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Задайте имя этому устройству"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Имя"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Новое имя"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"Пользователь, которому будет передано право собственности на эту учётную запись."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Новый владелец"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Новый пароль"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Получать письмо при каждой неудачной попытке войти в вашу учётную запись 2FAuth"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"При неудачном входе"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Получать письмо, когда новое устройства подключается к вашей учётной записи 2FAuth"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"С нового устройства"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Вы можете оставить следующие значения пустыми, если не знаете, что конкретно здесь нужно указать. Будут применены наиболее распространённые значения."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Настройка того, как и когда отображается код (OTP)"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Показывать код"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"OTP на основе времени, OTP на основе HMAC или Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Выберите тип создаваемого OTP"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Изменить способ отображения кодов путём группировки цифр, чтобы облегчить чтение и запоминание"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Форматирование кодов"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Пароль"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"Период действия сгенерированных кодов безопасности в секундах"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"По умолчанию - 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Интервал"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Сохранить последний примененный фильтр группы и восстановить его при следующем посещении"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Запомнить фильтр группы"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Регистрация будет доступна для адресов электронной почты из этого списка. Разделяйте адреса символом вертикальной черты ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Список фильтрации"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Сделать регистрацию доступной только для ограниченного диапазона адресов электронной почты. Оба правила могут использоваться одновременно. Это не влияет на регистрацию через SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Ограничить регистрацию"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Регистрация будет доступна для адресов электронной почты, удовлетворяющих регулярному выражению"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Правила фильтрации"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Разрешить временно раскрывать коды, скрытые звёздочками"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Показывать скрытый OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"Ключ, используемый для генерации кодов безопасности"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Секретный ключ"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Сервис"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Показывать значки учётных записей на главной"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Показать значки"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Отображать адрес электронной почты пользователя в нижнем колонтитуле вместо прямых ссылок. Ссылки будут доступны в меню при нажатии на адрес электронной почты."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Показывать адрес электронной почты в нижнем колонтитуле"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Отображать эту группу как фишку в селекторе группы на главном экране. Это не имеет эффекта, если 'Использовать фишки для переключения' отключено в настройках пользователя."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Показывать в переключателях Фишек"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Предварительный просмотр следующего кода — того, что заменит текущий, когда он перестанет действовать. Настройки, заданные для текущего OTP, также применяются к следующему (форматирование, показ звёздочками)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Показывать следующий OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Заменить сгенерированный код на звёздочки (***) для обеспечения конфиденциальности. Это не повлияет на функцию копирования/вставки"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Показывать сгенерированный OTP как звёздочки"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Добавьте навигационное меню сбоку некоторых длинных страниц, чтобы можно было прокручивать непосредственно к определённым разделам. Эта функция доступна только на версии для компьютера. Меню не будет видно на мобильной версии или версии для планшета."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Показать меню быстрой навигации"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:'Показать фишки для виртуальных групп, таких как "Несгруппированные учётные записи", "Поделился Я/Со мной" и т.д...'}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Показать виртуальные группы"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"При вызове принудительно сортировать учётные записи с учётом регистра символов"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Учитывать регистр символов"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Загруженные значки регистрируются в базе данных в дополнение к хранилищу файловой системы, которое затем используется только в качестве кэша. Это облегчает резервное копирование 2FAuth, так как необходимо сделать резервную копию только базы данных."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Но у этого есть недостатки. Размер базы данных может заметно увеличиться, если сервер хранит много крупных значков. Это может немного снизить производительность — файловая система будет чаще обращаться к диску, чтобы синхронизироваться с базой."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Сохранять значки в базе данных"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Отправить тестовое письмо для проверки конфигурации электронной почты вашего экземпляра 2FAuth. Важно иметь работающую конфигурацию, иначе пользователи не смогут запросить письмо для сброса пароля."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Тест конфигурации электронной почты"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Принудительно использовать тему, определённую в настройках вашей системы/браузера"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Тема"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"Часовой пояс применяется ко всем датам и временам, отображаемым в приложении"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Часовой пояс"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"Если вы столкнулись с проблемами при захвате QR-кодов, это позволяет переключиться на более простой, но более надёжный сканер QR-кодов"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Использовать базовый сканер QR-кода"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Показать набор фишек над списком учётных записей 2FA, чтобы разрешить переключение групп напрямую с главной страницы. Если отключено, имя активной группы отображается на метке, которую необходимо нажать для вызова селектора группы."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Использовать фишки для переключения"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Конфиденциальные данные, секретные ключи 2FA и адреса электронной почты хранятся в зашифрованном виде в базе данных. Убедитесь, что у вас есть резервная копия значения APP_KEY вашего .env файла (или весь файл) так как оно служит в качестве ключа шифрования. Не существует способа расшифровки данных без этого ключа."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Защитить конфиденциальные данные"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Сделать SSO единственным доступным методом для входа в 2FAuth. Вход в систему по паролю и Webauthn будут отключены для обычных пользователей. Это ограничение не затрагивает администраторов."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Использовать только SSO"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Сделайте WebAuthn единственным авторизованным методом входа в свой профиль 2FAuth. Это рекомендуемая настройка, чтобы воспользоваться расширенной безопасностью WebAuthn."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"В случае потери устройства вы сможете восстановить свой профиль, сбросив эту опцию и войдя с помощью электронной почты и пароля."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Внимание! Форма входа по электронной почте и паролю остаётся доступной, несмотря на то, что эта опция включена, но она всегда возвращает ошибку «Аутентификация не пройдена»."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Использовать только WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматически использовать способ ввода по умолчанию или предлагать выбор из доступных способов ввода"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Быстрый ввод"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Всегда возвращаться в группу по умолчанию когда код OTP скопирован"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Показывать группу по умолчанию при копировании"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"О программе"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Журнал доступа"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Доступ"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Восстановление доступа к профилю"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Учётные записи 2FA"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Общий доступ"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Настройки общего доступа"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Аутентификация"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Ограничения браузера"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Изменить пароль"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"ОСТОРОЖНО!!!"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Ввод данных"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Удалить профиль"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Редактировать учётную запись"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Редактирование группы"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Окружение"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Общие"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Группы"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Значки"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Импорт"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Последний доступ"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Вход"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Новая учётная запись"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Новая группа"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Новый пароль"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Новый доступ"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Новый токен"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Новый пользователь"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Уведомления"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"Одноразовые пароли"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"Журнал генерации OTP"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Пароль"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Персональные токены доступа"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Профиль"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Цель"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR-код"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Регистрация"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Регистрации"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Переименовать устройство"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить расширение"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить пароль"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Ресурсы"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Устройства безопасности"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Безопасность"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Параметры сервера"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Сессия"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Настройка"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Single Sign-On (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"Вход с использованием SSO"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Хранилище"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Поддерживаемые форматы миграции"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"Пользователь"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Передача права собственности"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"Веб-расширение 2FAuth"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Авторизация не выполнена"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Обновить профиль"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Управление пользователем"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Пользователи"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn вход"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 день"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 час"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 минуту"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 10 минут"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 15 минут"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 2 минуты"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 30 минут"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 5 минут"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"О программе"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Учётная запись"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Учётные записи, которыми со мной поделились"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Учетные записи, к которым я даю доступ"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Действия"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Активные группы"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Добавить в 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Администратор"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"📋 Расширенная форма"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"После щелчка/касания"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Показать все пароли в главной странице, без дополнительных действий"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Все на домашней странице"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Все"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Все учётные записи"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Без группы"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Учётные записи без группы"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Щёлкните на учётную запись, чтобы получить код в отдельном окне"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"По одиночке, в отдельном окне"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Настройки приложения"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Применить"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Аутентификация"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Авто"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Назад"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Настройки браузера"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Браузер"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Отмена"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Изменить пароль"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Все"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Проверить"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Загрузить"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Очистить"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Закрыть"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Постоянно"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Продолжить"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Скопировать в буфер обмена"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Скопировать"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Счётчик"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Создать"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Авторы"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Тёмная"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"По умолчанию"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Удалить этого пользователя"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Удалить профиль"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Удалить"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Демо"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Найти QR-коды"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Устройство"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Отклонить все"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Отклонить дубликаты"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Документация"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Готово"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Редактировать"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Экспорт"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Расширение"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 15 минут"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 5 минут"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Генерировать"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"GitHub"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Сетка"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Двумя одинаковыми группами"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"половинками"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Мне повезёт!"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Загруженный набор"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Импортировать все"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Импорт"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Адрес"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Эмитент"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Светлая"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Список"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"📷 Сфотографировать QR-код"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Управление"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Возможно позже"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Переместить"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Моё устройство"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Никогда"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Новый"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Без группы"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- Нет набора -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Без общего доступа"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Убрать из группы"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"При копировании кода"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 день"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 час"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 минуту"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 мес."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 г."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Онлайн коллекция"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Открыть в браузере"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"Операционная система"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"OTPAuth URI"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Группами по 2 цифры"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"парами"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Обычный текст"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Предзаполнить используя QR-код"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR-код"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"Загрузка QR-кода"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Обновить"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Зарегистрировать устройство"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Регистрация"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Обычный"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Удалить значок"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Отправить письмо ещё раз"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить расширение"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить пароль"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Сброс"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Отозвать"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Сохранить"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Сканировать QR-код"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Поиск"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Выберите учётные записи для отображения"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Отправить ссылку для восстановления пароля"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Отправить ссылку для восстановления"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Отправить"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Поделиться"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"С общим доступом"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Я поделился"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Со мной поделились"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Все пользователи"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Конкретные пользователи"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Показать меня"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Войти"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Выйти"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Отправить"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 10 минут"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Проверка"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Текстовый файл"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 30 минут"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Время"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Импорт"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Передать"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Передача права собственности"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Группами по 3 цифры"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"тройками"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 2 минуты"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth формат"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Разблокировать"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Перестать делиться"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Обновить"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Загрузить QR-код"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Загрузить"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Пользователи"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Переменные"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Веб-расширение"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" мес."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Болгарский)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Датский)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Немецкий)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Английский)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Испанский)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Французский)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Хинди)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Итальянский)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Японский)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Корейский)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Голландский)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Португальский, Бразильский)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Русский)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Турецкий)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Китайский упрощенный)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"О программе"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Поделиться"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Добавить пользователей"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Административная панель"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Вернуться на главную"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Настройка"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Продолжить"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Создать новую группу"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Создать пользователя"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Создайте свою первую группу"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"Как создать PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Редактировать"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Сгенерировать новый токен"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Перейти к 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Помогите перевести 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Документация по значкам"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"имени пользователя и пароля"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Управление группами"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Управление Общим доступом"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Управление"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Не сейчас"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Откройте 2FAuth для создания группы"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"Журнал генерации OTP"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Восстановите доступ к профилю"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Зарегистрировать новое устройство"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Регистрация"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Восстановить"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить расширение"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить пароль"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Сканировать"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"устройства безопасности"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Смотреть полный журнал"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Посмотрите, как включить поставщика"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Документация о функции «Общий доступ»"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Вы можете войти без SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Войти"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Передать право собственности"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"Схема экспорта 2FAuth"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Использовать расширенную форму"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Посмотреть как QR-код"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Посмотреть на GitHub"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Почему я это вижу?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"Веб-приложение для управления двухфакторной аутентификацией (2FA) учётных записей и генерации кодов безопасности"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Веб-приложение для управления двухфакторной аутентификацией (2FA) учётных записей и генерации кодов безопасности"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"Журнал содержит больше записей."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Полный журнал доступа пользователя "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Этот профиль привязан к учётной записи "},{t:4,k:"provider"},{t:3,v:" через OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"Вы вошли через SSO с помощью учётной записи "},{t:4,k:"provider"},{t:3,v:". Ваша информация не может быть изменена здесь, измените данные в "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Письмо для восстановления доступа к профилю отправлено!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Выберите способ и добавьте свою первую учётную запись"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Добавьте первого пользователя, с которым хотите поделиться этой учётной записью"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Управление пользователями, зарегистрированными на вашем экземпляре приложения, или создание новых."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Установите «Все пользователи», чтобы поделиться этой учётной записью со всеми другими пользователями экземпляра 2FAuth. Это включает как существующих, так и новых пользователей."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Вы уже аутентифицированы"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Уже зарегистрированы?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"уже в общем доступе"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Альтернативные методы"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Аутентификация обрабатывается обратным прокси, настройки ниже отключены."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Аутентификация на сервере не удалась."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"Идеальный спутник вашего 2FAuth веб-приложения"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser на :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock включён"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"Профиль пользователя будет удалён, а также все его данные 2FA."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Ваш профиль будет удалён вместе со всеми вашими данными 2FA. Это действие невозможно отменить."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Удаление вашего профиля в 2FAuth не влияет на вашу внешнюю учётную запись SSO."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Удаление группы не удаляет учётные записи"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Начать обнаружение и выбрать код, я обработаю все остальные."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Быстрый ввод"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Функция отключена в демонастрационном режиме"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"НЕ ВКЛЮЧАЙТЕ защиту паролем или шифрование при экспорте данных из приложения 2FA, иначе 2FAuth не сможет расшифровать их."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Ещё нет профиля?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Перед тем как продолжить, убедитесь, что всё сделали правильно — отменить это действие будет невозможно. Также убедитесь, что передаёте право собственности доверенному пользователю: он получит полный контроль над этой учётной записью."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"Письмо будет отправлено на адрес "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Вы можете повысить безопасность своего профиля в 2FAuth, включив аутентификацию через WebAuthn."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Убедитесь, что вы открыли письмо на полностью доверенном устройстве."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Произошла ошибка:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Ожидается: список OTPAuth URI, по одной в строке"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Истекает через "},{t:4,k:"days_to_expiration"},{t:3,v:" день(дней)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Истекло "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Ошибка входа "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Неудачно"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Получение данных..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Имейте в виду, что общий доступ к учётной записи не дает получателю разрешения на доступ к конфиденциальным данным учётной записи 2FA: только возможность генерировать OTP коды."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Ваш браузер (Firefox) требует включения особых настроек для автоматического открытия расширения при захвате QR-кода с веб-страницы."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Забыли пароль?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" создан "},{t:4,k:"requester"},{t:3,v:" "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"маленькие буквы"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"цифры"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"специальный символы"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"заглавные буквы"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Справка: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Привет "},{t:4,k:"username"},{t:3,v:", все хорошо"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"Кнопка «Мне повезёт!» пытается получить стандартный значок из выбранной коллекции значков. Чем проще значение поля Сервис, тем больше вероятность того, что вы получите ожидаемый значок: не добавляйте никаких расширений (например, «.сom»), используйте точное название службы и избегайте спецсимволов."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Администратор?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Используйте функцию экспорта данных приложений, чтобы получить ресурс миграции, такой как QR-код или JSON файл, а затем загрузите его здесь."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth может импортировать данные из различных 2FA приложений."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Импортировано"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- неверная учётная запись -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Этот токен сброса недействителен."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- неверный сервис -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"Минимум 8 символов"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Ваш персональный токен доступа все ещё действует?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Доступна всем пользователям"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Каждый пользователь этого экземпляра 2FAuth, как текущий, так и будущий, может видеть эту учётную запись и генерировать для неё пароли."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Последнее посещение: "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Логотипы"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Потеряли устройство?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Сделано с использованием"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Убедитесь, что вы скопировали ваш персональный токен доступа прямо сейчас. Вы не сможете увидеть его снова!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Управление профилем на уровне прокси-сервера."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Управление аутентификацией на уровне прокси-сервера."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Вы можете создать группы для организации ваших учётных записей. Все учётные записи остаются видимыми в служебной группе 'Все', независимо от группы, к которой они принадлежат."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Обязательно"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Переместить выбранные в"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Нужно импортировать один из видимых QR-кодов этой страницы в 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Или"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Или фильтровать учётные записи по группе"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"Вы можете передать право собственности на эту учётную запись 2FA другому пользователю. Новый владелец получит полный контроль над ней."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Передача не повлияет на текущие настройки общего доступа к записи."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Если эта запись в настоящее время доступна всем пользователям, вы сможете продолжать генерировать для неё одноразовые коды."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Если эта учётная запись в настоящее время доступна определённым пользователям, вы больше не увидите её, если её новый владелец не поделится ей с вами."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Настройте хотя бы одно устройство для включения следующих параметров"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Ни одной учётной записи 2FA не добавлено!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Пока нет записей"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"Групп ещё нет"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"В буфере обмена не найдено изображения"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"Нет совпадений"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"нет поставщика"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Нет результатов"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- нет сервисов -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Поставщик отсутствует?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"без общего доступа"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"ничего"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Подробности об этой попытке подключения"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Если это были вы, можете проигнорировать это предупреждение. Если дальнейшие попытки не удались, свяжитесь с администратором 2FAuth для проверки настроек безопасности и принятия мер против этого атакующего."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"Произошла неудачная попытка входа в ваш профиль 2FAuth."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось войти в 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Привет, :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Привет"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Информация об этом подключении"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Если это вы, то вы можете проигнорировать это уведомление. Если вы подозреваете, что это подозрительное действие с вашей учётной записью, измените ваш пароль."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Новое устройство только что подключилось к вашему профилю 2FAuth."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Подключение к 2FAuth с нового устройства"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"Если эта учётная запись 2FA была доступна другим пользователям до передачи права собственности, проверьте настройки общего доступа — возможно, их нужно обновить."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"Мы хотели сообщить, что :actor передал вам право собственности на учётную запись 2FA :twofaccount. Теперь вы являетесь владельцем этой учётной записи 2FA и имеете полный контроль над ней."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Передача прав собственности на учётную запись 2FA"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"Вы больше не можете просматривать эту учётную запись 2FA или использовать её для создания одноразовых кодов."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Мы хотели сообщить, что :actor отозвал общий доступ к учётной записи 2FA :twofaccount для всех пользователей."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"Мы хотели сообщить, что :actor отозвал общий доступ к учётной записи 2FA :twofaccount для вас."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"Общий доступ к учётной записи 2FA отозван"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Мы хотели сообщить, что :actor предоставил общий доступ к учётной записи 2FA :twofaccount для всех пользователей."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"Мы хотели сообщить, что :actor предоставил общий доступ к учётной записи 2FA :twofaccount для вас."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"Вам предоставлен доступ к учётной записи 2FA"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"Теперь вы можете просматривать эту учётную запись 2FA и использовать её для генерации одноразовых кодов, пока общий доступ к ней активен."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"С наилучшими пожеланиями"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"Сброс пароля 2FAuth"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"Вы получили это письмо, потому что вы запросили сброс пароля для вашего профиля 2FAuth."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Срок действия ссылки для сброса пароля истекает через :count минут."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"Если вы не запрашивали сброс пароля, то никаких дальнейших действий не требуется."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Вы получили это письмо, потому что вы запросили тестовое письмо, чтобы проверить настройки электронной почты вашего экземпляра 2FAuth."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"Тестовое письмо 2FAuth"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Хорошие новости! Всё работает! :-)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Рекомендуется (настоятельно)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Также вы можете продолжить с:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"OTPAuth URI - наиболее распространённый формат, используемый для обмена данными 2FA, например, в форме QR-кода, когда вы включаете 2FA на веб-сайте. Выберите этот вариант, если вы хотите сменить 2FAuth на что-то другое."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Экспорт данных в список OTPAuth URI"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Анализ данных..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Вход по паролю и через WebAuthn отключены."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Запрос на сброс пароля для этого пользователя уже существует, но истёк — пользователь не успел вовремя сменить пароль. Запрос мог быть создан как самим пользователем, так и администратором."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Запрос на сброс пароля для этого пользователя уже существует (отправлен "},{t:4,k:"datetime"},{t:3,v:"): пользователь ещё не сменил пароль, но ссылка из письма всё ещё действительна. Запрос мог быть создан как самим пользователем, так и администратором."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Учётная запись с такими же данными уже существует"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"Это веб-расширение — дополнение к веб-приложению 2FAuth. Оно даёт доступ к данным 2FA вашего профиля 2FAuth и позволяет генерировать коды OTP прямо из панели браузера."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"У вас должен быть профиль в 2FAuth, привязанный к расширению, — это делается через адрес сервера 2FAuth и Персональный токен доступа (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Чтобы восстановить ваш профиль, 2FAuth сбрасывает некоторые настройки WebAuthn, чтобы вы могли войти с помощью электронной почты и пароля."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth отправит вам ссылку для восстановления на этот адрес электронной почты. Нажмите на ссылку в полученном письме и следуйте инструкциям."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Дата регистрации: "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"Регистрация 2FA из расширения пока не поддерживается. Посетите своё приложение 2FAuth, чтобы добавить ваш первый 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:'Используйте "Отправить письмо ещё раз", чтобы отправить пользователю новое письмо для сброса пароля. Текущий пароль останется прежним, а предыдущие запросы будут отозваны.'}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Используйте эту опцию, если вы забыли пароль расширения."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"Расширение потеряет текущую конфигурацию и данные 2FAuth. Оно будет снова доступно для повторной привязки к профилю в 2FAuth."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Для принудительного сброса пароля используйте функцию 'Сброс пароля' (при этом будет установлен временный пароль) перед отправкой пользователю письма для сброса пароля, чтобы он мог установить новый пароль. Любой предыдущий запрос будет отозван."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth вышлет вам ссылку для сброса пароля на этот адрес. Нажмите на ссылку в полученном письме, чтобы установить новый пароль."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Если вы всегда использовали SSO для входа, выйдите из системы, а затем воспользуйтесь функцией сброса пароля, чтобы получить пароль и заполнить эту форму."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Вы можете попробовать обновить (возможно, это была временная проблема) или вы можете сбросить расширение и предоставить новый токен."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Удаление устройства необратимо"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Отзыв токена необратим"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Устройства аутентификации, которые можно использовать для входа в систему 2FAuth, такие как ключи безопасности (например, Yubikey) или смартфоны с биометрическими возможностями (например, Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Установите на «Конкретные пользователи» чтобы поделиться этой учётной записью с выбранными вами пользователями."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Некоторые настройки управляются вашим администратором"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Поделитесь этой учётной записью 2FA с другими пользователями этого экземпляра 2FAuth."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Общие учётные записи могут быть просмотрены и использованы другими пользователями для создания OTP кодов, но только владелец может редактировать или удалять их, или просматривать их секретные ключи."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Поделился "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Начиная с "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"доступна всем"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"используется совместно с конкретными пользователями"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"Вы можете подключиться, используя адрес электронной почты "},{t:4,k:"email"},{t:3,v:" и пароль "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Выберите поставщика SSO для авторизации:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Войти с помощью"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Некоторые переводы отсутствуют на предпочитаемом языке?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Обычные пользователи должны войти в систему с помощью SSO. Другие методы предназначены только для администратора."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Аутентификация ограничена только SSO, "},{t:4,k:"auth_method"},{t:3,v:" отключен"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Установленные камеры не подходят"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Пожалуйста, используйте другое устройство/камеру"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Для потоковой передачи с камеры требуется HTTPS"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Невозможно запустить сканирование в реальном времени :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"Обычно это делается нажатием на перечёркнутый значок камеры в адресной строке браузера или рядом с ней"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"У 2FAuth нет разрешения на доступ к вашей камере"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Вам нужно предоставить разрешение для использования камеры вашего устройства. Если вы уже отказались и ваш браузер не запрашивает у вас разрешения снова, обратитесь к документации браузера для выяснения того, как предоставить разрешение."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"На устройстве нет камеры"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Может быть, вы забыли подключить веб-камеру"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Сбой загрузки сканера"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Камера уже используется? Убедитесь, что другое приложение не использует вашу камеру и попробуйте снова"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Требуется HTTPS контекст"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"Для сканирования в реальном времени требуется HTTPS. Если вы запускаете 2FAuth с вашего компьютера, не используйте виртуальный хост, отличный от localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API не поддерживается в этом браузере"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Вам следует использовать современный браузер"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"В ресурсе миграции были найдены учётные записи 2FA. Пока ни одна из них не была добавлена в 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Успешный вход "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Успешный выход "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Принимается: Простой текст, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Принимается: jpg, jpeg, png, bmp, gif, svg или webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"Эта учётная запись в настоящее время "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Это не мягкое удаление — действие невозможно отменить."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Эта форма не затрагивает существующие настройки общего доступа. Чтобы прекратить общий доступ к этой учётной записи с пользователем, необходимо отозвать общий доступ из настроек общего доступа."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Слишком много попыток входа. Пожалуйста, попробуйте ещё раз через "},{t:4,k:"seconds"},{t:3,v:" секунд."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Токены личного доступа позволяют любому приложению аутентифицироваться в API 2Fauth. Вам необходимо указать токен доступа как Bearer токен в HTTP заголовке Authorization запросов от клиентского приложения."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"Это действие не отзовёт используемый персональный токен доступа."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"Предпочтительный вариант, если вам нужно создать резервную копию, которая может быть восстановлена в 2FAuth. Этот формат включает в себя информацию о значках."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Экспорт данных, используя схему 2FAuth json"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"Определение схемы описывается здесь:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"Расширение браузера для получения кодов безопасности 2FA, сгенерированных на вашем сервере 2FAuth."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"Значки пользовательского интерфейса"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"Расширение заблокировано для защиты данных. Введите пароль расширения для доступа к 2FA."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Используйте доступные кнопки, чтобы навсегда сохранить их в вашей коллекции 2FA или отклонить их."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Будьте готовы пройти аутентификацию с помощью (одного из) ваших устройств безопасности. Вставьте ключ, снимите маску или перчатки и т.д."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Используйте адрес электронной почты "},{t:4,k:"email"},{t:3,v:" и пароль "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Профиль предоставляется прокси-сервером аутентификации."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" активных токен(ов)"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" устройство(а) безопасности (passkeys)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Просмотрено "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"На сервере не найдено наборов значков."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Вход через WebAuthn отключён"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn позволяет использовать надёжные устройства (например, Yubikey или смартфоны с биометрическими возможностями) для быстрого и более безопасного входа."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Добро пожаловать в 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Добро пожаловать на демонстрационную версию 2FAuth."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Добро пожаловать в тестовый экземпляр 2FAuth"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"Это простое изменение конфигурации, которое занимает меньше минуты. Мы подготовили пошаговое руководство, которое поможет включить эту функцию."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:3,v:"учётных записей "},{t:4,k:"count"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:3,v:"Доступна новая версия "},{t:4,k:"version"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:3,v:"Выбрано: "},{t:4,k:"count"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Установлена последняя версия"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"Также вы можете вставить из буфера обмена"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"Вы можете включить функцию общего доступа в любое время"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"Для продолжения нужен профиль — пожалуйста, зарегистрируйтесь."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Учётная запись успешно создана"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Учётная запись успешно обновлена"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Учётная(ые) запись(и) успешно удалена(ы)"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Учётная(ые) запись(и) успешно перемещена(ы)"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Ошибка аутентификации"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Сработала автоблокировка, вы вышли из системы"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Кэш очищен"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Скопировано в буфер обмена"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Данные обновлены, чтобы отразить изменения со стороны сервера"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Устройство успешно деактивировано"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Устройство успешно зарегистрировано"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Название группы сохранено"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Группа успешно создана"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Группа успешно удалена"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"Нет доступных наборов значков"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Пароль изменён"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Пароль успешно изменён"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Пароль успешно сброшен"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Персональные токены доступа пользователя успешно отозваны"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Профиль успешно обновлён!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Устройства безопасности пользователя успешно отозваны"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Настройки сохранены"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Тестовое письмо отправлено, проверьте почту"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Токен успешно отозван"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Профиль пользователя успешно удалён"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"Пользователь успешно создан"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Роль пользователя обновлена"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"Найдено "},{t:4,k:"count"},{t:3,v:" действительных учётных записей"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Вперёд »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Назад"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Пароль должен содержать не менее восьми символов и совпадать с паролем в поле 'подтверждение пароля'."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Ваш пароль был сброшен!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"Ссылка на сброс пароля была отправлена!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Пожалуйста, подождите перед повторной попыткой."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Ошибочный код сброса пароля."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Не удалось найти пользователя с указанным адресом электронной почты."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Имя пользователя, электронная почта..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Элемент не найден"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"О программе"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Учётные записи"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Общий доступ к учётной записи"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Настройки приложения"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Аутентификация"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Создать пользователя"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Журнал доступа"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Управление пользователем"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Управление пользователями"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Автоблокировка"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Отсканируйте QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Создать учётную запись"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Создать группу"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Редактирование учётной записи"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Изменение группы"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Слишком много запросов"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Ошибка"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Группы"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Импорт учётных записей"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Лэндинг"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Вход"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"Журнал генерации OTP"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Восстановить пароль"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Новый пароль"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить расширение"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Регистрация нового профиля"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Профиль"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Новый персональный токен"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth Токены"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Устройства WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Редактирование устройства"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Настройки"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Открыть доступ к учётной записи"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Учётная запись как QR-код"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Новая учётная запись"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Передача права собственности"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Разблокировать"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Восстановление доступа к профилю"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Зарегистрировать новое устройство"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Очистить поиск"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Очистить выделение"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Закрыть страницу "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Создать новую группу"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Скопировать следующий код в буфер обмена"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Скопировать в буфер обмена"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Удалить"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Удалить учётную запись"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Удалить выбранные учётные записи"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Обнаружить QR-коды на активной веб-странице"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Отклонить эту учётную запись"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Редактировать учётную запись"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Редактировать группу"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Редактировать общий доступ"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Экспорт выбранных учётных записей"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Сгенерировать тестовый код"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Вернуться к странице "},{t:4,k:"pagetitle"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Скрыть выбор группы"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Скрыть пароль"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Импортировать эту учётную запись"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Заблокировать"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Управление"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Управление вашими группами"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Переместить выделенное в группу"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Экспорт данных в список OTPAuth URI"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Обновить список наборов значков"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Переименовать"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Отправить письмо для сброса пароля пользователю ещё раз"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Сбросить пароль пользователя"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Показать пароль"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Отозвать все устройства безопасности пользователя"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Отозвать все токены пользователя"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Отозвать"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Поиск"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Выбрать все"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Поделиться этой учётной записью"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Добавить общий доступ"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Общий доступ для всех"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Показать выбор групп"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Показать записи за последний месяц"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Показать записи за последний год"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Показать QR код"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Показать записи за последние 6 месяцев"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Показать записи за последние 3 месяца"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Войти, используя устройство безопасности"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"По возрастанию"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Показать сначала первые"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Показать сначала последние"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"По убыванию"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" делится этой учётной записью с вами"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Вы делитесь этой учётной записью со всеми пользователями"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Вы делитесь этой учётной записью с конкретными пользователями"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Экспорт данных, используя схему 2FAuth json"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Разблокировать (под вашу ответственность)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Отозвать общий доступ к выбранным учётным записям"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Использовать QR-код для волшебного заполнения формы"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Посетить "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"Вы должны принять :attribute, когда :other соответствует :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"Вы должны принять :attribute."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть датой большей или равной :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть датой после :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать только буквы, цифры, дефис и нижнее подчёркивание."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать только буквы и цифры."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать только буквы."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть массивом."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать только однобайтовые цифро-буквенные символы."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть датой меньшей или равной :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть датой до :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать от :min до :max элементов."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"Файл в поле :attribute должен быть от :min до :max килобайт."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть от :min до :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть длинной от :min до :max символов."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute должно иметь значение логического типа."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute содержит недопустимое значение."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"Значение :attribute не совпадает."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не содержит обязательного значения."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Неверный пароль."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не должно содержать двоеточий."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Этот адрес электронной почты не соответствует условиям регистрации"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Профиль с таким адресом электронной почты не найден."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Все адреса электронной почты должны быть действительными и разделены вертикальной чертой"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Поддерживаемый формат - jpeg, png, bmp, gif, svg или webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"Идентификаторы должны быть разделены запятыми. Запятая в конце не ставится."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"URI должен иметь метку."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не поддерживается."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Поддерживаемый формат - jpeg, png, bmp, gif, svg или webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть строкой в кодировке base32."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не должно содержать двоеточий."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute — не корректный OTPAuth URI."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть датой равной :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"Значение :attribute должно соответствовать формату :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректной датой."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать :decimal цифр десятичных разрядов."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно отсутствовать, когда :other равно :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"Вы должны отклонить :attribute."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"Значения полей :attribute и :other должны различаться."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать от :min до :max цифр."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть числом."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute содержит изображение с недопустимым разрешением."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute содержит повторяющееся значение."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не должно заканчиваться одним из следующих значений: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не должно начинаться с одного из следующих значений: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным адресом электронной почты."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно заканчиваться одним из следующих значений: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute некорректно."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"Выбранное значение для :attribute некорректно."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"Файл в поле :attribute должен иметь одно из следующих расширений: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть файлом."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"Количество элементов в поле :attribute должно быть больше :value."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"Размер файла в поле :attribute должен быть больше :value килобайт."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть больше чем :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать больше :value символа(ов)."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"Количество элементов в поле :attribute должно быть :value или больше."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"Размер файла в поле :attribute должен равняться или быть более :value килобайт."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть :value или больше."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать :value символ(ов) или больше."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным цветом в шестнадцатеричном формате."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"На сервере не найдено наборов значков."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть изображением."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно существовать в :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"Выбранное значение для :attribute ошибочно."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"Значение :attribute должно быть целым числом."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным IP адресом."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным IPv4 адресом."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным IPv6 адресом."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным регулярным выражением."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректной JSON строкой."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть списком."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть в нижнем регистре."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"Количество элементов в поле :attribute должно быть меньше :value."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"Размер файла в поле :attribute должен быть меньше :value килобайт."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть меньше чем :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать меньше :value символа(ов)."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"Количество элементов в поле :attribute не должно превышать :value."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"Размер файла в поле :attribute должен быть :value килобайт или меньше."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть :value или меньше."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать :value символ(ов) или меньше."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным MAC адресом."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не должно содержать не более :max цифр(ы)."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"Количество элементов в поле :attribute должно быть больше :value."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"Размер файла в поле :attribute не может быть больше :max килобайт."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть не больше чем :value."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать не больше :value символа(ов)."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть файлом типа :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть файлом типа :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать хотя бы :min цифр."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать хотя бы :min элемент(ов)."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"Размер файла в поле :attribute должен быть хотя бы :min килобайт."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть хотя бы :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать хотя бы :min символов."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно отсутствовать, когда :other равно :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно отсутствовать, пока :other равно :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно отсутствовать, если :values указано."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно отсутствовать, если :values указано."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно отсутствовать."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть кратным :value."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Выбранное значение для :attribute ошибочно."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute в неверном формате."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"Новый владелец не должен быть текущим владельцем."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть числом."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"Параметр uri должен быть указан один или в сочетании с параметром 'custom_otp'"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать хотя бы одну букву."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать хотя бы одну прописную и одну строчную буквы."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать хотя бы одну цифру."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно содержать хотя бы один символ."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute обнаружено в утёкших данных. Пожалуйста, выберите другое значение для :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute должно присутствовать, если :other равно :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно присутствовать, пока :other равно :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно присутствовать, если присутствует :values."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно присутствовать, если присутствует :values."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute должно присутствовать."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute запрещено, когда :other равно :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute запрещено, если :other не состоит в :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute запрещено."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute запрещает присутствие :other."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute в неверном формате."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"Массив в поле :attribute обязательно должен иметь ключи: :values"}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно, когда :other принято."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute обязательно, когда :other отклонено."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения, когда :other равно :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения, когда :other не равно :values."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения, когда :values указано."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения, когда :values указано."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения, когда ни одно из :values не указано."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения, когда :values не указано."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute обязательно для заполнения."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute не должно совпадать с :other."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"При использовании :attribute - это должен быть единственный параметр в теле этого запроса"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"Количество элементов в поле :attribute должно быть равным :size."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"Размер файла в поле :attribute должен быть равен :size килобайт."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно иметь размер :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно иметь размер :size символов."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно начинаться с одного из следующих: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть строкой."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным часовым поясом."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"Такое значение поля :attribute уже существует."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"Загрузка поля :attribute не удалась."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть в верхнем регистре."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным URL."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"Значение поля :attribute должно быть корректным UUID."}}}},{tr:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı gösteren simge"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Taranacak QR kodunun görüntüsü"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Emin misiniz?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Değişiklikler kaybolacak. Emin misiniz?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Bu, kullanıcının izinlerinde ciddi etkiler yaratacaktır. Emin misiniz?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabınızı silmek istediğinizden emin misiniz?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Bu grubu silmek istediğinizden emin misiniz?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Bu hesabı silmek istediğinizden emin misiniz?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Bu kullanıcıyı silmek istediğinizden emin misiniz? Geri dönüşü olmayacak."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Bundan sonra yönetici olmayacaksınız. Gerçekten emin misiniz?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Tüm hesapları silmek istediğinizden emin misiniz?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Tüm kopyaları silmek istediğinizden emin misiniz?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Bu hesabı silmek istediğinizden emin misiniz?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Bu sizin kendi hesabınız. Emin misiniz?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Çıkış yapmak istediğinizden emin misiniz?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Bir önceki talebi iptal etmek istediğinize emin misiniz?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Bu kullanıcının şifresini sıfırlamak istediğinizden emin misiniz?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Bu cihazın yetkilerini iptal etmek istediğinizden emin misiniz?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Bu tokeni iptal etmek istediğinize emin misiniz?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Ayarların değişiceğini onaylıyormusunuz?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'un alan adı geçerli bir alan adı değil"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı tarafından iptal edildi"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Hesap dış bir sağlayıcı tarafından yönetiliyor"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth, bir kimlik doğrulama proxy'si arkasında çalışacak şekilde yapılandırılmış, ancak proxy'niz beklenen başlığı döndürmüyor. Yapılandırmanızı kontrol edin ve tekrar deneyin."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Proxy kimlik doğrulaması başarısız oldu"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"Doğrulayıcıda keşfedilebilir kimlik bilgisi desteği bulunmuyor"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"Doğrulayıcıda kullanıcı doğrulama desteği bulunmuyor"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Cihazınız webauthn'yi desteklemiyor. Daha modern bir tarayıcı kullanarak daha sonra tekrar deneyin"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Gizli anahtar olmadan OTP oluşturulamaz"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Gizli anahtar çözülemedi. Bu, genellikle 2Fauth'un .env yapılandırma dosyasında yanlış bir APP_KEY ayarlanmasından veya veritabanında bozulmuş verilerin saklanmasından kaynaklanır."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Algılanan QR kodu çözülemiyor, görüntüyü kırpmayı veya netleştirmeyi deneyin"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Tek admin hesabını silemezsiniz"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Tek admin hesabını görevden alamazsınız"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Görüntüde bir QR kodu algılanamıyor, görüntüyü kırpmayı deneyin"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Değişiklik başarısız oldu, lütfen tekrar deneyin"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Kontrol başarısız oldu, lütfen daha sonra tekrar deneyin"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Veri sunucudan yenilenemiyor"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Bu QR kodunun verisi geçerli bir OTP Auth URI değil. QR kodu şunu içeriyor:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Sadece kullanıcı tarafından oluşturulan ayarlar silinebilir"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"QR kodu yüklenirken hata oluştu"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"ePosta gönderme başarısız"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Okunamaz, veri şifrelenmiş gibi görünüyor"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Şifreleme anahtarı oluşturulamadı"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Veri alımı sırasında bir sorun oluştu"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Şifre çözme başarısız oldu, veritabanınız hala korunuyor. Bu, genellikle bir veya daha fazla hesaba ait şifrelenmiş verilerin bütünlük sorunlarından kaynaklanır."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Şifreleme başarısız oldu, veritabanınız korumasız kaldı."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Simgeler içe aktarılamadı. Seçenek eski haline döndürüldü."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Kimlik doğrulama başarısız, PAT'ınızı kontrol edin"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth sunucusuna ulaşılamıyor, URL'yi kontrol edin"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT deşifre edilemedi"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Anahtar türetilemedi"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT şifreleme başarısız"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Şifre alınamadı"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Anahtar alınamadı"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"QR tarama kodu yüklenirken hata oluştu"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Mağazadan ayarlar yüklenemedi"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"IV yeniden oluşturulamadı"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Uygulama ayarları alınamadı"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Şifreleme deposu verilerini almada hata oluştu"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik kilitleme gecikmesi ayarlanamadı"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Şifreleme anahtarı ayarlanamadı"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Şifreleme parametreleri ayarlanamadı"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Şifrelenmiş PAT kaydedilemedi"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"Bu alan zorunludur ve geçerli bir URL olmalıdır"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"Alan zorunludur"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Dosya yüklemesi başarısız oldu"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS bağlamı gereklidir"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*anlaşılmaz*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Geçersiz 2FA verisi"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Geçersiz veya bilinmeyen kişisel erişim anahtarı"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Geçersiz veya okunamaz :appname verisi"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"Aktif sekme bulunamadı"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Hiçbir doğrulayıcı belirtilen algoritmaları desteklemiyor"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"Hiçbir giriş 'public-key' türünde değildi"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"Bu varyantta simge mevcut değil"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"İkon paketinde uygun ikon yok"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Bu kullanıcı için parola sıfırlama kullanılamıyor"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"Kullanılabilir QR kod resmi bulunamadı"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"Sayfanın görünür alanında geçerli bir QR kodu bulunamadı"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Okunabilir bir QR kodu yok"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"Bu QR kodunda geçerli bir OTP kaynağı yok"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Bu OTP formatı şu anda desteklenmiyor"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"İşleme izin verilmiyor"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Bu QR kodu okunamıyor"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR kodu geçersiz bir checksum'a sahip"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Yenile"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Adı alınmış, lütfen başka bir ad seçin"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Lütfen yalnızca harfler, sayılar, çizgiler, alt çizgiler, boşluklar veya tekli tırnak işaretleri kullanın"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Kaynak bulunamadı"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz zaten kayıtlı"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik hatası: WEBAUTHN_ID env değişkeninizi kontrol edin"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Sunucunuzda bir sorun var"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"İstenmeyen boşluklar otomatik olarak kaldırılacaktır"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Bu SSO sağlayıcısı .env dosyanızda tam olarak yapılandırılmamış"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO devre dışı bırakıldı"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"Aynı e-posta adresine sahip bir kullanıcı hesabı zaten mevcut, ancak dış hesap kimliğinizle eşleşmiyor. Bu e-posta ile zaten 2FAuth'a kayıtlıysanız SSO kullanmayın."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"SSO aracılığıyla kimlik doğrulama reddedildi"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Kayıtlar devre dışı bırakıldı"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"sorgu parametresine çok fazla kimlik eklendi, en fazla 100 izin verilir"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"URI şifresi çözülemedi"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"Bu kaynağı görüntülemek veya bu işlemi gerçekleştirmek için izniniz yok"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Yetkisiz"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"PAT şifreleme sırasında bilinmeyen hata"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Bilinmeyen hata"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Veriler desteklenen hiçbir formata uymuyor"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Desteklenmeyen OTP türü"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Bir kimlik doğrulama proxy'si veya SSO kullanırken geçerli değildir"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Bu kimlik doğrulama metodu yalnızca yöneticiler içindir. Kullanıcılar SSO ile giriş yapmalıdır."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı hesabı silme işlemi başarısız oldu, hiçbir veri silinmedi"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı ID'si 1 ile 64 karakter arasında değildi"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Mevcut şifre yanlış, hiçbir şey değişmedi"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Yanlış şifre"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"John DOE"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Hesap"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik kodlarının oluşturulması için kullanılacak algoritma"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Algoritma"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcıların kişisel erişim belirteçleri oluşturmasına ve bunları 2FAuth web uzantısı gibi üçüncü taraf uygulamalarla kimlik doğrulaması yapmak için kullanmasına izin verin"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"PAT kullanımına izin ver"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"Uzantının, sunucuda kimlik doğrulaması için kullandığı Kişisel Erişim Belirteci (PAT). Bunu, 2FAuth kullanıcı hesabınızın Ayarlar > OAuth sayfasından oluşturabilirsiniz"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API anahtarı"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Belirli bir süre sonra ekranda gösterilen kodu otomatik olarak sakla. Bu, kod görünümünü kapatmayı unutursanız gereksiz yere yeni kod isteklerinin önüne geçer."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik kapatma OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Uzantıyı, verilere yetkisiz erişimi engellemek için otomatik olarak kilitle"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik kilitleme"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"İşlem olmaması durumunda kullanıcının çıkışını yapar. Eğer kimlik doğrulama bir proxy aracılığı ile yapılmış ve belirlenmiş bir çıkış url'si yok ise bu seçenek işe yaramaz."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik kilitleme"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Yeni hesaplar, tarandıktan veya QR kodu yüklendikten sonra otomatik olarak kaydedilir. 'Kaydet' butonuna tıklamanıza gerek kalmaz"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesapları otomatik kaydet"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Önbelleğin zaman zaman, örneğin bir değişkenin değiştirilmesinden veya uygulamanın güncellenmesinden sonra, temizlenmesi gerekir. Buradan yapabilirsiniz."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Önbellek yönetimi"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik olarak (her hafta) kontrol et ve 2FAuth'un yeni bir sürümü Github'da yayımlandıysa haber ver"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Yeni sürümü kontrol et"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Bir kod panoya kopyalandıktan hemen sonra Arama kutusunu temizler"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Kopyaladıktan sonra Aramayı Temizle"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Oluşturulan kodu kopyalamak için tıkladıktan sonra parolanın ekrandan kaldırılmasını sağlar"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Kopyalama işleminden sonra OTP'yi kapat"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Yeni parolayı onayla"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Oluşturulan parolayı, ekranda görünür görünmez, otomatik olarak kopyalar. Tarayıcı sınırlandırmaları nedeniyle, yenilenenler değil yalnızca ilk Time-based One-Time Password (TOTP) kopyalanır"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Ekrandaki OTP'yi kopyala"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"Sayaç değerini düzenlemek risklidir çünkü hesabı hizmetin doğrulama sunucusuyla senkronize etmeyi bozabilirsiniz. Değişiklik yapmak için kilit simgesini kullanın, ancak ne yaptığınızı biliyorsanız sadece değiştirin"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"Başlangıç sayaç değeri"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Varsayılan değer 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Sayaç"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Kimliğinizi doğrulamak için mevcut parolanızı girin"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Mevcut parola"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Yeni oluşturulan hesapların ilişkilendirileceği grup"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Varsayılan grup"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Doğrudan giriş seçeneği seçildiğinde varsayılan giriş modu kullanılır"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Varsayılan giriş modu"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"Oluşturulacak güvenlik kodunun kaç haneden oluşacağı"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Hane sayısı"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"Tüm güvenlik cihazlarını iptal edilecektir. Bu seçeneği yalnızca cihazınız kayboldu veya cihazınızda güvenlik zaafiyeti oluştuysa kullanın."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Tüm güvenlik cihazlarını devre dışı bırak"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Yeni kullanıcı kaydını kapatır. Geçersiz kılınmadığı sürece (aşağıya bakın), bu seçenek SSO'yu da etkiler ve yeni kullanıcıların SSO ile girişini engeller"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Kayıt olmayı devre dışı bırak"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Hesapların nasıl görünmesini istediğinizi seçin"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Görüntüleme modu"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"ePosta"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcıların Single Sign-On ile harici bir hesap üzerinden oturum açmasını sağlar"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"SSO Etkinleştir"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Uzantının kilidini açmak için şu anda kullanılan şifre"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Mevcut parola"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Uzantıyı kilitlemek ve gerektiğinde hassas verileri şifrelemek için kullanılacak yeni parola"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Yeni parola"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Uzantıyı kilitlemek ve gerektiğinde hassas verileri şifrelemek için kullanılacak yeni parola"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Parola"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı eklerken 2FA sağlayıcısının özgün simgelerini al (dene)"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Özgün simgeleri al"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"Hesabın ilişkilendirileceği grup"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Grup"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'un doğru çalışıp çalışmadığını kontrol edebileceğiniz URL. Bu URL, Docker HEALTHCHECK veya Kubernetes HTTPS Liveness probe'u ile ayarlanabilir."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Sağlık uçnoktası"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"Kaydolduğunuz 2FAuth örneğinin web adresi. Örneğin: https://2fauth.benimsitem.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth sunucu URL'si"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"Resmi bir ikona ihtiyaç duyulduğunda öncelikle sorgulanacak ikon koleksiyonu."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Favori çevrimiçi koleksiyon"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Simgelerin çevrimiçi bir logo koleksiyonundan mı yoksa yerel bir ikon paketinden mi alınacağını ayarlayın. İkon ayarlarını değiştirmek, daha önce alınmış olan ikonları yenilemeyecektir."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"İkonları şuradan al"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"Resmi bir ikon gerektiğinde kullanılacak ikon paketi. İkon paketleri, paket dizinlerinin 2FAuth sunucusuna yüklenmesiyle kullanıma sunulur; daha fazla bilgi için yöneticinize danışın."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"İkon paketi"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Getirilecek veriyi belirtilen türle sınırlandırın. Eğer tür eksikse, 2FAuth normal türe geri dönmeye çalışmaz."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Tür ile istek"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Bazı ikonlar, koyu veya açık kullanıcı arayüzlerine en uygun olacak şekilde farklı türlerde mevcuttur. İlk olarak aramak istediğiniz türü ayarlayın. Normal tür otomatik olarak yedek olarak getirilecektir."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Simge varyantı"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Simge"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcıya 'Yönetici' rolü verir. Yöneticiler uygulamanın tamamını, yani ayarları ve diğer kullanıcıları yönetme izinlerine sahiptir, ancak sahip olmadıkları bir 2FA için şifre oluşturamazlar."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Yönetici"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Kayıt olma devre dışıyken yeni kullanıcıların SSO ile ilk kez oturum açmasına izin verir"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO ile kayıt olmayı açık tut"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'un gösterileceği dili değiştirir. Buradaki diller tamamlanmış olup tarayıcınız tarafından tercih edilen dili değiştirmek için seçim yapabilirsiniz."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Diller"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Bu cihaza isim verin"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Ad"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Yeni isim"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Yeni parola"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth hesabınıza başarısız bir bağlanma denemesi olduğunda eposta alın"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"Başarısız girişte"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Yeni bir cihaz 2FAuth hesabınıza ilk kez eriştiğinde bir eposta alın"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"Yeni cihazda"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"Neleri seçmeniz gerektiğini bilmiyorsanız aşağıdaki seçenekleri boş bırakabilirsiniz. En yaygın kullanılan değerler uygulanacaktır."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords (OTP)'lerin nasıl ve ne zaman gösterileceğini ayarlar"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Parolayı göster"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Zamana dayalı OTP veya HMAC dayalı OTP veya Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Oluşturulacak OTP tipini seçin"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Daha rahat okuma ve akılda tutma için parolalarınızdaki rakamların nasıl gruplanacağını seçin"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Parola gösterimi"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Parola"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"Oluşturulan güvenlik kodlarının, saniye cinsinden, geçerli olduğu süre"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Varsayılan 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Süre"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Son uygulanan grup filtresini saklar ve bir sonraki ziyaretinizde aynısını gösterir"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Grup filtrelerini hatırla"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Bu listedeki ePostalara kayıt izni verilecektir. Farklı ePostaları ('|') simgesiyle ayırın."}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Filtre listesi"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Kayıt işleminin yalnızca sınırlı sayıda e-posta adresi için geçerli olmasını sağlayın. Her iki kural da aynı anda kullanılabilir. Bunun SSO aracılığıyla kayıt üzerinde hiçbir etkisi yoktur."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Kayıtları sınırla"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Bu betimlemelere (RegEx) uyan ePostaların kayıt olmasına izin verilecektir"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Filtreleme kuralları"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Noktalar şeklinde gösterilen parolanın geçici olarak gösterilmesini sağlar"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Gizlenmiş OTP'yi göster"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik kodlarınızın oluşturulması için gereken anahtar"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Anahtar"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Servis"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Ana görünümde hesap simgelerini göster"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Simgeleri göster"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Oturum açmış kullanıcının epostasını doğrudan gezinme bağlantıları yerine altbilgide görüntüleyin. Bağlantılara, epostaya tıkladıktan sonra açılan menüden erişilebilir."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Epostayı alt bilgide göster"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Geçerli şifrenin süresi dolduğunda yerine geçecek olan bir sonraki şifreyi önizleyin. Geçerli OTP için ayarlanan tercihler bir sonraki OTP için de geçerlidir (biçimlendirme, nokta olarak göster)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Bir sonraki OTP'yi göster"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Oluşturulan parola karakterlerini gizliliği sağlamak için *** ile değiştirin. Kopyala/yapıştır özelliğini etkilemez"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Oluşturulan OTP'yi noktalar olarak göster"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"Etkinleştirildiğinde, Sıralama işlevini hesapları büyük/küçük harfe duyarlı bir şekilde sıralayacak şekilde zorlar"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Büyük/küçük harfe duyarlı sıralama"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Yüklenen ikonlar, dosya sistemi depolamasının yanı sıra veritabanına da kaydedilir ve bu veritabanı yalnızca önbellek olarak kullanılır. Bu, 2FAuth yedeklemesi oluşturmayı çok daha kolay hale getirir, çünkü yalnızca veritabanının yedeklenmesi gerekir."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Ancak dikkat edin, bunun bazı dezavantajları olabilir: Eğer çok sayıda büyük ikonunuz varsa, veritabanı boyutu önemli ölçüde artabilir. Ayrıca, dosya sisteminin veritabanıyla senkronize olduğundan emin olmak için daha sık erişime ihtiyaç duyulması nedeniyle uygulama performansını da etkileyebilir."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Simgeleri veritabanında barındır"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Uygulamadaki ePosta ayarlarını kontrol etmek için bir kontrol ePostası gönder. Çalışan bir sistemin olması önemlidir aksi takdirde kullanıcılar parola sıfırlama talebi gönderemezler."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"ePosta ayarlarını kontrol et"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Belirli bir tema kullan veya sistem/tarayıcı tercihini uygula"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Tema"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"Saat dilimi, uygulamada gösterilen tüm tarih ve saatler için uygulandı"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Saat dilimi"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"QR kod okunması sırasında sorunlar yaşıyorsanız, bu seçenek daha basit ancak daha güvenilir bir QR kod okuyucu kullanılmasını sağlar"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Basit QR kod okuyucuyu kullan"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"2FA sırları ve ePosta gibi hassas veriler, şifrelenmiş veritabanında tutulur. .env dosyanızda bulunan APP_KEY değeri anahtar şifreleme işlevi gördüğü için bu değeri (veya tüm dosyanızı) yedeklediğinizden emin olun. Şifrelenmiş veriyi bu anahtar olmadan açmanız mümkün değildir."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Hassas verileri koru"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"SSO'yu 2FAuth'a giriş için tek yöntem yapın. Şifre ve Webauthn ile giriş, düz kullanıcılar için devre dışı bırakılacak. Yöneticiler bu durumdan etkilenmez."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Sadece SSO kullan"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth hesabınıza giriş yapmak için WebAuthn'ı tek yetkili yöntem olarak ayarlayın. Bu, WebAuthn'ın gelişmiş güvenliğinden yararlanmak için önerilen kurulumdur."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Cihazınızın kaybolması durumunda, bu seçeneği sıfırlayarak ve e-posta adresiniz ve şifrenizle giriş yaparak hesabınızı kurtarabilirsiniz."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"Dikkat! Bu seçenek etkinleştirilmiş olsa bile E-posta ve Şifre formu kullanılabilir durumda kalır, ancak her zaman 'Kimlik doğrulama başarısız' hatası verir."}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Yalnızca WebAuthn kullan"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Mevcut olanlar arasından bir giriş modu seçmeniz istenip istenmeyeceğini veya doğrudan varsayılan giriş modunu kullanmak isteyip istemediğinizi seçin"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Doğrudan giriş"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"OTP kopyalandığında her zaman varsayılan gruba döner"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Kopyalarken varsayılan grubu göster"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Hakkında"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Erişim günlüğü"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Erişim"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Hesap kurtarma"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşım ayarları"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Kimlik doğrulama"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Tarayıcı Kısıtlamaları ile Karşılaşıldı"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Parola değiştir"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Tehlikeli Bölge"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Veri girişi"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı sil"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı düzenle"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Grubu düzenle"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Ortam"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Genel"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Gruplar"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Simgeler"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"İçe Aktar"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Son erişimler"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Giriş"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Yeni hesap"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Yeni grup"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Yeni parola"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Yeni paylaşım"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Yeni token"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Yeni kullanıcı"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Bildirimler"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Seçenekler"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"Tek Kullanımlık Şifreler"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Parola"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Kişisel erişim tokenleri"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Seçenekler"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Profil"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Amaç"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Kodu"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Kaydol"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Kayıt"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Cihazı adı değişikliği"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Uzantıyı sıfırla"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Şifreyi sıfırla"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Kaynaklar"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik cihazları"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Sunucu Parametreleri"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Oturum"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Kurulum"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Tek Noktadan Giriş (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO girişi"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Depolama"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Desteklenen taşıma biçimleri"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Sahibi değiştir"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth web uzantısı"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Yetkisiz"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Profil güncelleme"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı yönetimi"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcılar"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn girişi"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"1 gün sonra"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 saat sonra"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 dakika sonra"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 dakika sonra"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 dakika sonra"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 dakika sonra"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 dakika sonra"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 dakika sonra"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"Hakkında"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Hesap"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı benimle paylaş"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşım Hesabı"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"işlemler"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Aktif grup"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'ı ekle"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Yönetici"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Gelişmiş form"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Tıkladıktan/dokunduktan sonra"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Tüm parolaları ana sayfada gösterir"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"Tümü birden, ana ekranda"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Tümü"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Tüm hesaplar"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Grup-suz"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Grup-suz hesaplar"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Parolaları ayrı bir ekranda görmek için tıklayın"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Tek, kendi görünüşünde"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Uygulama kurulumu"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Uygula"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Doğrulama"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Geri"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Tarayıcı önayarı"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Tarayıcı"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"İptal"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Parola değiştir"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Tümü"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Kontrol et"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Yükle"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Temizle"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Kapat"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Sürekli"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Devam et"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Panoya kopyala"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Kopyala"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Sayaç"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Oluştur"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Emeği geçenler"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Karanlık"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"Varsayılan"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Bu kullanıcıyı sil"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabınızı silin"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Sil"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Demo"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR Kod Bul"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Hepsini iptal et"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Aynı olanları yoksay"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Dokümantasyon"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Tamam"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Düzenle"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Dışa Aktar"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Uzantı"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 dakika sonra"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 dakika sonra"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Oluştur"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Izgara"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Rakamları eşit sayıda iki gruba ayır"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"Ortadan böl"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Şansımı dene"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Yüklenen paket"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Tümünü içe aktar"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"İçe Aktar"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP Adresi"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Yayınlayan"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Aydınlık"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Liste"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"Canlı QR kod tarama"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Yönet"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Belki daha sonra"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Taşı"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Cihazım"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Asla"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Yeni"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Grup yok"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- Paket yok -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşılmamış"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Gruplarından ayır"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik kodu kopyalandığında"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"1 gün sonra"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 saat sonra"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 dakika sonra"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 ay"}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 yıl"}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Çevrimiçi koleksiyon"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Tarayıcıda aç"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"İşletim Sistemi"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Seçenekler"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI'leri"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Rakamları ikişerli ayır"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"İkili ayır"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Düz metin"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR kod kullanarak doldur"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Kodu"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"QR kod yükleme"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Yenile"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz ekle"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Kaydol"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Simgeyi kaldır"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"ePosta'yı yeniden gönder"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Uzantıyı sıfırla"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Şifreyi sıfırla"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Sıfırla"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"İptal et"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Kaydet"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR kod tara"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Ara"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Gösterilecek hesapları seç"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Parola sıfırlama bağlantısı yolla"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Kurtarma bağlantısı gönder"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Gönder"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Paylaş"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşılan"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Benim tarafımdan paylaşılanlar"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Benimle paylaşılanlar"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Tüm Kullanıcılar"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Belirli kullanıcılar"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Göster"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Oturum aç"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Çıkış"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Gönder"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 dakika sonra"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Deneme"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Metin dosyası"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 dakika sonra"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Zaman"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"İçe Aktar"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Aktarım"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Sahipliği aktar"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Rakamları üçerli ayır"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"Üçlü ayır"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 dakika sonra"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth formatı"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Kilidi aç"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşımı kaldır"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Güncelle"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR kod yükle"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Yükle"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcılar"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Değişkenler"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Web uzantısı"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" ay"}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Bulgarca)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Danca)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Almanca)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (İngilizce)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (İspanyolca)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Fransızca)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Hintçe)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (İtalyanca)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Japonca)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Korece)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Hollandaca (Hollandaca)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Portekizce, Brezilyalı)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (Rusça)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Turkish)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Basitleştirilmiş Çince)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Hakkında"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşımı Ekle"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcıları ekle"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Yönetici paneli"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Anasayfaya geri dön"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Yapılandır"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Devam et"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Yeni grup oluştur"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı oluştur"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"İlk önce gup u oluşturun"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"PAT nasıl oluşturulur"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Düzenle"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Yeni bir token oluştur"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'a git"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth çevirisine yardımcı olun"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sİmge Dökümantasyounu"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"kullanıcı & şifre"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupları yönet"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşımı yönet"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Yönet"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Belki daha sonra"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Açın ve grup kurun"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabınızı kurtarın"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Yeni cihaz ekle"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Kaydol"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Sıfırla"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Uzantıyı sıfırla"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Şifrenizi sıfırlayın"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Tara"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"bir güvenlik cihazı"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Tüm günlüğü gör"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Nasıl bir sağlayıcı etkinleştirebileceğinizi görün"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Ayarlar"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Döküman paylaş"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"SSO olmadan giriş yapabilirsiniz"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Oturum aç"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Sahipliği devret"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth dışa aktarma formatı"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Detaylı formu kullan"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR Kod göster"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Github'da görüntüle"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Bunu neden görüyorum?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"İki Aşamalı Giriş (2FA) hesapları ve güvenlik kodlarının oluşturulması için bir web uygulaması"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"İki Aşamalı Giriş (2FA) hesapları ve güvenlik kodlarının oluşturulması için bir web uygulaması"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"Erişim günlüğü daha çok girdi içeriyor."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" kullanıcısının tüm erişim günlüğü"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Bu hesap OAuth ile bir "},{t:4,k:"provider"},{t:3,v:" hesabına bağlı"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:4,k:"provider"},{t:3,v:" hesabınızı kullanarak SSO girişi yaptınız. Bilgilerinizi buradan değil "},{t:4,k:"provider"},{t:3,v:" üzerinden değiştirebilirsiniz."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Hesap kurtarma ePostası gönderildi!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Bir metod seç ve ilk hesabını ekle"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"İlk önce kullanıcı ekleyin ve hesabı paylaşın"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Uygulamanızda kayıtlı kullanıcılar yönetin veya yeni kullanıcı oluşturun."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Zaten giriş yapılmış, lütfen öncelikle çıkış yapın"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Zaten kayıtlı mısınız?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"Zaten paylaşıldı"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Alternatif yöntem"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Kimlik doğrulama, ters proxy tarafından sağlandı; aşağıdaki ayarlar devre dışı bırakıldı."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Sunucuya karşı kimlik doğrulama başarısız oldu."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth web uygulamanız için mükemmel bir yardımcı"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":platform üzerinde :browser"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock Açık"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı hesabı ve tüm 2FA verileri silinecektir."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı hesabınız ve tüm 2FA verileriniz silinecektir. Bunun geri dönüşü yok."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth hesabını silmek, harici SSO hesabınızı etkilemez."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Bir gurubu silmek, içindeki hesapları silmez"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Doğrudan giriş"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Bu özellik Demo modunda geçerli değil"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Başka bir 2FA uygulamasından verileri dışarı aktarırken şifreleme veya şifre ile koruma seçeneklerini kullanmayın, aksi takdirde 2FAuth bu verileri açamaz."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Henüz hesabınız yok mu?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"ePosta "},{t:4,k:"email"},{t:3,v:" adresine iletilecektir"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn kimlik doğrulamasını etkinleştirerek 2FAuth hesabınızın güvenliğini artırabilirsiniz."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"ePostayı tamamen size ait bir bilgisayarda açtığınıza emin olun."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Bir hata oluştu:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Beklenen: Her biri bir satırda bir otpauth URI listesi"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Başarısız giriş denemesi "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Başarısız"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Veri getiriliyor..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Parolanızı mı unuttunuz?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Küçük harf barındırmalı"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Rakam barındırmalı"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Özel karakter barındırmalı"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Büyük harf barındırmalı"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Yardım: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Merhaba "},{t:4,k:"username"},{t:3,v:", her şey yolunda"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"'Şansımı dene' düğmesi, seçilen ikon koleksiyonundan standart bir ikon almaya çalışır. Hizmet alanı değeri ne kadar basitse, beklenen ikonu alma olasılığınız o kadar yüksektir: Herhangi bir uzantı (örneğin '.com') eklemeyin, hizmetin tam adını kullanın, özel karakterlerden kaçının."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Yönetici?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Kullandığınız uygulamanın Dışa Aktarma özelliğini kullanarak bir QR kodu veya JSON dosyası oluşturun ve buraya yükleyin."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth, çeşitli 2FA uygulamalarından veri alabilir."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"İçe aktarıldı"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- geçersiz hesap -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"Bu sıfırlama token'i geçerli değil."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- geçersiz servis -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"En az 8 karakter"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Kişisel erişim anahtarınız hala geçerli mi?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Tüm kullanıcılarla paylaş"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Son görülme "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logolar"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Cihazınız mı kayboldu?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Kullanılanlar"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Kişisel tokeninizi şu anda kopyaladığınızdan emin olun. Bir daha görebilme şansınız olmayacak!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı proxy seviyesinde yönetin."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Kimlik doğrulamayı proxy seviyesinde yönetin."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"Hesaplarınızı istediğiniz şekilde düzenlemek için gruplar oluşturabilirsiniz. Tüm hesaplar, ait oldukları gruba bakılmaksızın 'Tümü' adlı sözde grupta görünür durumda kalır."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Zorunlu"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Seçilenleri taşı"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Veya"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Veya hesapları gruba göre filtreleyin"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Aşağıdaki seçenekleri aktifleştirmek için en az bir cihaz ekleyin"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Burada 2FA yok!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Henüz herhangi bir girdi yok"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"Grup yok"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Panoda görsel bulunamadı"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"Eşleşme bulunamadı"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"sağlayıcı yok"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Sonuç yok"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- servis yok -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Sağlayıcı yok mu?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşılmıyor"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"hiçbiri"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Bu giriş denemesinin detayları şöyle"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Eğer bu sizseniz, bu uyarıyı göz ardı edebilirsiniz. Eğer daha fazla başarısız giriş denemesi görürseniz, güvenlik ayarlarını gözden geçirmek ve bu saldırgana karşı işlem yapmak için 2FAuth yöneticisiyle iletişime geçmelisiniz."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth hesabınıza başarısız bir giriş denemesi yapıldı."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth uygulamasına başarısız giriş"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Merhaba :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Merhaba"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Bu bağlantının detayları"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"Eğer bu sizseniz, bu uyarı gözardı edebilirsiniz. Eğer hesabınızda şüpheli bir hareket olduğunu düşünüyorsanız, lütfen parolanızı değiştirin."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth hesabınıza yeni bir cihaz bağlandı."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'a yeni bir cihazdan erişim"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{static:"",t:2,i:[]}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"Saygılar"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"Bir parola sıfırlama talebinde bulunmadıysanız, başka bir işlem yapmanıza gerek yoktur."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"Bu ePostayı, ePosta yapılandırmanızın doğruluğunu test etmek amacıyla bir deneme ePostası istediğiniz için aldınız."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth deneme ePostası"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Haberler iyi, çalışıyor :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Önerilen (şiddetle)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Ayrıca şununla da devam edebilirsiniz:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI, 2FA verilerini değiştirmek için kullanılan en yaygın formattır; örneğin bir web sitesinde 2FA'yı etkinleştirdiğinizde QR kodu biçimindedir. 2FAuth'tan geçiş yapmak istiyorsanız bunu seçin."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Veriyi, otpauth URI listesi olarak dışa aktar"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Veri analiz ediliyor..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Şifre ve WebAuthn ile giriş devre dışı bırakıldı."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"Bu kullanıcı için bir parola sıfırlama talebi bulunmakta ama talebin süresi geçmiş yani kullanıcı, süresi içerisinde parolasını değiştirmemiş. Bu talep, kullanıcı tarafından veya bir yönetici tarafından yapılmış olabilir."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"Bu kullanıcı için bir parola sıfırlama talebi bulunmakta (talep tarihi "},{t:4,k:"datetime"},{t:3,v:"), yani kullanıcı henüz parolasını değiştirmemiş ancak gönderilen parola değiştirme bağlantısı hala geçerli. Bu talep, kullanıcı tarafından veya bir yönetici tarafından yapılmış olabilir."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"Birebir aynı verilere sahip başkan bir hesap mevcut"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"Bu web uzantısı, 2FAuth web uygulamasına ek bir bileşendir. 2FAuth kullanıcı hesabınızın 2FA verilerine erişmenizi ve doğrudan tarayıcı çubuğunuzdan OTP'ler oluşturmanızı sağlar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"Bu eklentiyi kullanabilmek için 2FAuth kullanıcı hesabınızın olması ve bunu eklentiye bağlamanız gerekir. Bu işlem, 2FAuth sunucu adresini ve Kişisel Erişim Belirteci (PAT) sağlayarak yapılır."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"Hasabınızı kurtarmak için, 2FAuth bazı Webauthn özelliklerini sıfırlar, böylece ePosta ve parolanızla giriş yapabilirsiniz."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth size, bu ePosta adresine bir kurtarma bağlantısı gönderecektir. Aldığınız ePostadaki bağlantıya tıklayın ve talimatları izleyin."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Kayıt tarihi "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"Uzantı üzerinden 2FA kaydı henüz desteklenmemektedir. İlk 2FA'nızı eklemek için 2FAuth uygulamanızı ziyaret edin."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcıya yeni bir parola sıfırlama e-postası göndermek ve yeni bir parola belirlemesini sağlamak için 'E-postayı yeniden gönder' seçeneğini kullanın. Bu işlem, mevcut parolayı olduğu gibi bırakacak ve önceki tüm istekler iptal edilecektir."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Uzantı parolasını unuttuysanız bu seçeneği kullanın."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"Uzantının mevcut yapılandırması ve 2FAuth verileri silinecektir. 2FAuth kullanıcı hesabına yeniden bağlanmaya hazır hale gelecektir."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcıya yeni bir şifre belirleyebilmesi için şifre sıfırlama e-postası gönderilmeden önce, 'Şifreyi sıfırla' seçeneğini kullanarak şifre sıfırlama işlemini zorlayabilirsiniz (bu işlem geçici bir şifre belirleyecektir). Daha önceki tüm istekler iptal edilecektir."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth bu adrese bir parola sıfırlama bağlantısı yollanacak. Yeni bir parola belirlemek için ePostadaki bağlantıya tıklayın."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Eğer şimdiye kadar giriş için hep SSO kullandıysanız, parola alabillmek için çıkış yapın ve sonrasında parola sıfırlama özelliğini kullanın."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Sayfayı yenilemeyi deneyebilirsiniz (belki geçici bir sorundur) veya uzantıyı sıfırlayıp yeni bir belirteç sağlayabilirsiniz."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz iptali kalıcıdır"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Token iptali kalıcıdır"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'a giriş yapabilmek için kullanabileceğiniz; güvenlik anahtarı (ör. Yubikey) veya biyometrik özellikli bir akıllı telefon (ör. Apple FaceId/TouchId) gibi cihazlar"}},"message.selected_users_meaning":{t:0,b:{static:"",t:2,i:[]}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Bazı ayarlar yöneticiniz tarafından yönetiliyor"}},"message.share_account_with_other_users":{t:0,b:{static:"",t:2,i:[]}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{static:"",t:2,i:[]}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" tarafından paylaşıldı"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:4,k:"date"},{t:3,v:" tarihinden beri"}]}},"message.shared_with_all":{t:0,b:{static:"",t:2,i:[]}},"message.shared_with_specific_users":{t:0,b:{static:"",t:2,i:[]}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:4,k:"email"},{t:3,v:" ePosta adresini ve "},{t:4,k:"password"},{t:3,v:" şifresini kullanarak bağlanabilirsiniz"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Giriş yapmak için bir SSO sağlayıcısı seçin:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Oturum açma yöntemi"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Tarayıcıda belirtilen dildeki çeviriler eksik mi?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcıların SSO ile giriş yapması gerekiyor. Diğer yöntemleri yalnızca yöneticiler kullanabilir."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Kimlik doğrulama yalnızca SSO ile mümkün, "},{t:4,k:"auth_method"},{t:3,v:" devre dışı"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Yüklenen kameralar uygun değil"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Lütfen başka bir cihaz/kamera kullanın"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Kamera yayını için HTTPS gereklidir"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Canlı tarama başlatılamıyor :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"Genellikle tarayıcının adres çubuğunun yanında veya içinde çizili bir kamera simgesine tıklayarak yapılır"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth'un kameranıza ulaşmak için izni yok"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz kamerasını kullanma izni vermeniz gerekiyor. Eğer zaten reddettiyseniz ve tarayıcınız tekrar sormuyorsa, izni nasıl vereceğiniz hakkında tarayıcı belgelerine başvurun."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"Bu cihazda kamera yok"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Belki web kamerasını takmayı unuttunuz"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Tarayıcı yüklenemedi"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Kamera zaten kullanımda mı? Başka bir uygulamanın kameranızı kullanmadığından emin olun ve tekrar deneyin"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Güvenli bağlam gereklidir"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"Canlı tarama için HTTPS gereklidir. Eğer 2FAuth'u bilgisayarınızdan çalıştırıyorsanız, localhost dışında sanal bir ana bilgisayar kullanmayın"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Bu tarayıcıda Akış API'si desteklenmiyor"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Modern bir tarayıcı kullanmalısınız"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"Taşıma kaynağında aşağıdaki 2FA hesapları bulundu. Şimdiye kadar hiçbiri 2FAuth'a eklenmedi."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Başarılı giriş "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Başarılı çıkış "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Kabul Edilen: Düz metin, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Kabul Edilen: jpg, jpeg, png, bmp, gif, svg veya webp"}},"message.this_account_is_currently_x":{t:0,b:{static:"",t:2,i:[]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"Bu kalıcı bir silme işlemidir, geri dönüşü olmayacak."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Çok fazla hatalı giriş denemesi. Lütfen "},{t:4,k:"seconds"},{t:3,v:" saniye sonra yeniden deneyin."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Kişisel Erişim Tokenleri, herhangi bir uygulamanın 2FAuth API'sinde kimlik doğrulaması yapmasına olanak tanır. Erişim tokenlerini, kullanıcı uygulama isteklerinin yetkilendirmesinde Taşıyıcı token olarak belirtmelisiniz."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"Bu işlem, kullanımda olan kişisel erişim belirtecini iptal etmez."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"Geri yüklenebilecek bir yedekleme oluşturmanız gerekiyorsa bu seçeneği tercih etmelisiniz. Bu seçenek simgeleri de halleder."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Verileri, 2FAuth json formatında dışa aktar"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"Bu format açıklaması şöyle açıklanmıştır:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth sunucunuzdan oluşturulan 2FA güvenlik kodlarını almak için kullanılan bir tarayıcı uzantısı."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"KA İkonları"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"Uzantı, verilerini korumak için kilitlenmiştir. İki faktörlü kimlik doğrulamanıza erişmek için uzantı şifresini girin."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Kullanılabilir düğmeleri kullanarak bunları 2FA koleksiyonunuza kalıcı olarak kaydedin veya bunları silin."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik cihazlarınız ile giriş yapmaya hazırlanın. Ör. anahtar cihazınızı takın, yüz maskenizi veya eldiveninizi çıkarın."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:4,k:"email"},{t:3,v:" ePosta adresini ve "},{t:4,k:"password"},{t:3,v:" şifresini kullan"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı hesabı, kimlik doğrulama proxy'si ile sağlandı."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" aktif token"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" güvenlik cihazı (parola anahtarı)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Görüntülendi "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Sunucuda ikon paketi bulunmadı."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn girişi devre dışı bırakıldı"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn, (Yubikey veya biyometrik özelliklere sahip akıllı telefonlar gibi) güvenilir cihazları kullanarak hızlı ve daha güvenli bir şekilde oturum açmanıza olanak tanır."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth'a hoşgeldiniz"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth demosuna hoşgeldiniz."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth test sürümüne hoşgeldiniz"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" hesap"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" bulunuyor"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" tanesi seçildi"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Bu uygulama güncel"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"Devam etmek için bir hesaba ihtiyacınız var, lütfen kayıt olun."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Hesap başarıyla oluşturuldu"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Hesap başarı ile güncellendi"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Hesap(lar) başarıyla silindi"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Hesap(lar) başarıyla taşındı"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Kimlik doğrulama başarısız"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik kilit devreye girdi, sistemden çıkışınız yapıldı"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Önbellek temizlendi"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Panoya kopyalandı"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Sunucu tarafındaki değişikliklerin görünmesi için veriler yenilendi"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz başarıyla iptal edildi"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz başarıyla kaydedildi"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Grup ismi kaydedildi"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Grup başarıyla oluşturuldu"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Grup başarıyla silindi"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"İkon paketi mevcut değil"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Şifre değiştirildi"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Şifre başarıyla değiştirildi"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Parola başarıyla sıfırlandı"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcının KET'leri başarıyla iptal edildi"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Profil başarıyla güncellendi!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcının güvenlik cihazları başarıyla iptal edildi"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Ayarlar kaydedildi"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test ePostası gönderildi, gelen kutunuzu kontrol edin"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Token başarıyla iptal edildi"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı hesabı başarıyla silindi"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"kullanıcı başarıyla oluşturuldu"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı rolü güncellendi"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"Toplam geçerli hesap sayısı"},{t:4,k:"count"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Sonraki »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Önceki"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Parolalar en az sekiz karakterden oluşmalı ve şifre doğrulaması ile eşleşmelidir."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Parolanız sıfırlandı!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"ePosta adresinize parola sıfırlama bağlantısı gönderdik!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Lütfen tekrar denemeden önce bekleyin."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"Şifre sıfırlama token'i geçersiz."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"Bu ePosta adresine sahip bir kullanıcı bulamadık."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı adı, ePosta..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Öge bulunamadı"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Hakkında"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Hesaplar"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşım Hesabı"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Uygulama kurulumu"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Kimlik doğrulama"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı oluştur"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Erişim günlüğü"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı yönet"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı yönetimi"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Otomatik kilitleme"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"QR flaşı"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Hesap oluştur"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Grup oluştur"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Hesap düzenle"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Grup düzenle"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Flood"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Hata"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Gruplar"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Hesapları içeri aktar"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Landing"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Giriş"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Parola sıfırlama"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Yeni parola"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Uzantıyı sıfırla"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Yeni hesap oluştur"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcı hesabı"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Yeni kişisel token"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth tokenleri"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Seçenekler"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn cihazları"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Cihaz düzenle"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Ayarlar"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı Paylaş"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"QR kod olarak hesap"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Yeni hesap"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Sahipliği devret"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Kilidi aç"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Hesap kurtarma"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Yeni cihaz ekle"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Aramayı temizle"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Seçimi temizle"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:4,k:"pagetitle"},{t:3,v:" sayfasını kapat"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Yeni Grup Oluştur"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Sonraki şifreyi panoya kopyala"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Panoya kopyala"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Sil"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı sil"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Seçili hesabı sil"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Bu hesabı yoksay"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı düzenle"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Grubu düzenle"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Paylaşım düzenle"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Seçili hesapları dışa aktar"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Bir deneme parolası oluştur"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:4,k:"pagetitle"},{t:3,v:" sayfasına geri dön"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Grup seçiciyi gizle"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Parolayı gizle"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Hesabı içe aktar"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Kilitle"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Yönet"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Grupları yönet"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Seçilenleri gruba taşı"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Veriyi, otpauth URI listesi olarak dışa aktar"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"İkon paketi listesini güncelle"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Yeniden adlandır"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Parola sıfırlama ePostasını kullanıcıya yeniden gönder"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Kullanıcının parolasını sıfırla"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Parolayı göster"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Tüm kullanıcı güvenlik cihazlarını iptal et"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Tüm kullanıcı token'larını iptal et"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"İptal et"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Ara"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Tümünü seç"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Bu hesabı paylaş"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Herkesle Paylaş"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Grup seçiciyi göster"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Geçen aydan girdiler göster"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Geçen yıldan girdiler göster"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR kodu göster"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Geçen 6 aydan girdiler göster"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Geçen 3 aydan girdiler göster"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Güvenlik cihazı kullanarak oturum aç"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"Artana göre sırala"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Eskileri önce göster"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Yenileri önce göster"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Azalana göre sırala"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Verileri, 2FAuth json formatında dışa aktar"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Kilidi aç (risk size ait)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Formu sihirli bir şekilde doldurmak için QR kod kullan"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:4,k:"website"},{t:3,v:" adresini ziyaret et"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:":other, :value olduğunda :attribute kabul edilmelidir."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:":attribute kabul edilmelidir."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir URL değil."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :date tarihi ile aynı veya bundan sonraki bir tarih olmalıdır."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute şu tarihten :date sonra olmalı."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:":attribute yalnızca harfler, rakamlar, tireler ve alt çizgiler içermelidir."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:":attribute yalnızca harfler ve rakamlar içermelidir."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:":attribute yalnızca harf içermelidir."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute bir dizi olmalıdır."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:":attribute yalnızca tek baytlık alfanümerik karakterler ve semboller içermelidir."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :date tarihi ile aynı veya önceki bir tarih olmalıdır."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :date tarihinden önce bir tarih olmalıdır."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :min ve :max aralığında olmalıdır."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :min ve :max kilobyte aralığında olmalıdır."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :min ve :max aralığında olmalıdır."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :min ve :max karakter aralığında olmalıdır."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attribute, doğru veya yanlış olmalıdır."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı yetkisiz bir değer içeriyor."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute doğrulaması eşleşmedi."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanında gerekli bir değer eksik."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Parola hatalı."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute iki nokta üst üste içermemelidir."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Bu ePosta adresi kayıt politikasına uymuyor"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Bu ePostayı kullanan bir hesap bulunamadı."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Tüm ePostaların geçerli ve dikey çubuk ile ayrılmış olması gerekiyor"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Desteklenen formatlar jpeg, png, bmp, gif, svg veya webp'dir."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"IDler virgül ile ayrılmalı, en sonda ise virgül olmamalıdır."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"Uri'nin bir etiketi olmalıdır."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:":attribute desteklenmiyor."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Desteklenen formatlar jpeg, png, bmp, gif, svg veya webp'dir."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:":attribute base32 kodlu bir dize olmalıdır."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute iki nokta üst üste içermemelidir."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir otpauth uri'si değil."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute tarihi, :date tarihine eşit olmalıdır."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute :format biçimi ile eşleşmiyor."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir tarih değil."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı :decimal kadar ondalık basamağa sahip olmalıdır."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:":other, :value olduğunda :attribute reddedilmelidir."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:":attribute reddedilmelidir."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute ve :other birbirinden farklı olmalıdır."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :min ve :max basamak aralığında olmalıdır."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :digits rakam olmalıdır."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçersiz görüntü boyutlarına sahip."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı yinelenen bir değere sahip."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute şunlardan biriyle bitmemelidir: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute şunlardan biriyle başlamamalıdır: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir ePosta adresi olmalı."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute şunlardan biriyle bitmelidir: :values."}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:":attribute seçimi geçersiz."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:":attribute seçimi geçersiz."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı, şu uzantılardan birine sahip olmalıdır: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute bir dosya olmalıdır."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanının doldurulması zorunludur."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value öğelerinden daha fazla öğeye sahip olmalıdır."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value kilobayttan fazla olmalıdır."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value değerinden büyük olmalıdır."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value karakterden büyük olmalıdır."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value veya daha fazla öğe içermelidir."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value kilobayttan büyük veya eşit olmalıdır."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value değerinden büyük veya eşit olmalıdır."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute, en az :value karakter içermelidir."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı geçerli bir onaltılık renk olmalıdır."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"İkon paketi sunucuda buluamadı."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute bir görsel olmalı."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:":attribute değeri :other içinde mevcut değil."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:":attribute seçimi geçersiz."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attribute tamsayı olmalıdır."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir IP adresi olmalıdır."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir IPv4 adresi olmalıdır."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir IPv6 adresi olmalıdır."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"The :attribute must be a valid regex pattern."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir JSON olmalı."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı bir liste olmalı."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı yalnızca küçük harfler içermelidir."}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value ögeden az olmalıdır."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value kilobayttan az olmalıdır."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value değerinden küçük olmalıdır."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value karakterden az olmalıdır."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute, en fazla :value öge içermelidir."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value kilobayttan küçük ya da eşit olmalıdır."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :value değerinden küçük veya eşit olmalıdır."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute :value karakterden az ya da eşit olmalıdır."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir MAC adresi olmalıdır."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :max rakamdan fazla rakama sahip olmamalıdır."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :max öğeden fazla öğeye sahip olmamalıdır."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute değeri :max kilobayttan büyük olmamalıdır."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute değeri :max değerinden büyük olmamalıdır."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :max karakterden fazla olmamalıdır."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attribute şu dosya biçimlerinden biri olmalıdır: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attribute şu dosya biçimlerinden biri olmalıdır: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az :min rakam içermelidir."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az :min nesneye sahip olmalıdır."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az :min kilobayt olmalıdır."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az :min olmalıdır."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az :min karakter içermelidir."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı, :other :value olduğunda, boş olmalıdır."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:":other, :value olmadığı sürece :attribute alanı eksik olmalıdır."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:":values mevcut olduğunda :attribute alanı boş olmalıdır."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:":values mevcut olduğunda :attribute alanı boş olmalıdır."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı eksik olmalı."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :values değerinin katı olmalıdır."}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:":attribute seçimi geçersiz."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute formatı geçersiz."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute bir sayı olmalıdır."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"Uri parametresi tek başına veya yalnızca 'custom_otp' parametresiyle birlikte sağlanmalıdır"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az bir harf içermelidir."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az bir büyük harf ve bir küçük harf içermelidir."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az bir sayı içermelidir."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:":attribute en az bir sembol içermelidir."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"Girilen :attribute bir veri sızıntısında ortaya çıktı. Lütfen farklı bir :attribute seçin."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:":other :valiue olduğunda, :attribute mevcut olmalıdır."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:":other, :value olmadığı sürece :attribute alanı mevcut olmalıdır."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:":values mevcut olduğunda :attribute alanı da mevcut olmalıdır."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:":values mevcut olduğunda :attribute alanı da mevcut olmalıdır."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı dolu olmalı."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:":other :value iken :attribute alanı engellenmiştir."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı, :other alanı :value değerlerinden birine sahip olmadığı sürece engellenmiştir."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı engellenmiştir."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı :other değerinin mevcut olmasını engeller."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute formatı geçersiz."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı aşağıdakiler için girişler içermelidir: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:":other kabul edildiğinde :attribute alanı gereklidir."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:":other reddedildiğinde :attribute alanı gereklidir."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:":other :value iken :attribute alanı gereklidir."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı, :other alanı :value değerlerinden birine sahip olmadığında zorunludur."}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:":values mevcut ise :attribute alanları zorunludur."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:":values varsa :attribute alanı zorunludur."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"Herhangi bir :values değeri mevcut olmadığında :attribute alanına değer girilmesi zorunludur."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı :values yokken zorunludur."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı zorunludur."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attribute ve :other aynı olmalı."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:":attribute kullanıldığında, istek gövdesindeki tek parametre bu olmalıdır"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute :size nesneye sahip olmalıdır."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute :size kilobayt olmalıdır."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute, :size olmalıdır."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:": attribute en az :size karakter olmalıdır."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute şunlardan biriyle başlamalıdır: :values."}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute bir dize olmalıdır."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir saat dilimi olmalıdır."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı geçerli bir ULID olmalıdır."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":attribute daha önceden kayıt edilmiş."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attribute yüklemesi başarısız."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute alanı yalnızca BÜYÜK HARFLER içermelidir."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir URL olmalıdır."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attribute geçerli bir UUID olmalıdır."}}}},{uk:{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"Значок, який ілюструє обліковий запис"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"Зображення QR-коду для сканування"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"Зміни будуть втрачені. Ви впевнені?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"Це матиме серйозний вплив на права цього користувача. Ви впевнені?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете видалити свій обліковий запис?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете видалити цю групу?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете видалити цей обліковий запис?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете видалити цього користувача? Ця дія є незворотною."}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Ви більше не будете адміністратором. Ви впевнені?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете скасувати всі облікові записи?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете скасувати всі дублікати?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете скасувати цей обліковий запис?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"Це ваш власний обліковий запис. Ви впевнені?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете вийти?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете скасувати попередній запит?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете скинути пароль цього користувача?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете відкликати цей пристрій?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"Ви впевнені, що хочете відкликати цей ключ?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"Домен 2FAuth не є дійсним доменом"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"Скасовано користувачем"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис керований зовнішнім провайдером"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"2Fauth налаштований на роботу за проксі-сервером автентифікації, але ваш проксі-сервер не повертає очікуваний заголовок. Перевірте налаштування та повторіть спробу."}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"Проксі-автентифікація не вдалася"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"В автентифікаторі відсутня підтримка видимих облікових даних"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"В автентифікаторі відсутня підтримка перевірки користувача"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"Ваш пристрій не підтримує webauthn. Повторіть спробу пізніше використовуючи більш сучасний браузер"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"Неможливо створити OTP без секретного ключа"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"Секретний ключ не може бути розшифрованим. В основному це може бути викликано неправильним APP_KEY в .env файлі 2Fauth або пошкодженими даними, що зберігаються в базі даних."}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Не вдається декодувати знайдений QR-код, спробуйте обрізати або збільшити різкість зображення"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Неможливо видалити єдиний обліковий запис адміністратора"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"Неможливо понизити єдиний обліковий запис адміністратора"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"Неможливо виявити QR-код на зображенні, спробуйте обрізати зображення"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"Зміна не вдалася, спробуйте ще раз"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"Перевірка не вдалася, спробуйте ще раз пізніше"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"Неможливо оновити дані з сервера"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"Дані цього QR-коду не є дійсним OTP Auth URI. QR-код містить:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"Тільки налаштування, створені користувачем, можуть бути видалені"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Помилка отримання QR-коду"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"Відправка E-mail не вдалася"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"Нечитабельне, дані здаються зашифрованими"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося згенерувати ключ шифрування"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 Щось пішло не так під час отримання даних"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"Помилка розшифрування, ваша база даних все ще захищена. Це в основному спричинено цілісністю зашифрованих даних для одного або декількох облікових записів."}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Шифрування не вдалося, ваша база даних залишається незахищеною."}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"Перенесення значків не вдалося. Налаштування було відновлено до попереднього значення."}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"Аутентифікація не вдалася, перевірте ваш PAT"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"Сервер 2FAuth недоступний, перевірте URL-адресу"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося розшифрувати PAT"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося отримати ключ"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося зашифрувати PAT"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося отримати пароль"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося отримати токен"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося завантажити налаштування зі сховища"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося перегенерувати IV"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося отримати налаштування застосунку"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося отримати дані зашифрованого сховища"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося встановити затримку автоблокування"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося встановити ключ шифрування"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося встановити параметри шифрування"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося зберегти зашифрований PAT"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"Поле є обов'язковим і має бути коректним URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"Це поле обов’язкове"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося завантажити файл"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"Вимагається HTTPS контекст"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*не розшифровано*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"Невірні дані 2FA"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"Неправильний або невідомий персональний токен доступу"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"Invalid or unreadable :appname data"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"Жоден автентифікатор не підтримує вказані алгоритми"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"No entry was of type 'public-key'"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"Немає доступних значків в цьому варіанті"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Немає збігів в наборі значків"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"Скидання пароля недоступне для цього користувача"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Немає читабельного QR-коду"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"У цьому QR-коді немає дійсного ресурсу OTP"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Цей формат OTP наразі не підтримується"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"Операція не дозволена"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"Цей QR-код неможливо прочитати"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR-код має невірну контрольну суму"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Оновити"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"Зарезервоване ім'я, будь ласка, оберіть щось інше"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"Будь ласка, використовуйте лише літери, цифри, дефіси, підкреслення, пробіли або одинарні лапки"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"Ресурс не знайдено"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"Пристрій вже зареєстрований"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"Security error: Check your WEBAUTHN_ID env var"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"Щось не так з вашим сервером"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"Unwanted spaces will be automatically removed"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"Цей SSO провайдер не повністю налаштований у файлі .env"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO вимкнено"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email."}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"Автентифікація через SSO відхилена"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"Реєстрація вимкнена"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"too many ids were included in the query parameter, max 100 allowed"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося розшифрувати uri"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"You do not have permissions to view this resource or to perform this action"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Не авторизовано"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Невідома помилка під час шифрування PAT"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"Невідома помилка"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"Дані не відповідають жодному підтримуваному формату"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Непідтримуваний тип OTP"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"Недоступно при використанні проксі-автентифікації або SSO"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Цей спосіб автентифікації лише для адміністраторів. Користувачі повинні входити через SSO."}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"Видалення облікового запису користувача не вдалося, дані не видалено"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"Ідентифікатор користувача не був між 1 і 64 символами"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"Wrong current password, nothing has changed"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"Невірний пароль"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Степан Бандера"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"Алгоритм, використаний для захисту кодів безпеки"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"Алгоритм"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Дозволити користувачам створювати персональні токени доступу і використовувати їх для автентифікації через сторонні програми, такі як веб-розширення 2FAuth"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Дозволити використання PAT"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"Персональний токен доступу (PAT) для автентифікації розширення на сервері. Ви можете згенерувати його на сторінці Налаштування > OAuth вашого облікового запису 2FAuth"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API-токен"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматично приховувати пароль з екрана після закінчення тайм-ауту. Це дозволяє уникнути непотрібних запитів свіжих паролів, якщо ви забули закрити перегляд паролю."}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"Автозакриття OTP"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматичне блокування розширення для запобігання несанкціонованого доступу до його даних"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"Автоблокування"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"Вийти з облікового запису автоматично у випадку неактивності. Не має ефекту коли автентифікація виконується проксі-сервером, і не вказана користувацька URL-адреса для виходу."}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"Автоблокування"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"Нові облікові записи автоматично реєструються після сканування або завантаження QR-коду, нема потреби натискати кнопку Зберегти"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"Автоматичне збереження облікових записів"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"Інколи кеш повинен бути очищений, наприклад, після зміни змінних середовища або оновлення. Ви можете зробити це тут."}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"Управління кешем"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"Автоматично перевіряти (раз на тиждень) і попереджати, коли з'являється нова версія 2FAuth на Github"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"Перевіряти наявність нової версії"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Очистити поле пошуку відразу після того, як код був скопійований в буфер обміну"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Очистити пошук після копіювання"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Натискання на згенерований код, щоб скопіювати його, автоматично приховає його з екрану"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"Закрити OTP після копіювання"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"Підтвердити новий пароль"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first Time-based One-Time Password (TOTP) password will be copied, not the rotating ones"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"Копіювати OTP при показі"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"Початкове значення лічильника"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"За замовчуванням 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"Лічильник"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"Fill in your current password to confirm that it's you"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Поточний пароль"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"The group to which the newly created accounts are associated"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"Група за замовчуванням"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"Спосіб введення за замовчуванням, який буде використаний при увімкненій опції швидкого введення"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"Спосіб вводу за замовчуванням"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"The number of digits of the generated security codes"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"Кількість цифр"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"All your security devices will be revoked. Use this option if you have lost one or its security has been compromised."}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Вимкнути усі пристрої безпеки"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won't be able to sign in via SSO"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"Вимкнути реєстрацію"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want accounts to be displayed as a list or as a grid"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"Режим відображення"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"Ел. пошта"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"Дозволити відвідувачам автентифікуватись за допомогою зовнішнього ID через схему Single Sign-On"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"Увімкнути SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Пароль що зараз використовується для розблокування розширення"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"Поточний пароль"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"The new password that will be used to lock this extension and encrypt sensitive data when needed"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"Новий пароль"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"Пароль, який буде використовуватися для блокування цього розширення та шифрування конфіденційних даних, коли це буде необхідно"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"Пароль"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"(Спробувати) Отримати офіційний значок емітента 2FA при додаванні облікового запису"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"Отримати офіційні значки"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"Група, до якої буде призначено обліковий запис"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"Група"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe."}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"Кінцева точка здоров'я"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"The web address of the 2FAuth instance where you signed up. For example: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"URL сервера 2FAuth"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"The icons collection to be queried at first when an official icon is required."}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"Улюблена онлайн-колекція"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"Set whether to fetch the icons from an online logo collection or a local icon pack. Changing the following icon settings will not refresh icons that have already been fetched."}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"Отримати значки з"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"The icon pack to use when an official icon is required. Icon packs are made available by uploading pack directories to the 2FAuth server, ask your instance administrator for more."}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"Набір значків"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"Narrow the fetch to the specified variant. If the variant is missing, 2FAuth will not try to fallback to the regular variant."}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"Жорстка вибірка"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"Some icons are available in different flavors to best suit dark or light user interfaces. Set the one you want to look for first. The regular variant will automatically be fetched as a fallback."}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"Варіант значків"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"Значок"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don't own."}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"Адміністратор"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow new users to sign in for the first time via SSO whereas registration is disabled"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"Залишити SSO реєстрацію увімкненою"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"Language used to translate the 2FAuth user interface. Named languages are complete, set the one of your choice to override your browser preference."}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"Мова"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"Назва цього пристрою"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"Ім’я"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"Нова назва"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Новий пароль"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email each time an attempt to connect to your 2FAuth account fails"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"При невдалому вході"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"Get an email when a new device connects to your 2FAuth account for the first time"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"При вході з нового пристрою"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"You can leave the following options blank if you don't know how to set them. The most commonly used values will be applied."}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"Set how and when One-Time Passwords (OTP) are displayed"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"Показати пароль"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"Time-based OTP or HMAC-based OTP or Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"Виберіть тип OTP для створення"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"Change how the passwords are displayed by grouping digits to ease readability and memorization"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"Форматування паролю"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"Пароль"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"The period of validity of the generated security codes in second"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"За замовчуванням 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"Період"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Save the last group filter applied and restore it on your next visit"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"Запам'ятати фільтр групи"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"Emails in this list will be allowed to register. Separate addresses with a pipe ('|')"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"Список фільтрації"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO."}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"Обмежити реєстрацію"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"Emails matching this regular expression will be allowed to register"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"Правило фільтрації"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Let the ability to temporarily reveal Dot-Obscured passwords"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"Reveal obscured OTP"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"The key used to generate your security codes"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"Секретний ключ"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"Google, Twitter, Apple"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"Сервіс"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"Показувати значки облікових записів на головній сторінці"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"Показувати значки"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"Display the logged-in user's email in the footer instead of direct navigation links. The links are then available in a menu behind a click/tap on the email address."}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"Показати email в футері"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"Preview the next password, i.e. the password that will replace the current password when it expires. Preferences set for the current OTP also apply to the next one (formatting, show as dot)"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"Показувати наступний OTP"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"Replace generated password characters with *** to ensure confidentiality. Does not affect the copy/paste feature"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"Показувати згенерований OTP як крапки"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"When invoked, force the Sort function to sort accounts on a case-sensitive basis"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"Sort case sensitive"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:"Uploaded icons are registered in the database in addition to the file system storage, which is then used only as a cache. This makes creating a 2FAuth backup much easier, as only the database has to be backed up."}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"But beware, this may has some drawbacks: The database size may increase significantly if the instance hosts many large icons. It may also affect the application performance because the file system is hit more often to ensure it is synchronised with the database."}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"Зберегти значки в базі даних"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"Send a test email to control your instance's email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password."}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"Тест конфігурації електронної пошти"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"Force a specific theme or apply the theme defined in your system/browser preferences"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"Тема"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"Часовий пояс застосовується до всіх дат та часів що показуються в застосунку"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Часовий пояс"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"If you experiences issues when capturing QR codes enables this option to switch to a more basic but more reliable QR code reader"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"Використовувати базовий сканер QR-кодів"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key."}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Захистити конфіденційні дані"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Зробити SSO єдиним доступним методом для входу у 2FAuth. Вхід з паролем і Webauthn будуть відключені для звичайних користувачів. Це обмеження не впливає на адміністраторів."}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"Використовувати лише SSO"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security."}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password."}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:'Увага! Форма електронної пошти та пароля залишиться доступною попри ввімкнену опцію, однак вона завжди повертатиме відповідь "Невдала автентифікація".'}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"Використовувати лише WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"Пряме введення"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"Always return to the default group when an OTP is copied"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"View default group on copy"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"Про застосунок"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"Журнал доступу"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"Доступ"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"Відновлення облікового запису"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"Автентифікація"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Змінити пароль"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"Небезпечна зона"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"Введення даних"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Видалити обліковий запис"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Редагувати обліковий запис"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"Середовище"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"Загальне"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"Групи"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"Iмпорт"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"Останній доступ"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"Вхід"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"Новий обліковий запис"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"Нова група"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"Новий пароль"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"Новий токен"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"Новий користувач"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"Сповіщення"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"Параметри"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"Пароль"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"Персональні токени доступу"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"Профіль"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"Призначення"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR-код"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"Реєстрація"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"Реєстрації"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"Перейменувати пристрій"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Скинути розширення"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Скинути пароль"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"Ресурси"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"Пристрої безпеки"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"Безпека"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"Єдиний вхід (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"Вхід через SSO"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"Сховище"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"Підтримувані формати міграції"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"Веб-розширення 2FAuth"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"Не авторизовано"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"Оновити профіль"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"Керування користувачем"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"Користувачі"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn вхід"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 день"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 годину"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 хвилину"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 10 хвилин"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 15 хвилин"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 2 хвилини"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 30 хвилин"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 5 хвилин"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"Про застосунок"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"Активна група"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Розширена форма"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"Після кліку/дотику"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"Показати всі паролі на головному екрані, не роблячи нічого"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"All of them, on home"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"Всі"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Всі облікові записи"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"Без групи"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Облікові записи без групи"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"Click an account to get a password in a dedicated view"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"Alone, in its own view"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування застосунку"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"Застосувати"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"Авто"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"Назад"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування браузера"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"Браузер"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"Скасувати"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"Змінити пароль"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"Всі"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"Перевірити зараз"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"Завантажити"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"Очистити"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"Закрити"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"Постійно"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"Продовжити"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Скопіювати в буфер обміну"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"Скопіювати"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"Створити"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"Автори"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"Темна"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"За замовчуванням"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"Видалити цього користувача"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Видалити ваш обліковий запис"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"Видалити"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"Демо"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"Пристрій"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"Відхилити все"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"Відхилити дублікати"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"Документація"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"Готово"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"Експорт"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"Розширення"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 15 хвилин"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 5 хвилин"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"Згенерувати"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"Сітка"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"Розділити цифри на дві однакові групи"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"навпіл"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"Мені пощастить!"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"Завантажений пакет"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"Імпортувати всі"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"Iмпорт"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP-адреса"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"Видавець"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"Світлий"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"Список"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"QR code livescan"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"Керування"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"Перемістити"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"Мій пристрій"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"Ніколи"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"Новий"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"Без групи"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- Без пакунка -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"Remove from their group"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"On security code copy"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 день"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 годину"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 1 хвилину"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 міс."}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 р."}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"Онлайн-колекція"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"Відкрити в браузері"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"ОС"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"Параметри"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"Групування цифр два по два"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"парами"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"Простий текст"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Prefill using a QR Code"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR-код"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"Завантаження QR-коду"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"Оновити"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"Зареєструвати пристрій"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"Зареєструватися"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"Звичайний"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"Видалити значок"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"Надіслати лист повторно"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Скинути розширення"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"Скинути пароль"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"Скинути"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Відкликати"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"Зберегти"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Сканувати QR-код"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"Пошук"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"Виберіть облікові записи для показу"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"Надіслати посилання для скидання пароля"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"Надіслати посилання для відновлення"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"Надіслати"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Увійти"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"Вийти"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"Надіслати"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 10 хвилин"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"Перевірка"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"Текстовий файл"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 30 хвилин"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"Час"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"Iмпорт"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"Групувати цифри три по три"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"по три"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"Через 2 хвилини"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth формат"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Розблокувати"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"Оновити"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Завантажити QR-код"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"Завантажити"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"Користувачі"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"Змінні"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"Веб-розширення"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" міс."}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (Болгарська)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (Данська)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (Німецька)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (Англійська)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (Іспанська)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (Французька)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (Хінді)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (Італійська)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (Японська)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (Корейська)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (Нідерландська)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (Португальська, Бразильська)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (російська)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (Турецька)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Китайська спрощена)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"Про застосунок"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"Панель адміністратора"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"Повернутися на головну"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"Налаштувати"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"Продовжити"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"Створити нову групу"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"Створити користувача"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"Як створити PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"Редагувати"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"Згенерувати новий токен"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"Перейти до 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Допоможіть перекласти 2FAuth"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"логін та пароль"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"Керування групами"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"Керування"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Можливо пізніше"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"Відновити ваш обліковий запис"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"Зареєструвати новий пристрій"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"Зареєструватися"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"Скинути його"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Скинути розширення"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Скинути пароль"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"Сканувати"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"пристрій безпеки"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"Переглянути повний журнал"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"See how to enable a provider"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"Ви можете увійти без SSO"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Увійти"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth export schema"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"Використати розширену форму"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"Переглянути на Github"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"Чому я це бачу?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"Повний журнал доступу для користувача "},{t:4,k:"username"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"Цей обліковий запис прив'язаний до облікового запису "},{t:4,k:"provider"},{t:3,v:" через OAuth"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"You signed-in via SSO using your "},{t:4,k:"provider"},{t:3,v:" account. Your information cannot be changed here but on "},{t:4,k:"provider"},{t:3,v:"."}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Лист для відновлення облікового запису надіслано!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"Виберіть спосіб і додайте свій перший обліковий запис"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Manage users registered on your instance or create new ones."}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"Вже аутентифіковані, будь ласка, спочатку вийдіть"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"Вже зареєстровані?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"Альтернативні методи"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Автентифікація виконується зворотним проксі, налаштування нижче вимкнено."}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"Автентифікація на сервері не вдалася."}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"The perfect companion to your 2FAuth web application"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":browser на :platform"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"Caps lock увімкнено"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис користувача буде видалено, як і всі його дані 2FA."}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"Ваш обліковий запис буде видалено разом з усіма вашими даними 2FA. Цю дію неможливо скасувати."}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"Видалення вашого облікового запису 2FAuth не впливає на ваш зовнішній обліковий запис SSO."}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Видалення групи не видаляє облікові записи"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Пряме введення"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"Функція вимкнена в демонстраційному режимі"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them."}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"Ще не маєте облікового запису?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"The email will be send to "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"You can enhance the security of your 2FAuth account by enabling WebAuthn authentication."}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"Ensure you open the email on a device you fully own."}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"Виникла помилка:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"Expected: A list of otpauth URI, one by line"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"Невдалий вхід "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"Невдача"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"Отримання даних..."}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"Забули пароль?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"Містить маленьку літеру"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"Містить цифру"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"Містить спеціальний символ"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"Містить велику літеру"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"Довідка: "}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"Привіт, "},{t:4,k:"username"},{t:3,v:", все добре"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"The 'Try my luck' button tries to get a standard icon from the selected icon collection. The simpler the Service field value, the more likely you are to get the expected icon: Do not append any extension (like '.com'), use the exact name of the service, avoid special chars."}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Адміністратор?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"Use the Export feature of these apps to get a migration resource like a QR code or a JSON file then load it here."}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth can import data from various 2FA apps."}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"Імпортовано"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- invalid account -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"This reset token is invalid."}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- invalid service -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"8 символів мінімум"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"Ваш персональний токен доступу все ще дійсний?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"Last seen "},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Логотипи від"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"Втратили ваш пристрій?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"Зроблено з"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"Make sure to copy your personal access token now. You won’t be able to see it again!"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Керуйте обліковим записом на рівні проксі."}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"Manage authentication at proxy level."}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can create groups to organize your accounts the way you want. All accounts remain visible in the pseudo group named 'All', regardless of the group they belong to."}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"Обов'язково"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"Перемістити вибране до"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"Або"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"Або фільтрувати облікові записи по групах"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"Set at least one device to enable the following options"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"Жодного облікового запису 2FA не додано!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"Поки немає записів"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"немає провайдера"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"Немає результатів"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- немає сервісу -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"Провайдер відсутній?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"нічого"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Подробиці про цю спробу підключення"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker."}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"There has been a failed login attempt to your 2FAuth account."}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося увійти до 2FAuth"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"Привіт, :username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"Привіт"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"Інформація про це підключення"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password."}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"Новий пристрій щойно приєднано до вашого облікового запису 2FAuth."}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"Підключення до 2FAuth з нового пристрою"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"З найкращими побажаннями"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance."}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"Тестовий лист 2FAuth"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"Гарна новина, все працює :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"Recommended (highly)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"Ви також можете продовжити з:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI - це найбільш поширений формат, який використовується для обміну даними 2FA, наприклад, у формі QR-коду, коли ви вмикаєте 2FA на вебсайті. Виберіть це, якщо ви хочете перемкнутися з 2FAuth."}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Експорт даних у список otpauth URI"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"Аналіз даних..."}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Password login and WebAuthn are disabled."}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"A password reset request exists for this user but has expired, meaning that the user has not changed their password in time. This may be a request from the user themselves or from an administrator."}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"A password reset request exists for this user (request sent at "},{t:4,k:"datetime"},{t:3,v:"), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator."}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"An account with the exact same data already exists"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"This web extension is an add-on to the 2FAuth web application. It lets you access the 2FA data of your 2FAuth user account and generate OTPs directly from your browser bar."}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"You must have a 2FAuth user account and bind it to the extension in order to use it. This is done by providing the 2FAuth server address and a Personal Access Token (PAT)."}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"To recover your account, 2FAuth resets some Webauthn settings so you will be able to sign in using your email and password."}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a recovery link to this email address. Click the link in the received email and follow the instructions."}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"Зареєстрований "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"2FA registraton from the extension is not supported yet. Visit your 2FAuth app to add your first 2FA."}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Resend email' to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked."}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"Use this option if you forgot the extension password."}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension will be stripped of its current configuration and 2FAuth data. It will be available again for rebinding to a 2FAuth user account."}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"Use 'Reset password' to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked."}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth will send you a password reset link to this address. Click the link in the received email to set a new password."}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form."}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"You can try to refresh (maybe it was a temporary problem) or you can reset the extension and provide a new token."}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Відкликання пристрою є незворотним"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"Відкликання токену є незворотним"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"Authentication devices you can use to sign in 2FAuth, like security keys (i.e Yubikey) or smartphones with biometric capabilities (i.e. Apple FaceId/TouchId)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"Some settings are being managed by your administrator"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"You can connect using the email address "},{t:4,k:"email"},{t:3,v:" and the password "},{t:4,k:"password"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"Pick an SSO provider to sign in with:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"Увійти використовуючи"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"Деякі переклади відсутні бажаною мовою?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"Regular users must sign in with SSO. Other methods are for administrators only."}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"Authentication is restricted to SSO only, "},{t:4,k:"auth_method"},{t:3,v:" is disabled"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Installed cameras are not suitable"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Будь ласка, використайте інший пристрій/камеру"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS required for camera streaming"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"Неможливо запустити сканування в реальному часі :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"It is usually done by clicking on a slashed camera icon in or next to the browser's address bar"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth does not have permission to access your camera"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission."}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"На цьому пристрої немає камери"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"Можливо ви забули під'єднати вебкамеру"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"Не вдалося завантажити сканер"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"Is the camera already in use? Ensure that no other app use your camera and try again"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"Вимагається захищений контекст"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"Stream API is not supported in this browser"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"Вам слід використати сучасний браузер"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"The following 2FA accounts were found in the migration resource. So far none of them have been added to 2FAuth."}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"Успішний вхід "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"Успішний вихід "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"Приймається: Простий текст, json, 2fas"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"Приймаються: jpg, jpeg, png, bmp, gif, svg, або webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"This is not a soft delete, there is no going back."}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"Забагато спроб входу. Будь ласка, спробуйте знову через "},{t:4,k:"seconds"},{t:3,v:" секунд."}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests."}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"This action does not revoke the personal access token in use."}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"You should prefer this option if you need to create a backup that can be restored. This format takes care of the icons."}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"Визначення схеми описано тут:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"A browser extension to retrieve 2FA security codes generated from your 2FAuth server."}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI значки від"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"The extension is locked to protect its data. Enter the extension password to access your 2FAs."}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"Використовуйте доступні кнопки, щоб назавжди зберегти їх до вашої колекції 2FA, або відхилити їх."}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"Get ready to authenticate using (one of) your security devices. Plug your key in, remove face mask or gloves, etc."}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"Використовуйте email адресу "},{t:4,k:"email"},{t:3,v:" і пароль "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"User account made available by an authentication proxy."}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" активних токенів"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" пристроїв безпеки (passkey)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"Переглянуто "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"На сервері не знайдено пакету значків."}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Вхід через Webauthn вимкнено"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely."}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Ласкаво просимо до 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"Ласкаво просимо до 2FAuth демо."}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"Ласкаво просимо до тестової інсталяції 2FAuth"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" облікових записів"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:4,k:"version"},{t:3,v:" доступна"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" обрано"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"Встановлено останню версію"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"You need an account to go further, please register yourself."}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис успішно створено"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис успішно оновлено"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully deleted"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"Account(s) successfully moved"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"Помилка автентифікації"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Auto-lock triggered, you've been logged out"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"Кеш очищено"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Скопійовано до буфера обміну"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"Data has been refresh to reflect server-side changes"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Пристрій успішно відкликано"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"Пристрій успішно зареєстровано"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"Ім'я групи збережено"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"Групу успішно створено"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Групу успішно видалено"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"Немає доступних пакетів значків"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"Пароль змінено"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"Пароль успішно змінено"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"Пароль успішно скинуто"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"PAT користувача успішно відкликано"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"Профіль успішно оновлено!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"User's security devices successfully revoked"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"Settings saved"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"Test email sent, check your inbox"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"Токен успішно відкликано"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис користувача успішно видалено"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"Користувача успішно створено"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"Роль користувача оновлено"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" valid accounts found"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"Далі »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« Назад"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"Passwords must be at least eight characters and match the confirmation."}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"Your password has been reset!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"We have emailed your password reset link!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"Please wait before retrying."}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"This password reset token is invalid."}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"We can't find a user with that email address."}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"User name, email..."}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"Елемент не знайдено"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"Про застосунок"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"Облікові записи"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування застосунку"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"Автентифікація"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"Створення користувача"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"Журнал доступу"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"Керування користувачем"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"Керування користувачами"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"Автоблокування"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"Flash QR"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"Створення облікового запису"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"Створення групи"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"Редагування облікового запису"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"Редагування групи"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"Забагато запитів"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"Помилка"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"Групи"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"Імпорт облікових записів"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"Лендінг"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"Вхід"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"Скидання паролю"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"Новий пароль"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"Скинути розширення"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"Реєстрація нового облікового запису"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"Обліковий запис користувача"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"Новий персональний токен"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth токени"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"Пристрої WebAuthn"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"Редагування пристрою"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"Налаштування"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"Account as QR code"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"Новий обліковий запис"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Розблокувати"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"Відновлення облікового запису"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"Зареєструвати новий пристрій"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"Очистити пошук"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"Очистити виділення"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Закрити сторінку "},{t:4,k:"pagetitle"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"Скопіювати наступний пароль у буфер обміну"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"Скопіювати в буфер обміну"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"Видалити"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Відхилити цей обліковий запис"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Експортувати вибрані облікові записи"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"Згенерувати тестовий код"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"Go back to the "},{t:4,k:"pagetitle"},{t:3,v:" page"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Приховати вибір групи"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"Приховати пароль"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Імпортувати цей обліковий запис"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"Заблокувати"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"Керування"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"Move selected into a group"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data as a list of otpauth URIs"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"Refresh icon pack list"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"Перейменувати"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"Resend a password reset email to the user"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"Reset the user's password"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"Показати пароль"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Відкликати всі пристрої безпеки користувача"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"Відкликати всі токени користувача"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"Відкликати"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"Пошук"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"Вибрати все"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"Показувати вибір групи"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"Показати записи за останній місяць"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"Показати записи за останній рік"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Показати QR-код"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 6 months"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"Show entries from the last 3 months"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"Увійти, використовуючи пристрій безпеки"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"За зростанням"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"Показати спочатку давніші"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"Показати спочатку останні"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Сортувати за спаданням"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"Export data using the 2FAuth json schema"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"Розблокувати (на власний ризик)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Заповніть форму автоматично, відсканувавши QR-код"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"Відвідати "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути прийнятним, коли :other є :value."}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"Ви повинні прийняти :attribute."}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute не є правильним URL."}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити дату не раніше, або дорівнюватися :date."}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити дату не раніше :date."}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити лише літери, цифри, тире та підкреслення."}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити лише літери та цифри."}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити лише літери."}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути масивом."}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити лише однобайтові буквено-цифрові знаки та символи."}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити дату не пізніше, або дорівнюватися :date."}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити дату не пізніше :date."}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити від :min до :max елементів."}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:"Розмір файлу у полі :attribute має бути не менше :min та не більше :max кілобайт."}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути між :min та :max."}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:"Текст у полі :attribute має бути не менше :min та не більше :max символів."}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити логічний тип."}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute містить неавторизоване значення."}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute не збігається з підтвердженням."}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити обов'язкове значення."}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"Пароль неправильний."}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:"Використання двокрапки в полі :attribute неприпустиме."}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"Ця адреса електронної пошти не відповідає вимогам реєстрації"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"Не знайдено облікового запису з такою електронною адресою."}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"Всі електронні адреси повинні бути дійсними та розділені вертикальною рискою"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"Підтримувані формати jpeg, png, bmp, gif, svg або webp."}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"Ідентифікатори повинні бути розділеними комами, без коми в кінці."}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"URI повинен мати мітку."}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"Значення поля :attribute не підтримується."}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"Підтримувані формати: jpeg, png, bmp, gif, svg або webp."}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:"Дані поля :attribute мають бути у вигляді закодованого base32 рядку."}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:"Використання двокрапки в полі :attribute недопустиме."}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:"Некоректне значення otpauth uri в полі :attribute."}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути датою рівною :date."}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute не відповідає формату :format."}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute не є датою."}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити :decimal десяткових знаків."}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути відхилено, якщо :other є :value."}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути відхилено."}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:"Поля :attribute та :other повинні бути різними."}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:"Довжина цифрового поля :attribute повинна бути від :min до :max."}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:"Довжина цифрового поля :attribute повинна дорівнювати :digits."}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute містить неприпустимі розміри зображення."}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute містить значення, яке дублюється."}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute не може закінчуватися одним із таких: :values."}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute не може починатися з одного з наступного: :values."}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити коректну електронну адресу."}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має закінчуватися одним з наступних значень: :values"}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"Значення поля :attribute відсутнє у списку допустимих значень."}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:"Значення поля :attribute не існує."}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:"Файл у полі :attribute повинен мати одне з наступних розширень: :values."}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити файл."}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення."}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити більше ніж :value елементів."}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути більше ніж :value кілобайт."}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути більше ніж :value."}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути більше ніж :value символів."}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити :value чи більше елементів."}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має дорівнювати чи бути більше ніж :value кілобайт."}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має дорівнювати чи бути більше ніж :value."}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має дорівнювати чи бути більше ніж :value символів."}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має мати дійсний шістнадцятковий колір."}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"На сервері не знайдено пакету значків."}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити зображення."}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:"Значення поля :attribute не міститься в :other."}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"Значення поля :attribute відсутнє у списку допустимих значень."}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити ціле число."}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити IP адресу."}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити IPv4 адресу."}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити IPv6 адресу."}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити коректний регулярний вираз."}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:"Дані поля :attribute мають бути у форматі JSON."}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:"Значення поля :attribute має бути списком."}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути рядком у нижньому регістрі"}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити менше ніж :value items."}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути менше ніж :value кілобайт."}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути менше ніж :value."}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути менше ніж :value символів."}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити не більше ніж :value елементів."}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має дорівнювати чи бути менше ніж :value кілобайт."}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має дорівнювати чи бути менше ніж :value."}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має дорівнювати чи бути менше ніж :value символів."}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити MAC адресу."}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute не може містити більше :max цифр."}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити не більше :max елементів."}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:"Файл в полі :attribute має бути не більше :max кілобайт."}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути не більше :max."}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:"Текст в полі :attribute повинен мати довжину не більшу за :max."}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити файл одного з типів: :values."}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити файл одного з типів: :values."}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити принаймні :min цифр."}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити не менше :min елементів."}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:"Розмір файлу у полі :attribute має бути не меншим :min кілобайт."}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне бути не менше :min."}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:"Текст у полі :attribute повинен містити не менше :min символів."}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути відсутнім, якщо :other дорівнює :value."}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути відсутнім, якщо :other не є :value."}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинно бути відсутнім, якщо присутні :values."}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинно бути відсутнім, якщо присутнє :values."}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути відсутнім."}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинно бути кратним :value"}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"Значення поля :attribute не повинно бути у списку."}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:"Формат поля :attribute не вірний."}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинно містити число."}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"Параметр uri повинен надаватися самостійно або в поєднанні з параметром 'custom_otp'"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити принаймні одну літеру."}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити принаймні одну велику та одну малу літери."}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити принаймні одне число."}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити принаймні один символ."}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute з'явився під час витоку даних. Виберіть інший :attribute."}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути присутнім, коли :other дорівнює :value."}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинно бути присутнім, якщо :other не є :value."}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинно бути присутнім, якщо присутні :values."}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинно бути присутнім, коли присутній :values."}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне бути присутнє."}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute заборонено, коли :other дорівнює :value."}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute заборонено, якщо тільки :other не знаходиться в :values."}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute заборонено."}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute забороняє присутність :other."}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має хибний формат."}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має містити записи для: :values."}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим, якщо прийнято :other."}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим, якщо відхилено :other."}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення, коли :other є рівним :value."}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення, коли :other відрізняється від :values"}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення, коли :values вказано."}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення, коли :values вказано."}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення, коли :values не вказано."}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення, коли :values не вказано."}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute є обов'язковим для заповнення."}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:"Поля :attribute та :other мають збігатися."}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"Якщо використовувати :attribute, це має бути єдиний параметр в тілі цього запиту"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити :size елементів."}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:"Файл у полі :attribute має бути розміром :size кілобайт."}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути довжини :size."}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:"Текст у полі :attribute повинен містити :size символів."}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне починатися з одного з наступних значень: :values"}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити текст."}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute повинне містити коректну часову зону."}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути коректним ULID."}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:"Вказане значення поля :attribute вже існує."}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:"Завантаження :attribute не вдалося."}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути рядком у верхньому регістрі."}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:"Формат поля :attribute хибний."}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:"Поле :attribute має бути коректним UUID ідентифікатором."}}}},{"zh-CN":{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"账号图标"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"要扫描的二维码图像"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"您确定吗?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"此操作会取消所有的更改,确定要继续吗?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"这将严重影响此用户的权限,确定要继续吗?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"您确定要删除您的账户吗?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"您确定要删除此分组吗?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"您确定要删除此账号吗?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"您确定要删除此用户吗?此操作无法恢复。"}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"您将失去管理员权限,确定要继续吗?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"您确定要丢弃所有账号吗?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"您确定要放弃所有重复的账号吗?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"您确定要丢弃此账号吗?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"这是您自己的账户,确定要继续吗?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"您确定要退出登录吗?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"您确定要撤销之前的请求吗?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"您确定要重置此用户的密码吗?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"您确定要删除此设备吗?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"您确定要吊销此令牌吗?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"您确定要更改分享设置吗?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"此操作会吊销所有用户的访问此 2FA 账号的权限,确定要继续吗?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"此操作会停止分享此账号,确定要继续吗?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"您即将失去此 2FA 账号的所有权,确定要继续吗?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 的域名不符合规范"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"操作被用户中止"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"由外部提供方管理的账户"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"已为 2FAuth 配置了前置的身份代理,但身份代理并没有返回正确的请求头,请检查您的配置并重试。"}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"身份代理认证失败"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"验证器暂不兼容可发现性凭据"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"验证器暂不兼容用户验证"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"您的设备不支持 WebAuthn,请尝试换用新版浏览器并重试"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"无法在无密码的情况下创建一个 OTP"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"无法解密,可能是因为 2FAuth 的 .env 文件中 APP_KEY 值的设置错误,或数据库已损坏。"}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"二维码已识别,但解码失败,请裁切或锐化图像后再试"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"这是唯一的管理员账户,无法删除"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"这是唯一的管理员账户,无法降级"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"未在图像中检测到二维码,请裁切图像后再试"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"修改失败,请重试"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"检查失败,请稍后重试"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"无法从服务器刷新数据"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"此二维码的数据不是有效的 OTP Auth URI。此二维码包含:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"只有用户创建的设置才允许被删除"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"获取二维码时出错"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"邮件发送失败"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"无法读取,数据可能已被加密"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"加密密钥创建失败"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 获取数据时出错"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"解密失败,您的数据库仍处于保护状态。这通常是因为某个或多个账户的加密数据的完整性存在问题而导致的。"}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"加密失败,您的数据库仍处于未保护状态。"}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"图标迁移失败,相关设置已恢复为先前的值。"}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"验证失败,请检查您的个人访问令牌 (PAT)"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"无法连接到 2FAuth 服务器,请检查 URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"解码 PAT 失败"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"获取密钥失败"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"加密 PAT 失败"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"获取密码失败"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"获取令牌失败"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"二维码扫描脚本注入出错"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"从已保存的数据中导入设置失败"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"获取 IV 失败"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"获取应用程序设置失败"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"获取加密存储的数据失败"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"设置自动锁定失败"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"设置加密密钥失败"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"设置加密参数失败"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"保存加密 PAT 失败"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"此选项必填,且必须为有效的 URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"此选项必填"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"文件上传失败"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"需要 HTTPS"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*无法识别*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"无效的 2FA 数据"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"无效或未知的个人访问令牌 (PAT)"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"无效或不兼容的 :appname 数据"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"未找到活动标签"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"没有验证器支持此算法"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"没有类型为 “公钥” 的条目"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"此样式下无可用图标"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"图标包中无匹配项"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"无法为此用户重置密码"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"无可用的二维码图像数据"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"此页面的当前显示区域内无法找到有效的二维码"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"没有可识别的二维码"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"此二维码中没有有效的 OTP 字段"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"不支持此 OTP 格式"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"不允许此操作"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"服务器上的 OAuth 密钥权限无效。若要解决此问题,请参考 2FAuth 文档中的 “升级至 v8” 部分。"}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"二维码无效"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"二维码的校验码错误"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"刷新"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"此名称为保留字符,请选择其他内容"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"仅允许字母、数字、减号 (-)、下划线 (_)、单引号 (') 或空格"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"请求不是来自受信任的身份代理"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"找不到资源"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"设备已被注册"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"安全错误:请检查您的 WEBAUTHN_ID 环境变量"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"“所有用户” 分享范围已被禁用"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"分享功能已被关闭"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"服务器发生内部错误"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"多余的空格将被自动删除"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"您未在 .env 文件中正确配置此 SSO 提供方"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO 已禁用"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"已存在相同邮箱的账户,但不匹配您的外部账户 ID 。如果您已使用此邮箱在 2FAuth 上注册过,请不要使用 SSO。"}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"SSO 验证被拒绝"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"已停用注册"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"此账号已分享给所有用户"}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"此账号尚未分享给所有用户"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"查询参数中包含太多 ID,最多允许 100 个"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"无法解密 URI"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"您无权查看此资源或执行此操作"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"无权限"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"加密 PAT 时发生未知错误"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"未知错误"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"不兼容的数据格式"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"不兼容的 OTP 类型"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"不允许按此范围进行分享"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"当身份代理或 SSO 启用时不可用"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"仅管理员允许使用此鉴权方式,普通用户必须使用 SSO 登录。"}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"账户删除失败,数据未被删除"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"用户 ID 需大于 1 并小于 64 个字符"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"当前密码错误"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"密码错误"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"账号名称"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"账号"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"验证码的加密算法"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"算法"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"允许用户创建个人访问令牌 (PAT),并允许第三方应用使用令牌来登录 2FAuth,如 2FAuth 网页扩展"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"允许使用 PAT 鉴权"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"扩展可以使用个人访问令牌 (PAT) 来登录到服务器。您可以从您 2FAuth 的用户设置 > OAuth 页面生成一个 PAT"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API 令牌"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"超时后自动隐藏验证码。如果您忘记退出验证码界面,此功能可以减少不必要的验证码刷新请求。"}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"自动关闭验证码页面"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"自动锁定扩展,防止数据被非法读取"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"自动锁定"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"在闲置时自动退出登录,但以下情况除外:启用了身份代理,且没有配置正确的注销 URL。"}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"自动锁定"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"扫描或上传二维码后,新账号会被自动录入,无需点击 ”保存“ 按钮"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"自动保存账号"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"某些情况下需要清除缓存,例如更改了环境变量,或 2FAuth 进行了升级。您可以在此处手动清理缓存。"}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"缓存管理"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"自动检查更新 (每周一次)。当发现 2FAuth 有新版本时,会发出更新提醒"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"检查更新"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"复制验证码后立即清空搜索框"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"复制后清空搜索框"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"点击某个验证码即可复制并隐藏显示"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"复制后关闭验证码页面"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"再次确认新密码"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"当验证码显示时立即复制。由于浏览器的限制,仅能复制第一个 Time-based One-Time Password (TOTP) 验证码,后续刷新的无法自动复制。"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"当验证码显示时自动复制"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"如果计数器设置错误,可能会导致验证码失效。如果您不了解此功能,请勿随意编辑。您可以点击 “锁定” 图标来解锁编辑,但操作时请务必小心。"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"计数器的初始值"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"默认为 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"计数器"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"为了确认您的身份,请输入当前的密码"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"当前密码"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"新账号创建时,将自动关联到此分组"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"默认分组"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"当 “锁定录入方式” 启用时,锁定为上述的录入模式"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"默认录入模式"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"生成的验证码位数"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"码长"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"此操作将吊销您所有的安全设备。若某个设备已遗失或不再安全,请点击此选项。"}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"禁用所有安全设备"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"防止新用户注册,除非有例外 (见下方选项)。此选项也会禁用通过 “SSO 登录” 产生的注册行为,所以新用户将无法通过 SSO 登录"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"关闭注册"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"选择以列表或网格的方式显示账号"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"显示模式"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"邮箱"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"允许用户分享他们的 2FA 账号给其他用户。被分享的用户可以在自己的账户中看见此账号,并获取验证码,但无权编辑、删除或导出,也不允许查看密钥,或编辑其分享设置。"}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"启用分享"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"允许分享 2FA 账号时,分享给当前 2FAuth 节点上的所有用户。当某个 2FA 账号被分享给 “所有用户” 时,后续的新用户也会被自动分享。"}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"关闭此选项会禁止使用 “所有用户” 的范围进行分享,但不会吊销已经按此范围分享的 2FA 账号。如果你重新启用此选项,用户将重新被允许按 “所有用户” 的范围进行分享,除非在禁用期内已设置了 “特定用户” 的分享范围。"}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"启用 “所有用户” 分享范围"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"允许访客通过单点登录的方式,使用外部 ID 进行身份验证"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"启用 SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"当前用于解锁扩展的密码"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"当前密码"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"用于锁定此扩展的新密码。当由需要时,也会使用此密码来加密敏感数据"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"新密码"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"用于锁定此扩展的密码。当由需要时,也会使用此密码来加密敏感数据"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"密码"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"模糊查询允许使用 “用户名” 或 “邮箱地址”,但必须完整输入"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"搜索用户"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"在添加账号时,尝试获此账号的官方图标"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"获取官方图标"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"此账号要移动到的组"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"分组"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"此 URL 可以显示当前 2FAuth 节点的健康状况。您可以将此 URL 配置在 Docker 的 “HEALTHCHECK”,或是 Kubernetes 的 “livenessProbe” 中,来对服务进行健康检查。"}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"节点健康检查"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"您用于登录 2FAuth 的 URL 地址,例如 https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 服务器 URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"优先从此图标包获取官方图标。"}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"首选在线图标库"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:`选择是从 “在线图标库” 还是从 “本地图标包” 获取图标。更改此设置不会刷新已获取的图标。 +`}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"图标获取来源"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"获取图标时所使用的图标包。若要使用本地图标包,需要先将图标包上传至 2FAuth 服务器,请咨询此实例的管理员了解详情。"}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"图标包"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"获取图标时仅获取选中的样式。如果不存在此样式,2FAuth 将不会自动获取 “普通” 图标。"}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"严格模式"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"某些图标提供不同的样式,用以适配 “亮色” 或 “暗色” 的模式界面。您可以选择一个为优先获取的样式,若选中的样式无法获取到时,将自动获取 “普通” 样式。"}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"图标样式"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"图标"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"授予用户管理员权限。管理员有权管理整个应用,如调整 “设置” 和管理其他用户,但管理员无法获取他人账号内的 2FA 验证码。"}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"管理员"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"在注册被禁用时,仍然允许新用户通过 SSO 登录"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"仍然允许通过 SSO 注册新账户"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"设置 2FAuth 的界面语言。以下仅列出已有的翻译,您可以手动选择一个语言,或跟随浏览器语言自动切换。"}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"语言"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"命名此设备"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"名称"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"新名称"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"所有权将被转移给此用户。"}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"新所有者"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"新密码"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"每次登录失败时都发送邮件通知"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"登录失败时"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"当新设备首次登录时发送邮件通知"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"来自新设备时"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"如果您不了解下列选项,请留空来使用默认配置。"}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"设置验证码的显示方式和时间。"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"显示验证码"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"TOTP,HOTP 或 Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"选择要创建的 OTP 类型"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"分段显示验证码,提高可读性并且便于记忆"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"密码格式"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"密码"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"验证码的有效期 (秒)"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"默认为 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"周期"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"记住选中的分组,并在下次访问时自动切换至此分组"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"记住选中的分组"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"仅允许此列表中的邮箱进行注册,用管道符 ('|') 来分隔多个地址"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"过滤列表"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"只允许符合规则的邮箱地址进行注册。可以同时使用下方的两条规则来进行限制。SSO 的注册流程不受此限制的影响。"}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"限制注册"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"仅允许匹配正则表达式的邮箱地址进行注册"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"过滤规则"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"允许验证码临时以明文显示"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"显示被遮挡的验证码"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"用于生成安全码的密钥"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"密钥"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"服务名称"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"服务"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"在主视图中显示图标"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"显示图标"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"在页面底部显示当前登录用户的邮箱地址,而非直接显示导航链接。当点击邮箱地址时,再跳转到导航链接。"}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"在底部显示邮箱地址"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"提前显示下一个验证码 (即当前验证码过期后,会生成的新验证码)。当前验证码的相关设置也会同样应用到下一个验证码上,例如显示格式、是否显示为点等等。"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"显示下一个验证码"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"显示验证码时,显示 ”*“ 号而不是明文。此功能可以提高安全性,且不会影响复制和粘贴操作。"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"隐藏生成的验证码"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"显示快速导航菜单"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"选中时,强制 “排序” 功能以区分大小写的方式对账号进行排序"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"按大小写排序"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:`图标上传后会额外储存一份到数据库中。 +启用此功能可以令 2FAuth 更易于备份:仅需备份数据库,即可保存 2FAuth 的数据以及所有的图标。`}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:`但要注意的是,此功能可能会产生负面效果:如果上传了大量的大体积图标,那么数据库的体积也会显著地增大。 +此功能也可能会影响 2FAuth 的性能,因为需要频繁地读写磁盘来保证 ”图标“ 数据与数据库保持同步。`}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"保存图标至数据库"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"发送一封测试邮件,验证邮件服务器是否已正确配置。如果配置存在错误,用户将无法收到 “重置密码” 的邮件。"}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"测试送信配置"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"手动设置为某个主题,或自动跟随系统 / 浏览器的主题方案"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"主题"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"为所有的 “日期” 与 “时间” 设置时区"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"时区"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"如果你在扫描二维码时遇到问题,此选项可以切换到更简单但更稳定的二维码扫描器"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"使用简版二维码扫描器"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"敏感数据、2FA 秘钥和邮箱地址会以加密形式储存在数据库中。请您务必备份在 .env 中配置的 APP_KEY 的值 (或备份整个 .env 文件)。如果此密钥丢失,那么已加密的数据将无法解密。"}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"保护敏感数据"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"仅允许通过 SSO 进行登录。启用此功能后,普通用户将无法使用密码和 WebAuthn 来登录 2FAuth,但管理员不受影响。"}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"仅允许 SSO 登录"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"将 WebAuthn 设为 2FAuth 的唯一鉴权方式。若要完全发挥 WebAuth 的安全性,推荐启用此选项。"}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"当设备丢失时, 您可以重置此选项来恢复您的账户,并使用您的邮箱与密码来登录。"}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"请注意! 即使启用了此选项,2FAuth 也仍会显示邮箱与密码的登录界面。但如果尝试使用邮箱登录,则会永远提示 “验证失败”。"}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"仅允许使用 WebAuthn 鉴权"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"在数据录入时,默认会提供多种录入的方式供您选择。若您想锁定为某一种方式,您可以打开此选项。"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"锁定录入方式"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"复制 OTP 验证码后,总是返回到默认分组"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"复制后返回默认分组"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"关于"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"访问日志"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"访问"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"恢复账户"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA 账号"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"分享"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"分享设置"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"身份认证"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"浏览器限制"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"修改密码"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"危险选项"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"数据录入"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"删除账户"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"编辑账号"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"编辑分组"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"环境变量"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"通用"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"分组"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"图标"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"导入"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"最近访问"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"登录"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"新建账号"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"新建分组"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"新密码"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"新建分享"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"新建令牌"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"新用户"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"通知"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"偏好"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"验证码"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"验证码历史记录"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"密码"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"个人访问令牌"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"系统参数"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"个人资料"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"介绍"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"二维码"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"注册"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"注册"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"重命名设备"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置扩展"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"重置密码"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"实用信息"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"安全设备"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"安全"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"服务端参数"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"配置"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"单点登录 (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO 登录"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"存储"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"支持的迁移格式"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"用户"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"转让所有权"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 网页扩展"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"无权限"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"更新个人资料"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"用户"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"用户"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"使用 WebAuthn 登录"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"1 天后"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 小时后"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 分钟后"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 分钟后"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 分钟后"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 分钟后"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 分钟后"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 分钟后"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"关于"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"账户"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"分享给我的账号"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"由我分享的账号"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"操作选项"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"最近更新"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"添加到 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"管理员"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"手动填写"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"点击账号后"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"所有验证码都在主页中显示,不做任何操作"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"直接在主页中显示"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"所有账号"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"所有账号"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"未分组"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"未分组的账号"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"点击账号后,在独立页面中打开并获取验证码"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"在独立页面中显示"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"系统"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"应用"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"身份认证"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"自动"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"返回"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"跟随浏览器语言"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"浏览器"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"取消"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"修改密码"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"所有账号"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"立即检查"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"上传"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"清空"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"关闭"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"始终"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"继续"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"复制到剪贴板"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"复制"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"计数器"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"创建"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"鸣谢"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"暗色"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"默认值"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"删除此用户"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"删除我的账户"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"删除"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"演示"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"检测二维码"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"设备"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"全部放弃"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"放弃重复项"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"文档"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"完成"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"编辑"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"导出"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"扩展插件"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 分钟后"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 分钟后"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"生成"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"网格"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"平均拆分位两组"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"对半分组"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"手气不错"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"已上传的图标包"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"全部导入"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"导入"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP 地址"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP 地址"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"签发方"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"亮色"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"列表"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"扫描二维码"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"以后再说"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"移动"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"我的设备"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"从不"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"新建"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"未分组"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- 无图标包 -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"不分享"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"从分组中移除"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"复制验证码后"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"1 天后"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 小时后"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 分钟后"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 个月"}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 年"}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"在线图标库"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"在浏览器中打开"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"系统版本"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"偏好"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"以两位为一组进行分隔"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"两位一组"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"纯文本"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"使用二维码来填写"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"二维码"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"上传二维码"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"刷新"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"注册设备"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"注册"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"普通"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"移除图标"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"重新发送邮件"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置扩展"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"重置密码"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"重置"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"吊销"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"保存"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"扫描二维码"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"搜索​​​​"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"选择要显示的分组"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"发送密码重置链接"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"发送恢复链接"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"发送"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"分享"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"已分享"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"我分享的"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"分享给我的"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"所有用户"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"特定用户"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"显示详情"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"登录"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"退出"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"提交"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 分钟后"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"测试"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"文本文件"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 分钟后"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"时间"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"导入"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"转让"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"转让所有权"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"以三位为一组进行分隔"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"三位一组"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 分钟后"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 格式"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"解锁"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"未被分享"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"更新"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"上传二维码"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"上传"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"用户"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"环境变量"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"网页扩展"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" 个月"}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (保加利亚语)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (丹麦语)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (德语)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (英语)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (西班牙语)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (法语)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (印地语)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (意大利语)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (日语)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (韩语)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (荷兰语)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (葡萄牙语,巴西语)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (俄语)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (土耳其语)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"中文 (简体中文)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"关于"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"新增分享"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"添加用户"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"系统管理"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"返回首页"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"创建"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"继续"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"新建分组"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"创建新用户"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"创建您的第一个分组"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"如何创建 PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"编辑"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"生成新令牌"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"转到 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"诚邀您协助翻译 2FAuth!"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"“图标” 功能教程"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"用户名和密码"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"管理分组"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"分享管理"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"以后再说"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"若要创建分组,请打开 2FAuth"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"验证码历史记录"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"恢复您的账户"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"注册新设备"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"注册"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"重置密码"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置扩展"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"重置您的密码"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"扫描"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"安全设备"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"显示完整日志"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"看看如何启用提供方"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"用户设置"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"“分享” 功能教程"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"您可以不使用 SSO 登录"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"登录"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"转让所有权"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 导出结构"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"手动填写"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"以二维码形式查看"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"在 GitHub 上查看"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"为什么我会看到这个?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"此网页 App 可助您管理两步验证 (2FA) 账号,并生成对应的验证码"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"本网页 App 可助您管理两步验证 (2FA) 账号,并生成对应的验证码"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"日志包含更多条目。"}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"用户 "},{t:4,k:"username"},{t:3,v:" 的完整访问日志"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"此账户通过 OAuth 与 "},{t:4,k:"provider"},{t:3,v:" 账户绑定"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"您当前是通过 "},{t:4,k:"provider"},{t:3,v:" 登录的,因此无法在此处更改信息,请回到 "},{t:4,k:"provider"},{t:3,v:" 进行操作。"}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"账户恢复邮件已发送!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"选择一个添加方式,创建您的第一个账号"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"添加一个要分享此账号的用户"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"管理当前节点上的已注册用户,或创建一个新的用户。"}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"如果要分享给此 2FAuth 节点上的所有用户,请选择 “所有用户”。“所有用户” 包括当前已存在的用户,以及后续新增的用户。"}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"您已登录,请先退出登录。"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"已经注册?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"已分享"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"其他创建方式"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"因为鉴权已被反向代理接管,因此以下设置已被禁用。"}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"与服务器验证失败。"}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 服务的完美搭子"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":platform 上的 :browser"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"大写锁定已打开"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"此用户所有的 2FA 数据将与此账户被一同删除。"}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"您所有的 2FA 数据将与此账户被一同删除,此操作无法恢复。"}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"删除此 2FAuth 账户不会影响您的外部 SSO 账户。"}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"删除分组时,组内的账号不会被删除"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"开始检测并选择二维码,其余的将会自动处理。"}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"原始数据"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"此功能在演示模式下被禁用"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"如果您需要从其他 2FA 应用导出数据到 2FAuth,请务必在导出前关闭加密保护,否则 2FAuth 将无法解密数据。"}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"还没有账户?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"此操作无法撤销,在进行任何操作前,请您务必再三核对相关选项是否正确。新的所有者会获得此 2FA 账号的完全控制权限,因此请您在转让前,核实并确认对方是可信用户。"}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"邮件将发送到此地址: "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"您可以启用 WebAuthn 来增强您 2FAuth 账户的安全性。"}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"请务必在您信任的设备上打开邮件。"}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"发生错误:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"请填入一个包含 otpauth URI 的列表,每行一条"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"有效期剩余 "},{t:4,k:"days_to_expiration"},{t:3,v:" 日"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"已于 "},{t:4,k:"expired_at"},{t:3,v:" 过期"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"登录失败于 "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"失败"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"正在获取数据…"}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"注意,被分享的用户只允许获取 2FA 验证码,无权查看密钥信息。"}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"您的浏览器 (Firefox) 需要在 “扩展” 的设置中启用特定的功能,才能够识别页面上的二维码。"}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"忘记密码?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"generated_at"},{t:3,v:":由 "},{t:4,k:"requester"},{t:3,v:" 生成了 "},{t:4,k:"otp"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"包含小写字母"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"包含数字"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"包含特殊字符"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"包含大写字母"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"教程:"}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"您好 "},{t:4,k:"username"},{t:3,v:",验证成功"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"“手气不错” 功能会尝试从选定的图标包中获取图标。“服务” 栏所填的名称越简单,您获得正确图标的概率越大。请仅提供此服务的名称,不要填入后缀 (例如 “.com”) 以及特殊字符。"}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"您是管理员吗?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"使用这些应用的 “导出” 功能来获取迁移资源,例如二维码或 JSON 文件,然后在 2FAuth 中导入。"}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 支持从各类 2FA 应用中导入数据。"}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"已导入"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- 无效账号 -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"此密码重置令牌无效"}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- 无效服务 -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"至少 8 位"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"您的 PAT 是否仍然有效?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"已分享给所有用户"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"此实例上的所有用户 (包括后续的新用户) 都可以查看此账号,并获取验证码。"}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"最近活跃:"},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logo 来自"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"设备已遗失?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"基于"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"请确保您已复制个人访问令牌!此令牌仅展示这一次。"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"在身份验证代理上管理您的账户。"}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"在身份验证代理上管理鉴权设定。"}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"您可以创建分组来归纳您的账号。无论账号处于哪个组内,都将在 “所有账号” 分组中显示。"}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"必须"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"移动所选项到"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"需要从当前页面的显示区域内导入 2FA 吗?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"或"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"或按分组筛选账号"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"您可以转让此 2FA 账号的所有权,新所有者将拥有此 2FA 账号的完全控制权限。"}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"所有权的转让不会影响已生效的分享设置。"}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"如果此 2FA 账号已被分享给了 “所有用户”,那么在移交所有权后,您仍然可以获取到验证码。"}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"如果已按 “特定用户” 进行了分享,除非新的所有者将您加入分享列表中,否则您将无权查看此 2FA 账号。"}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"若要启用下列选项,请添加 1 个 WebAuthn 设备。"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"无任何 2FA 账号!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"暂无记录"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"无分组"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"剪贴板内无图像"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"无结果"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"暂无选项"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"无结果"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- 无服务 -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"找不到提供方?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"未被分享"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"无"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"这是本次事件的相关信息"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"如果这是您的操作,那么请忽略此告警。但如果不是您的操作,且持续有登录失败的警告,那么您应立即通知 2FAuth 的管理员去检查相关的安全设置,并对此攻击者采取措施。"}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"您的 2FAuth 账户触发了一次登录失败警告。"}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 登录失败"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"你好,:username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"您好"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"这是本次事件的相关信息"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"如果是您操作的,您可以忽略此告警。如果您怀疑自己的账户有任何可疑活动,请立即更改您的密码。"}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"您的 2FAuth 账户有来自新设备的登录。"}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"来自新设备的访问"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"此账号可能已被分享给其他用户,在转让之前,建议您先检查 (并适当调整) 分享设置。"}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"温馨提示::actor 已将 :twofaccount 的所有权转移给了您。您现在是此 2FA 账号的新所有者,拥有完全控制权限。"}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA 账号所有权转移"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"您无权再查看此 2FA 账号或获取验证码。"}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"温馨提示::actor 已停止分享 :twofaccount 给所有用户。"}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"温馨提示::actor 已停止分享 :twofaccount 给您。"}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"此 2FA 账号已停止共享"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"温馨提示::actor 与所有用户分享了 :twofaccount 。"}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"温馨提示::actor 与您分享了 :twofaccount 。"}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"您有一个新分享的 2FA 账号"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"您现在可以查看此 2FA 账号,并获取验证码。若此账号的所有者停止了分享,您将失去访问权限。"}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"此致"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"重置 2FAuth 密码"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"您之所以会收到此邮件,是因为您曾经申请过重置 2FAuth 账户的密码。"}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"此密码重置链接将在 :count 分钟后过期。"}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"如果您没有申请过重置密码,请忽略此消息。"}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"您之所以会收到这封邮件,是因为您要求发送一封测试邮件,来验证您 2FAuth 的上邮件发送功能是否能正常工作。"}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 测试邮件"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"恭喜您,功能正常 :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"推荐"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"您也可以使用:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI 是用于传输 2FA 数据的最常用格式。例如,当您在网站上启用 2FA 时,显示的二维码就包含 otpauth URI 数据。点击即可从 2FAuth 切换至此选项。"}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 optauth URI 列表结构导出数据"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"正在解析数据…"}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"密码与 WebAuthn 登录已禁用。"}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"此用户的密码重置请求已超时,意味着此用户未在有效期内完成密码重置。此请求可能是由用户自己或其他管理员发起的。"}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"此用户已申请过密码重置 (申请时间 "},{t:4,k:"datetime"},{t:3,v:"),但未完成重置密码的操作,且此前发送的密码重置链接仍然有效。此请求可能是由用户自己或其他管理员发起的。"}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"已存在相同数据的账号"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"此扩展是 2FAuth 应用的网页插件,能让您无需打开 2FAuth 应用,直接从浏览器工具栏中获取验证码。"}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"若要使用 2FAuth 扩展,您必须拥有一个 2FAuth 账户,并将其绑定到此扩展上。此操作需要 2FAuth 服务的 URL 以及个人访问令牌 (PAT)。"}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"为了恢复您的账户,2FAuth 将会重置部分 WebAuthn 相关的设置,以便您可以使用邮箱和密码进行登录。"}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 将向此邮箱发送包含恢复链接的邮件,请点击邮件中的链接,并按照提示进行操作。"}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"注册于 "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"目前暂不支持从扩展插件注册 2FA,请访问 2FAuth 应用来添加 2FA。"}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"使用 “重新发送邮件” 来向用户发送新的密码重置邮件。此操作不会更改当前的密码,且之前的所有的密码重置申请都将被撤销。"}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"如果您忘记了扩展的解锁密码,请点击此选项。"}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"此操作将从扩展上删除现有配置和对应的 2FAuth 数据,并允许您重新绑定一个 2FAuth 账号。"}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"使用 “重置密码” 来强制重置此用户的密码。点击重置后,会为此用户分配一个临时密码,以便用户无需 “重置密码邮件” 也可以设置新的密码。此操作会撤销之前所有的密码重置申请。"}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 将向此邮箱发送密码重置链接,请点击邮件中的链接设置新密码。"}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"如果您此前使用的是 SSO 登录,请在退出登录后,使用 “重置密码” 功能设置密码。"}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"请尝试刷新 (服务可能暂时无响应),或重置扩展并提供一个新的令牌。"}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"设备吊销后无法恢复"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"令牌吊销后无法恢复"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"您可以用来登录 2FAuth 的认证设备,例如安全密钥 (如 Yubikey) 或具有生物识别能力的智能手机 (如 Apple FaceID / TouchID)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"如果只想分享给特定的用户,请选择 “特定用户”。"}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"部分设置由您的管理员管理"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"将此 2FA 账号分享给当前 2FAuth 节点上的其他用户。"}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"用户可以在自己的账户中看见被分享的 2FA 账号,并获取验证码,但只有原账号的所有者可以编辑、删除或查看密钥。"}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"来自 "},{t:4,k:"username"},{t:3,v:" 的分享"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"分享于 "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"分享给所有人"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"分享给特定用户"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"您可以使用邮箱 "},{t:4,k:"email"},{t:3,v:" 与密码 "},{t:4,k:"password"},{t:3,v:" 来连接"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"选择一个 SSO 渠道来登录:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"切换登录方式:"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"发现有词条缺少翻译吗?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"普通用户必须使用 SSO 登录,仅有管理员可选用其他登录选项。"}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"仅允许通过 SSO 进行身份鉴权,"},{t:4,k:"auth_method"},{t:3,v:" 已被禁用"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"现有的摄像头无法用于此扫描"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"请使用其他的摄像头,或更换设备"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"需要 HTTPS 才能获取摄像画面"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"无法启动扫描 :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"通常情况下,您可以点击浏览器地址栏中 (或旁边) 的相机图标来继续。"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 没有权限访问您的相机"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 需要您的授权才能使用此设备上的相机。如果您已点击过 “拒绝”,且您的浏览器没有再次提示您进行授权,请查找浏览器的文档以了解如何重新授权。"}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"此设备上没有摄像头"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"摄像头是否已正确连接?"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"扫描启动失败"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"摄像头是否已被占用?请确保没有其他应用正在使用您的摄像头,并再试一次"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"需要 secure 字段"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"扫描需要通过 HTTPS 协议通信。如果您是在电脑上运行 2FAuth 程序,请切换至本地主机,不要使用其他虚拟主机"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"此浏览器不支持 Stream API"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"请换用新版浏览器"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"在导入的数据中找到了下列没有被添加到 2FAuth 的账号。"}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"成功登录于 "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"成功退出于 "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"支持格式:json、2fas 或纯文本"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"支持格式:jpg、jpeg、png、bmp、gif、svg 或 webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"此账号的分享状态为:"},{t:4,k:"sharing_status"},{t:3,v:"。"}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"数据将被永久删除,此操作无法恢复。"}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"当前操作不会影响已有的分享设置。若要停止分享此 2FA 账号,请从 “分享管理” 中进行操作。"}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"您尝试登录的次数过多,请 "},{t:4,k:"seconds"},{t:3,v:" 秒后再试。"}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"任何应用都能够通过 “个人访问令牌” 来与 2FAuth API 进行鉴权。您需要在第三方应用的请求头 (header) 中,提供此令牌作为 Bearer 令牌。"}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"此操作不会吊销正在使用中的个人访问令牌。"}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"如果您的目的是创建一个备份,以备随时恢复数据,建议您优先使用此选项,这个格式可以保存图标信息。"}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 2FAuth json 结构导出数据"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"结构定义描述:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"可从您的 2FAuth 上获取验证码的浏览器扩展。"}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI 图标来自"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"为了数据安全,扩展已被锁定。请输入扩展的密码来访问您的 2FA 验证码。"}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"点击对应的按钮,即可选择 “放弃” 或 “导入” 账号到 2FA 列表中。"}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"若要使用安全设备进行身份验证,请根据验证类型,插入您的密钥设备,或取下口罩 (手套) 来进行生物验证。"}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"使用邮箱地址 "},{t:4,k:"email"},{t:3,v:" 以及密码 "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"由身份验证代理创建的用户账户。"}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" 个有效的令牌"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" 个安全设备 (通行密钥)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"查看 "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"服务器上未找到图标包。"}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 登录已被禁用"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 允许您使用信任设备 (如 Yubikeys 或具有生物识别能力的手机) 来快速、安全地登录到 2FAuth。"}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"欢迎使用 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"欢迎使用 2FAuth 演示程序。"}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"欢迎使用 2FAuth 测试节点"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"此操作非常简单,仅需几步就可完成。而且我们还准备了一份详细的教学,手把手来助您启用此功能。"}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" 个账号"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:3,v:"新版本 "},{t:4,k:"version"},{t:3,v:" 已发布!"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:3,v:"已选择 "},{t:4,k:"count"},{t:3,v:" 个"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"已是最新版"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"若您已复制了图像,请在此处按 Ctrl + V 粘贴"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"您可以随时更改此设置"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"您需要一个账号才能继续操作,请先自行注册。"}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"账号创建成功"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"账号更新成功"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"账号删除成功"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"账号移动成功"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"验证失败"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"自动锁定已触发,您已被退出登录。"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"缓存已清除"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"已复制"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"数据已与服务器同步"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"设备吊销成功"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"设备注册成功"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"分组名称已保存"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"分组创建成功"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"分组删除成功"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"无可用图标包"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"密码已修改"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"密码修改成功"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"密码重置成功"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"用户的令牌已成功吊销。"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"个人资料更新成功!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"用户的安全设备已成功吊销。"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"设置已保存"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"测试邮件已发送,请检查您的收件箱"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"已成功吊销令牌"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"账户删除成功"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"用户创建成功"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"用户权限已更新"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"找到"},{t:4,k:"count"},{t:3,v:" 个有效账号"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"下一页 »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« 上一页"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"密码至少为 8 位,且两次输入的内容必须相同。"}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"密码重置成功!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"密码重置邮件已发送!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"请稍候再试。"}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"密码重置令牌无效。"}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"找不到此邮箱对应的用户。"}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"用户名、邮箱…"}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"这是一个操作"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"这是一个警报"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"这是一个信息"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"这是一个成功"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"这是一个警告"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"找不到项目"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"关于"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"账号"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"账号分享"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"系统"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"身份认证"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"创建用户"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"访问日志"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"用户管理"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"用户"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"自动锁定"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"扫描二维码"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"创建账号"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"创建分组"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"编辑账号"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"编辑分组"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"请求数过多"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"错误"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"分组"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"导入账号"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"登录页"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"登录"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"验证码历史记录"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"重置密码"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"新密码"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置扩展"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"注册新账号"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"账户"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"新建个人令牌"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth 令牌"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"选项"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 设备"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"编辑设备"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"用户设置"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"分享账号"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"从二维码获取账号"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"新建账号"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"转让所有权"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"解锁"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"恢复账户"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"注册新设备"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"清除搜索结果"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"清除选择"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"关闭 "},{t:4,k:"pagetitle"},{t:3,v:" 页"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"创建新分组"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"复制下一个验证码"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"复制到剪贴板"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"删除"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"删除账号"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"删除选中的账号"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"从活动页面中检测二维码"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"放弃导入此账号"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"编辑账号"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"编辑分组"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"修改分享设置"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"导出选中的账号"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"生成测试密码"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"回到 "},{t:4,k:"pagetitle"},{t:3,v:" 页面"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"隐藏分组筛选"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"隐藏密码"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"导入此账号"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"锁定"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"管理您的分组"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"移动所选项到分组中"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 optauth URI 列表结构导出数据"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"刷新图标包列表"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"重命名"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"重新发送密码重置邮件给用户"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"重置用户密码"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"显示密码"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"吊销此用户的所有安全设备"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"吊销此用户的所有令牌"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"吊销"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"搜索​​​​"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"全选"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"分享此账号"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"新增分享用户"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"分享给所有用户"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"显示分组筛选"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"显示上个月的条目"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"显示上一年的条目"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"显示二维码"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"显示最近 6 个月的条目"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"显示最近 3 个月的条目"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"使用安全设备登录"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"A - Z 排序"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"倒序显示最近访问"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"顺序显示最近访问"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"Z - A 排列"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:3,v:"此账号由 "},{t:4,k:"username"},{t:3,v:" 分享"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"您已将此账号分享给了所有用户"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"您已将此账号分享给了特定用户"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 2FAuth json 结构导出数据"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"解锁 (注意安全风险)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"取消选中用户的分享权限"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"扫描二维码,自动填写表单"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"访问 "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 为 :value 时,必须允许 :attribute 。"}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"必须允许 :attribute。"}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的网址。"}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须要等于 :date 或更晚。"}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须要晚于 :date。"}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:":attribute 只能由字母、数字、减号 (-) 与下划线 (_) 组成。"}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须包含字母与数字"}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:":attribute 只能包含字母。"}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是一个数组。"}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:":attribute 只能包含单个字母和符号。"}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须要早于或等于 :date。"}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须要早于 :date。"}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须介于 :min - :max 位之间。"}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须介于 :min - :max KB 之间。"}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须介于 :min - :max 之间。"}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须介于 :min - :max 个字符之间。"}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须为布尔值。"}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:":attribute 字段包含非法的值。"}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute 两次输入不一致。"}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:":attribute 缺少必需的值。"}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"密码错误"}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能包含冒号。"}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"此邮箱地址不允许注册"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"未找到与此邮箱匹配的账户。"}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"所有的邮箱必须是有效的邮箱地址,并用管道符 “"},{t:2,i:[{t:3}],s:"” 隔开"}]}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"仅支持 jpeg、png、bmp、gif、svg 或 webp 格式。"}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"ID 必须以逗号分隔,且不能以逗号结尾。"}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"必须为 uri 分配一个标签。"}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"不支持 :attribute 项。"}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"仅支持 jpeg、png、bmp、gif、svg 或 webp 格式。"}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是 Base32 编码的字符串。"}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能包含冒号。"}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不是有效的 otpauth uri。"}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须要等于 :date。"}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute 的格式必须为 :format。"}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是有效的日期格式。"}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须有 :decimal 位小数。"}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 为 :value 时,必须拒绝 :attribute 。"}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"必须拒绝 :attribute。"}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute 与 :other 必须不同。"}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须介于 :min 和 :max 位数字之间。"}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须为 :digits 位数字。"}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute 图片尺寸不正确。"}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute 已经存在。"}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能以这些值结尾::values。"}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能以这些值开头::values。"}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的邮箱。"}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须以 :values 为结尾。"}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"选中的 :attribute 无效。"}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不存在。"}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须包含以下扩展名之一 :values。"}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是文件。"}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能为空。"}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :value 个项。"}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须大于 :value KB。"}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须大于 :value。"}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :value 个字符。"}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :value 个项。"}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须大于或等于 :value KB。"}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须大于或等于 :value。"}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少为 :value 个字符。"}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须为有效的 HEX 颜色码。"}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"无法在服务器上找到此图标包。"}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是图片。"}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须在 :other 中。"}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"已选的属性 :attribute 无效。"}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是整数。"}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的 IP 地址。"}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的 IPv4 地址。"}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的 IPv6 地址。"}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的 regex 表达式。"}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的 JSON 字符串。"}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须为列表。"}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是小写字母。"}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最多包含 :value 个项。"}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须小于 :value KB。"}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须小于 :value。"}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须少于 :value 个字符。"}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须少于或等于 :value 个元素。"}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须小于或等于 :value KB。"}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须小于或等于 :value。"}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须小于或等于 :value 个字符。"}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是正确的 MAC 地址。"}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须少于 :max 位。"}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最多为 :max 项。"}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最大为 :max KB。"}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须小于 :max。"}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最大为 :max 个字符。"}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是一个 :values 类型的文件。"}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是一个 :values 类型的文件。"}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少为 :min 位。"}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :min 个项。"}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少为 :min KB。"}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少为 :min。"}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少为 :min 个字符。"}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 为 :value 时 :attribute 必须为空。"}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"除非 :other 为 :value,否则 :attribute 必须为空。"}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"当 :value 存在时,:attribute 必须为空。"}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"当 :value 存在时,:attribute 必须为空。"}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须为空。"}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是 :value 的倍数。"}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"已选的属性 :attribute 非法。"}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 的格式错误。"}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"所有权转移不允许选择当前所有者,请选择其他用户。"}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是一个数字。"}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"“uri” 参数必须单独提供,或与 “custom_otp” 参数同时提供。"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一个字母。"}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一个大写字母和一个小写字母。"}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一个数字。"}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一个符号。"}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"输入的 :attribute 已在数据泄露中出现过。请选择其他的 :attribute。"}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 为 :value 时,:attribute 为必填项"}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"除非 :other 为 :value,否则 :attribute 为必填项。"}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"当存在 :values 时,:attribute 为必填项。"}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"当 :values 存在时,:attribute 为必填项。"}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须存在。"}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 为 :value 时,:attribute 字段被禁止。"}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"除非 :other 为 :values,否则 :attribute 字段会被禁止。"}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"已禁止 :attribute 字段。"}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 字段禁止出现 :other。"}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 格式错误。"}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:":attribute 字段必须包含: :values。"}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 存在时,:attribute 不能为空。"}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 不存在时,:attribute 不能为空。"}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 为 :value 时 :attribute 不能为空。"}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"当 :other 不为 :values 时 :attribute 不能为空。"}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"当 :values 存在时 :attribute 不能为空。"}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"当 :values 存在时 :attribute 不能为空。"}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"当 :values 都不存在时 :attribute 不能为空。"}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"当 :values 不存在时 :attribute 不能为空。"}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能为空。"}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attribute 与 :other 必须相同。"}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"当使用 :attribute 时,请求的数据包中只能包含这一种参数。"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须包含 :size 项。"}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 大小必须为 :size KB。"}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 大小必须为 :size。"}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须为 :size 个字符。"}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须以 :values 开头。"}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须为字符串。"}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是一个有效的时区。"}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是有效的 ULID。"}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":attribute 已经存在。"}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attribute 上传失败。"}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是大写字母。"}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是有效的 URL。"}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必须是有效的 UUID。"}}}},{"zh-TW":{"alttext.icon_to_illustrate_the_account":{t:0,b:{t:2,i:[{t:3}],s:"帳號圖示"}},"alttext.image_of_qrcode_to_scan":{t:0,b:{t:2,i:[{t:3}],s:"要掃描的QR Code圖像"}},"confirmation.are_you_sure":{t:0,b:{t:2,i:[{t:3}],s:"您確定嗎?"}},"confirmation.cancel_creation":{t:0,b:{t:2,i:[{t:3}],s:"此操作會取消所有的更改,確定要繼續嗎?"}},"confirmation.change_admin_role":{t:0,b:{t:2,i:[{t:3}],s:"這將嚴重影響此使用者的權限,確定要繼續嗎?"}},"confirmation.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"您確定要刪除您的帳號嗎?"}},"confirmation.delete_group":{t:0,b:{t:2,i:[{t:3}],s:"您確定要刪除此分組嗎?"}},"confirmation.delete_twofaccount":{t:0,b:{t:2,i:[{t:3}],s:"您確定要刪除此帳號嗎?"}},"confirmation.delete_user":{t:0,b:{t:2,i:[{t:3}],s:"您確定要刪除此使用者嗎?此操作無法恢復。"}},"confirmation.demote_own_account":{t:0,b:{t:2,i:[{t:3}],s:"您將失去管理員權限,確定要繼續嗎?"}},"confirmation.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"您確定要丟棄所有帳號嗎?"}},"confirmation.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"您確定要放棄所有重複的帳號嗎?"}},"confirmation.discard":{t:0,b:{t:2,i:[{t:3}],s:"您確定要丟棄此帳號嗎?"}},"confirmation.edit_own_account":{t:0,b:{t:2,i:[{t:3}],s:"這是您自己的帳號,確定要繼續嗎?"}},"confirmation.logout":{t:0,b:{t:2,i:[{t:3}],s:"您確定要退出嗎?"}},"confirmation.purge_password_reset_request":{t:0,b:{t:2,i:[{t:3}],s:"您確定要撤銷之前的請求嗎?"}},"confirmation.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"您確定要重置此使用者的密碼嗎?"}},"confirmation.revoke_device":{t:0,b:{t:2,i:[{t:3}],s:"您確定要刪除此設備嗎?"}},"confirmation.revoke_token":{t:0,b:{t:2,i:[{t:3}],s:"您確定要吊銷此令牌嗎?"}},"confirmation.toggle_sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Are you sure you want to change the sharing setting?"}},"confirmation.unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing this account with all users. Are you sure?"}},"confirmation.bulk_unshare":{t:0,b:{t:2,i:[{t:3}],s:"This will stop sharing these accounts. Are you sure?"}},"confirmation.you_will_loose_ownership":{t:0,b:{t:2,i:[{t:3}],s:"You are about to lose ownership of this account. Are you sure?"}},"error.2fauth_has_not_a_valid_domain":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 的域名不符合規範"}},"error.aborted_by_user":{t:0,b:{t:2,i:[{t:3}],s:"操作被使用者中止"}},"error.account_managed_by_external_provider":{t:0,b:{t:2,i:[{t:3}],s:"由外部提供方管理的帳號"}},"error.auth_proxy_failed.legend":{t:0,b:{t:2,i:[{t:3}],s:"已為 2FAuth 設定了前置的身份代理,但身份代理並沒有返回正確的請求頭,請檢查您的設定並重試。"}},"error.auth_proxy_failed":{t:0,b:{t:2,i:[{t:3}],s:"身份代理認證失敗"}},"error.authenticator_missing_discoverable_credential_support":{t:0,b:{t:2,i:[{t:3}],s:"驗證器暫不兼容可發現性憑據"}},"error.authenticator_missing_user_verification_support":{t:0,b:{t:2,i:[{t:3}],s:"驗證器暫不兼容使用者驗證"}},"error.browser_does_not_support_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"您的設備不支援 WebAuthn,請嘗試換用新版瀏覽器並重試"}},"error.cannot_create_otp_without_secret":{t:0,b:{t:2,i:[{t:3}],s:"無法在無密碼的情況下建立一個 OTP"}},"error.cannot_decipher_secret":{t:0,b:{t:2,i:[{t:3}],s:"無法解密,可能是因為 2FAuth 的 .env 檔案中 APP_KEY 值的設定錯誤,或資料庫已損壞。"}},"error.cannot_decode_detected_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"QR Code已識別,但解碼失敗,請裁切或銳化圖像後再試"}},"error.cannot_delete_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"這是唯一的管理員帳號,無法刪除"}},"error.cannot_demote_the_only_admin":{t:0,b:{t:2,i:[{t:3}],s:"這是唯一的管理員帳號,無法降級"}},"error.cannot_detect_qrcode_in_image":{t:0,b:{t:2,i:[{t:3}],s:"未在圖像中檢測到QR Code,請裁切圖像後再試"}},"error.change_failed_please_retry":{t:0,b:{t:2,i:[{t:3}],s:"修改失敗,請重試"}},"error.check_failed_try_later":{t:0,b:{t:2,i:[{t:3}],s:"檢查失敗,請稍後重試"}},"error.data_cannot_be_refreshed_from_server":{t:0,b:{t:2,i:[{t:3}],s:"無法從伺服器刷新資料"}},"error.data_of_qrcode_is_not_valid_URI":{t:0,b:{t:2,i:[{t:3}],s:"此QR Code的資料不是有效的 OTP Auth URI。此QR Code包含:"}},"error.delete_user_setting_only":{t:0,b:{t:2,i:[{t:3}],s:"只有使用者建立的設定才允許被刪除"}},"error.error_during_qrcode_retrieval":{t:0,b:{t:2,i:[{t:3}],s:"Error during QR code retrieval"}},"error.email_sending_failed":{t:0,b:{t:2,i:[{t:3}],s:"郵件發送失敗"}},"error.encrypted_migration":{t:0,b:{t:2,i:[{t:3}],s:"無法讀取,資料可能已被加密"}},"error.encryption_key_generation_failed":{t:0,b:{t:2,i:[{t:3}],s:"加密密鑰建立失敗"}},"error.error_during_data_fetching":{t:0,b:{t:2,i:[{t:3}],s:"💀 獲取資料時出錯"}},"error.error_during_decryption":{t:0,b:{t:2,i:[{t:3}],s:"解密失敗,您的資料庫仍處於保護狀態。這通常是因為某個或多個帳號的加密資料的完整性存在問題而導致的。"}},"error.error_during_encryption":{t:0,b:{t:2,i:[{t:3}],s:"加密失敗,您的資料庫仍處於未保護狀態。"}},"error.failed_icon_store_database_toggling":{t:0,b:{t:2,i:[{t:3}],s:"圖示遷移失敗,相關設定已恢復為先前的值。"}},"error.failed_to_authenticate_with_host":{t:0,b:{t:2,i:[{t:3}],s:"驗證失敗,請檢查您的個人訪問令牌 (PAT)"}},"error.failed_to_contact_host":{t:0,b:{t:2,i:[{t:3}],s:"無法連接到 2FAuth 伺服器,請檢查 URL"}},"error.failed_to_decipher_pat":{t:0,b:{t:2,i:[{t:3}],s:"解碼 PAT 失敗"}},"error.failed_to_derive_key":{t:0,b:{t:2,i:[{t:3}],s:"獲取密鑰失敗"}},"error.failed_to_encrypt_pat":{t:0,b:{t:2,i:[{t:3}],s:"加密 PAT 失敗"}},"error.failed_to_get_password":{t:0,b:{t:2,i:[{t:3}],s:"獲取密碼失敗"}},"error.failed_to_get_token":{t:0,b:{t:2,i:[{t:3}],s:"獲取令牌失敗"}},"error.failed_to_inject_content_script":{t:0,b:{t:2,i:[{t:3}],s:"Failed to inject the script to perform QR scan"}},"error.failed_to_load_settings":{t:0,b:{t:2,i:[{t:3}],s:"從已儲存的資料中導入設定失敗"}},"error.failed_to_regenerate_iv":{t:0,b:{t:2,i:[{t:3}],s:"獲取 IV 失敗"}},"error.failed_to_retrieve_app_settings":{t:0,b:{t:2,i:[{t:3}],s:"獲取應用程式設定失敗"}},"error.failed_to_retrieve_encryption_store_data":{t:0,b:{t:2,i:[{t:3}],s:"獲取加密存儲的資料失敗"}},"error.failed_to_set_autolock_delay":{t:0,b:{t:2,i:[{t:3}],s:"設定自動鎖定失敗"}},"error.failed_to_set_enc_key":{t:0,b:{t:2,i:[{t:3}],s:"設定加密密鑰失敗"}},"error.failed_to_set_encryption_parameters":{t:0,b:{t:2,i:[{t:3}],s:"設定加密參數失敗"}},"error.failed_to_store_encrypted_pat":{t:0,b:{t:2,i:[{t:3}],s:"儲存加密 PAT 失敗"}},"error.field_is_required_and_valid_url":{t:0,b:{t:2,i:[{t:3}],s:"此選項必填,且必須為有效的 URL"}},"error.field_is_required":{t:0,b:{t:2,i:[{t:3}],s:"此選項必填"}},"error.file_upload_failed":{t:0,b:{t:2,i:[{t:3}],s:"檔案上傳失敗"}},"error.https_required":{t:0,b:{t:2,i:[{t:3}],s:"需要 HTTPS"}},"error.indecipherable":{t:0,b:{t:2,i:[{t:3}],s:"*無法識別*"}},"error.invalid_2fa_data":{t:0,b:{t:2,i:[{t:3}],s:"無效的 2FA 資料"}},"error.invalid_or_unknown_token":{t:0,b:{t:2,i:[{t:3}],s:"無效或未知的個人訪問令牌 (PAT)"}},"error.invalid_x_migration":{t:0,b:{t:2,i:[{t:3}],s:"無效或不兼容的 :appname 資料"}},"error.no_active_tab_found":{t:0,b:{t:2,i:[{t:3}],s:"No active tab found"}},"error.no_authenticator_support_specified_algorithms":{t:0,b:{t:2,i:[{t:3}],s:"沒有驗證器支援此算法"}},"error.no_entry_was_of_type_public_key":{t:0,b:{t:2,i:[{t:3}],s:"沒有類型為 「公鑰」 的條目"}},"error.no_icon_for_this_variant":{t:0,b:{t:2,i:[{t:3}],s:"此樣式下無可用圖示"}},"error.no_match_in_the_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"圖示包中無匹配項"}},"error.no_pwd_reset_for_this_user_type":{t:0,b:{t:2,i:[{t:3}],s:"無法為此使用者重置密碼"}},"error.no_qr_image_data_available":{t:0,b:{t:2,i:[{t:3}],s:"No QR image data available"}},"error.no_qrcode_found":{t:0,b:{t:2,i:[{t:3}],s:"No valid QR code found in the visible area of the page"}},"error.no_readable_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"沒有可識別的QR Code"}},"error.no_valid_otp":{t:0,b:{t:2,i:[{t:3}],s:"此QR Code中沒有有效的 OTP 字段"}},"error.not_a_supported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"不支援此 OTP 格式"}},"error.not_allowed_operation":{t:0,b:{t:2,i:[{t:3}],s:"不允許此操作"}},"error.passport_key_permissions":{t:0,b:{t:2,i:[{t:3}],s:"OAuth key permissions are invalid on the server. Please refer to the 'Upgrading to v8' guide on the 2FAuth documentation site to resolve this issue."}},"error.qrcode_cannot_be_read":{t:0,b:{t:2,i:[{t:3}],s:"QR Code無效"}},"error.qrcode_has_invalid_checksum":{t:0,b:{t:2,i:[{t:3}],s:"QR Code的校驗碼錯誤"}},"error.refresh":{t:0,b:{t:2,i:[{t:3}],s:"刷新"}},"error.reserved_name_please_choose_something_else":{t:0,b:{t:2,i:[{t:3}],s:"此名稱為保留字符,請選擇其他內容"}},"error.accepted_char_for_group_name":{t:0,b:{t:2,i:[{t:3}],s:"請僅使用字母、數位、破折號、底線、空格或單引號"}},"error.request_not_from_trusted_proxy":{t:0,b:{t:2,i:[{t:3}],s:"Request does not come from a trusted proxy"}},"error.resource_not_found":{t:0,b:{t:2,i:[{t:3}],s:"找不到資源"}},"error.security_device_already_registered":{t:0,b:{t:2,i:[{t:3}],s:"設備已被註冊"}},"error.security_error_check_rpid":{t:0,b:{t:2,i:[{t:3}],s:"安全錯誤:請檢查您的 WEBAUTHN_ID 環境變數"}},"error.all_users_sharing_scope_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"All Users sharing scope is disabled"}},"error.sharing_is_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Sharing feature is disabled"}},"error.something_wrong_with_server":{t:0,b:{t:2,i:[{t:3}],s:"伺服器發生內部錯誤"}},"error.spaces_are_ignored":{t:0,b:{t:2,i:[{t:3}],s:"多餘的空格將被自動刪除"}},"error.sso_bad_provider_setup":{t:0,b:{t:2,i:[{t:3}],s:"您未在 .env 檔案中正確設定此 SSO 提供方"}},"error.sso_disabled":{t:0,b:{t:2,i:[{t:3}],s:"SSO 已禁用"}},"error.sso_email_already_used":{t:0,b:{t:2,i:[{t:3}],s:"已存在相同信箱的帳號,但不匹配您的外部帳號 ID 。如果您已使用此信箱在 2FAuth 上註冊過,請不要使用 SSO。"}},"error.sso_failed":{t:0,b:{t:2,i:[{t:3}],s:"SSO 驗證被拒絕"}},"error.sso_no_register":{t:0,b:{t:2,i:[{t:3}],s:"已停用註冊"}},"error.this_account_is_already_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is already shared with all users."}},"error.this_account_is_not_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"This account is not shared with all users"}},"error.too_many_ids":{t:0,b:{t:2,i:[{t:3}],s:"查詢參數中包含太多 ID,最多允許 100 個"}},"error.Unable_to_decrypt_uri":{t:0,b:{t:2,i:[{t:3}],s:"無法解密 URI"}},"error.unauthorized.legend":{t:0,b:{t:2,i:[{t:3}],s:"您無權查看此資源或執行此操作"}},"error.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"無權限"}},"error.unknown_error_during_pat_encryption":{t:0,b:{t:2,i:[{t:3}],s:"加密 PAT 時發生未知錯誤"}},"error.unknown_error":{t:0,b:{t:2,i:[{t:3}],s:"未知錯誤"}},"error.unsupported_migration":{t:0,b:{t:2,i:[{t:3}],s:"不兼容的資料格式"}},"error.unsupported_otp_type":{t:0,b:{t:2,i:[{t:3}],s:"不兼容的 OTP 類型"}},"error.unsupported_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Unsupported sharing scope"}},"error.unsupported_with_reverseproxy":{t:0,b:{t:2,i:[{t:3}],s:"當身份代理或 SSO 啟用時不可用"}},"error.unsupported_with_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"僅管理員允許使用此認證方式,普通使用者必須使用 SSO 登入。"}},"error.user_deletion_failed":{t:0,b:{t:2,i:[{t:3}],s:"帳號刪除失敗,資料未被刪除"}},"error.user_id_not_between_1_64":{t:0,b:{t:2,i:[{t:3}],s:"使用者 ID 需大於 1 並小於 64 個字符"}},"error.wrong_current_password":{t:0,b:{t:2,i:[{t:3}],s:"當前密碼錯誤"}},"error.wrong_password":{t:0,b:{t:2,i:[{t:3}],s:"密碼錯誤"}},"field.account.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"帳號名稱"}},"field.account":{t:0,b:{t:2,i:[{t:3}],s:"帳號"}},"field.algorithm.help":{t:0,b:{t:2,i:[{t:3}],s:"驗證碼的加密算法"}},"field.algorithm":{t:0,b:{t:2,i:[{t:3}],s:"算法"}},"field.allow_pat_in_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"允許使用者建立個人訪問令牌 (PAT),並允許第三方應用使用令牌來登入 2FAuth,如 2FAuth 網頁擴充功能"}},"field.allow_pat_in_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"允許使用 PAT 認證"}},"field.apiToken.help":{t:0,b:{t:2,i:[{t:3}],s:"擴充功能可以使用個人訪問令牌 (PAT) 來登入到伺服器。您可以從您 2FAuth 的使用者設定 > OAuth 頁面生成一個 PAT"}},"field.apiToken":{t:0,b:{t:2,i:[{t:3}],s:"API 令牌"}},"field.auto_close_timeout.help":{t:0,b:{t:2,i:[{t:3}],s:"超時後自動隱藏驗證碼。如果您忘記退出驗證碼界面,此功能可以減少不必要的驗證碼刷新請求。"}},"field.auto_close_timeout":{t:0,b:{t:2,i:[{t:3}],s:"自動關閉驗證碼頁面"}},"field.auto_lock_extension.help":{t:0,b:{t:2,i:[{t:3}],s:"自動鎖定擴充功能,防止資料被非法讀取"}},"field.auto_lock_extension":{t:0,b:{t:2,i:[{t:3}],s:"自動鎖定"}},"field.auto_lock.help":{t:0,b:{t:2,i:[{t:3}],s:"在不活躍時自動登出,但在下列情況時無效:使用了身份代理,或沒有設定自訂註銷 URL。"}},"field.auto_lock":{t:0,b:{t:2,i:[{t:3}],s:"自動鎖定"}},"field.auto_save_qrcoded_account.help":{t:0,b:{t:2,i:[{t:3}],s:"掃描或上傳QR Code後,新帳號會被自動錄入,無需點擊 」儲存「 按鈕"}},"field.auto_save_qrcoded_account":{t:0,b:{t:2,i:[{t:3}],s:"自動儲存帳號"}},"field.cache_management.help":{t:0,b:{t:2,i:[{t:3}],s:"某些情況下需要清除快取,例如更改了環境變數,或 2FAuth 進行了升級。您可以在此處手動清理快取。"}},"field.cache_management":{t:0,b:{t:2,i:[{t:3}],s:"快取管理"}},"field.check_for_update.help":{t:0,b:{t:2,i:[{t:3}],s:"自動檢查更新 (每週一次)。當發現 2FAuth 有新版本時,會發出更新提醒"}},"field.check_for_update":{t:0,b:{t:2,i:[{t:3}],s:"檢查更新"}},"field.clear_search_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"複製驗證碼後立即清空搜尋框"}},"field.clear_search_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"複製後清空搜尋框"}},"field.close_otp_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"點擊某個驗證碼即可複製並隱藏顯示"}},"field.close_otp_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"複製後關閉驗證碼頁面"}},"field.confirm_new_password":{t:0,b:{t:2,i:[{t:3}],s:"再次確認新密碼"}},"field.copy_otp_on_display.help":{t:0,b:{t:2,i:[{t:3}],s:"當驗證碼顯示時立即複製。由於瀏覽器的限制,僅能複製第一個 Time-based One-Time Password (TOTP) 驗證碼,後續刷新的無法自動複製。"}},"field.copy_otp_on_display":{t:0,b:{t:2,i:[{t:3}],s:"當驗證碼顯示時自動複製"}},"field.counter.help_lock":{t:0,b:{t:2,i:[{t:3}],s:"如果計數器設定錯誤,可能會導致驗證碼失效。如果您不瞭解此功能,請勿隨意編輯。您可以點擊 「鎖定」 圖示來解鎖編輯,但操作時請務必小心。"}},"field.counter.help":{t:0,b:{t:2,i:[{t:3}],s:"計數器的初始值"}},"field.counter.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"預設為 0"}},"field.counter":{t:0,b:{t:2,i:[{t:3}],s:"計數器"}},"field.current_password.help":{t:0,b:{t:2,i:[{t:3}],s:"為了確認這是您自己的帳號,請輸入當前的密碼"}},"field.current_password":{t:0,b:{t:2,i:[{t:3}],s:"當前密碼"}},"field.default_group.help":{t:0,b:{t:2,i:[{t:3}],s:"新帳號建立時,將自動關聯到此分組"}},"field.default_group":{t:0,b:{t:2,i:[{t:3}],s:"預設分組"}},"field.defaultCaptureMode.help":{t:0,b:{t:2,i:[{t:3}],s:"當 「鎖定錄入方式」 啟用時,鎖定為上述的錄入模式"}},"field.defaultCaptureMode":{t:0,b:{t:2,i:[{t:3}],s:"預設錄入模式"}},"field.digits.help":{t:0,b:{t:2,i:[{t:3}],s:"生成的驗證碼位數"}},"field.digits":{t:0,b:{t:2,i:[{t:3}],s:"碼長"}},"field.disable_all_security_devices.help":{t:0,b:{t:2,i:[{t:3}],s:"此操作將吊銷您所有的安全設備。若某個設備已遺失或不再安全,請點擊此選項。"}},"field.disable_all_security_devices":{t:0,b:{t:2,i:[{t:3}],s:"禁用所有安全設備"}},"field.disable_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"防止新使用者註冊,除非有例外 (見下方選項)。此選項也會禁用通過 「SSO 登入」 產生的註冊行為,所以新使用者將無法通過 SSO 登入"}},"field.disable_registration":{t:0,b:{t:2,i:[{t:3}],s:"關閉註冊"}},"field.display_mode.help":{t:0,b:{t:2,i:[{t:3}],s:"選擇以列表或網格的方式顯示帳號"}},"field.display_mode":{t:0,b:{t:2,i:[{t:3}],s:"顯示模式"}},"field.email":{t:0,b:{t:2,i:[{t:3}],s:"信箱"}},"field.enable_sharing.help":{t:0,b:{t:2,i:[{t:3}],s:"Allow users to share their 2FA accounts with other users of this 2FAuth instance. When shared, 2FA accounts can be viewed and used by sharing recipients to generate OTP codes. Only the owner of an account can edit, delete, or export it, as well as view its secret or manage the sharing configuration of the account."}},"field.enable_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Enable sharing"}},"field.enable_all_users_sharing_scope.help":{t:0,b:{t:2,i:[{t:3}],s:"The All Users scope lets you target all users of the 2FAuth instance. When an account is shared at this level, it is automatically shared with all users, including those created after the sharing action."}},"field.enable_all_users_sharing_scope.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"Disabling this setting will deactivate existing sharings with the All Users scope, but it will not revoke them. If you re-enable this setting later, these sharings will be active again unless sharings with specific users have been set up in the meantime."}},"field.enable_all_users_sharing_scope":{t:0,b:{t:2,i:[{t:3}],s:"Enable 'All Users' sharing scope"}},"field.enable_sso.help":{t:0,b:{t:2,i:[{t:3}],s:"允許訪客通過單點登入的方式,使用外部 ID 進行身份驗證"}},"field.enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"啟用 SSO"}},"field.extCurrentPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"當前用於解鎖擴充功能的密碼"}},"field.extCurrentPassword":{t:0,b:{t:2,i:[{t:3}],s:"當前密碼"}},"field.extNewPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"在需要時用於鎖定此擴充功能並加密敏感資料的新密碼"}},"field.extNewPassword":{t:0,b:{t:2,i:[{t:3}],s:"新密碼"}},"field.extPassword.help":{t:0,b:{t:2,i:[{t:3}],s:"在需要時用於鎖定此擴充功能並加密敏感資料的新密碼"}},"field.extPassword":{t:0,b:{t:2,i:[{t:3}],s:"密碼"}},"field.findUserForShare.help":{t:0,b:{t:2,i:[{t:3}],s:"Partial search supported on username, email must match exactly"}},"field.findUserForShare":{t:0,b:{t:2,i:[{t:3}],s:"Find users to share with"}},"field.get_official_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"在添加帳號時,嘗試獲此帳號的官方圖示"}},"field.get_official_icons":{t:0,b:{t:2,i:[{t:3}],s:"獲取官方圖示"}},"field.group.help":{t:0,b:{t:2,i:[{t:3}],s:"此帳號要移動到的組"}},"field.group":{t:0,b:{t:2,i:[{t:3}],s:"分組"}},"field.health_endpoint.help":{t:0,b:{t:2,i:[{t:3}],s:"此 URL 可以顯示當前 2FAuth 節點的健康狀況。您可以將此 URL 設定在 Docker 的 「HEALTHCHECK」,或是 Kubernetes 的 「livenessProbe」 中,來對服務進行健康檢查。"}},"field.health_endpoint":{t:0,b:{t:2,i:[{t:3}],s:"節點健康檢查"}},"field.hostUrl.help":{t:0,b:{t:2,i:[{t:3}],s:"您用於登入 2FAuth 的 URL 位址,例如: https://2fauth.mysite.me"}},"field.hostUrl":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 伺服器 URL"}},"field.icon_collection.help":{t:0,b:{t:2,i:[{t:3}],s:"當需要官方圖示時,將優先查詢此圖示庫。"}},"field.icon_collection":{t:0,b:{t:2,i:[{t:3}],s:"首選在線圖示庫"}},"field.icon_source.help":{t:0,b:{t:2,i:[{t:3}],s:"設定是從在線 Logo 庫獲取圖示,還是從本地圖示包獲取。更改以下圖示設定不會刷新已獲取的圖示。"}},"field.icon_source":{t:0,b:{t:2,i:[{t:3}],s:"圖示獲取來源"}},"field.icon_pack.help":{t:0,b:{t:2,i:[{t:3}],s:"當需要官方圖示時使用的圖示包。需將圖示包目錄上傳至 2FAuth 伺服器方可使用,請諮詢您的實例管理員瞭解更多資訊。"}},"field.icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"圖示包"}},"field.icon_variant_strict_fetch.help":{t:0,b:{t:2,i:[{t:3}],s:"獲取圖示時僅獲取選中的樣式。如果不存在此樣式,2FAuth 將不會自動獲取 「普通」 圖示。"}},"field.icon_variant_strict_fetch":{t:0,b:{t:2,i:[{t:3}],s:"嚴格模式"}},"field.icon_variant.help":{t:0,b:{t:2,i:[{t:3}],s:"某些圖示提供不同的樣式,用以相容 「黑暗」 或 「明亮」 模式界面。您可以選擇一個樣式作為預設偏好,我們將為您優先獲取。當選定的樣式無法獲取到時,將自動獲取 「普通」 樣式。"}},"field.icon_variant":{t:0,b:{t:2,i:[{t:3}],s:"圖示樣式"}},"field.icon":{t:0,b:{t:2,i:[{t:3}],s:"圖示"}},"field.is_admin.help":{t:0,b:{t:2,i:[{t:3}],s:"授予使用者管理員權限。管理員有權管理整個應用,例如設定和其他使用者,但無法為不屬於他們的 2FA 帳號生成密碼。"}},"field.is_admin":{t:0,b:{t:2,i:[{t:3}],s:"管理員"}},"field.keep_sso_registration_enabled.help":{t:0,b:{t:2,i:[{t:3}],s:"在註冊被禁用時,仍然允許新使用者通過 SSO 登入"}},"field.keep_sso_registration_enabled":{t:0,b:{t:2,i:[{t:3}],s:"仍然允許 SSO 註冊"}},"field.language.help":{t:0,b:{t:2,i:[{t:3}],s:"設定 2FAuth 的界面語言。以下僅列出翻譯完成的語言,您可以手動選擇一個語言,或跟隨瀏覽器語言自動切換。"}},"field.language":{t:0,b:{t:2,i:[{t:3}],s:"語言"}},"field.name_this_device":{t:0,b:{t:2,i:[{t:3}],s:"命名此設備"}},"field.name":{t:0,b:{t:2,i:[{t:3}],s:"名稱"}},"field.new_name":{t:0,b:{t:2,i:[{t:3}],s:"新名稱"}},"field.new_owner.help":{t:0,b:{t:2,i:[{t:3}],s:"The user to which the ownership of this account will be transferred."}},"field.new_owner":{t:0,b:{t:2,i:[{t:3}],s:"New owner"}},"field.new_password":{t:0,b:{t:2,i:[{t:3}],s:"新密碼"}},"field.notify_on_failed_login.help":{t:0,b:{t:2,i:[{t:3}],s:"每次登入失敗時都發送郵件通知"}},"field.notify_on_failed_login":{t:0,b:{t:2,i:[{t:3}],s:"登入失敗時"}},"field.notify_on_new_auth_device.help":{t:0,b:{t:2,i:[{t:3}],s:"當新設備首次登入時發送郵件通知"}},"field.notify_on_new_auth_device":{t:0,b:{t:2,i:[{t:3}],s:"來自新設備時"}},"field.options.help":{t:0,b:{t:2,i:[{t:3}],s:"如果您不瞭解下列選項,請留空來使用預設設定。"}},"field.otp_generation.help":{t:0,b:{t:2,i:[{t:3}],s:"設定驗證碼的顯示方式和時間。"}},"field.otp_generation":{t:0,b:{t:2,i:[{t:3}],s:"顯示驗證碼"}},"field.otp_type.help":{t:0,b:{t:2,i:[{t:3}],s:"TOTP,HOTP 或 Steam OTP"}},"field.otp_type":{t:0,b:{t:2,i:[{t:3}],s:"選擇要建立的 OTP 類型"}},"field.password_format.help":{t:0,b:{t:2,i:[{t:3}],s:"分段顯示驗證碼,提高可讀性並且便於記憶"}},"field.password_format":{t:0,b:{t:2,i:[{t:3}],s:"密碼格式"}},"field.password":{t:0,b:{t:2,i:[{t:3}],s:"密碼"}},"field.period.help":{t:0,b:{t:2,i:[{t:3}],s:"驗證碼的有效期 (秒)"}},"field.period.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"預設為 30"}},"field.period":{t:0,b:{t:2,i:[{t:3}],s:"週期"}},"field.remember_active_group.help":{t:0,b:{t:2,i:[{t:3}],s:"記住選中的分組,並在下次訪問時自動切換至此分組"}},"field.remember_active_group":{t:0,b:{t:2,i:[{t:3}],s:"記住選中的分組"}},"field.restrict_list.help":{t:0,b:{t:2,i:[{t:3},{t:9},{t:3}],s:"僅允許此列表中的信箱進行註冊,用管道符 | 來分隔多個位址"}},"field.restrict_list":{t:0,b:{t:2,i:[{t:3}],s:"過濾列表"}},"field.restrict_registration.help":{t:0,b:{t:2,i:[{t:3}],s:"只允許符合規則的信箱位址進行註冊。可以同時使用下方的兩條規則來進行限制。SSO 的註冊流程不受此限制的影響。"}},"field.restrict_registration":{t:0,b:{t:2,i:[{t:3}],s:"限制註冊"}},"field.restrict_rule.help":{t:0,b:{t:2,i:[{t:3}],s:"僅允許匹配正規表達式的信箱位址進行註冊"}},"field.restrict_rule":{t:0,b:{t:2,i:[{t:3}],s:"過濾規則"}},"field.reveal_dotted_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"允許驗證碼臨時以明文顯示"}},"field.reveal_dotted_otp":{t:0,b:{t:2,i:[{t:3}],s:"顯示被遮擋的驗證碼"}},"field.secret.help":{t:0,b:{t:2,i:[{t:3}],s:"用於生成安全碼的密鑰"}},"field.secret":{t:0,b:{t:2,i:[{t:3}],s:"密鑰"}},"field.service.placeholder":{t:0,b:{t:2,i:[{t:3}],s:"服務名稱"}},"field.service":{t:0,b:{t:2,i:[{t:3}],s:"服務"}},"field.show_accounts_icons.help":{t:0,b:{t:2,i:[{t:3}],s:"在主視圖中顯示圖示"}},"field.show_accounts_icons":{t:0,b:{t:2,i:[{t:3}],s:"顯示圖示"}},"field.show_email_in_footer.help":{t:0,b:{t:2,i:[{t:3}],s:"在頁面底部顯示當前登入使用者的信箱位址,而非直接顯示導航連結。當點擊信箱位址時,再跳轉到導航連結。"}},"field.show_email_in_footer":{t:0,b:{t:2,i:[{t:3}],s:"在底部顯示信箱位址"}},"field.show_in_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Display this group as a chip in the group selector on the main view. This has no effect if 'Use Chips for toggling' is disabled in user preferences."}},"field.show_in_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show in chip toggles"}},"field.show_next_otp.help":{t:0,b:{t:2,i:[{t:3}],s:"預覽下一個驗證碼,即當前驗證碼過期後,會生成的新驗證碼。當前驗證碼的相關設定也會同樣應用到下一個驗證碼上(顯示格式、是否顯示為點)。"}},"field.show_next_otp":{t:0,b:{t:2,i:[{t:3}],s:"顯示下一個驗證碼"}},"field.show_otp_as_dot.help":{t:0,b:{t:2,i:[{t:3}],s:"用 」*「 號來遮擋驗證碼的顯示,以提高安全性。此功能不會影響複製和貼上操作。"}},"field.show_otp_as_dot":{t:0,b:{t:2,i:[{t:3}],s:"隱藏生成的驗證碼"}},"field.show_quick_nav_menus.help":{t:0,b:{t:2,i:[{t:3}],s:"Add a navigation menu to the side of certain long pages so that you can scroll directly to specific sections. This feature is only available on desktop. Menus won't be visible on mobile or tablet."}},"field.show_quick_nav_menus":{t:0,b:{t:2,i:[{t:3}],s:"Show quick nav menus"}},"field.show_virtual_chips.help":{t:0,b:{t:2,i:[{t:3}],s:"Show chips for virtual groups like the Group Less Accounts group, the Shared With/By Me group, etc..."}},"field.show_virtual_chips":{t:0,b:{t:2,i:[{t:3}],s:"Show virtual groups"}},"field.sort_case_sensitive.help":{t:0,b:{t:2,i:[{t:3}],s:"選中時,強制 「排序」 功能以區分大小寫的方式對帳號進行排序"}},"field.sort_case_sensitive":{t:0,b:{t:2,i:[{t:3}],s:"按大小寫排序"}},"field.store_icon_to_database.help":{t:0,b:{t:2,i:[{t:3}],s:`圖示上傳後會額外儲存一份到資料庫中。 +啟用此功能可以令 2FAuth 更易於備份:僅需備份資料庫,即可儲存 2FAuth 的資料以及所有的圖示。`}},"field.store_icon_to_database.help_bis":{t:0,b:{t:2,i:[{t:3}],s:`但要注意的是,此功能可能會產生負面效果:如果上傳了大量的大體積圖示,那麼資料庫的體積也會顯著地增大。 +此功能也可能會影響 2FAuth 的性能,因為需要頻繁地讀寫磁碟來保證 」圖示「 資料與資料庫保持同步。`}},"field.store_icon_to_database":{t:0,b:{t:2,i:[{t:3}],s:"儲存圖示至資料庫"}},"field.test_email.help":{t:0,b:{t:2,i:[{t:3}],s:"發送一封測試郵件,以此驗證送信設定是否正確。如果沒有正確地設定郵件伺服器,使用者將無法收到 「重置密碼」 的郵件。"}},"field.test_email":{t:0,b:{t:2,i:[{t:3}],s:"測試送信設定"}},"field.theme.help":{t:0,b:{t:2,i:[{t:3}],s:"手動設定為某個主題,或自動跟隨系統 / 瀏覽器的主題方案"}},"field.theme":{t:0,b:{t:2,i:[{t:3}],s:"主題"}},"field.timezone.help":{t:0,b:{t:2,i:[{t:3}],s:"為所有的 「日期」 與 「時間」 設定時區"}},"field.timezone":{t:0,b:{t:2,i:[{t:3}],s:"時區"}},"field.use_basic_qrcode_reader.help":{t:0,b:{t:2,i:[{t:3}],s:"如果你在掃描QR Code時遇到問題,此選項可以切換到更簡單但更可靠的QR Code掃描器"}},"field.use_basic_qrcode_reader":{t:0,b:{t:2,i:[{t:3}],s:"使用簡版QR Code掃描器"}},"field.use_chips_to_select_group.help":{t:0,b:{t:2,i:[{t:3}],s:"Show a set of chips above the 2FA account list to allow group toggling direclty from the main view. When disabled, the name of the active group is displayed on a label that must be clicked to invoke the group selector."}},"field.use_chips_to_select_group":{t:0,b:{t:2,i:[{t:3}],s:"Use Chips for toggling"}},"field.use_encryption.help":{t:0,b:{t:2,i:[{t:3}],s:"敏感資料、2FA 秘鑰和信箱位址會以加密形式儲存在資料庫中。請您務必備份在 .env 中設定的 APP_KEY 的值 (或備份整個 .env 檔案)。如果此密鑰丟失,那麼已加密的資料將無法解密。"}},"field.use_encryption":{t:0,b:{t:2,i:[{t:3}],s:"保護敏感資料"}},"field.use_sso_only.help":{t:0,b:{t:2,i:[{t:3}],s:"僅允許通過 SSO 進行登入。啟用此功能後,普通使用者將無法使用密碼和 WebAuthn 來登入 2FAuth,但管理員不受此限制的影響。"}},"field.use_sso_only":{t:0,b:{t:2,i:[{t:3}],s:"僅允許 SSO 登入"}},"field.use_webauthn_only.help":{t:0,b:{t:2,i:[{t:3}],s:"將 WebAuthn 設為 2FAuth 的唯一認證方式。若要發揮 WebAuth 的最佳安全性,推薦啟用此選項。"}},"field.use_webauthn_only.help_bis":{t:0,b:{t:2,i:[{t:3}],s:"當設備丟失時, 您可以重置此選項來恢復您的帳號,並使用您的信箱與密碼來登入。"}},"field.use_webauthn_only.help_ter":{t:0,b:{t:2,i:[{t:3}],s:"請注意! 即使啟用此選項,2FAuth 也不會禁用信箱和密碼的登入界面,但如果嘗試使用信箱登入,則永遠會提示 「驗證失敗」。"}},"field.use_webauthn_only":{t:0,b:{t:2,i:[{t:3}],s:"僅允許 WebAuthn"}},"field.useDirectCapture.help":{t:0,b:{t:2,i:[{t:3}],s:"在預設情況下,資料錄入時會提供多種錄入的方式。您可以打開此選項來鎖定到某一種方式"}},"field.useDirectCapture":{t:0,b:{t:2,i:[{t:3}],s:"鎖定錄入方式"}},"field.view_default_group_on_copy.help":{t:0,b:{t:2,i:[{t:3}],s:"複製 OTP 驗證碼後,總是返回到預設分組"}},"field.view_default_group_on_copy":{t:0,b:{t:2,i:[{t:3}],s:"複製後返回預設分組"}},"heading.about":{t:0,b:{t:2,i:[{t:3}],s:"關於"}},"heading.access_log":{t:0,b:{t:2,i:[{t:3}],s:"訪問日誌"}},"heading.access":{t:0,b:{t:2,i:[{t:3}],s:"訪問"}},"heading.account_recovery":{t:0,b:{t:2,i:[{t:3}],s:"恢復帳號"}},"heading.2fa_accounts":{t:0,b:{t:2,i:[{t:3}],s:"2FA accounts"}},"heading.sharing":{t:0,b:{t:2,i:[{t:3}],s:"Sharing"}},"heading.sharing_setting":{t:0,b:{t:2,i:[{t:3}],s:"Sharing setting"}},"heading.authentication":{t:0,b:{t:2,i:[{t:3}],s:"身份認證"}},"heading.browser_restrictions":{t:0,b:{t:2,i:[{t:3}],s:"Browser Restrictions"}},"heading.change_password":{t:0,b:{t:2,i:[{t:3}],s:"修改密碼"}},"heading.danger_zone":{t:0,b:{t:2,i:[{t:3}],s:"危險選項"}},"heading.data_input":{t:0,b:{t:2,i:[{t:3}],s:"資料錄入"}},"heading.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"刪除帳號"}},"heading.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"編輯帳號"}},"heading.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"heading.environment":{t:0,b:{t:2,i:[{t:3}],s:"環境變數"}},"heading.general":{t:0,b:{t:2,i:[{t:3}],s:"通用"}},"heading.groups":{t:0,b:{t:2,i:[{t:3}],s:"分組"}},"heading.icons":{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},"heading.import":{t:0,b:{t:2,i:[{t:3}],s:"導入"}},"heading.last_accesses":{t:0,b:{t:2,i:[{t:3}],s:"最近訪問"}},"heading.login":{t:0,b:{t:2,i:[{t:3}],s:"登入"}},"heading.new_account":{t:0,b:{t:2,i:[{t:3}],s:"新建帳號"}},"heading.new_group":{t:0,b:{t:2,i:[{t:3}],s:"新建分組"}},"heading.new_password":{t:0,b:{t:2,i:[{t:3}],s:"新密碼"}},"heading.new_sharing":{t:0,b:{t:2,i:[{t:3}],s:"New sharing"}},"heading.new_token":{t:0,b:{t:2,i:[{t:3}],s:"新建令牌"}},"heading.new_user":{t:0,b:{t:2,i:[{t:3}],s:"新使用者"}},"heading.notifications":{t:0,b:{t:2,i:[{t:3}],s:"通知"}},"heading.options":{t:0,b:{t:2,i:[{t:3}],s:"偏好"}},"heading.one_time_passwords":{t:0,b:{t:2,i:[{t:3}],s:"One-Time Passwords"}},"heading.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generations log"}},"heading.password":{t:0,b:{t:2,i:[{t:3}],s:"密碼"}},"heading.personal_access_tokens":{t:0,b:{t:2,i:[{t:3}],s:"個人訪問令牌"}},"heading.preferences":{t:0,b:{t:2,i:[{t:3}],s:"系統參數"}},"heading.profile":{t:0,b:{t:2,i:[{t:3}],s:"個人資料"}},"heading.purpose":{t:0,b:{t:2,i:[{t:3}],s:"介紹"}},"heading.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"heading.register":{t:0,b:{t:2,i:[{t:3}],s:"註冊"}},"heading.registrations":{t:0,b:{t:2,i:[{t:3}],s:"註冊"}},"heading.rename_device":{t:0,b:{t:2,i:[{t:3}],s:"重命名設備"}},"heading.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置擴充功能"}},"heading.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"重置密碼"}},"heading.resources":{t:0,b:{t:2,i:[{t:3}],s:"資源"}},"heading.security_devices":{t:0,b:{t:2,i:[{t:3}],s:"安全設備"}},"heading.security":{t:0,b:{t:2,i:[{t:3}],s:"安全"}},"heading.server_parameter":{t:0,b:{t:2,i:[{t:3}],s:"Server Parameters"}},"heading.session":{t:0,b:{t:2,i:[{t:3}],s:"Session"}},"heading.setup":{t:0,b:{t:2,i:[{t:3}],s:"設定"}},"heading.single_sign_on":{t:0,b:{t:2,i:[{t:3}],s:"單點登入 (SSO)"}},"heading.sso_login":{t:0,b:{t:2,i:[{t:3}],s:"SSO 登入"}},"heading.storage":{t:0,b:{t:2,i:[{t:3}],s:"存儲"}},"heading.supported_migration_formats":{t:0,b:{t:2,i:[{t:3}],s:"支援的遷移格式"}},"heading.user":{t:0,b:{t:2,i:[{t:3}],s:"User"}},"heading.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"heading.twofauth_webext":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 網頁擴充功能"}},"heading.unauthorized":{t:0,b:{t:2,i:[{t:3}],s:"無權限"}},"heading.update_profile":{t:0,b:{t:2,i:[{t:3}],s:"更新個人資料"}},"heading.user_management":{t:0,b:{t:2,i:[{t:3}],s:"使用者"}},"heading.users":{t:0,b:{t:2,i:[{t:3}],s:"使用者"}},"heading.webauthn_login":{t:0,b:{t:2,i:[{t:3}],s:"使用 WebAuthn 登入"}},"label.1_day":{t:0,b:{t:2,i:[{t:3}],s:"1 天后"}},"label.1_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 小時後"}},"label.1_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 分鐘後"}},"label.10_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 分鐘後"}},"label.15_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 分鐘後"}},"label.2_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 分鐘後"}},"label.30_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 分鐘後"}},"label.5_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 分鐘後"}},"label.about":{t:0,b:{t:2,i:[{t:3}],s:"關於"}},"label.account":{t:0,b:{t:2,i:[{t:3}],s:"帳號"}},"label.accounts_shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Accounts shared with me"}},"label.accounts_I_m_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Accounts I'm sharing"}},"label.actions":{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},"label.active_group":{t:0,b:{t:2,i:[{t:3}],s:"最近更新"}},"label.add_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"Add to 2FAuth"}},"label.administrator":{t:0,b:{t:2,i:[{t:3}],s:"Administrator"}},"label.advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"手動填寫"}},"label.after_a_click_tap":{t:0,b:{t:2,i:[{t:3}],s:"點擊帳號後"}},"label.all_of_them_on_home.title":{t:0,b:{t:2,i:[{t:3}],s:"所有驗證碼都在首頁中顯示,不做任何操作"}},"label.all_of_them_on_home":{t:0,b:{t:2,i:[{t:3}],s:"直接在首頁中顯示"}},"label.all":{t:0,b:{t:2,i:[{t:3}],s:"所有帳號"}},"label.all_accounts":{t:0,b:{t:2,i:[{t:3}],s:"所有帳號"}},"label.group_less":{t:0,b:{t:2,i:[{t:3}],s:"無分組"}},"label.group_less_accounts":{t:0,b:{t:2,i:[{t:3}],s:"無分組帳號"}},"label.alone_in_its_own_view.title":{t:0,b:{t:2,i:[{t:3}],s:"點擊帳號後,在獨立頁面中打開並獲取驗證碼"}},"label.alone_in_its_own_view":{t:0,b:{t:2,i:[{t:3}],s:"在獨立頁面中顯示"}},"label.api":{t:0,b:{t:2,i:[{t:3}],s:"API"}},"label.app_setup":{t:0,b:{t:2,i:[{t:3}],s:"系統"}},"label.apply":{t:0,b:{t:2,i:[{t:3}],s:"應用"}},"label.auth":{t:0,b:{t:2,i:[{t:3}],s:"Authentication"}},"label.automatic":{t:0,b:{t:2,i:[{t:3}],s:"自動"}},"label.back":{t:0,b:{t:2,i:[{t:3}],s:"返回"}},"label.browser_preference":{t:0,b:{t:2,i:[{t:3}],s:"跟隨瀏覽器語言"}},"label.browser":{t:0,b:{t:2,i:[{t:3}],s:"瀏覽器"}},"label.cancel":{t:0,b:{t:2,i:[{t:3}],s:"取消"}},"label.change_password":{t:0,b:{t:2,i:[{t:3}],s:"修改密碼"}},"label.check_all":{t:0,b:{t:2,i:[{t:3}],s:"所有帳號"}},"label.check_now":{t:0,b:{t:2,i:[{t:3}],s:"立即檢查"}},"label.choose_image":{t:0,b:{t:2,i:[{t:3}],s:"上傳"}},"label.clear":{t:0,b:{t:2,i:[{t:3}],s:"清空"}},"label.close":{t:0,b:{t:2,i:[{t:3}],s:"關閉"}},"label.constantly":{t:0,b:{t:2,i:[{t:3}],s:"始終"}},"label.continue":{t:0,b:{t:2,i:[{t:3}],s:"繼續"}},"label.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"複製到剪貼簿"}},"label.copy":{t:0,b:{t:2,i:[{t:3}],s:"複製"}},"label.counter":{t:0,b:{t:2,i:[{t:3}],s:"Counter"}},"label.create":{t:0,b:{t:2,i:[{t:3}],s:"建立"}},"heading.credits":{t:0,b:{t:2,i:[{t:3}],s:"鳴謝"}},"label.dark":{t:0,b:{t:2,i:[{t:3}],s:"暗色"}},"label.default":{t:0,b:{t:2,i:[{t:3}],s:"預設值"}},"label.delete_this_user":{t:0,b:{t:2,i:[{t:3}],s:"刪除此使用者"}},"label.delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"刪除我的帳號"}},"label.delete":{t:0,b:{t:2,i:[{t:3}],s:"刪除"}},"label.demo":{t:0,b:{t:2,i:[{t:3}],s:"演示"}},"label.detect_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR Codes"}},"label.device":{t:0,b:{t:2,i:[{t:3}],s:"設備"}},"label.discard_all":{t:0,b:{t:2,i:[{t:3}],s:"全部放棄"}},"label.discard_duplicates":{t:0,b:{t:2,i:[{t:3}],s:"放棄重複項"}},"label.docs":{t:0,b:{t:2,i:[{t:3}],s:"文件"}},"label.done":{t:0,b:{t:2,i:[{t:3}],s:"完成"}},"label.edit":{t:0,b:{t:2,i:[{t:3}],s:"Edit"}},"label.export":{t:0,b:{t:2,i:[{t:3}],s:"導出"}},"label.extension":{t:0,b:{t:2,i:[{t:3}],s:"擴充功能插件"}},"label.fifteen_minutes":{t:0,b:{t:2,i:[{t:3}],s:"15 分鐘後"}},"label.five_minutes":{t:0,b:{t:2,i:[{t:3}],s:"5 分鐘後"}},"label.generate":{t:0,b:{t:2,i:[{t:3}],s:"生成"}},"label.github":{t:0,b:{t:2,i:[{t:3}],s:"Github"}},"label.grid":{t:0,b:{t:2,i:[{t:3}],s:"網格"}},"label.half_digit":{t:0,b:{t:2,i:[{t:3}],s:"1234 5678"}},"label.half.legend":{t:0,b:{t:2,i:[{t:3}],s:"平均拆分位兩組"}},"label.half":{t:0,b:{t:2,i:[{t:3}],s:"對半分組"}},"label.i_m_lucky":{t:0,b:{t:2,i:[{t:3}],s:"手氣不錯"}},"label.uploaded_pack":{t:0,b:{t:2,i:[{t:3}],s:"已上傳的圖示包"}},"label.import_all":{t:0,b:{t:2,i:[{t:3}],s:"全部導入"}},"label.import":{t:0,b:{t:2,i:[{t:3}],s:"導入"}},"label.ip_address":{t:0,b:{t:2,i:[{t:3}],s:"IP 位址"}},"label.IP":{t:0,b:{t:2,i:[{t:3}],s:"IP 位址"}},"label.issuer":{t:0,b:{t:2,i:[{t:3}],s:"簽發方"}},"label.light":{t:0,b:{t:2,i:[{t:3}],s:"亮色"}},"label.list":{t:0,b:{t:2,i:[{t:3}],s:"列表"}},"label.livescan":{t:0,b:{t:2,i:[{t:3}],s:"掃描QR Code"}},"label.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"label.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"Maybe later"}},"label.move":{t:0,b:{t:2,i:[{t:3}],s:"移動"}},"label.my_device":{t:0,b:{t:2,i:[{t:3}],s:"我的設備"}},"label.never":{t:0,b:{t:2,i:[{t:3}],s:"從不"}},"label.new":{t:0,b:{t:2,i:[{t:3}],s:"新建"}},"label.no_group":{t:0,b:{t:2,i:[{t:3}],s:"未分組"}},"label.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"- 無圖示包 -"}},"label.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"Not shared"}},"label.remove_from_group":{t:0,b:{t:2,i:[{t:3}],s:"從分組刪除"}},"label.oauth":{t:0,b:{t:2,i:[{t:3}],s:"OAuth"}},"label.on_otp_copy":{t:0,b:{t:2,i:[{t:3}],s:"複製驗證碼後"}},"label.one_day":{t:0,b:{t:2,i:[{t:3}],s:"1 天后"}},"label.one_hour":{t:0,b:{t:2,i:[{t:3}],s:"1 小時後"}},"label.one_minutes":{t:0,b:{t:2,i:[{t:3}],s:"1 分鐘後"}},"label.one_month":{t:0,b:{t:2,i:[{t:3}],s:"1 個月"}},"label.one_year":{t:0,b:{t:2,i:[{t:3}],s:"1 年"}},"label.online_collection":{t:0,b:{t:2,i:[{t:3}],s:"在線圖示庫"}},"label.open_in_browser":{t:0,b:{t:2,i:[{t:3}],s:"在瀏覽器中打開"}},"label.openid":{t:0,b:{t:2,i:[{t:3}],s:"OpenID"}},"label.operating_system_short":{t:0,b:{t:2,i:[{t:3}],s:"系統版本"}},"label.options":{t:0,b:{t:2,i:[{t:3}],s:"偏好"}},"label.otpauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI"}},"label.pair_digit":{t:0,b:{t:2,i:[{t:3}],s:"12 34 56"}},"label.pair.legend":{t:0,b:{t:2,i:[{t:3}],s:"以兩位為一組進行分隔"}},"label.pair":{t:0,b:{t:2,i:[{t:3}],s:"兩位一組"}},"label.plain_text":{t:0,b:{t:2,i:[{t:3}],s:"純文本"}},"label.prefill_using_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"使用QR Code來填寫"}},"label.qr_code":{t:0,b:{t:2,i:[{t:3}],s:"QR Code"}},"label.qr_code_upload":{t:0,b:{t:2,i:[{t:3}],s:"上傳QR Code"}},"label.refresh":{t:0,b:{t:2,i:[{t:3}],s:"刷新"}},"label.register_a_device":{t:0,b:{t:2,i:[{t:3}],s:"註冊設備"}},"label.register":{t:0,b:{t:2,i:[{t:3}],s:"註冊"}},"label.regular":{t:0,b:{t:2,i:[{t:3}],s:"普通"}},"label.remove_icon":{t:0,b:{t:2,i:[{t:3}],s:"移除圖示"}},"label.resend_email":{t:0,b:{t:2,i:[{t:3}],s:"重新發送郵件"}},"label.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置擴充功能"}},"label.reset_password":{t:0,b:{t:2,i:[{t:3}],s:"重置密碼"}},"label.reset":{t:0,b:{t:2,i:[{t:3}],s:"重置"}},"label.revoke":{t:0,b:{t:2,i:[{t:3}],s:"吊銷"}},"label.save":{t:0,b:{t:2,i:[{t:3}],s:"儲存"}},"label.scan_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"掃描QR Code"}},"label.search":{t:0,b:{t:2,i:[{t:3}],s:"搜尋"}},"label.select_accounts_to_show":{t:0,b:{t:2,i:[{t:3}],s:"選擇要顯示的帳號"}},"label.send_password_reset_link":{t:0,b:{t:2,i:[{t:3}],s:"發送密碼重置連結"}},"label.send_recovery_link":{t:0,b:{t:2,i:[{t:3}],s:"發送恢復連結"}},"label.send":{t:0,b:{t:2,i:[{t:3}],s:"發送"}},"label.share":{t:0,b:{t:2,i:[{t:3}],s:"Share"}},"label.shared":{t:0,b:{t:2,i:[{t:3}],s:"Shared"}},"label.shared_by_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared by me"}},"label.shared_with_me":{t:0,b:{t:2,i:[{t:3}],s:"Shared with me"}},"label.share_with_all":{t:0,b:{t:2,i:[{t:3}],s:"All users"}},"label.share_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"Specific users"}},"label.show_me":{t:0,b:{t:2,i:[{t:3}],s:"Show me"}},"label.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"登入"}},"label.sign_out":{t:0,b:{t:2,i:[{t:3}],s:"退出"}},"label.submit":{t:0,b:{t:2,i:[{t:3}],s:"提交"}},"label.ten_minutes":{t:0,b:{t:2,i:[{t:3}],s:"10 分鐘後"}},"label.test":{t:0,b:{t:2,i:[{t:3}],s:"測試"}},"label.text_file":{t:0,b:{t:2,i:[{t:3}],s:"文本檔案"}},"label.thirty_minutes":{t:0,b:{t:2,i:[{t:3}],s:"30 分鐘後"}},"label.time":{t:0,b:{t:2,i:[{t:3}],s:"時間"}},"label.to_import":{t:0,b:{t:2,i:[{t:3}],s:"導入"}},"label.transfer":{t:0,b:{t:2,i:[{t:3}],s:"Transfer"}},"label.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"label.trio_digit":{t:0,b:{t:2,i:[{t:3}],s:"123 456"}},"label.trio.legend":{t:0,b:{t:2,i:[{t:3}],s:"以三位為一組進行分隔"}},"label.trio":{t:0,b:{t:2,i:[{t:3}],s:"三位一組"}},"label.two_minutes":{t:0,b:{t:2,i:[{t:3}],s:"2 分鐘後"}},"label.twofauth_export_format":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 格式"}},"label.unlock":{t:0,b:{t:2,i:[{t:3}],s:"解鎖"}},"label.unshare":{t:0,b:{t:2,i:[{t:3}],s:"Unshare"}},"label.update":{t:0,b:{t:2,i:[{t:3}],s:"更新"}},"label.upload_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"上傳QR Code"}},"label.upload":{t:0,b:{t:2,i:[{t:3}],s:"上傳"}},"label.users":{t:0,b:{t:2,i:[{t:3}],s:"使用者"}},"label.variables":{t:0,b:{t:2,i:[{t:3}],s:"環境變數"}},"label.webauthn":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn"}},"label.webextension":{t:0,b:{t:2,i:[{t:3}],s:"網頁擴充功能"}},"label.x_month":{t:0,b:{t:2,i:[{t:4,k:"x"},{t:3,v:" 個月"}]}},"lang.bg":{t:0,b:{t:2,i:[{t:3}],s:"Български (保加利亞語)"}},"lang.da":{t:0,b:{t:2,i:[{t:3}],s:"Dansk (丹麥語)"}},"lang.de":{t:0,b:{t:2,i:[{t:3}],s:"Deutsch (德語)"}},"lang.en":{t:0,b:{t:2,i:[{t:3}],s:"English (英語)"}},"lang.es-ES":{t:0,b:{t:2,i:[{t:3}],s:"Español (西班牙語)"}},"lang.fr":{t:0,b:{t:2,i:[{t:3}],s:"Français (法語)"}},"lang.hi":{t:0,b:{t:2,i:[{t:3}],s:"हिंदी (印地語)"}},"lang.it":{t:0,b:{t:2,i:[{t:3}],s:"Italiano (義大利語)"}},"lang.ja":{t:0,b:{t:2,i:[{t:3}],s:"日本語 (日語)"}},"lang.ko":{t:0,b:{t:2,i:[{t:3}],s:"한국어 (韓語)"}},"lang.nl":{t:0,b:{t:2,i:[{t:3}],s:"Nederlands (荷蘭語)"}},"lang.pt-BR":{t:0,b:{t:2,i:[{t:3}],s:"Português (葡萄牙語,巴西語)"}},"lang.ru":{t:0,b:{t:2,i:[{t:3}],s:"Русский (俄語)"}},"lang.tr":{t:0,b:{t:2,i:[{t:3}],s:"Türkçe (土耳其語)"}},"lang.zh-CN":{t:0,b:{t:2,i:[{t:3}],s:"简体中文 (Chinese Simplified)"}},"link.about":{t:0,b:{t:2,i:[{t:3}],s:"關於"}},"link.add_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Add sharing"}},"link.add_users":{t:0,b:{t:2,i:[{t:3}],s:"Add users"}},"link.admin_panel":{t:0,b:{t:2,i:[{t:3}],s:"系統管理"}},"link.back_to_home":{t:0,b:{t:2,i:[{t:3}],s:"返回首頁"}},"link.configure":{t:0,b:{t:2,i:[{t:3}],s:"建立"}},"link.continue":{t:0,b:{t:2,i:[{t:3}],s:"繼續"}},"link.create_group":{t:0,b:{t:2,i:[{t:3}],s:"新建分組"}},"link.create_new_user":{t:0,b:{t:2,i:[{t:3}],s:"建立新使用者"}},"link.create_your_first_group":{t:0,b:{t:2,i:[{t:3}],s:"Create your first group"}},"link.docs_how_to_create_a_pat":{t:0,b:{t:2,i:[{t:3}],s:"如何建立 PAT"}},"link.edit":{t:0,b:{t:2,i:[{t:3}],s:"編輯"}},"link.generate_new_token":{t:0,b:{t:2,i:[{t:3}],s:"生成新令牌"}},"link.go_to_2fauth_host":{t:0,b:{t:2,i:[{t:3}],s:"轉到 2FAuth"}},"link.help_translate_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"誠邀您協助翻譯 2FAuth!"}},"link.icons_doc":{t:0,b:{t:2,i:[{t:3}],s:"Icons Documentation"}},"link.login_and_password":{t:0,b:{t:2,i:[{t:3}],s:"使用者名稱和密碼"}},"link.manage_groups":{t:0,b:{t:2,i:[{t:3}],s:"管理分組"}},"link.manage_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Manage sharing"}},"link.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"link.maybe_later":{t:0,b:{t:2,i:[{t:3}],s:"以後再說"}},"link.open_2fauth_to_create_group":{t:0,b:{t:2,i:[{t:3}],s:"Open 2FAuth to create a group"}},"link.otp_generation_log":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"link.recover_your_account":{t:0,b:{t:2,i:[{t:3}],s:"恢復您的帳號"}},"link.register_a_new_device":{t:0,b:{t:2,i:[{t:3}],s:"註冊新設備"}},"link.register":{t:0,b:{t:2,i:[{t:3}],s:"註冊"}},"link.request_password_reset":{t:0,b:{t:2,i:[{t:3}],s:"重置密碼"}},"link.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置擴充功能"}},"label.reset_your_password":{t:0,b:{t:2,i:[{t:3}],s:"重置您的密碼"}},"link.scan":{t:0,b:{t:2,i:[{t:3}],s:"掃描"}},"link.security_device":{t:0,b:{t:2,i:[{t:3}],s:"安全設備"}},"link.see_full_log":{t:0,b:{t:2,i:[{t:3}],s:"顯示完整日誌"}},"link.see_how_to_enable_sso":{t:0,b:{t:2,i:[{t:3}],s:"看看如何啟用提供方"}},"link.settings":{t:0,b:{t:2,i:[{t:3}],s:"使用者設定"}},"link.sharing_doc":{t:0,b:{t:2,i:[{t:3}],s:"Sharing Documentation"}},"link.sign_in_here":{t:0,b:{t:2,i:[{t:3}],s:"您可以不使用 SSO 登入"}},"link.sign_in":{t:0,b:{t:2,i:[{t:3}],s:"登入"}},"link.transfer_ownership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"link.twofauth_export_schema":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 導出結構"}},"link.use_advanced_form":{t:0,b:{t:2,i:[{t:3}],s:"手動填寫"}},"link.view_as_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"View as QR Code"}},"link.view_on_github":{t:0,b:{t:2,i:[{t:3}],s:"在 GitHub 上查看"}},"link.why_this":{t:0,b:{t:2,i:[{t:3}],s:"為什麼我會看到這個?"}},"message.2fauth_description":{t:0,b:{t:2,i:[{t:3}],s:"此網頁 App 可助您管理兩步驗證 (2FA) 帳號,並生成對應的驗證碼"}},"message.2fauth_teaser":{t:0,b:{t:2,i:[{t:3}],s:"本網頁 App 可助您管理兩步驗證 (2FA) 帳號,並生成對應的驗證碼"}},"message.log_has_more_entries":{t:0,b:{t:2,i:[{t:3}],s:"The log contains more entries."}},"message.access_log_legend_for_user":{t:0,b:{t:2,i:[{t:3,v:"使用者 "},{t:4,k:"username"},{t:3,v:" 的完整訪問日誌"}]}},"message.account_bound_to_x_via_oauth":{t:0,b:{t:2,i:[{t:3,v:"此帳號通過 OAuth 與 "},{t:4,k:"provider"},{t:3,v:" 帳號綁定"}]}},"message.account_linked_to_sso_x_provider":{t:0,b:{t:2,i:[{t:3,v:"您當前是通過 "},{t:4,k:"provider"},{t:3,v:" 登入的,因此無法在此處更改資訊,請回到 "},{t:4,k:"provider"},{t:3,v:" 進行操作。"}]}},"message.account_recovery_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"帳號恢復郵件已發送!"}},"message.add_first_account":{t:0,b:{t:2,i:[{t:3}],s:"選擇一個添加方式,建立您的第一個帳號"}},"message.add_your_first_user_to_share_this_account_with":{t:0,b:{t:2,i:[{t:3}],s:"Add the first user to share this account with"}},"message.admin_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"管理當前節點上的已註冊使用者,或建立一個新的使用者。"}},"message.all_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'All users' to share this account with all other users of the 2FAuth instance. This includes both existing and future users."}},"message.already_authenticated":{t:0,b:{t:2,i:[{t:3}],s:"您已登入,請先登出。"}},"message.already_register":{t:0,b:{t:2,i:[{t:3}],s:"已經註冊?"}},"message.already_shared":{t:0,b:{t:2,i:[{t:3}],s:"already shared"}},"message.alternative_methods":{t:0,b:{t:2,i:[{t:3}],s:"其他建立方式"}},"message.auth_handled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"因為認證已被反向代理接管,因此以下設定已被禁用。"}},"message.authentication_against_server_failed":{t:0,b:{t:2,i:[{t:3}],s:"與伺服器驗證失敗。"}},"message.bind_2fauth_to_use_extension":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 服務的完美搭子"}},"message.browser_on_platform":{t:0,b:{t:2,i:[{t:3}],s:":platform 上的 :browser"}},"message.caps_lock_is_on":{t:0,b:{t:2,i:[{t:3}],s:"大寫鎖定已打開"}},"message.delete_this_user_legend":{t:0,b:{t:2,i:[{t:3}],s:"此使用者所有的 2FA 資料將與此帳號被一同刪除。"}},"message.delete_your_account_and_reset_all_data":{t:0,b:{t:2,i:[{t:3}],s:"您所有的 2FA 資料將與此帳號被一同刪除,此操作無法恢復。"}},"message.deleting_2fauth_account_does_not_impact_provider":{t:0,b:{t:2,i:[{t:3}],s:"刪除此 2FAuth 帳號不會影響您的外部 SSO 帳號。"}},"message.deleting_group_does_not_delete_accounts":{t:0,b:{t:2,i:[{t:3}],s:"刪除分組時,組內的帳號不會被刪除"}},"message.detect_qrcode_in_page_legend":{t:0,b:{t:2,i:[{t:3}],s:"Start detection and select the code, I'll handle the rest."}},"message.direct_input":{t:0,b:{t:2,i:[{t:3}],s:"鎖定錄入方式"}},"message.disabled_in_demo":{t:0,b:{t:2,i:[{t:3}],s:"此功能在演示模式下被禁用"}},"message.do_not_set_password_or_encryption":{t:0,b:{t:2,i:[{t:3}],s:"如果您需要從其他 2FA 應用導出資料到 2FAuth,請務必在導出前關閉加密保護,否則 2FAuth 將無法解密資料。"}},"message.dont_have_account_yet":{t:0,b:{t:2,i:[{t:3}],s:"還沒有帳號?"}},"message.double_check_new_owner":{t:0,b:{t:2,i:[{t:3}],s:"Be sure to double-check your choice before proceeding as this action cannot be undone (by you). Also, ensure you are transferring the ownership to a trusted user as they will have full control over this 2FA account."}},"message.email_will_be_send_to_x":{t:0,b:{t:2,i:[{t:3,v:"郵件將發送到此位址: "},{t:4,k:"email"}]}},"message.enhance_security_using_webauthn":{t:0,b:{t:2,i:[{t:3}],s:"您可以啟用 WebAuthn 驗證來增強您 2FAuth 帳號的安全性。"}},"message.ensure_you_open_mail_in_trusted_device":{t:0,b:{t:2,i:[{t:3}],s:"請務必在您信任的設備上打開郵件。"}},"message.error_occured":{t:0,b:{t:2,i:[{t:3}],s:"發生錯誤:"}},"message.expected_format_for_direct_input":{t:0,b:{t:2,i:[{t:3}],s:"請填入一個包含 otpauth URI 的列表,每行一條"}},"message.expire_in_x_day":{t:0,b:{t:2,i:[{t:3,v:"Expires in "},{t:4,k:"days_to_expiration"},{t:3,v:" day(s)"}]}},"message.expired_since_x":{t:0,b:{t:2,i:[{t:3,v:"Expired since "},{t:4,k:"expired_at"}]}},"message.failed_login_on":{t:0,b:{t:2,i:[{t:3,v:"登入失敗於 "},{t:4,k:"login_at"}]}},"message.failure":{t:0,b:{t:2,i:[{t:3}],s:"失敗"}},"message.fetching_data":{t:0,b:{t:2,i:[{t:3}],s:"正在獲取資料…"}},"message.keep_in_mind_share_principle":{t:0,b:{t:2,i:[{t:3}],s:"Keep in mind that sharing an account does not give permission to recipient to access sensitive data of the 2FA account but only the ability to generate OTP codes."}},"message.firefox_popup_restriction_info":{t:0,b:{t:2,i:[{t:3}],s:"Your browser (Firefox) requires a special preference to be enabled for the extension to automatically open when you capture a QR code from a webpage."}},"message.forgot_your_password":{t:0,b:{t:2,i:[{t:3}],s:"忘記密碼?"}},"message.otp_generated_by_on":{t:0,b:{t:2,i:[{t:4,k:"otp"},{t:3,v:" generated by "},{t:4,k:"requester"},{t:3,v:" on "},{t:4,k:"generated_at"}]}},"message.has_lower_case":{t:0,b:{t:2,i:[{t:3}],s:"包含小寫字母"}},"message.has_number":{t:0,b:{t:2,i:[{t:3}],s:"包含數位"}},"message.has_special_char":{t:0,b:{t:2,i:[{t:3}],s:"包含特殊字符"}},"message.has_upper_case":{t:0,b:{t:2,i:[{t:3}],s:"包含大寫字母"}},"message.help_colon":{t:0,b:{t:2,i:[{t:3}],s:"教學:"}},"message.hi_x_its_all_good":{t:0,b:{t:2,i:[{t:3,v:"您好 "},{t:4,k:"username"},{t:3,v:",驗證成功"}]}},"message.i_m_lucky_legend":{t:0,b:{t:2,i:[{t:3}],s:"「手氣不錯」 功能會嘗試從選定的圖示包中獲取圖示。「服務」 欄所填的名稱越簡單,您獲得正確圖示的機率越大。請僅提供此服務的名稱,不要填入後綴(例如 「.com」)以及特殊字符。"}},"message.if_administrator":{t:0,b:{t:2,i:[{t:3}],s:"您是管理員嗎?"}},"message.import_legend_afterpart":{t:0,b:{t:2,i:[{t:3}],s:"使用這些應用的 「導出」 功能來獲取遷移資源,例如QR Code或 JSON 檔案,然後在 2FAuth 中導入。"}},"message.import_legend":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 支援從各類 2FA 應用導入資料。"}},"message.imported":{t:0,b:{t:2,i:[{t:3}],s:"已導入"}},"message.invalid_account":{t:0,b:{t:2,i:[{t:3}],s:"- 無效帳號 -"}},"message.invalid_reset_token":{t:0,b:{t:2,i:[{t:3}],s:"此密碼重置令牌無效"}},"message.invalid_service":{t:0,b:{t:2,i:[{t:3}],s:"- 無效服務 -"}},"message.is_long_enough":{t:0,b:{t:2,i:[{t:3}],s:"至少 8 位"}},"message.is_pat_still_valid":{t:0,b:{t:2,i:[{t:3}],s:"您的 PAT 是否仍然可用?"}},"message.is_shared_with_all_users":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all users"}},"message.is_shared_with_all_users_legend":{t:0,b:{t:2,i:[{t:3}],s:"Every user of this 2FAuth instance, both current and future, can see this account and generate passwords for it."}},"message.last_seen_on_date":{t:0,b:{t:2,i:[{t:3,v:"最近活躍:"},{t:4,k:"date"}]}},"message.logos_by":{t:0,b:{t:2,i:[{t:3}],s:"Logo 來自"}},"message.lost_your_device":{t:0,b:{t:2,i:[{t:3}],s:"設備已遺失?"}},"message.made_with":{t:0,b:{t:2,i:[{t:3}],s:"基於"}},"message.make_sure_copy_token":{t:0,b:{t:2,i:[{t:3}],s:"請確保您已複製個人訪問令牌!此令牌僅展示這一次。"}},"message.manage_account_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"在身份驗證代理上管理您的帳號。"}},"message.manage_auth_at_proxy_level":{t:0,b:{t:2,i:[{t:3}],s:"在身份驗證代理上管理認證設定。"}},"message.manage_groups_legend":{t:0,b:{t:2,i:[{t:3}],s:"您可以建立分組來歸納您的帳號。無論帳號處於哪個組內,都將在 「所有帳號」 分組中顯示。"}},"message.mandatory_rules":{t:0,b:{t:2,i:[{t:3}],s:"必須"}},"message.move_selected_to":{t:0,b:{t:2,i:[{t:3}],s:"移動所選項到"}},"message.need_to_import_qrcode_punchline":{t:0,b:{t:2,i:[{t:3}],s:"Need to import one of the visible QR codes of this page into 2FAuth?"}},"message.or":{t:0,b:{t:2,i:[{t:3}],s:"或"}},"message.or_filter_by_group":{t:0,b:{t:2,i:[{t:3}],s:"或按分組篩選帳號"}},"message.ownership_can_be_transferred_legend":{t:0,b:{t:2,i:[{t:3}],s:"You can transfer the ownership of this 2FA account to another user. The new owner will have full control over it."}},"message.ownership_can_be_transferred_sharing_legend":{t:0,b:{t:2,i:[{t:3}],s:"Existing sharing settings of the account will not be impacted by the transfer."}},"message.ownership_can_be_transferred_sharing_legend_if_with_all":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with all users, you will be able to continue generating One-Time Passwords for it."}},"message.ownership_can_be_transferred_sharing_legend_if_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"If this account is currently shared with specific users, you won't see it anymore unless the new owner shares it with you afterward."}},"message.need_a_security_device_to_enable_options":{t:0,b:{t:2,i:[{t:3}],s:"若要啟用下列選項,請添加 1 個 WebAuthn 設備。"}},"message.no_account_here":{t:0,b:{t:2,i:[{t:3}],s:"無任何 2FA 帳號!"}},"message.no_entry_yet":{t:0,b:{t:2,i:[{t:3}],s:"暫無記錄"}},"message.no_group_yet":{t:0,b:{t:2,i:[{t:3}],s:"No group yet"}},"message.no_image_found_in_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"No image found in clipboard"}},"message.no_match":{t:0,b:{t:2,i:[{t:3}],s:"No match"}},"message.no_provider":{t:0,b:{t:2,i:[{t:3}],s:"暫無選項"}},"message.no_result":{t:0,b:{t:2,i:[{t:3}],s:"無結果"}},"message.no_service":{t:0,b:{t:2,i:[{t:3}],s:"- 無服務 -"}},"message.no_sso_provider_or_provider_is_missing":{t:0,b:{t:2,i:[{t:3}],s:"找不到提供方?"}},"message.not_shared":{t:0,b:{t:2,i:[{t:3}],s:"not shared"}},"message.nothing":{t:0,b:{t:2,i:[{t:3}],s:"無"}},"message.notifications.failed_login.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"這是本次事件的相關資訊"}},"message.notifications.failed_login.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"如果這是您觸發的,您可以忽略此告警。但如果不是您,且持續有登入失敗的警告的話,您應立即通知 2FAuth 的管理員去檢查相關的安全設定,並對此攻擊者採取措施。"}},"message.notifications.failed_login.resume":{t:0,b:{t:2,i:[{t:3}],s:"您的 2FAuth 帳號觸發了一次登入失敗警告。"}},"message.notifications.failed_login.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 登入失敗"}},"message.notifications.hello_user":{t:0,b:{t:2,i:[{t:3}],s:"你好,:username,"}},"message.notifications.hello":{t:0,b:{t:2,i:[{t:3}],s:"您好"}},"message.notifications.new_device.connection_details":{t:0,b:{t:2,i:[{t:3}],s:"這是本次事件的相關資訊"}},"message.notifications.new_device.recommandations":{t:0,b:{t:2,i:[{t:3}],s:"如果是您操作的,您可以忽略此告警。如果您懷疑自己的帳號有任何可疑活動,請立即更改您的密碼。"}},"message.notifications.new_device.resume":{t:0,b:{t:2,i:[{t:3}],s:"您的 2FAuth 帳號有來自新設備的登入。"}},"message.notifications.new_device.subject":{t:0,b:{t:2,i:[{t:3}],s:"來自新設備的訪問"}},"message.notifications.twofaccount_ownership_transferred.check_shares":{t:0,b:{t:2,i:[{t:3}],s:"As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate."}},"message.notifications.twofaccount_ownership_transferred.resume":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it."}},"message.notifications.twofaccount_ownership_transferred.subject":{t:0,b:{t:2,i:[{t:3}],s:"Ownership transfer on a 2FA account"}},"message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can no longer view this 2FA account or use it to generate One-Time Passwords."}},"message.notifications.twofaccount_share_revoked.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users."}},"message.notifications.twofaccount_share_revoked.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount."}},"message.notifications.twofaccount_share_revoked.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FA account sharing revoked"}},"message.notifications.twofaccount_shared.resume_all_users":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with all users."}},"message.notifications.twofaccount_shared.resume_user":{t:0,b:{t:2,i:[{t:3}],s:"We wanted to let you know that :actor shared 2FA account :twofaccount with you."}},"message.notifications.twofaccount_shared.subject":{t:0,b:{t:2,i:[{t:3}],s:"A 2FA account has been shared with you"}},"message.notifications.twofaccount_shared.use_it_to_generate_otp":{t:0,b:{t:2,i:[{t:3}],s:"You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active."}},"message.notifications.regards":{t:0,b:{t:2,i:[{t:3}],s:"此致"}},"message.notifications.reset_password.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth Password Reset"}},"message.notifications.reset_password.reason":{t:0,b:{t:2,i:[{t:3}],s:"You are receiving this email because you requested a password reset for your 2FAuth account."}},"message.notifications.reset_password.expire_in_x_minutes":{t:0,b:{t:2,i:[{t:3}],s:"This password reset link will expire in :count minutes."}},"message.notifications.reset_password.no_action_required":{t:0,b:{t:2,i:[{t:3}],s:"If you did not request a password reset, no further action is required."}},"message.notifications.test_email_settings.reason":{t:0,b:{t:2,i:[{t:3}],s:"您之所以會收到這封郵件,是因為您要求發送一封測試郵件,來驗證您 2FAuth 的上郵件發送功能是否能正常工作。"}},"message.notifications.test_email_settings.subject":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 測試郵件"}},"message.notifications.test_email_settings.success":{t:0,b:{t:2,i:[{t:3}],s:"恭喜您,功能正常 :)"}},"message.optional_rules_you_should_follow":{t:0,b:{t:2,i:[{t:3}],s:"建議 (更安全)"}},"message.or_continue_with":{t:0,b:{t:2,i:[{t:3}],s:"您也可以使用:"}},"message.otpauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"otpauth URI 是用於傳輸 2FA 資料的最常用格式。例如,當您在網站上啟用 2FA 時,顯示的QR Code就包含 otpauth URI 資料。點擊即可從 2FAuth 切換至此選項。"}},"message.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 optauth URI 列表結構導出資料"}},"message.parsing_data":{t:0,b:{t:2,i:[{t:3}],s:"正在解析資料…"}},"message.password_login_and_webauthn_are_disabled":{t:0,b:{t:2,i:[{t:3}],s:"密碼與 WebAuthn 登入已禁用。"}},"message.password_request_expired":{t:0,b:{t:2,i:[{t:3}],s:"此使用者的密碼重置請求已超時,意味著此使用者未在有效期內完成密碼重置。此請求可能是由使用者自己或其他管理員發起的。"}},"message.password_requested_on_t":{t:0,b:{t:2,i:[{t:3,v:"此使用者已申請過密碼重置 (申請時間 "},{t:4,k:"datetime"},{t:3,v:"),但未完成重置密碼的操作,且此前發送的密碼重置連結仍然有效。此請求可能是由使用者自己或其他管理員發起的。"}]}},"message.possible_duplicate":{t:0,b:{t:2,i:[{t:3}],s:"已存在相同資料的帳號"}},"message.purpose_description":{t:0,b:{t:2,i:[{t:3}],s:"此擴充功能是 2FAuth 應用的網頁插件,能讓您無需打開 2FAuth 應用,直接從瀏覽器工具欄中獲取驗證碼。"}},"message.purpose_requirements":{t:0,b:{t:2,i:[{t:3}],s:"若要使用 2FAuth 擴充功能,您必須擁有一個 2FAuth 帳號,並將其綁定到此擴充功能上。此操作需要 2FAuth 服務的 URL 以及個人訪問令牌 (PAT)。"}},"message.recover_account_instructions":{t:0,b:{t:2,i:[{t:3}],s:"為了恢復您的帳號,2FAuth 將會重置部分 WebAuthn 相關的設定,以便您可以使用信箱和密碼進行登入。"}},"message.recovery_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 將向此信箱發送包含恢復連結的郵件,請點擊郵件中的連結,並按照提示進行操作。"}},"message.registered_on_date":{t:0,b:{t:2,i:[{t:3,v:"註冊於 "},{t:4,k:"date"}]}},"message.registration_not_supported_visit_tour_instance":{t:0,b:{t:2,i:[{t:3}],s:"目前暫不支援從擴充功能插件註冊 2FA,請訪問 2FAuth 應用來添加 2FA。"}},"message.resend_email_help":{t:0,b:{t:2,i:[{t:3}],s:"使用 「重新發送郵件」 來向使用者發送新的密碼重置郵件,以便使用者可以設定新的密碼。 此操作不會更改當前的密碼,且之前的所有的密碼重置申請都將被撤銷。"}},"message.reset_extension_description_bis":{t:0,b:{t:2,i:[{t:3}],s:"如果您忘記了擴充功能的解鎖密碼,請點擊此選項。"}},"message.reset_extension_description":{t:0,b:{t:2,i:[{t:3}],s:"此操作將從擴充功能上刪除現有設定和對應的 2FAuth 資料,並允許您重新綁定一個 2FAuth 帳號。"}},"message.reset_password_help":{t:0,b:{t:2,i:[{t:3}],s:"使用 「重置密碼」 來強制重置密碼 (將會使用臨時密碼來覆蓋使用者當前的密碼),以便使用者可以設定新密碼。此操作會撤銷之前所有的密碼重置申請。"}},"message.reset_punchline":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 將向此信箱發送密碼重置連結,請點擊郵件中的連結設定新密碼。"}},"message.reset_your_password_to_delete_your_account":{t:0,b:{t:2,i:[{t:3}],s:"如果您此前使用的是 SSO 登入,請在登出後,使用 「重置密碼」 功能設定密碼。"}},"message.retry_or_reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"請嘗試刷新 (服務可能暫時無響應),或重置擴充功能並提供一個新的令牌。"}},"message.revoking_a_device_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"設備吊銷後無法恢復"}},"message.revoking_a_token_is_permanent":{t:0,b:{t:2,i:[{t:3}],s:"令牌吊銷後無法恢復"}},"message.security_devices_legend":{t:0,b:{t:2,i:[{t:3}],s:"您可以用來登入 2FAuth 的認證設備,例如安全密鑰 (如 Yubikey) 或具有生物識別能力的智慧手機 (如 Apple FaceID / TouchID)"}},"message.selected_users_meaning":{t:0,b:{t:2,i:[{t:3}],s:"Set to 'Specific users' to share this account with the users of your choice."}},"message.settings_managed_by_administrator":{t:0,b:{t:2,i:[{t:3}],s:"部分設定已被您的管理員進行管控"}},"message.share_account_with_other_users":{t:0,b:{t:2,i:[{t:3}],s:"Share this 2FA account with other users of this 2FAuth instance."}},"message.shared_account_can_be_viewed_not_full_controlled":{t:0,b:{t:2,i:[{t:3}],s:"Shared accounts can be viewed and used by other users to generate OTP codes, but only the owner can edit or delete them, or view their secrets."}},"message.shared_by_x":{t:0,b:{t:2,i:[{t:3,v:"Shared by "},{t:4,k:"username"}]}},"message.shared_since_x":{t:0,b:{t:2,i:[{t:3,v:"Since "},{t:4,k:"date"}]}},"message.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"shared with all"}},"message.shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"shared with specific users"}},"message.sign_in_using_email_password":{t:0,b:{t:2,i:[{t:3,v:"您可以使用信箱 "},{t:4,k:"email"},{t:3,v:" 與密碼 "},{t:4,k:"password"},{t:3,v:" 來連接"}]}},"message.sign_in_using_sso":{t:0,b:{t:2,i:[{t:3}],s:"選擇一個 SSO 管道來登入:"}},"message.sign_in_using":{t:0,b:{t:2,i:[{t:3}],s:"切換登入方式:"}},"message.some_translation_are_missing":{t:0,b:{t:2,i:[{t:3}],s:"發現有詞條缺少翻譯嗎?"}},"message.sso_only_form_restricted_to_admin":{t:0,b:{t:2,i:[{t:3}],s:"普通使用者必須使用 SSO 登入,僅有管理員可選用其他登入選項。"}},"message.sso_only_x_settings_are_disabled":{t:0,b:{t:2,i:[{t:3,v:"僅允許通過 SSO 進行身份認證,"},{t:4,k:"auth_method"},{t:3,v:" 已被禁用"}]}},"message.stream.camera_not_suitable.reason":{t:0,b:{t:2,i:[{t:3}],s:"已安裝的監視器不適用"}},"message.stream.camera_not_suitable.solution":{t:0,b:{t:2,i:[{t:3}],s:"請使用其他監視器或更換設備"}},"message.stream.https_required":{t:0,b:{t:2,i:[{t:3}],s:"攝影機需要 HTTPS"}},"message.stream.live_scan_cant_start":{t:0,b:{t:2,i:[{t:3}],s:"無法啟動掃描 :("}},"message.stream.need_grant_permission.click_camera_icon":{t:0,b:{t:2,i:[{t:3}],s:"通常情況下,您可以點擊瀏覽器網址列中 (或旁邊) 的相機圖示來繼續。"}},"message.stream.need_grant_permission.reason":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 沒有權限訪問您的相機"}},"message.stream.need_grant_permission.solution":{t:0,b:{t:2,i:[{t:3}],s:"2FAuth 需要您的授權才能使用此設備上的相機。如果您已點擊過 「拒絕」,且您的瀏覽器沒有再次提示您進行授權,請查找瀏覽器的文件以瞭解如何重新授權。"}},"message.stream.no_cam_on_device.reason":{t:0,b:{t:2,i:[{t:3}],s:"此設備上沒有監視器"}},"message.stream.no_cam_on_device.solution":{t:0,b:{t:2,i:[{t:3}],s:"或許您忘了連接監視器"}},"message.stream.not_readable.reason":{t:0,b:{t:2,i:[{t:3}],s:"掃描啟動失敗"}},"message.stream.not_readable.solution":{t:0,b:{t:2,i:[{t:3}],s:"監視器是否已被佔用?請確保沒有其他應用正在使用您的監視器,並再試一次"}},"message.stream.secured_context_required.reason":{t:0,b:{t:2,i:[{t:3}],s:"需要 secure 字段"}},"message.stream.secured_context_required.solution":{t:0,b:{t:2,i:[{t:3}],s:"掃描需要通過 HTTPS 協議通訊。如果您是在電腦上運行 2FAuth 程式,請切換至本地主機,不要使用其他虛擬主機"}},"message.stream.stream_api_not_supported.reason":{t:0,b:{t:2,i:[{t:3}],s:"此瀏覽器不支援 Stream API"}},"message.stream.stream_api_not_supported.solution":{t:0,b:{t:2,i:[{t:3}],s:"請換用新版瀏覽器"}},"message.submitted_data_parsed_now_accounts_are_awaiting_import":{t:0,b:{t:2,i:[{t:3}],s:"在導入的資料中找到了下列沒有被添加到 2FAuth 的帳號。"}},"message.successful_login_on":{t:0,b:{t:2,i:[{t:3,v:"成功登入於 "},{t:4,k:"login_at"}]}},"message.successful_logout_on":{t:0,b:{t:2,i:[{t:3,v:"成功退出於 "},{t:4,k:"logout_at"}]}},"message.supported_formats_for_file_upload":{t:0,b:{t:2,i:[{t:3}],s:"支援格式:json、2fas 或純文本"}},"message.supported_formats_for_qrcode_upload":{t:0,b:{t:2,i:[{t:3}],s:"支援格式:jpg、jpeg、png、bmp、gif、svg 或 webp"}},"message.this_account_is_currently_x":{t:0,b:{t:2,i:[{t:3,v:"This account is currently "},{t:4,k:"sharing_status"},{t:3,v:"."}]}},"message.this_is_not_soft_delete":{t:0,b:{t:2,i:[{t:3}],s:"資料將被永久刪除,此操作無法恢復。"}},"message.this_form_does_not_affect_existing_sharing":{t:0,b:{t:2,i:[{t:3}],s:"This form does not affect existing shares of the account. To stop sharing this account with a user, you need to revoke the sharing from the sharing settings."}},"message.throttle":{t:0,b:{t:2,i:[{t:3,v:"您嘗試登入的次數過多,請 "},{t:4,k:"seconds"},{t:3,v:" 秒後再試。"}]}},"message.token_legend":{t:0,b:{t:2,i:[{t:3}],s:"任何應用都能夠通過 「個人訪問令牌」 來與 2FAuth API 進行認證。您需要在第三方應用的請求頭 (header) 中,提供此令牌作為 Bearer 令牌。"}},"message.token_remains_valid":{t:0,b:{t:2,i:[{t:3}],s:"此操作不會弔銷正在使用中的個人訪問令牌。"}},"message.twofauth_export_format_desc":{t:0,b:{t:2,i:[{t:3}],s:"如果您的目的是建立一個備份,以備隨時恢復資料,建議您優先使用此選項,這個格式可以儲存圖示資訊。"}},"message.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 2FAuth json 結構導出資料"}},"message.twofauth_export_format_url":{t:0,b:{t:2,i:[{t:3}],s:"結構定義描述:"}},"message.twofauth_webext_teaser":{t:0,b:{t:2,i:[{t:3}],s:"可從您的 2FAuth 上獲取驗證碼的瀏覽器擴充功能。"}},"message.ui_icons_by":{t:0,b:{t:2,i:[{t:3}],s:"UI 圖示來自"}},"message.unlock_description":{t:0,b:{t:2,i:[{t:3}],s:"為了資料安全,擴充功能已被鎖定。請輸入擴充功能的密碼來訪問您的 2FA 驗證碼。"}},"message.use_buttons_to_save_or_discard":{t:0,b:{t:2,i:[{t:3}],s:"點擊對應的按鈕,即可選擇 「放棄」 或 「導入」 帳號到 2FA 列表中。"}},"message.use_security_device_to_sign_in":{t:0,b:{t:2,i:[{t:3}],s:"若要使用安全設備進行身份驗證,請根據驗證類型,插入您的密鑰設備,或取下口罩 (或手套) 進行生物驗證。"}},"message.use_those_credentials":{t:0,b:{t:2,i:[{t:3,v:"使用信箱位址 "},{t:4,k:"email"},{t:3,v:" 以及密碼 "},{t:4,k:"password"}]}},"message.user_account_controlled_by_proxy":{t:0,b:{t:2,i:[{t:3}],s:"由身份驗證代理建立的使用者帳號。"}},"message.user_has_x_active_pat":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" 個有效的令牌"}]}},"message.user_has_x_security_devices":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" 個安全設備 (通行密鑰)"}]}},"message.viewed_on":{t:0,b:{t:2,i:[{t:3,v:"查看 "},{t:4,k:"login_at"}]}},"message.warning_no_icon_pack":{t:0,b:{t:2,i:[{t:3}],s:"伺服器上未找到圖示包。"}},"message.webauthn_login_disabled":{t:0,b:{t:2,i:[{t:3}],s:"Webauthn 登入已被禁用"}},"message.webauthn_uses_trusted_devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 允許您使用信任設備 (如 Yubikeys 或具有生物識別能力的手機) 來快速、安全地登入到 2FAuth。"}},"message.welcome_to_2fauth":{t:0,b:{t:2,i:[{t:3}],s:"歡迎使用 2FAuth"}},"message.welcome_to_demo_app":{t:0,b:{t:2,i:[{t:3}],s:"歡迎使用 2FAuth 演示程式。"}},"message.welcome_to_testing_app":{t:0,b:{t:2,i:[{t:3}],s:"歡迎使用 2FAuth 測試節點"}},"message.workaround_available":{t:0,b:{t:2,i:[{t:3}],s:"This is a simple configuration change that takes less than a minute. We've prepared a step-by-step guide to help you enable this feature."}},"message.x_accounts":{t:0,b:{t:2,i:[{t:4,k:"count"},{t:3,v:" 個帳號"}]}},"message.x_is_available":{t:0,b:{t:2,i:[{t:3,v:"新版本"},{t:4,k:"version"},{t:3,v:" 已發佈!"}]}},"message.x_selected":{t:0,b:{t:2,i:[{t:3,v:"已選擇"},{t:4,k:"count"},{t:3,v:" 個"}]}},"message.you_are_up_to_date":{t:0,b:{t:2,i:[{t:3}],s:"已是最新版"}},"message.you_can_also_paste":{t:0,b:{t:2,i:[{t:3}],s:"You can also Paste your clipboard"}},"message.you_can_toggle_sharing_setting_at_any_time":{t:0,b:{t:2,i:[{t:3}],s:"You can toggle sharing setting at any time"}},"message.you_need_an_account_to_go_further":{t:0,b:{t:2,i:[{t:3}],s:"您需要一個帳號才能繼續操作,請先自行註冊。"}},"notification.account_created":{t:0,b:{t:2,i:[{t:3}],s:"帳號建立成功"}},"notification.account_updated":{t:0,b:{t:2,i:[{t:3}],s:"帳號更新成功"}},"notification.accounts_deleted":{t:0,b:{t:2,i:[{t:3}],s:"帳號刪除成功"}},"notification.accounts_moved":{t:0,b:{t:2,i:[{t:3}],s:"帳號移動成功"}},"notification.authentication_failed":{t:0,b:{t:2,i:[{t:3}],s:"驗證失敗"}},"notification.autolock_triggered_punchline":{t:0,b:{t:2,i:[{t:3}],s:"自動鎖定已觸發,您已被自動登出。"}},"notification.cache_cleared":{t:0,b:{t:2,i:[{t:3}],s:"快取已清除"}},"notification.copied_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"已複製"}},"notification.data_refreshed_to_reflect_server_changes":{t:0,b:{t:2,i:[{t:3}],s:"資料已與伺服器同步"}},"notification.device_revoked":{t:0,b:{t:2,i:[{t:3}],s:"設備吊銷成功"}},"notification.device_successfully_registered":{t:0,b:{t:2,i:[{t:3}],s:"設備註冊成功"}},"notification.group_name_saved":{t:0,b:{t:2,i:[{t:3}],s:"分組名稱已儲存"}},"notification.group_successfully_created":{t:0,b:{t:2,i:[{t:3}],s:"分組建立成功"}},"notification.group_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"分組刪除成功"}},"notification.no_available_icon_packs":{t:0,b:{t:2,i:[{t:3}],s:"無可用圖示包"}},"notification.password_changed":{t:0,b:{t:2,i:[{t:3}],s:"密碼已修改"}},"notification.password_successfully_changed":{t:0,b:{t:2,i:[{t:3}],s:"密碼修改成功"}},"notification.password_successfully_reset":{t:0,b:{t:2,i:[{t:3}],s:"密碼重置成功"}},"notification.pats_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"使用者的令牌已成功吊銷。"}},"notification.profile_saved":{t:0,b:{t:2,i:[{t:3}],s:"個人資料更新成功!"}},"notification.security_devices_succesfully_revoked":{t:0,b:{t:2,i:[{t:3}],s:"使用者的安全設備已成功吊銷。"}},"notification.setting_saved":{t:0,b:{t:2,i:[{t:3}],s:"設定已儲存"}},"notification.test_email_sent":{t:0,b:{t:2,i:[{t:3}],s:"測試郵件已發送,請檢查您的收件箱"}},"notification.token_revoked":{t:0,b:{t:2,i:[{t:3}],s:"已成功吊銷令牌"}},"notification.user_account_successfully_deleted":{t:0,b:{t:2,i:[{t:3}],s:"帳號刪除成功"}},"notification.user_created":{t:0,b:{t:2,i:[{t:3}],s:"使用者建立成功"}},"notification.user_role_updated":{t:0,b:{t:2,i:[{t:3}],s:"使用者權限已更新"}},"notification.x_valid_accounts_found":{t:0,b:{t:2,i:[{t:3,v:"找到"},{t:4,k:"count"},{t:3,v:" 個有效帳號"}]}},"pagination.next":{t:0,b:{t:2,i:[{t:3}],s:"下一頁 »"}},"pagination.previous":{t:0,b:{t:2,i:[{t:3}],s:"« 上一頁"}},"passwords.password":{t:0,b:{t:2,i:[{t:3}],s:"密碼至少為 8 位,且兩次輸入的內容必須相同。"}},"passwords.reset":{t:0,b:{t:2,i:[{t:3}],s:"密碼重置成功!"}},"passwords.sent":{t:0,b:{t:2,i:[{t:3}],s:"密碼重置郵件已發送!"}},"passwords.throttled":{t:0,b:{t:2,i:[{t:3}],s:"請稍候再試。"}},"passwords.token":{t:0,b:{t:2,i:[{t:3}],s:"密碼重置令牌無效。"}},"passwords.user":{t:0,b:{t:2,i:[{t:3}],s:"找不到此信箱對應的使用者。"}},"placeholder.search_user_placeholder":{t:0,b:{t:2,i:[{t:3}],s:"使用者名稱、信箱…"}},"test.action":{t:0,b:{t:2,i:[{t:3}],s:"This is an action"}},"test.alert":{t:0,b:{t:2,i:[{t:3}],s:"This is an alert"}},"test.info":{t:0,b:{t:2,i:[{t:3}],s:"This is an info"}},"test.success":{t:0,b:{t:2,i:[{t:3}],s:"This is a success"}},"test.warn":{t:0,b:{t:2,i:[{t:3}],s:"This is a warn"}},"title.404":{t:0,b:{t:2,i:[{t:3}],s:"找不到項目"}},"title.about":{t:0,b:{t:2,i:[{t:3}],s:"關於"}},"title.accounts":{t:0,b:{t:2,i:[{t:3}],s:"帳號"}},"title.accountSharing":{t:0,b:{t:2,i:[{t:3}],s:"Account Sharing"}},"title.admin.appSetup":{t:0,b:{t:2,i:[{t:3}],s:"系統"}},"title.admin.auth":{t:0,b:{t:2,i:[{t:3}],s:"身份認證"}},"title.admin.createUser":{t:0,b:{t:2,i:[{t:3}],s:"建立使用者"}},"title.admin.logs.access":{t:0,b:{t:2,i:[{t:3}],s:"訪問日誌"}},"title.admin.manageUser":{t:0,b:{t:2,i:[{t:3}],s:"使用者管理"}},"title.admin.users":{t:0,b:{t:2,i:[{t:3}],s:"使用者"}},"title.autolock":{t:0,b:{t:2,i:[{t:3}],s:"自動鎖定"}},"title.capture":{t:0,b:{t:2,i:[{t:3}],s:"掃描QR Code"}},"title.createAccount":{t:0,b:{t:2,i:[{t:3}],s:"建立帳號"}},"title.createGroup":{t:0,b:{t:2,i:[{t:3}],s:"建立分組"}},"title.editAccount":{t:0,b:{t:2,i:[{t:3}],s:"編輯帳號"}},"title.editGroup":{t:0,b:{t:2,i:[{t:3}],s:"編輯分組"}},"title.flooded":{t:0,b:{t:2,i:[{t:3}],s:"請求數過多"}},"title.genericError":{t:0,b:{t:2,i:[{t:3}],s:"錯誤"}},"title.groups":{t:0,b:{t:2,i:[{t:3}],s:"分組"}},"title.importAccounts":{t:0,b:{t:2,i:[{t:3}],s:"導入帳號"}},"title.landing":{t:0,b:{t:2,i:[{t:3}],s:"登入頁"}},"title.login":{t:0,b:{t:2,i:[{t:3}],s:"登入"}},"title.otpLogs":{t:0,b:{t:2,i:[{t:3}],s:"OTP generation log"}},"title.password.request":{t:0,b:{t:2,i:[{t:3}],s:"重置密碼"}},"title.password.reset":{t:0,b:{t:2,i:[{t:3}],s:"新密碼"}},"title.reset_extension":{t:0,b:{t:2,i:[{t:3}],s:"重置擴充功能"}},"title.register":{t:0,b:{t:2,i:[{t:3}],s:"註冊新帳號"}},"title.settings.account":{t:0,b:{t:2,i:[{t:3}],s:"帳號"}},"title.settings.oauth.generatePAT":{t:0,b:{t:2,i:[{t:3}],s:"新建個人令牌"}},"title.settings.oauth.tokens":{t:0,b:{t:2,i:[{t:3}],s:"OAuth 令牌"}},"title.settings.options":{t:0,b:{t:2,i:[{t:3}],s:"選項"}},"title.settings.webauthn.devices":{t:0,b:{t:2,i:[{t:3}],s:"WebAuthn 設備"}},"title.settings.webauthn.editCredential":{t:0,b:{t:2,i:[{t:3}],s:"編輯設備"}},"title.settings":{t:0,b:{t:2,i:[{t:3}],s:"使用者設定"}},"title.shareAccount":{t:0,b:{t:2,i:[{t:3}],s:"Share account"}},"title.showQRcode":{t:0,b:{t:2,i:[{t:3}],s:"從QR Code獲取帳號"}},"title.start":{t:0,b:{t:2,i:[{t:3}],s:"新建帳號"}},"title.transferOwnership":{t:0,b:{t:2,i:[{t:3}],s:"Transfer ownership"}},"title.unlock":{t:0,b:{t:2,i:[{t:3}],s:"解鎖"}},"title.webauthn.lost":{t:0,b:{t:2,i:[{t:3}],s:"恢復帳號"}},"title.webauthn.recover":{t:0,b:{t:2,i:[{t:3}],s:"註冊新設備"}},"tooltip.clear_search":{t:0,b:{t:2,i:[{t:3}],s:"清除搜尋結果"}},"tooltip.clear_selection":{t:0,b:{t:2,i:[{t:3}],s:"清除選擇"}},"tooltip.close_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"關閉 "},{t:4,k:"pagetitle"},{t:3,v:" 頁"}]}},"tooltip.create_new_group":{t:0,b:{t:2,i:[{t:3}],s:"Create a new group"}},"tooltip.copy_next_password":{t:0,b:{t:2,i:[{t:3}],s:"複製下一個驗證碼"}},"tooltip.copy_to_clipboard":{t:0,b:{t:2,i:[{t:3}],s:"複製到剪貼簿"}},"tooltip.delete":{t:0,b:{t:2,i:[{t:3}],s:"刪除"}},"tooltip.delete_account":{t:0,b:{t:2,i:[{t:3}],s:"Delete account"}},"tooltip.delete_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Delete selected accounts"}},"tooltip.detect_qrcode_in_page":{t:0,b:{t:2,i:[{t:3}],s:"Detect QR codes in the active webpage"}},"tooltip.discard_this_account":{t:0,b:{t:2,i:[{t:3}],s:"放棄導入此帳號"}},"tooltip.edit_account":{t:0,b:{t:2,i:[{t:3}],s:"Edit account"}},"tooltip.edit_group":{t:0,b:{t:2,i:[{t:3}],s:"Edit group"}},"tooltip.edit_sharing":{t:0,b:{t:2,i:[{t:3}],s:"Edit sharing"}},"tooltip.export_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"導出選中的帳號"}},"tooltip.generate_a_test_password":{t:0,b:{t:2,i:[{t:3}],s:"生成測試密碼"}},"tooltip.go_back_to_the_x_page":{t:0,b:{t:2,i:[{t:3,v:"回到 "},{t:4,k:"pagetitle"},{t:3,v:" 頁面"}]}},"tooltip.hide_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"隱藏分組篩選"}},"tooltip.hide_password":{t:0,b:{t:2,i:[{t:3}],s:"隱藏密碼"}},"tooltip.import_this_account":{t:0,b:{t:2,i:[{t:3}],s:"導入此帳號"}},"tooltip.lock":{t:0,b:{t:2,i:[{t:3}],s:"鎖定"}},"tooltip.manage":{t:0,b:{t:2,i:[{t:3}],s:"管理"}},"tooltip.manage_your_groups":{t:0,b:{t:2,i:[{t:3}],s:"Manage your groups"}},"tooltip.move_selected_to_group":{t:0,b:{t:2,i:[{t:3}],s:"移動所選項到分組中"}},"tooltip.otpauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 optauth URI 列表結構導出資料"}},"tooltip.refresh_icon_pack_list":{t:0,b:{t:2,i:[{t:3}],s:"刷新圖示包列表"}},"tooltip.rename":{t:0,b:{t:2,i:[{t:3}],s:"重命名"}},"tooltip.resend_email_title":{t:0,b:{t:2,i:[{t:3}],s:"重新發送密碼重置郵件給使用者"}},"tooltip.reset_password_title":{t:0,b:{t:2,i:[{t:3}],s:"重置使用者密碼"}},"tooltip.reveal_password":{t:0,b:{t:2,i:[{t:3}],s:"顯示密碼"}},"tooltip.revoke_all_devices_for_user":{t:0,b:{t:2,i:[{t:3}],s:"吊銷使用者的所有安全設備"}},"tooltip.revoke_all_pat_for_user":{t:0,b:{t:2,i:[{t:3}],s:"吊銷使用者的所有令牌"}},"tooltip.revoke":{t:0,b:{t:2,i:[{t:3}],s:"吊銷"}},"tooltip.search":{t:0,b:{t:2,i:[{t:3}],s:"搜尋​​​​"}},"tooltip.select_all":{t:0,b:{t:2,i:[{t:3}],s:"全選"}},"tooltip.share_this_account":{t:0,b:{t:2,i:[{t:3}],s:"Share this account"}},"tooltip.share_with_new_users":{t:0,b:{t:2,i:[{t:3}],s:"Add new user sharing"}},"tooltip.shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"Shared with all"}},"tooltip.show_group_selector":{t:0,b:{t:2,i:[{t:3}],s:"顯示分組篩選"}},"tooltip.show_last_month_log":{t:0,b:{t:2,i:[{t:3}],s:"顯示上個月的條目"}},"tooltip.show_one_year_log":{t:0,b:{t:2,i:[{t:3}],s:"顯示上一年的條目"}},"tooltip.show_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"顯示QR Code"}},"tooltip.show_six_months_log":{t:0,b:{t:2,i:[{t:3}],s:"顯示最近 6 個月的條目"}},"tooltip.show_three_months_log":{t:0,b:{t:2,i:[{t:3}],s:"顯示最近 3 個月的條目"}},"tooltip.sign_in_using_security_device":{t:0,b:{t:2,i:[{t:3}],s:"使用安全設備登入"}},"tooltip.sort_ascending":{t:0,b:{t:2,i:[{t:3}],s:"升序排序"}},"tooltip.sort_by_date_asc":{t:0,b:{t:2,i:[{t:3}],s:"倒序顯示最近訪問"}},"tooltip.sort_by_date_desc":{t:0,b:{t:2,i:[{t:3}],s:"順序顯示最近訪問"}},"tooltip.sort_descending":{t:0,b:{t:2,i:[{t:3}],s:"降序排列"}},"tooltip.this_account_is_shared_by_x_with_you":{t:0,b:{t:2,i:[{t:4,k:"username"},{t:3,v:" shares this account with you"}]}},"tooltip.this_account_is_shared_with_all":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with all users"}},"tooltip.this_account_is_shared_with_specific_users":{t:0,b:{t:2,i:[{t:3}],s:"You share this account with specific users"}},"tooltip.twofauth_export_format_sub":{t:0,b:{t:2,i:[{t:3}],s:"以 2FAuth json 結構導出資料"}},"tooltip.unlock":{t:0,b:{t:2,i:[{t:3}],s:"解鎖 (注意安全風險)"}},"tooltip.unshare_selected_accounts":{t:0,b:{t:2,i:[{t:3}],s:"Revoke all shares on selected accounts"}},"tooltip.use_qrcode":{t:0,b:{t:2,i:[{t:3}],s:"掃描QR Code,自動填寫表單"}},"tooltip.visit_x":{t:0,b:{t:2,i:[{t:3,v:"訪問 "},{t:4,k:"website"}]}},"validation.accepted_if":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 為 :value 時,必須允許 :attribute 。"}},"validation.accepted":{t:0,b:{t:2,i:[{t:3}],s:"必須允許 :attribute。"}},"validation.active_url":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的網址。"}},"validation.after_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須要等於 :date 或更晚。"}},"validation.after":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須要晚於 :date。"}},"validation.alpha_dash":{t:0,b:{t:2,i:[{t:3}],s:":attribute 只能由字母、數位、減號 (-) 與底線 (_) 組成。"}},"validation.alpha_num":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須包含字母與數位"}},"validation.alpha":{t:0,b:{t:2,i:[{t:3}],s:":attribute 只能包含字母。"}},"validation.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是一個陣列。"}},"validation.ascii":{t:0,b:{t:2,i:[{t:3}],s:":attribute 只能包含單個字母和符號。"}},"validation.before_or_equal":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須要等於 :date 或更早。"}},"validation.before":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須要早於 :date。"}},"validation.between.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須介於 :min - :max 位之間。"}},"validation.between.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須介於 :min - :max KB 之間。"}},"validation.between.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須介於 :min - :max 之間。"}},"validation.between.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須介於 :min - :max 個字符之間。"}},"validation.boolean":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須為布爾值。"}},"validation.can":{t:0,b:{t:2,i:[{t:3}],s:":attribute 字段包含非法的值。"}},"validation.confirmed":{t:0,b:{t:2,i:[{t:3}],s:":attribute 兩次輸入不一致。"}},"validation.contains":{t:0,b:{t:2,i:[{t:3}],s:":attribute 缺少必需的值。"}},"validation.current_password":{t:0,b:{t:2,i:[{t:3}],s:"密碼錯誤"}},"validation.custom.account.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能包含冒號。"}},"validation.custom.email.ComplyWithEmailRestrictionPolicy":{t:0,b:{t:2,i:[{t:3}],s:"此信箱位址不允許註冊"}},"validation.custom.email.exists":{t:0,b:{t:2,i:[{t:3}],s:"未找到與此信箱匹配的帳號。"}},"validation.custom.email.IsValidEmailList":{t:0,b:{t:2,i:[{t:3}],s:"所有信箱位址必須是有效的,並用管道符隔開"}},"validation.custom.icon.image":{t:0,b:{t:2,i:[{t:3}],s:"僅支援 jpeg、png、bmp、gif、svg 或 webp 格式。"}},"validation.custom.ids.regex":{t:0,b:{t:2,i:[{t:3}],s:"ID 必須以逗號分隔,且不能以逗號結尾。"}},"validation.custom.label.required":{t:0,b:{t:2,i:[{t:3}],s:"必須未 url 分配一個標籤。"}},"validation.custom.otp_type.in":{t:0,b:{t:2,i:[{t:3}],s:"不支援 :attribute 項。"}},"validation.custom.qrcode.image":{t:0,b:{t:2,i:[{t:3}],s:"僅支援 jpeg、png、bmp、gif、svg 或 webp 格式。"}},"validation.custom.secret.isBase32Encoded":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是 Base32 編碼的字符串。"}},"validation.custom.service.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能包含冒號。"}},"validation.custom.uri.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不是有效的 otpauth uri。"}},"validation.date_equals":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須要等於 :date。"}},"validation.date_format":{t:0,b:{t:2,i:[{t:3}],s:":attribute 的格式必須為 :format。"}},"validation.date":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是有效的日期格式。"}},"validation.decimal":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須有 :decimal 位小數。"}},"validation.declined_if":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 為 :value 時,必須拒絕 :attribute 。"}},"validation.declined":{t:0,b:{t:2,i:[{t:3}],s:"必須拒絕 :attribute。"}},"validation.different":{t:0,b:{t:2,i:[{t:3}],s:":attribute 與 :other 必須不同。"}},"validation.digits_between":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須介於 :min 和 :max 位數位之間。"}},"validation.digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須為 :digits 位數位。"}},"validation.dimensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute 圖片尺寸不正確。"}},"validation.distinct":{t:0,b:{t:2,i:[{t:3}],s:":attribute 已經存在。"}},"validation.doesnt_end_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能以這些值結尾::values。"}},"validation.doesnt_start_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能以這些值開頭::values。"}},"validation.email":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的信箱。"}},"validation.ends_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須以 :values 為結尾。"}},"validation.enum":{t:0,b:{t:2,i:[{t:3}],s:"選中的 :attribute 無效。"}},"validation.exists":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不存在。"}},"validation.extensions":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須包含以下副檔名之一 :values。"}},"validation.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是檔案。"}},"validation.filled":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能為空。"}},"validation.gt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :value 個項。"}},"validation.gt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須大於 :value KB。"}},"validation.gt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須大於 :value。"}},"validation.gt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :value 個字符。"}},"validation.gte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :value 個項。"}},"validation.gte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須大於或等於 :value KB。"}},"validation.gte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須大於或等於 :value。"}},"validation.gte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少為 :value 個字符。"}},"validation.hex_color":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須為有效的 HEX 顏色碼。"}},"validation.IconPackExists":{t:0,b:{t:2,i:[{t:3}],s:"無法在伺服器上找到該圖示包。"}},"validation.image":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是圖片。"}},"validation.in_array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須在 :other 中。"}},"validation.in":{t:0,b:{t:2,i:[{t:3}],s:"已選的屬性 :attribute 無效。"}},"validation.integer":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是整數。"}},"validation.ip":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的 IP 位址。"}},"validation.ipv4":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的 IPv4 位址。"}},"validation.ipv6":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的 IPv6 位址。"}},"validation.IsValidRegex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的 regex 表達式。"}},"validation.json":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的 JSON 字符串。"}},"validation.list":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須為列表。"}},"validation.lowercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是小寫字母。"}},"validation.lt.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最多包含 :value 個項。"}},"validation.lt.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須小於 :value KB。"}},"validation.lt.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須小於 :value。"}},"validation.lt.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須少於 :value 個字符。"}},"validation.lte.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須少於或等於 :value 個元素。"}},"validation.lte.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須小於或等於 :value KB。"}},"validation.lte.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須小於或等於 :value。"}},"validation.lte.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須小於或等於 :value 個字符。"}},"validation.mac_address":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是正確的 MAC 位址。"}},"validation.max_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須少於 :max 位。"}},"validation.max.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最多為 :max 項。"}},"validation.max.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最大為 :max KB。"}},"validation.max.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須小於 :max。"}},"validation.max.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 最大為 :max 個字符。"}},"validation.mimes":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是一個 :values 類型的檔案。"}},"validation.mimetypes":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是一個 :values 類型的檔案。"}},"validation.min_digits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少為 :min 位。"}},"validation.min.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少包含 :min 個項。"}},"validation.min.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少為 :min KB。"}},"validation.min.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少為 :min。"}},"validation.min.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少為 :min 個字符。"}},"validation.missing_if":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 為 :value 時 :attribute 必須為空。"}},"validation.missing_unless":{t:0,b:{t:2,i:[{t:3}],s:"除非 :other 為 :value,否則 :attribute 必須為空。"}},"validation.missing_with_all":{t:0,b:{t:2,i:[{t:3}],s:"當 :value 存在時,:attribute 必須為空。"}},"validation.missing_with":{t:0,b:{t:2,i:[{t:3}],s:"當 :value 存在時,:attribute 必須為空。"}},"validation.missing":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須為空。"}},"validation.multiple_of":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是 :value 的倍數。"}},"validation.not_in":{t:0,b:{t:2,i:[{t:3}],s:"已選的屬性 :attribute 非法。"}},"validation.not_regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 的格式錯誤。"}},"validation.not_current_owner":{t:0,b:{t:2,i:[{t:3}],s:"The new owner must not be the current owner."}},"validation.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是一個數位。"}},"validation.onlyCustomOtpWithUri":{t:0,b:{t:2,i:[{t:3}],s:"「uri」 參數必須單獨提供,或與 「custom_otp」 參數同時提供。"}},"validation.password.letters":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一個字母。"}},"validation.password.mixed":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一個大寫字母和一個小寫字母。"}},"validation.password.numbers":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一個數位。"}},"validation.password.symbols":{t:0,b:{t:2,i:[{t:3}],s:":attribute 至少要包含一個符號。"}},"validation.password.uncompromised":{t:0,b:{t:2,i:[{t:3}],s:"輸入的 :attribute 已在資料洩露中出現過。請選擇其他的 :attribute。"}},"validation.present_if":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 為 :value 時,:attribute 為必填項"}},"validation.present_unless":{t:0,b:{t:2,i:[{t:3}],s:"除非 :other 為 :value,否則 :attribute 為必填項。"}},"validation.present_with_all":{t:0,b:{t:2,i:[{t:3}],s:"當存在 :values 時,:attribute 為必填項。"}},"validation.present_with":{t:0,b:{t:2,i:[{t:3}],s:"當 :values 存在時,:attribute 為必填項。"}},"validation.present":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須存在。"}},"validation.prohibited_if":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 為 :value 時,:attribute 字段被禁止。"}},"validation.prohibited_unless":{t:0,b:{t:2,i:[{t:3}],s:"除非 :other 為 :values,否則 :attribute 字段會被禁止。"}},"validation.prohibited":{t:0,b:{t:2,i:[{t:3}],s:"已禁止 :attribute 字段。"}},"validation.prohibits":{t:0,b:{t:2,i:[{t:3}],s:":attribute 字段禁止出現 :other。"}},"validation.regex":{t:0,b:{t:2,i:[{t:3}],s:":attribute 格式錯誤。"}},"validation.required_array_keys":{t:0,b:{t:2,i:[{t:3}],s:":attribute 字段必須包含: :values。"}},"validation.required_if_accepted":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 存在時,:attribute 不能為空。"}},"validation.required_if_declined":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 不存在時,:attribute 不能為空。"}},"validation.required_if":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 為 :value 時 :attribute 不能為空。"}},"validation.required_unless":{t:0,b:{t:2,i:[{t:3}],s:"當 :other 不為 :values 時 :attribute 不能為空。"}},"validation.required_with_all":{t:0,b:{t:2,i:[{t:3}],s:"當 :values 存在時 :attribute 不能為空。"}},"validation.required_with":{t:0,b:{t:2,i:[{t:3}],s:"當 :values 存在時 :attribute 不能為空。"}},"validation.required_without_all":{t:0,b:{t:2,i:[{t:3}],s:"當 :values 都不存在時 :attribute 不能為空。"}},"validation.required_without":{t:0,b:{t:2,i:[{t:3}],s:"當 :values 不存在時 :attribute 不能為空。"}},"validation.required":{t:0,b:{t:2,i:[{t:3}],s:":attribute 不能為空。"}},"validation.same":{t:0,b:{t:2,i:[{t:3}],s:":attribute 與 :other 必須相同。"}},"validation.single":{t:0,b:{t:2,i:[{t:3}],s:"當使用 :attribute 時,請求的封包中只能包含這一種參數。"}},"validation.size.array":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須包含 :size 項。"}},"validation.size.file":{t:0,b:{t:2,i:[{t:3}],s:":attribute 大小必須為 :size KB。"}},"validation.size.numeric":{t:0,b:{t:2,i:[{t:3}],s:":attribute 大小必須為 :size。"}},"validation.size.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須為 :size 個字符。"}},"validation.starts_with":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須以 :values 開頭。"}},"validation.string":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須為字符串。"}},"validation.timezone":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是一個有效的時區。"}},"validation.ulid":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是有效的 ULID。"}},"validation.unique":{t:0,b:{t:2,i:[{t:3}],s:":attribute 已經存在。"}},"validation.uploaded":{t:0,b:{t:2,i:[{t:3}],s:":attribute 上傳失敗。"}},"validation.uppercase":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是大寫字母。"}},"validation.url":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是有效的 URL。"}},"validation.uuid":{t:0,b:{t:2,i:[{t:3}],s:":attribute 必須是有效的 UUID。"}}}}),hh=Of({locale:document.documentElement.lang,fallbackLocale:"en",globalInjection:!0,messages:jf});(function(){var t;try{if(typeof document<"u"){var e=document.createElement("style");e.nonce=(t=document.head.querySelector("meta[property=csp-nonce]"))==null?void 0:t.content,e.appendChild(document.createTextNode(".vue-notification-group{display:block;position:fixed;z-index:5000}.vue-notification-wrapper{display:block;overflow:hidden;width:100%;margin:0;padding:0}.notification-title{font-weight:600}.vue-notification-template{display:block;box-sizing:border-box;background:#fff;text-align:left}.vue-notification{display:block;box-sizing:border-box;text-align:left;font-size:12px;padding:10px;margin:0 5px 5px;color:#fff;background:#44a4fc;border-left:5px solid #187FE7}.vue-notification.warn{background:#ffb648;border-left-color:#f48a06}.vue-notification.error{background:#e54d42;border-left-color:#b82e24}.vue-notification.success{background:#68cd86;border-left-color:#42a85f}.vn-fade-enter-active,.vn-fade-leave-active,.vn-fade-move{transition:all .5s}.vn-fade-enter-from,.vn-fade-leave-to{opacity:0}")),document.head.appendChild(e)}}catch(i){console.error("vite-plugin-css-injected-by-js",i)}})();const ph=new Map;function Mf(t){return{all:t=t||new Map,on:function(e,i){var s=t.get(e);s?s.push(i):t.set(e,[i])},off:function(e,i){var s=t.get(e);s&&(i?s.splice(s.indexOf(i)>>>0,1):t.set(e,[]))},emit:function(e,i){var s=t.get(e);s&&s.slice().map(function(a){a(i)}),(s=t.get("*"))&&s.slice().map(function(a){a(e,i)})}}}const Gs=Mf(),pn="[-+]?[0-9]*.?[0-9]+",Wd=[{name:"px",regexp:new RegExp(`^${pn}px$`)},{name:"%",regexp:new RegExp(`^${pn}%$`)},{name:"px",regexp:new RegExp(`^${pn}$`)}],Wf=t=>{if(t==="auto")return{type:t,value:0};for(let e=0;e{switch(typeof t){case"number":return{type:"px",value:t};case"string":return Wf(t);default:return{type:"",value:t}}},Bd={x:new Set(["left","center","right"]),y:new Set(["top","bottom"])},$f=(t=>()=>t++)(0),Hf=t=>typeof t!="string"?[]:t.split(/\s+/gi).filter(Boolean),Gf=t=>{typeof t=="string"&&(t=Hf(t));let e=null,i=null;return t.forEach(s=>{Bd.y.has(s)&&(i=s),Bd.x.has(s)&&(e=s)}),{x:e,y:i}},mn={position:["top","right"],cssAnimation:"vn-fade",velocityAnimation:{enter:t=>({height:[t.clientHeight,0],opacity:[1,0]}),leave:{height:0,opacity:[0,1]}}},Vf=(t,e)=>{let i,s,a=e;const o=()=>{s=Date.now(),i=setTimeout(t,a)},r=()=>{clearTimeout(i),a-=Date.now()-s};return o(),{start:o,stop:r}};function Qf(t){return typeof t=="function"||Object.prototype.toString.call(t)==="[object Object]"&&!ea(t)}const vo={IDLE:0,DESTROYED:2},Kf=ni({name:"notifications",props:{group:{type:String,default:""},width:{type:[Number,String],default:300},reverse:{type:Boolean,default:!1},position:{type:[String,Array],default:()=>mn.position},classes:{type:[String,Array],default:"vue-notification"},animationType:{type:String,default:"css",validator(t){return t==="css"||t==="velocity"}},animation:{type:Object,default(){return mn.velocityAnimation}},animationName:{type:String,default:mn.cssAnimation},speed:{type:Number,default:300},duration:{type:Number,default:3e3},delay:{type:Number,default:0},max:{type:Number,default:1/0},ignoreDuplicates:{type:Boolean,default:!1},closeOnClick:{type:Boolean,default:!0},pauseOnHover:{type:Boolean,default:!1},dangerouslySetInnerHtml:{type:Boolean,default:!1}},emits:{click:t=>!0,destroy:t=>!0,start:t=>!0},slots:Object,setup:(t,{emit:e,slots:i,expose:s})=>{const a=vt([]),o=ph.get("velocity"),r=st(()=>t.animationType==="velocity"),n=st(()=>a.value.filter(q=>q.state!==vo.DESTROYED)),l=st(()=>Bf(t.width)),u=st(()=>{const{x:q,y:N}=Gf(t.position),Q=l.value.value,z=l.value.type,X={width:Q+z};return N&&(X[N]="0px"),q&&(q==="center"?X.left=`calc(50% - ${+Q/2}${z})`:X[q]="0px"),X}),d=st(()=>r.value?{onEnter:P,onLeave:F,onAfterLeave:B}:{}),c=q=>{e("click",q),t.closeOnClick&&w(q)},_=q=>{var N;t.pauseOnHover&&((N=q.timer)==null||N.stop())},p=q=>{var N;t.pauseOnHover&&((N=q.timer)==null||N.start())},v=(q={})=>{if(q.group||(q.group=""),q.data||(q.data={}),t.group!==q.group)return;if(q.clean||q.clear){f();return}const N=typeof q.duration=="number"?q.duration:t.duration,Q=typeof q.speed=="number"?q.speed:t.speed,z=typeof q.ignoreDuplicates=="boolean"?q.ignoreDuplicates:t.ignoreDuplicates,{title:X,text:L,type:tt,data:et,id:ht}=q,mt={id:ht||$f(),title:X,text:L,type:tt,state:vo.IDLE,speed:Q,length:N+2*Q,data:et,duplicates:0};N>=0&&(mt.timer=Vf(()=>w(mt),mt.length));const yt="bottom"in u.value,Pt=t.reverse?!yt:yt;let _t=-1;const lt=n.value.find(gt=>gt.title===q.title&>.text===q.text);if(z&<){lt.duplicates++;return}Pt?(a.value.push(mt),e("start",mt),n.value.length>t.max&&(_t=0)):(a.value.unshift(mt),e("start",mt),n.value.length>t.max&&(_t=n.value.length-1)),_t!==-1&&w(n.value[_t])},g=q=>{x(q)},y=q=>["vue-notification-template",t.classes,q.type||""],m=q=>r.value?void 0:{transition:`all ${q.speed}ms`},w=q=>{var N;(N=q.timer)==null||N.stop(),q.state=vo.DESTROYED,B(),e("destroy",q)},x=q=>{const N=a.value.find(Q=>Q.id===q);N&&w(N)},f=()=>{n.value.forEach(w)},T=(q,N)=>{var Q;const z=(Q=t.animation)==null?void 0:Q[q];return typeof z=="function"?z(N):z},P=(q,N)=>{const Q=T("enter",q);o(q,Q,{duration:t.speed,complete:N})},F=(q,N)=>{const Q=T("leave",q);o(q,Q,{duration:t.speed,complete:N})};function B(){a.value=a.value.filter(q=>q.state!==vo.DESTROYED)}return Ie(()=>{Gs.on("add",v),Gs.on("close",g)}),Qi(()=>{Gs.off("add",v),Gs.off("close",g)}),()=>{let q;return rt("div",{class:"vue-notification-group",style:u.value},[rt(Jg,ba(d.value,{tag:"div",css:!r.value,name:t.animationName}),Qf(q=n.value.map(N=>rt("div",{key:N.id,class:"vue-notification-wrapper",style:m(N),"data-id":N.id,onMouseenter:()=>_(N),onMouseleave:()=>p(N)},[i.body?i.body({item:N,class:[t.classes,N.type],close:()=>w(N)}):rt("div",{class:y(N),onClick:()=>c(N)},[t.dangerouslySetInnerHtml?rt(xt,null,[N.title?rt("div",{class:"notification-title",innerHTML:N.title},null):null,rt("div",{class:"notification-content",innerHTML:N.text},null)]):rt(xt,null,[N.title?rt("div",{class:"notification-title"},[N.title]):null,rt("div",{class:"notification-content"},[N.text])])])])))?q:{default:()=>[q]})])}}}),Zl=t=>{typeof t=="string"&&(t={title:"",text:t}),typeof t=="object"&&Gs.emit("add",t)};Zl.close=t=>{Gs.emit("close",t)};const Yf=()=>({notify:Zl}),Jf="Notifications";function Zf(t,e={}){Object.entries(e).forEach(s=>ph.set(...s));const i=e.name||"notify";t.config.globalProperties["$"+i]=Zl,t.component(e.componentName||Jf,Kf)}const Xf={install:Zf};const Ws=typeof document<"u";function mh(t){return typeof t=="object"||"displayName"in t||"props"in t||"__vccOpts"in t}function t3(t){return t.__esModule||t[Symbol.toStringTag]==="Module"||t.default&&mh(t.default)}const Ut=Object.assign;function gn(t,e){const i={};for(const s in e){const a=e[s];i[s]=ri(a)?a.map(t):t(a)}return i}const Ca=()=>{},ri=Array.isArray;function $d(t,e){const i={};for(const s in t)i[s]=s in e?e[s]:t[s];return i}const gh=Symbol("");function aa(t,e){return Ut(new Error,{type:t,[gh]:!0},e)}function Pi(t,e){return t instanceof Error&&gh in t&&(e==null||!!(t.type&e))}const fh=Symbol(""),Hd=Symbol(""),Nr=Symbol(""),Xl=Symbol(""),ol=Symbol("");function KP(){return Jt(Nr)}function e3(t){return Jt(Xl)}const vh=/#/g,i3=/&/g,s3=/\//g,a3=/=/g,o3=/\?/g,wh=/\+/g,r3=/%5B/g,n3=/%5D/g,yh=/%5E/g,l3=/%60/g,kh=/%7B/g,u3=/%7C/g,Ah=/%7D/g,d3=/%20/g;function tu(t){return t==null?"":encodeURI(""+t).replace(u3,"|").replace(r3,"[").replace(n3,"]")}function c3(t){return tu(t).replace(kh,"{").replace(Ah,"}").replace(yh,"^")}function rl(t){return tu(t).replace(wh,"%2B").replace(d3,"+").replace(vh,"%23").replace(i3,"%26").replace(l3,"`").replace(kh,"{").replace(Ah,"}").replace(yh,"^")}function b3(t){return rl(t).replace(a3,"%3D")}function _3(t){return tu(t).replace(vh,"%23").replace(o3,"%3F")}function h3(t){return _3(t).replace(s3,"%2F")}function ar(t){if(t==null)return null;try{return decodeURIComponent(""+t)}catch{}return""+t}const p3=/\/$/,m3=t=>t.replace(p3,"");function fn(t,e,i="/"){let s,a={},o="",r="";const n=e.indexOf("#");let l=e.indexOf("?");return l=n>=0&&l>n?-1:l,l>=0&&(s=e.slice(0,l),o=e.slice(l,n>0?n:e.length),a=t(o.slice(1))),n>=0&&(s=s||e.slice(0,n),r=e.slice(n,e.length)),s=w3(s??e,i),{fullPath:s+o+r,path:s,query:a,hash:ar(r)}}function g3(t,e){const i=e.query?t(e.query):"";return e.path+(i&&"?")+i+(e.hash||"")}function Gd(t,e){return!e||!t.toLowerCase().startsWith(e.toLowerCase())?t:t.slice(e.length)||"/"}function f3(t,e,i){const s=e.matched.length-1,a=i.matched.length-1;return s>-1&&s===a&&oa(e.matched[s],i.matched[a])&&xh(e.params,i.params)&&t(e.query)===t(i.query)&&e.hash===i.hash}function oa(t,e){return(t.aliasOf||t)===(e.aliasOf||e)}function xh(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var i in t)if(!v3(t[i],e[i]))return!1;return!0}function v3(t,e){return ri(t)?Vd(t,e):ri(e)?Vd(e,t):(t&&t.valueOf())===(e&&e.valueOf())}function Vd(t,e){return ri(e)?t.length===e.length&&t.every((i,s)=>i===e[s]):t.length===1&&t[0]===e}function w3(t,e){if(t.startsWith("/"))return t;if(!t)return e;const i=e.split("/"),s=t.split("/"),a=s[s.length-1];(a===".."||a===".")&&s.push("");let o=i.length-1,r,n;for(r=0;r1&&o--;else break;return i.slice(0,o).join("/")+"/"+s.slice(r).join("/")}const Ji={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};function y3(t){if(!t)if(Ws){const e=document.querySelector("base");t=e&&e.getAttribute("href")||"/",t=t.replace(/^\w+:\/\/[^/]+/,"")}else t="/";return t[0]!=="/"&&t[0]!=="#"&&(t="/"+t),m3(t)}const k3=/^[^#]+#/;function A3(t,e){return t.replace(k3,"#")+e}function x3(t,e){const i=document.documentElement.getBoundingClientRect(),s=t.getBoundingClientRect();return{behavior:e.behavior,left:s.left-i.left-(e.left||0),top:s.top-i.top-(e.top||0)}}const Lr=()=>({left:window.scrollX,top:window.scrollY});function T3(t){let e;if("el"in t){const i=t.el,s=typeof i=="string"&&i.startsWith("#"),a=typeof i=="string"?s?document.getElementById(i.slice(1)):document.querySelector(i):i;if(!a)return;e=x3(a,t)}else e=t;"scrollBehavior"in document.documentElement.style?window.scrollTo(e):window.scrollTo(e.left!=null?e.left:window.scrollX,e.top!=null?e.top:window.scrollY)}function Qd(t,e){return(history.state?history.state.position-e:-1)+t}const nl=new Map;function S3(t,e){nl.set(t,e)}function F3(t){const e=nl.get(t);return nl.delete(t),e}function P3(t){return typeof t=="string"||t&&typeof t=="object"}function Th(t){return typeof t=="string"||typeof t=="symbol"}function E3(t){const e={};if(t===""||t==="?")return e;const i=(t[0]==="?"?t.slice(1):t).split("&");for(let s=0;sa&&rl(a)):[s&&rl(s)]).forEach(a=>{a!==void 0&&(e+=(e.length?"&":"")+i,a!=null&&(e+="="+a))})}return e}function O3(t){const e={};for(const i in t){const s=t[i];s!==void 0&&(e[i]=ri(s)?s.map(a=>a==null?null:""+a):s==null?s:""+s)}return e}function wa(){let t=[];function e(s){return t.push(s),()=>{const a=t.indexOf(s);a>-1&&t.splice(a,1)}}function i(){t=[]}return{add:e,list:()=>t.slice(),reset:i}}function R3(t,e,i){const s=t.value;if(!s)return;let a=s;const o=()=>{a[e].delete(i)};Qi(o),A_(o),k_(()=>{const r=t.value;r&&(a=r),a[e].add(i)}),a[e].add(i)}function YP(t){R3(Jt(fh,{}),"leaveGuards",t)}function es(t,e,i,s,a,o=r=>r()){const r=s&&(s.enterCallbacks[a]=s.enterCallbacks[a]||[]);return()=>new Promise((n,l)=>{const u=_=>{_===!1?l(aa(4,{from:i,to:e})):_ instanceof Error?l(_):P3(_)?l(aa(2,{from:e,to:_})):(r&&s.enterCallbacks[a]===r&&typeof _=="function"&&r.push(_),n())},d=o(()=>t.call(s&&s.instances[a],e,i,u));let c=Promise.resolve(d);t.length<3&&(c=c.then(u)),c.catch(_=>l(_))})}function vn(t,e,i,s,a=o=>o()){const o=[];for(const r of t)for(const n in r.components){let l=r.components[n];if(!(e!=="beforeRouteEnter"&&!r.instances[n]))if(mh(l)){const u=(l.__vccOpts||l)[e];u&&o.push(es(u,i,s,r,n,a))}else{let u=l();o.push(()=>u.then(d=>{if(!d)throw new Error(`Couldn't resolve component "${n}" at "${r.path}"`);const c=t3(d)?d.default:d;r.mods[n]=d,r.components[n]=c;const _=(c.__vccOpts||c)[e];return _&&es(_,i,s,r,n,a)()}))}}return o}function q3(t,e){const i=[],s=[],a=[],o=Math.max(e.matched.length,t.matched.length);for(let r=0;roa(u,n))?s.push(n):i.push(n));const l=t.matched[r];l&&(e.matched.find(u=>oa(u,l))||a.push(l))}return[i,s,a]}let C3=()=>location.protocol+"//"+location.host;function Sh(t,e){const{pathname:i,search:s,hash:a}=e,o=t.indexOf("#");if(o>-1){let r=a.includes(t.slice(o))?t.slice(o).length:1,n=a.slice(r);return n[0]!=="/"&&(n="/"+n),Gd(n,"")}return Gd(i,t)+s+a}function I3(t,e,i,s){let a=[],o=[],r=null;const n=({state:_})=>{const p=Sh(t,location),v=i.value,g=e.value;let y=0;if(_){if(i.value=p,e.value=_,r&&r===v){r=null;return}y=g?_.position-g.position:0}else s(p);a.forEach(m=>{m(i.value,v,{delta:y,type:"pop",direction:y?y>0?"forward":"back":""})})};function l(){r=i.value}function u(_){a.push(_);const p=()=>{const v=a.indexOf(_);v>-1&&a.splice(v,1)};return o.push(p),p}function d(){if(document.visibilityState==="hidden"){const{history:_}=window;if(!_.state)return;_.replaceState(Ut({},_.state,{scroll:Lr()}),"")}}function c(){for(const _ of o)_();o=[],window.removeEventListener("popstate",n),window.removeEventListener("pagehide",d),document.removeEventListener("visibilitychange",d)}return window.addEventListener("popstate",n),window.addEventListener("pagehide",d),document.addEventListener("visibilitychange",d),{pauseListeners:l,listen:u,destroy:c}}function Yd(t,e,i,s=!1,a=!1){return{back:t,current:e,forward:i,replaced:s,position:window.history.length,scroll:a?Lr():null}}function z3(t){const{history:e,location:i}=window,s={value:Sh(t,i)},a={value:e.state};a.value||o(s.value,{back:null,current:s.value,forward:null,position:e.length-1,replaced:!0,scroll:null},!0);function o(l,u,d){const c=t.indexOf("#"),_=c>-1?(i.host&&document.querySelector("base")?t:t.slice(c))+l:C3()+t+l;try{e[d?"replaceState":"pushState"](u,"",_),a.value=u}catch(p){console.error(p),i[d?"replace":"assign"](_)}}function r(l,u){o(l,Ut({},e.state,Yd(a.value.back,l,a.value.forward,!0),u,{position:a.value.position}),!0),s.value=l}function n(l,u){const d=Ut({},a.value,e.state,{forward:l,scroll:Lr()});o(d.current,d,!0),o(l,Ut({},Yd(s.value,l,null),{position:d.position+1},u),!1),s.value=l}return{location:s,state:a,push:n,replace:r}}function D3(t){t=y3(t);const e=z3(t),i=I3(t,e.state,e.location,e.replace);function s(o,r=!0){r||i.pauseListeners(),history.go(o)}const a=Ut({location:"",base:t,go:s,createHref:A3.bind(null,t)},e,i);return Object.defineProperty(a,"location",{enumerable:!0,get:()=>e.location.value}),Object.defineProperty(a,"state",{enumerable:!0,get:()=>e.state.value}),a}const N3={type:0,value:""},L3=/[a-zA-Z0-9_]/;function U3(t){if(!t)return[[]];if(t==="/")return[[N3]];if(!t.startsWith("/"))throw new Error(`Invalid path "${t}"`);function e(p){throw new Error(`ERR (${i})/"${u}": ${p}`)}let i=0,s=i;const a=[];let o;function r(){o&&a.push(o),o=[]}let n=0,l,u="",d="";function c(){u&&(i===0?o.push({type:0,value:u}):i===1||i===2||i===3?(o.length>1&&(l==="*"||l==="+")&&e(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),o.push({type:1,value:u,regexp:d,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):e("Invalid state to consume buffer"),u="")}function _(){u+=l}for(;ne.length?e.length===1&&e[0]===80?1:-1:0}function Fh(t,e){let i=0;const s=t.score,a=e.score;for(;i0&&e[e.length-1]<0}const $3={strict:!1,end:!0,sensitive:!1};function H3(t,e,i){const s=W3(U3(t.path),i),a=Ut(s,{record:t,parent:e,children:[],alias:[]});return e&&!a.record.aliasOf==!e.record.aliasOf&&e.children.push(a),a}function G3(t,e){const i=[],s=new Map;e=$d($3,e);function a(c){return s.get(c)}function o(c,_,p){const v=!p,g=tc(c);g.aliasOf=p&&p.record;const y=$d(e,c),m=[g];if("alias"in c){const f=typeof c.alias=="string"?[c.alias]:c.alias;for(const T of f)m.push(tc(Ut({},g,{components:p?p.record.components:g.components,path:T,aliasOf:p?p.record:g})))}let w,x;for(const f of m){const{path:T}=f;if(_&&T[0]!=="/"){const P=_.record.path,F=P[P.length-1]==="/"?"":"/";f.path=_.record.path+(T&&F+T)}if(w=H3(f,_,y),p?p.alias.push(w):(x=x||w,x!==w&&x.alias.push(w),v&&c.name&&!ec(w)&&r(c.name)),Ph(w)&&l(w),g.children){const P=g.children;for(let F=0;F{r(x)}:Ca}function r(c){if(Th(c)){const _=s.get(c);_&&(s.delete(c),i.splice(i.indexOf(_),1),_.children.forEach(r),_.alias.forEach(r))}else{const _=i.indexOf(c);_>-1&&(i.splice(_,1),c.record.name&&s.delete(c.record.name),c.children.forEach(r),c.alias.forEach(r))}}function n(){return i}function l(c){const _=K3(c,i);i.splice(_,0,c),c.record.name&&!ec(c)&&s.set(c.record.name,c)}function u(c,_){let p,v={},g,y;if("name"in c&&c.name){if(p=s.get(c.name),!p)throw aa(1,{location:c});y=p.record.name,v=Ut(Xd(_.params,p.keys.filter(x=>!x.optional).concat(p.parent?p.parent.keys.filter(x=>x.optional):[]).map(x=>x.name)),c.params&&Xd(c.params,p.keys.map(x=>x.name))),g=p.stringify(v)}else if(c.path!=null)g=c.path,p=i.find(x=>x.re.test(g)),p&&(v=p.parse(g),y=p.record.name,p.keys.forEach(x=>{x.optional&&!v[x.name]&&delete v[x.name]}));else{if(p=_.name?s.get(_.name):i.find(x=>x.re.test(_.path)),!p)throw aa(1,{location:c,currentLocation:_});y=p.record.name,v=Ut({},_.params,c.params),g=p.stringify(v)}const m=[];let w=p;for(;w;)m.unshift(w.record),w=w.parent;return{name:y,path:g,params:v,matched:m,meta:Q3(m)}}t.forEach(c=>o(c));function d(){i.length=0,s.clear()}return{addRoute:o,resolve:u,removeRoute:r,clearRoutes:d,getRoutes:n,getRecordMatcher:a}}function Xd(t,e){const i={};for(const s of e)s in t&&(i[s]=t[s]);return i}function tc(t){const e={path:t.path,redirect:t.redirect,name:t.name,meta:t.meta||{},aliasOf:t.aliasOf,beforeEnter:t.beforeEnter,props:V3(t),children:t.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in t?t.components||null:t.component&&{default:t.component}};return Object.defineProperty(e,"mods",{value:{}}),e}function V3(t){const e={},i=t.props||!1;if("component"in t)e.default=i;else for(const s in t.components)e[s]=typeof i=="object"?i[s]:i;return e}function ec(t){for(;t;){if(t.record.aliasOf)return!0;t=t.parent}return!1}function Q3(t){return t.reduce((e,i)=>Ut(e,i.meta),{})}function K3(t,e){let i=0,s=e.length;for(;i!==s;){const o=i+s>>1;Fh(t,e[o])<0?s=o:i=o+1}const a=Y3(t);return a&&(s=e.lastIndexOf(a,s-1)),s}function Y3(t){let e=t;for(;e=e.parent;)if(Ph(e)&&Fh(t,e)===0)return e}function Ph({record:t}){return!!(t.name||t.components&&Object.keys(t.components).length||t.redirect)}function ic(t){const e=Jt(Nr),i=Jt(Xl),s=st(()=>{const l=G(t.to);return e.resolve(l)}),a=st(()=>{const{matched:l}=s.value,{length:u}=l,d=l[u-1],c=i.matched;if(!d||!c.length)return-1;const _=c.findIndex(oa.bind(null,d));if(_>-1)return _;const p=sc(l[u-2]);return u>1&&sc(d)===p&&c[c.length-1].path!==p?c.findIndex(oa.bind(null,l[u-2])):_}),o=st(()=>a.value>-1&&tv(i.params,s.value.params)),r=st(()=>a.value>-1&&a.value===i.matched.length-1&&xh(i.params,s.value.params));function n(l={}){if(X3(l)){const u=e[G(t.replace)?"replace":"push"](G(t.to)).catch(Ca);return t.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:s,href:st(()=>s.value.href),isActive:o,isExactActive:r,navigate:n}}function J3(t){return t.length===1?t[0]:t}const Z3=ni({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:ic,setup(t,{slots:e}){const i=Ps(ic(t)),{options:s}=Jt(Nr),a=st(()=>({[ac(t.activeClass,s.linkActiveClass,"router-link-active")]:i.isActive,[ac(t.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:i.isExactActive}));return()=>{const o=e.default&&J3(e.default(i));return t.custom?o:we("a",{"aria-current":i.isExactActive?t.ariaCurrentValue:null,href:i.href,onClick:i.navigate,class:a.value},o)}}});function X3(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)&&!t.defaultPrevented&&!(t.button!==void 0&&t.button!==0)){if(t.currentTarget&&t.currentTarget.getAttribute){const e=t.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function tv(t,e){for(const i in e){const s=e[i],a=t[i];if(typeof s=="string"){if(s!==a)return!1}else if(!ri(a)||a.length!==s.length||s.some((o,r)=>o.valueOf()!==a[r].valueOf()))return!1}return!0}function sc(t){return t?t.aliasOf?t.aliasOf.path:t.path:""}const ac=(t,e,i)=>t??e??i,ev=ni({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(t,{attrs:e,slots:i}){const s=Jt(ol),a=st(()=>t.route||s.value),o=Jt(Hd,0),r=st(()=>{let u=G(o);const{matched:d}=a.value;let c;for(;(c=d[u])&&!c.components;)u++;return u}),n=st(()=>a.value.matched[r.value]);zo(Hd,st(()=>r.value+1)),zo(fh,n),zo(ol,a);const l=vt();return Bt(()=>[l.value,n.value,t.name],([u,d,c],[_,p,v])=>{d&&(d.instances[c]=u,p&&p!==d&&u&&u===_&&(d.leaveGuards.size||(d.leaveGuards=p.leaveGuards),d.updateGuards.size||(d.updateGuards=p.updateGuards))),u&&d&&(!p||!oa(d,p)||!_)&&(d.enterCallbacks[c]||[]).forEach(g=>g(u))},{flush:"post"}),()=>{const u=a.value,d=t.name,c=n.value,_=c&&c.components[d];if(!_)return oc(i.default,{Component:_,route:u});const p=c.props[d],v=p?p===!0?u.params:typeof p=="function"?p(u):p:null,y=we(_,Ut({},v,e,{onVnodeUnmounted:m=>{m.component.isUnmounted&&(c.instances[d]=null)},ref:l}));return oc(i.default,{Component:y,route:u})||y}}});function oc(t,e){if(!t)return null;const i=t(e);return i.length===1?i[0]:i}const Eh=ev;function iv(t){const e=G3(t.routes,t),i=t.parseQuery||E3,s=t.stringifyQuery||Kd,a=t.history,o=wa(),r=wa(),n=wa(),l=Rt(Ji);let u=Ji;Ws&&t.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=gn.bind(null,j=>""+j),c=gn.bind(null,h3),_=gn.bind(null,ar);function p(j,K){let Z,ut;return Th(j)?(Z=e.getRecordMatcher(j),ut=K):ut=j,e.addRoute(ut,Z)}function v(j){const K=e.getRecordMatcher(j);K&&e.removeRoute(K)}function g(){return e.getRoutes().map(j=>j.record)}function y(j){return!!e.getRecordMatcher(j)}function m(j,K){if(K=Ut({},K||l.value),typeof j=="string"){const C=fn(i,j,K.path),M=e.resolve({path:C.path},K),H=a.createHref(C.fullPath);return Ut(C,M,{params:_(M.params),redirectedFrom:void 0,href:H})}let Z;if(j.path!=null)Z=Ut({},j,{path:fn(i,j.path,K.path).path});else{const C=Ut({},j.params);for(const M in C)C[M]==null&&delete C[M];Z=Ut({},j,{params:c(C)}),K.params=c(K.params)}const ut=e.resolve(Z,K),ft=j.hash||"";ut.params=d(_(ut.params));const S=g3(s,Ut({},j,{hash:c3(ft),path:ut.path})),O=a.createHref(S);return Ut({fullPath:S,hash:ft,query:s===Kd?O3(j.query):j.query||{}},ut,{redirectedFrom:void 0,href:O})}function w(j){return typeof j=="string"?fn(i,j,l.value.path):Ut({},j)}function x(j,K){if(u!==j)return aa(8,{from:K,to:j})}function f(j){return F(j)}function T(j){return f(Ut(w(j),{replace:!0}))}function P(j,K){const Z=j.matched[j.matched.length-1];if(Z&&Z.redirect){const{redirect:ut}=Z;let ft=typeof ut=="function"?ut(j,K):ut;return typeof ft=="string"&&(ft=ft.includes("?")||ft.includes("#")?ft=w(ft):{path:ft},ft.params={}),Ut({query:j.query,hash:j.hash,params:ft.path!=null?{}:j.params},ft)}}function F(j,K){const Z=u=m(j),ut=l.value,ft=j.state,S=j.force,O=j.replace===!0,C=P(Z,ut);if(C)return F(Ut(w(C),{state:typeof C=="object"?Ut({},ft,C.state):ft,force:S,replace:O}),K||Z);const M=Z;M.redirectedFrom=K;let H;return!S&&f3(s,ut,Z)&&(H=aa(16,{to:M,from:ut}),_t(ut,ut,!0,!1)),(H?Promise.resolve(H):N(M,ut)).catch($=>Pi($)?Pi($,2)?$:Pt($):mt($,M,ut)).then($=>{if($){if(Pi($,2))return F(Ut({replace:O},w($.to),{state:typeof $.to=="object"?Ut({},ft,$.to.state):ft,force:S}),K||M)}else $=z(M,ut,!0,O,ft);return Q(M,ut,$),$})}function B(j,K){const Z=x(j,K);return Z?Promise.reject(Z):Promise.resolve()}function q(j){const K=Qt.values().next().value;return K&&typeof K.runWithContext=="function"?K.runWithContext(j):j()}function N(j,K){let Z;const[ut,ft,S]=q3(j,K);Z=vn(ut.reverse(),"beforeRouteLeave",j,K);for(const C of ut)C.leaveGuards.forEach(M=>{Z.push(es(M,j,K))});const O=B.bind(null,j,K);return Z.push(O),te(Z).then(()=>{Z=[];for(const C of o.list())Z.push(es(C,j,K));return Z.push(O),te(Z)}).then(()=>{Z=vn(ft,"beforeRouteUpdate",j,K);for(const C of ft)C.updateGuards.forEach(M=>{Z.push(es(M,j,K))});return Z.push(O),te(Z)}).then(()=>{Z=[];for(const C of S)if(C.beforeEnter)if(ri(C.beforeEnter))for(const M of C.beforeEnter)Z.push(es(M,j,K));else Z.push(es(C.beforeEnter,j,K));return Z.push(O),te(Z)}).then(()=>(j.matched.forEach(C=>C.enterCallbacks={}),Z=vn(S,"beforeRouteEnter",j,K,q),Z.push(O),te(Z))).then(()=>{Z=[];for(const C of r.list())Z.push(es(C,j,K));return Z.push(O),te(Z)}).catch(C=>Pi(C,8)?C:Promise.reject(C))}function Q(j,K,Z){n.list().forEach(ut=>q(()=>ut(j,K,Z)))}function z(j,K,Z,ut,ft){const S=x(j,K);if(S)return S;const O=K===Ji,C=Ws?history.state:{};Z&&(ut||O?a.replace(j.fullPath,Ut({scroll:O&&C&&C.scroll},ft)):a.push(j.fullPath,ft)),l.value=j,_t(j,K,Z,O),Pt()}let X;function L(){X||(X=a.listen((j,K,Z)=>{if(!Xt.listening)return;const ut=m(j),ft=P(ut,Xt.currentRoute.value);if(ft){F(Ut(ft,{replace:!0,force:!0}),ut).catch(Ca);return}u=ut;const S=l.value;Ws&&S3(Qd(S.fullPath,Z.delta),Lr()),N(ut,S).catch(O=>Pi(O,12)?O:Pi(O,2)?(F(Ut(w(O.to),{force:!0}),ut).then(C=>{Pi(C,20)&&!Z.delta&&Z.type==="pop"&&a.go(-1,!1)}).catch(Ca),Promise.reject()):(Z.delta&&a.go(-Z.delta,!1),mt(O,ut,S))).then(O=>{O=O||z(ut,S,!1),O&&(Z.delta&&!Pi(O,8)?a.go(-Z.delta,!1):Z.type==="pop"&&Pi(O,20)&&a.go(-1,!1)),Q(ut,S,O)}).catch(Ca)}))}let tt=wa(),et=wa(),ht;function mt(j,K,Z){Pt(j);const ut=et.list();return ut.length?ut.forEach(ft=>ft(j,K,Z)):console.error(j),Promise.reject(j)}function yt(){return ht&&l.value!==Ji?Promise.resolve():new Promise((j,K)=>{tt.add([j,K])})}function Pt(j){return ht||(ht=!j,L(),tt.list().forEach(([K,Z])=>j?Z(j):K()),tt.reset()),j}function _t(j,K,Z,ut){const{scrollBehavior:ft}=t;if(!Ws||!ft)return Promise.resolve();const S=!Z&&F3(Qd(j.fullPath,0))||(ut||!Z)&&history.state&&history.state.scroll||null;return si().then(()=>ft(j,K,S)).then(O=>O&&T3(O)).catch(O=>mt(O,j,K))}const lt=j=>a.go(j);let gt;const Qt=new Set,Xt={currentRoute:l,listening:!0,addRoute:p,removeRoute:v,clearRoutes:e.clearRoutes,hasRoute:y,getRoutes:g,resolve:m,options:t,push:f,replace:T,go:lt,back:()=>lt(-1),forward:()=>lt(1),beforeEach:o.add,beforeResolve:r.add,afterEach:n.add,onError:et.add,isReady:yt,install(j){j.component("RouterLink",Z3),j.component("RouterView",Eh),j.config.globalProperties.$router=Xt,Object.defineProperty(j.config.globalProperties,"$route",{enumerable:!0,get:()=>G(l)}),Ws&&!gt&&l.value===Ji&&(gt=!0,f(a.location).catch(ut=>{}));const K={};for(const ut in Ji)Object.defineProperty(K,ut,{get:()=>l.value[ut],enumerable:!0});j.provide(Nr,Xt),j.provide(Xl,o_(K)),j.provide(ol,l);const Z=j.unmount;Qt.add(j),j.unmount=function(){Qt.delete(j),Qt.size<1&&(u=Ji,X&&X(),X=null,l.value=Ji,gt=!1,ht=!1),Z()}}};function te(j){return j.reduce((K,Z)=>K.then(()=>q(Z)),Promise.resolve())}return Xt}const rc=t=>t==="";const sv=(...t)=>t.filter((e,i,s)=>!!e&&e.trim()!==""&&s.indexOf(e)===i).join(" ").trim();const nc=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const av=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,i,s)=>s?s.toUpperCase():i.toLowerCase());const ov=t=>{const e=av(t);return e.charAt(0).toUpperCase()+e.slice(1)};var Cs={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const rv=Symbol("lucide-icons");function nv(){return Jt(rv,{})}const lv=({name:t,iconNode:e,absoluteStrokeWidth:i,"absolute-stroke-width":s,strokeWidth:a,"stroke-width":o,size:r,color:n,...l},{slots:u})=>{const{size:d,color:c,strokeWidth:_=2,absoluteStrokeWidth:p=!1,class:v=""}=nv(),g=st(()=>{const y=rc(i)||rc(s)||i===!0||s===!0||p===!0,m=a||o||_||Cs["stroke-width"];return y?Number(m)*24/Number(r??d??Cs.width):m});return we("svg",{...Cs,...l,width:r??d??Cs.width,height:r??d??Cs.height,stroke:n??c??Cs.stroke,"stroke-width":g.value,class:sv("lucide",v,...t?[`lucide-${nc(ov(t))}-icon`,`lucide-${nc(t)}`]:["lucide-icon"])},[...e.map(y=>we(...y)),...u.default?[u.default()]:[]])};const Zt=(t,e)=>(i,{slots:s,attrs:a})=>we(lv,{...a,...i,iconNode:e,name:t},s.default?{default:s.default}:void 0);const uv=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8",key:"7n84p3"}]],Oh=Zt("at-sign",uv);const dv=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],cv=Zt("chevron-down",dv);const bv=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}],["path",{d:"M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662",key:"154egf"}]],_v=Zt("circle-user",bv);const hv=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],pv=Zt("eye-off",hv);const mv=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],gv=Zt("eye",mv);const fv=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"M15 3v18",key:"14nvp0"}]],vv=Zt("grid-3x3",fv);const wv=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],yv=Zt("info",wv);const kv=[["path",{d:"M12.4 2.7a2.5 2.5 0 0 1 3.4 0l5.5 5.5a2.5 2.5 0 0 1 0 3.4l-3.7 3.7a2.5 2.5 0 0 1-3.4 0L8.7 9.8a2.5 2.5 0 0 1 0-3.4z",key:"165ttr"}],["path",{d:"m14 7 3 3",key:"1r5n42"}],["path",{d:"m9.4 10.6-6.814 6.814A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814",key:"1ubxi2"}]],Av=Zt("key-square",kv);const xv=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],Tv=Zt("list",xv);const Sv=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],wo=Zt("loader-circle",Sv);const Fv=[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]],Pv=Zt("menu",Fv);const Ev=[["path",{d:"m9 10 2 2 4-4",key:"1gnqz4"}],["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["path",{d:"M12 17v4",key:"1riwvh"}],["path",{d:"M8 21h8",key:"1ev6f3"}]],Ov=Zt("monitor-check",Ev);const Rv=[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]],qv=Zt("moon",Rv);const Cv=[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}],["path",{d:"M8 14s1.5 2 4 2 4-2 4-2",key:"1y1vjs"}],["path",{d:"M9 9h.01",key:"1q5me6"}],["path",{d:"M15 9h.01",key:"x1ddxp"}]],Iv=Zt("scan-face",Cv);const zv=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Dv=Zt("search",zv);const Nv=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],Lv=Zt("settings",Nv);const Uv=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M6.376 18.91a6 6 0 0 1 11.249.003",key:"hnjrf2"}],["circle",{cx:"12",cy:"11",r:"4",key:"1gt34v"}]],jv=Zt("shield-user",Uv);const Mv=[["path",{d:"M22 2 2 22",key:"y4kqgn"}]],Wv=Zt("slash",Mv);const Bv=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],$v=Zt("sliders-horizontal",Bv);const Hv=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["line",{x1:"9",x2:"15",y1:"15",y2:"9",key:"1dfufj"}]],Rh=Zt("square-slash",Hv);const Gv=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],Vv=Zt("sun",Gv);const Qv=[["path",{d:"m16 11 2 2 4-4",key:"9rsbq5"}],["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],qh=Zt("user-check",Qv);const Kv=[["path",{d:"M18 21a8 8 0 0 0-16 0",key:"3ypg7q"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3",key:"10s06x"}]],Yv=Zt("users-round",Kv);const Jv=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],Ch=Zt("users",Jv);const Zv=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Xv=Zt("x",Zv);function tw(t,e){return Gi()?(Za(t,e),!0):!1}const wn=new WeakMap,ew=(...t)=>{var e;const i=t[0],s=(e=ge())===null||e===void 0?void 0:e.proxy,a=s??Gi();if(a==null&&!Es())throw new Error("injectLocal must be called in setup");return a&&wn.has(a)&&i in wn.get(a)?wn.get(a)[i]:Jt(...t)},eu=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const iw=Object.prototype.toString,sw=t=>iw.call(t)==="[object Object]",aw=()=>{};function Ih(...t){if(t.length!==1)return Bl(...t);const e=t[0];return typeof e=="function"?ss(Er(()=>({get:e,set:aw}))):vt(e)}function ow(t,e){function i(...s){return new Promise((a,o)=>{Promise.resolve(t(()=>e.apply(this,s),{fn:e,thisArg:this,args:s})).then(a).catch(o)})}return i}const zh=t=>t();function rw(t=zh,e={}){const{initialState:i="active"}=e,s=Ih(i==="active");function a(){s.value=!1}function o(){s.value=!0}return{isActive:Ai(s),pause:a,resume:o,eventFilter:(...n)=>{s.value&&t(...n)}}}function nw(t){let e;function i(){return e||(e=t()),e}return i.reset=async()=>{const s=e;e=void 0,s&&await s},i}function lc(t){return t.endsWith("rem")?Number.parseFloat(t)*16:Number.parseFloat(t)}function yn(t){return Array.isArray(t)?t:[t]}function lw(t){return ge()}function uw(t,e,i={}){const{eventFilter:s=zh,...a}=i;return Bt(t,ow(s,e),a)}function dw(t,e,i={}){const{eventFilter:s,initialState:a="active",...o}=i,{eventFilter:r,pause:n,resume:l,isActive:u}=rw(s,{initialState:a});return{stop:uw(t,e,{...o,eventFilter:r}),pause:n,resume:l,isActive:u}}function Dh(t,e=!0,i){lw()?Ie(t,i):e?t():si(t)}function cw(t,e,i={}){const{immediate:s=!0,immediateCallback:a=!1}=i,o=Rt(!1);let r;function n(){r&&(clearTimeout(r),r=void 0)}function l(){o.value=!1,n()}function u(...d){a&&t(),n(),o.value=!0,r=setTimeout(()=>{o.value=!1,r=void 0,t(...d)},Ft(e))}return s&&(o.value=!0,eu&&u()),tw(l),{isPending:Ai(o),start:u,stop:l}}function bw(t,e,i){return Bt(t,e,{...i,immediate:!0})}const fs=eu?window:void 0,Nh=eu?window.navigator:void 0;function Lh(t){var e;const i=Ft(t);return(e=i?.$el)!==null&&e!==void 0?e:i}function Va(...t){const e=(s,a,o,r)=>(s.addEventListener(a,o,r),()=>s.removeEventListener(a,o,r)),i=st(()=>{const s=yn(Ft(t[0])).filter(a=>a!=null);return s.every(a=>typeof a!="string")?s:void 0});return bw(()=>{var s,a;return[(s=(a=i.value)===null||a===void 0?void 0:a.map(o=>Lh(o)))!==null&&s!==void 0?s:[fs].filter(o=>o!=null),yn(Ft(i.value?t[1]:t[0])),yn(G(i.value?t[2]:t[1])),Ft(i.value?t[3]:t[2])]},([s,a,o,r],n,l)=>{if(!s?.length||!a?.length||!o?.length)return;const u=sw(r)?{...r}:r,d=s.flatMap(c=>a.flatMap(_=>o.map(p=>e(c,_,p,u))));l(()=>{d.forEach(c=>c())})},{flush:"post"})}function _w(){const t=Rt(!1),e=ge();return e&&Ie(()=>{t.value=!0},e),t}function iu(t){const e=_w();return st(()=>(e.value,!!t()))}const hw=Symbol("vueuse-ssr-width");function pw(){const t=Es()?ew(hw,null):null;return typeof t=="number"?t:void 0}function mw(t,e={}){const{window:i=fs,ssrWidth:s=pw()}=e,a=iu(()=>i&&"matchMedia"in i&&typeof i.matchMedia=="function"),o=Rt(typeof s=="number"),r=Rt(),n=Rt(!1),l=u=>{n.value=u.matches};return Hl(()=>{if(o.value){o.value=!a.value,n.value=Ft(t).split(",").some(u=>{const d=u.includes("not all"),c=u.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=u.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let p=!!(c||_);return c&&p&&(p=s>=lc(c[1])),_&&p&&(p=s<=lc(_[1])),d?!p:p});return}a.value&&(r.value=i.matchMedia(Ft(t)),n.value=r.value.matches)}),Va(r,"change",l,{passive:!0}),st(()=>n.value)}function uc(t,e={}){const{controls:i=!1,navigator:s=Nh}=e,a=iu(()=>s&&"permissions"in s),o=Rt(),r=typeof t=="string"?{name:t}:t,n=Rt(),l=()=>{var d,c;n.value=(d=(c=o.value)===null||c===void 0?void 0:c.state)!==null&&d!==void 0?d:"prompt"};Va(o,"change",l,{passive:!0});const u=nw(async()=>{if(a.value){if(!o.value)try{o.value=await s.permissions.query(r)}catch{o.value=void 0}finally{l()}if(i)return St(o.value)}});return u(),i?{state:n,isSupported:a,query:u}:n}function gw(t={}){const{navigator:e=Nh,read:i=!1,source:s,copiedDuring:a=1500,legacy:o=!1}=t,r=iu(()=>e&&"clipboard"in e),n=uc("clipboard-read"),l=uc("clipboard-write"),u=st(()=>r.value||o),d=Rt(""),c=Rt(!1),_=Rt(!1),p=cw(()=>c.value=!1,a,{immediate:!1});let v=0;async function g(){let T=!(r.value&&f(n.value));if(!T)try{d.value=await e.clipboard.readText()}catch{T=!0}T&&(d.value=x())}u.value&&i&&Va(["copy","cut"],g,{passive:!0});async function y(T){const P=T??Ft(s);if(u.value&&P!=null){_.value=!0;let F=!(r.value&&f(l.value));if(!F)try{const B=m(P);await e.clipboard.write([B])}catch{F=!0}if(F)if(typeof P=="string")d.value=P,w(P);else{const B=++v,q=await P();q!=null&&B===v&&(d.value=q,w(q))}c.value=!0,p.start(),_.value=!1}}function m(T){return typeof T=="string"?(d.value=T,new ClipboardItem({"text/plain":T})):new ClipboardItem({"text/plain":T().then((P="")=>(d.value=P,new Blob([P],{type:"text/plain"})))})}function w(T){const P=document.createElement("textarea");P.value=T,P.style.position="absolute",P.style.opacity="0",P.setAttribute("readonly",""),document.body.appendChild(P),P.select(),document.execCommand("copy"),P.remove()}function x(){var T,P,F;return(T=(P=document)===null||P===void 0||(F=P.getSelection)===null||F===void 0||(F=F.call(P))===null||F===void 0?void 0:F.toString())!==null&&T!==void 0?T:""}function f(T){return T==="granted"||T==="prompt"}return{copyPending:Ai(_),isSupported:u,text:Ai(d),copied:Ai(c),copy:y}}const yo=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ko="__vueuse_ssr_handlers__",fw=vw();function vw(){return ko in yo||(yo[ko]=yo[ko]||{}),yo[ko]}function Uh(t,e){return fw[t]||e}function ww(t){return mw("(prefers-color-scheme: dark)",t)}function yw(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}const kw={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},dc="vueuse-storage";function Aw(t,e,i,s={}){var a;const{flush:o="pre",deep:r=!0,listenToStorageChanges:n=!0,writeDefaults:l=!0,mergeDefaults:u=!1,shallow:d,window:c=fs,eventFilter:_,onError:p=L=>{console.error(L)},initOnMounted:v}=s,g=(d?Rt:vt)(typeof e=="function"?e():e),y=st(()=>Ft(t));if(!i)try{i=Uh("getDefaultStorage",()=>fs?.localStorage)()}catch(L){p(L)}if(!i)return g;const m=Ft(e),w=yw(m),x=(a=s.serializer)!==null&&a!==void 0?a:kw[w],{pause:f,resume:T}=dw(g,L=>N(L),{flush:o,deep:r,eventFilter:_});Bt(y,()=>z(),{flush:o});let P=!1;const F=L=>{v&&!P||z(L)},B=L=>{v&&!P||X(L)};c&&n&&(i instanceof Storage?Va(c,"storage",F,{passive:!0}):Va(c,dc,B)),v?Dh(()=>{P=!0,z()}):z();function q(L,tt){if(c){const et={key:y.value,oldValue:L,newValue:tt,storageArea:i};c.dispatchEvent(i instanceof Storage?new StorageEvent("storage",et):new CustomEvent(dc,{detail:et}))}}function N(L){try{const tt=i.getItem(y.value);if(L==null)q(tt,null),i.removeItem(y.value);else{const et=x.write(L);tt!==et&&(i.setItem(y.value,et),q(tt,et))}}catch(tt){p(tt)}}function Q(L){const tt=L?L.newValue:i.getItem(y.value);if(tt==null)return l&&m!=null&&i.setItem(y.value,x.write(m)),m;if(!L&&u){const et=x.read(tt);return typeof u=="function"?u(et,m):w==="object"&&!Array.isArray(et)?{...m,...et}:et}else return typeof tt!="string"?tt:x.read(tt)}function z(L){if(!(L&&L.storageArea!==i)){if(L&&L.key==null){g.value=m;return}if(!(L&&L.key!==y.value)){f();try{const tt=x.write(g.value);(L===void 0||L?.newValue!==tt)&&(g.value=Q(L))}catch(tt){p(tt)}finally{L?si(T):T()}}}}function X(L){z(L.detail)}return g}const xw="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Tw(t={}){const{selector:e="html",attribute:i="class",initialValue:s="auto",window:a=fs,storage:o,storageKey:r="vueuse-color-scheme",listenToStorageChanges:n=!0,storageRef:l,emitAuto:u,disableTransition:d=!0}=t,c={auto:"",light:"light",dark:"dark",...t.modes||{}},_=ww({window:a}),p=st(()=>_.value?"dark":"light"),v=l||(r==null?Ih(s):Aw(r,s,o,{window:a,listenToStorageChanges:n})),g=st(()=>v.value==="auto"?p.value:v.value),y=Uh("updateHTMLAttrs",(f,T,P)=>{const F=typeof f=="string"?a?.document.querySelector(f):Lh(f);if(!F)return;const B=new Set,q=new Set;let N=null;if(T==="class"){const z=P.split(/\s/g);Object.values(c).flatMap(X=>(X||"").split(/\s/g)).filter(Boolean).forEach(X=>{z.includes(X)?B.add(X):q.add(X)})}else N={key:T,value:P};if(B.size===0&&q.size===0&&N===null)return;let Q;d&&(Q=a.document.createElement("style"),Q.appendChild(document.createTextNode(xw)),a.document.head.appendChild(Q));for(const z of B)F.classList.add(z);for(const z of q)F.classList.remove(z);N&&F.setAttribute(N.key,N.value),d&&(a.getComputedStyle(Q).opacity,document.head.removeChild(Q))});function m(f){var T;y(e,i,(T=c[f])!==null&&T!==void 0?T:f)}function w(f){t.onChanged?t.onChanged(f,m):m(f)}Bt(g,w,{flush:"post",immediate:!0}),Dh(()=>w(g.value));const x=st({get(){return u?v.value:g.value},set(f){v.value=f}});return Object.assign(x,{store:v,system:p,state:g})}const io=ni((t,{slots:e})=>{const i=Tw(t),s=Ps({mode:i,system:i.system,store:i.store});return()=>{if(e.default)return e.default(s)}},{name:"UseColorMode",props:["attribute","deep","disableTransition","emitAuto","eventFilter","flush","initOnMounted","initialValue","listenToStorageChanges","mergeDefaults","modes","onChanged","onError","selector","serializer","shallow","storage","storageKey","storageRef","window","writeDefaults"]});const cc=t=>t==="";const Sw=(...t)=>t.filter((e,i,s)=>!!e&&e.trim()!==""&&s.indexOf(e)===i).join(" ").trim();const bc=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const Fw=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,i,s)=>s?s.toUpperCase():i.toLowerCase());const Pw=t=>{const e=Fw(t);return e.charAt(0).toUpperCase()+e.slice(1)};var Is={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const Ew=Symbol("lucide-icons");function Ow(){return Jt(Ew,{})}const Rw=({name:t,iconNode:e,absoluteStrokeWidth:i,"absolute-stroke-width":s,strokeWidth:a,"stroke-width":o,size:r,color:n,...l},{slots:u})=>{const{size:d,color:c,strokeWidth:_=2,absoluteStrokeWidth:p=!1,class:v=""}=Ow(),g=st(()=>{const y=cc(i)||cc(s)||i===!0||s===!0||p===!0,m=a||o||_||Is["stroke-width"];return y?Number(m)*24/Number(r??d??Is.width):m});return we("svg",{...Is,...l,width:r??d??Is.width,height:r??d??Is.height,stroke:n??c??Is.stroke,"stroke-width":g.value,class:Sw("lucide",v,...t?[`lucide-${bc(Pw(t))}-icon`,`lucide-${bc(t)}`]:["lucide-icon"])},[...e.map(y=>we(...y)),...u.default?[u.default()]:[]])};const so=(t,e)=>(i,{slots:s,attrs:a})=>we(Rw,{...a,...i,iconNode:e,name:t},s);const qw=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],ao=so("chevron-right",qw);const Cw=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Iw=so("eye-off",Cw);const zw=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],Dw=so("eye",zw);const Nw=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 9.9-1",key:"1mm8w8"}]],Lw=so("lock-open",Nw);const Uw=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],os=so("lock",Uw),kn=new WeakMap,jw=(...t)=>{var e;const i=t[0],s=(e=ge())===null||e===void 0?void 0:e.proxy,a=s??Gi();if(a==null&&!Es())throw new Error("injectLocal must be called in setup");return a&&kn.has(a)&&i in kn.get(a)?kn.get(a)[i]:Jt(...t)},Mw=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ww=Object.prototype.toString,Bw=t=>Ww.call(t)==="[object Object]",$w=()=>{};function jh(...t){if(t.length!==1)return Bl(...t);const e=t[0];return typeof e=="function"?ss(Er(()=>({get:e,set:$w}))):vt(e)}function Hw(t,e){function i(...s){return new Promise((a,o)=>{Promise.resolve(t(()=>e.apply(this,s),{fn:e,thisArg:this,args:s})).then(a).catch(o)})}return i}const Mh=t=>t();function Gw(t=Mh,e={}){const{initialState:i="active"}=e,s=jh(i==="active");function a(){s.value=!1}function o(){s.value=!0}return{isActive:ss(s),pause:a,resume:o,eventFilter:(...n)=>{s.value&&t(...n)}}}function _c(t){return t.endsWith("rem")?Number.parseFloat(t)*16:Number.parseFloat(t)}function An(t){return Array.isArray(t)?t:[t]}function Vw(t){return ge()}function Qw(t,e,i={}){const{eventFilter:s=Mh,...a}=i;return Bt(t,Hw(s,e),a)}function Kw(t,e,i={}){const{eventFilter:s,initialState:a="active",...o}=i,{eventFilter:r,pause:n,resume:l,isActive:u}=Gw(s,{initialState:a});return{stop:Qw(t,e,{...o,eventFilter:r}),pause:n,resume:l,isActive:u}}function Wh(t,e=!0,i){Vw()?Ie(t,i):e?t():si(t)}function Yw(t,e,i){return Bt(t,e,{...i,immediate:!0})}const vs=Mw?window:void 0;function Bh(t){var e;const i=Ft(t);return(e=i?.$el)!==null&&e!==void 0?e:i}function ll(...t){const e=(s,a,o,r)=>(s.addEventListener(a,o,r),()=>s.removeEventListener(a,o,r)),i=st(()=>{const s=An(Ft(t[0])).filter(a=>a!=null);return s.every(a=>typeof a!="string")?s:void 0});return Yw(()=>{var s,a;return[(s=(a=i.value)===null||a===void 0?void 0:a.map(o=>Bh(o)))!==null&&s!==void 0?s:[vs].filter(o=>o!=null),An(Ft(i.value?t[1]:t[0])),An(G(i.value?t[2]:t[1])),Ft(i.value?t[3]:t[2])]},([s,a,o,r],n,l)=>{if(!s?.length||!a?.length||!o?.length)return;const u=Bw(r)?{...r}:r,d=s.flatMap(c=>a.flatMap(_=>o.map(p=>e(c,_,p,u))));l(()=>{d.forEach(c=>c())})},{flush:"post"})}function Jw(){const t=Rt(!1),e=ge();return e&&Ie(()=>{t.value=!0},e),t}function Zw(t){const e=Jw();return st(()=>(e.value,!!t()))}const Xw=Symbol("vueuse-ssr-width");function ty(){const t=Es()?jw(Xw,null):null;return typeof t=="number"?t:void 0}function ey(t,e={}){const{window:i=vs,ssrWidth:s=ty()}=e,a=Zw(()=>i&&"matchMedia"in i&&typeof i.matchMedia=="function"),o=Rt(typeof s=="number"),r=Rt(),n=Rt(!1),l=u=>{n.value=u.matches};return Hl(()=>{if(o.value){o.value=!a.value,n.value=Ft(t).split(",").some(u=>{const d=u.includes("not all"),c=u.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=u.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let p=!!(c||_);return c&&p&&(p=s>=_c(c[1])),_&&p&&(p=s<=_c(_[1])),d?!p:p});return}a.value&&(r.value=i.matchMedia(Ft(t)),n.value=r.value.matches)}),ll(r,"change",l,{passive:!0}),st(()=>n.value)}const Ao=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},xo="__vueuse_ssr_handlers__",iy=sy();function sy(){return xo in Ao||(Ao[xo]=Ao[xo]||{}),Ao[xo]}function $h(t,e){return iy[t]||e}function ay(t){return ey("(prefers-color-scheme: dark)",t)}function oy(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}const ry={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},hc="vueuse-storage";function ny(t,e,i,s={}){var a;const{flush:o="pre",deep:r=!0,listenToStorageChanges:n=!0,writeDefaults:l=!0,mergeDefaults:u=!1,shallow:d,window:c=vs,eventFilter:_,onError:p=L=>{console.error(L)},initOnMounted:v}=s,g=(d?Rt:vt)(typeof e=="function"?e():e),y=st(()=>Ft(t));if(!i)try{i=$h("getDefaultStorage",()=>vs?.localStorage)()}catch(L){p(L)}if(!i)return g;const m=Ft(e),w=oy(m),x=(a=s.serializer)!==null&&a!==void 0?a:ry[w],{pause:f,resume:T}=Kw(g,L=>N(L),{flush:o,deep:r,eventFilter:_});Bt(y,()=>z(),{flush:o});let P=!1;const F=L=>{v&&!P||z(L)},B=L=>{v&&!P||X(L)};c&&n&&(i instanceof Storage?ll(c,"storage",F,{passive:!0}):ll(c,hc,B)),v?Wh(()=>{P=!0,z()}):z();function q(L,tt){if(c){const et={key:y.value,oldValue:L,newValue:tt,storageArea:i};c.dispatchEvent(i instanceof Storage?new StorageEvent("storage",et):new CustomEvent(hc,{detail:et}))}}function N(L){try{const tt=i.getItem(y.value);if(L==null)q(tt,null),i.removeItem(y.value);else{const et=x.write(L);tt!==et&&(i.setItem(y.value,et),q(tt,et))}}catch(tt){p(tt)}}function Q(L){const tt=L?L.newValue:i.getItem(y.value);if(tt==null)return l&&m!=null&&i.setItem(y.value,x.write(m)),m;if(!L&&u){const et=x.read(tt);return typeof u=="function"?u(et,m):w==="object"&&!Array.isArray(et)?{...m,...et}:et}else return typeof tt!="string"?tt:x.read(tt)}function z(L){if(!(L&&L.storageArea!==i)){if(L&&L.key==null){g.value=m;return}if(!(L&&L.key!==y.value)){f();try{const tt=x.write(g.value);(L===void 0||L?.newValue!==tt)&&(g.value=Q(L))}catch(tt){p(tt)}finally{L?si(T):T()}}}}function X(L){z(L.detail)}return g}const ly="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Hh(t={}){const{selector:e="html",attribute:i="class",initialValue:s="auto",window:a=vs,storage:o,storageKey:r="vueuse-color-scheme",listenToStorageChanges:n=!0,storageRef:l,emitAuto:u,disableTransition:d=!0}=t,c={auto:"",light:"light",dark:"dark",...t.modes||{}},_=ay({window:a}),p=st(()=>_.value?"dark":"light"),v=l||(r==null?jh(s):ny(r,s,o,{window:a,listenToStorageChanges:n})),g=st(()=>v.value==="auto"?p.value:v.value),y=$h("updateHTMLAttrs",(f,T,P)=>{const F=typeof f=="string"?a?.document.querySelector(f):Bh(f);if(!F)return;const B=new Set,q=new Set;let N=null;if(T==="class"){const z=P.split(/\s/g);Object.values(c).flatMap(X=>(X||"").split(/\s/g)).filter(Boolean).forEach(X=>{z.includes(X)?B.add(X):q.add(X)})}else N={key:T,value:P};if(B.size===0&&q.size===0&&N===null)return;let Q;d&&(Q=a.document.createElement("style"),Q.appendChild(document.createTextNode(ly)),a.document.head.appendChild(Q));for(const z of B)F.classList.add(z);for(const z of q)F.classList.remove(z);N&&F.setAttribute(N.key,N.value),d&&(a.getComputedStyle(Q).opacity,document.head.removeChild(Q))});function m(f){var T;y(e,i,(T=c[f])!==null&&T!==void 0?T:f)}function w(f){t.onChanged?t.onChanged(f,m):m(f)}Bt(g,w,{flush:"post",immediate:!0}),Wh(()=>w(g.value));const x=st({get(){return u?v.value:g.value},set(f){v.value=f}});return Object.assign(x,{store:v,system:p,state:g})}const Gh=ni((t,{slots:e})=>{const i=Hh(t),s=Ps({mode:i,system:i.system,store:i.store});return()=>{if(e.default)return e.default(s)}},{name:"UseColorMode",props:["attribute","deep","disableTransition","emitAuto","eventFilter","flush","initOnMounted","initialValue","listenToStorageChanges","mergeDefaults","modes","onChanged","onError","selector","serializer","shallow","storage","storageKey","storageRef","window","writeDefaults"]}),uy=["type","disabled"],ul={__name:"VueButton",props:{label:{type:String,default:"[[label]]"},color:{type:String,default:"is-link"},isLoading:{type:Boolean,default:!1},isDisabled:{type:Boolean,default:!1},nativeType:{type:String,default:"submit",required:!0}},setup(t){const e=t;return(i,s)=>(D(),W("button",{type:t.nativeType,disabled:t.isLoading||t.isDisabled,class:nt({button:!0,[`${t.color}`]:!0,"is-loading":t.isLoading})},[ee(i.$slots,"default",{},()=>[Ot(at(i.$t(e.label)),1)])],10,uy))}},dy={class:"field is-grouped"},cy={class:"control"},by={key:0,class:"control"},_y={__name:"FormButtons",props:{showCancelButton:{type:Boolean,default:!1},isBusy:{type:Boolean,default:!1},isDisabled:{type:Boolean,default:!1},submitLabel:{type:String,default:"label.submit"},cancelLabel:{type:String,default:"label.cancel"},color:{type:String,default:"is-link"},submitId:{type:String,default:"btnSubmit"},cancelId:{type:String,default:"btnCancel"}},emits:["submit","cancel"],setup(t,{emit:e}){const i=e;return(s,a)=>(D(),W("div",dy,[V("div",cy,[rt(G(ul),{onClick:a[0]||(a[0]=o=>i("submit")),id:t.submitId,nativeType:"submit",color:t.color,isLoading:t.isBusy,disabled:t.isDisabled},{default:$t(()=>[Ot(at(s.$t(t.submitLabel)),1)]),_:1},8,["id","color","isLoading","disabled"])]),t.showCancelButton?(D(),W("div",by,[rt(G(ul),{onClick:a[1]||(a[1]=o=>i("cancel")),id:t.cancelId,nativeType:"button",color:"is-text"},{default:$t(()=>[Ot(at(s.$t(t.cancelLabel)),1)]),_:1},8,["id"])])):it("",!0)]))}};function qe(t,e){let i;switch(e=e.toString(),t){case"text":i="txt";break;case"button":i="btn";break;case"email":i="eml";break;case"password":i="pwd";break;case"radio":i="rdo";break;case"label":i="lbl";break;case"select":i="sel";break;case"legend":i="leg";break;case"error":i="err";break;default:i="txt";break}return{inputId:i+e[0].toUpperCase()+e.toLowerCase().slice(1)}}function Os(t){return{valErrorId:"valError"+t[0].toUpperCase()+t.toLowerCase().slice(1)}}const hy=["id","name","disabled","aria-describedby"],py=["for","onKeypress"],my={class:"icon-text"},gy={key:0,class:"icon"},fy=["id"],vy=Object.assign({inheritAttrs:!1},{__name:"FormCheckbox",props:{modelValue:Boolean,fieldName:{type:String,default:"",required:!0},label:{type:String,default:""},labelClass:{type:String,default:""},help:{type:String,default:""},isIndented:Boolean,isDisabled:Boolean,isLocked:Boolean,isWarning:Boolean,isDanger:Boolean},emits:["update:modelValue"],setup(t,{emit:e}){const i=t,s=e,a=qe("legend",i.fieldName).inputId,o=$m(),r=st({get(){return i.modelValue},set(l){s("update:modelValue",l)}});function n(){o.disabled!=!0&&(r.value=!r.value)}return(l,u)=>(D(),W("div",{class:nt(["field is-flex",{"is-left-bordered-warning":t.isWarning,"is-left-bordered-danger":t.isDanger}])},[t.isIndented?(D(),W("div",{key:0,class:nt(["pr-1",{"is-opacity-5":t.isDisabled||t.isLocked}])},[rt(G(ao),{class:"has-text-grey rotate-135"})],2)):it("",!0),V("div",null,[Ma(V("input",{id:t.fieldName,type:"checkbox",name:t.fieldName,class:"is-checkradio is-info","onUpdate:modelValue":u[0]||(u[0]=d=>r.value=d),disabled:t.isDisabled||t.isLocked,"aria-describedby":t.help?G(a):void 0},null,8,hy),[[of,r.value]]),V("label",{tabindex:"0",for:t.fieldName,class:nt(["label",t.labelClass]),onKeypress:Ts(We(n,["prevent"]),["space"])},[V("span",my,[V("span",null,at(l.$t(i.label)),1),t.isLocked?(D(),W("span",gy,[rt(G(os),{class:"icon-size-1"})])):it("",!0)])],42,py),t.help?(D(),W("p",{key:0,id:G(a),class:"help"},at(l.$t(t.help)),9,fy)):it("",!0)])],2))}}),wy={role:"alert"},yy=["id"],rs={__name:"FormFieldError",props:{error:{type:String,required:!0},field:{type:String,required:!0},alertType:{type:String,default:"is-danger"}},setup(t){const e=t,{valErrorId:i}=Os(e.field);return(s,a)=>(D(),W("div",wy,[V("p",{id:G(i),class:nt(["help",t.alertType])},at(t.error),11,yy)]))}},ky={class:"field"},Ay=["for"],xy={class:"icon-text"},Ty={key:0,class:"icon"},Sy=["disabled","id","name","type","value","placeholder","maxlength","aria-describedby","aria-invalid","aria-errormessage"],Fy={key:0,class:"icon is-small is-left"},Py={key:1,class:"icon is-small is-right"},Ey=["id"],Oy=Object.assign({inheritAttrs:!1},{__name:"FormField",props:{modelValue:[String,Number,Boolean],label:{type:String,default:""},fieldName:{type:String,default:"",required:!0},errorMessage:[String],inputType:{type:String,default:"text"},placeholder:{type:String,default:""},help:{type:String,default:""},hasOffset:{type:Boolean,default:!1},isDisabled:{type:Boolean,default:!1},maxLength:{type:Number,default:null},isIndented:Boolean,isLocked:Boolean,leftIcon:{type:String,default:""},rightIcon:{type:String,default:""},iconSize:{type:Number,default:20},iconColor:{type:String,default:"currentColor"},iconStrokeWidth:{type:Number,default:2},idSuffix:{type:String,default:""}},setup(t){const e=t,{inputId:i}=qe(e.inputType,e.fieldName+e.idSuffix),{valErrorId:s}=Os(e.fieldName),a=qe("legend",e.fieldName).inputId;return(o,r)=>(D(),W("div",{class:nt(["mb-3",{"pt-3":t.hasOffset,"is-flex":t.isIndented}])},[t.isIndented?(D(),W("div",{key:0,class:nt(["pr-1",{"is-opacity-5":t.isDisabled||t.isLocked}])},[rt(G(ao),{class:"has-text-grey rotate-135"})],2)):it("",!0),V("div",ky,[V("label",{for:G(i),class:nt(["label",{"is-opacity-5":t.isDisabled||t.isLocked}])},[V("span",xy,[V("span",null,at(o.$t(e.label)),1),t.isLocked?(D(),W("span",Ty,[rt(G(os),{class:"icon-size-1"})])):it("",!0)])],10,Ay),V("div",{class:nt(["control",{"has-icons-left":t.leftIcon,"has-icons-right":t.rightIcon}])},[V("input",ba({disabled:t.isDisabled||t.isLocked,id:G(i),name:t.fieldName,type:t.inputType,class:"input",value:t.modelValue,placeholder:t.placeholder},o.$attrs,{onInput:r[0]||(r[0]=n=>o.$emit("update:modelValue",n.target.value)),onChange:r[1]||(r[1]=n=>o.$emit("change:modelValue",n.target.value)),maxlength:t.maxLength,"aria-describedby":t.help?G(a):void 0,"aria-invalid":t.errorMessage!=null,"aria-errormessage":t.errorMessage!=null?G(s):void 0}),null,16,Sy),t.leftIcon?(D(),W("span",Fy,[t.leftIcon?(D(),Nt(G(ur),{key:0,name:t.leftIcon,"stroke-width":t.iconStrokeWidth,size:t.iconSize,color:t.iconColor},null,8,["name","stroke-width","size","color"])):it("",!0)])):it("",!0),t.rightIcon?(D(),W("span",Py,[t.rightIcon?(D(),Nt(G(ur),{key:0,name:t.rightIcon,"stroke-width":t.iconStrokeWidth,size:t.iconSize,color:t.iconColor},null,8,["name","stroke-width","size","color"])):it("",!0)])):it("",!0)],2),t.errorMessage!=null?(D(),Nt(G(rs),{key:0,error:t.errorMessage,field:t.fieldName},null,8,["error","field"])):it("",!0),t.help?(D(),W("p",{key:1,id:G(a),class:"help"},at(o.$t(t.help)),9,Ey)):it("",!0)])],2))}}),Ry=["for"],qy={class:"icon-text"},Cy={key:0,class:"icon"},Iy={class:"control has-icons-right"},zy=["disabled","name","id","type","value","placeholder","aria-describedby","aria-invalid","aria-errormessage"],Dy=["title"],Ny=["title"],Ly={key:0,class:"help is-warning"},Uy={key:2,class:"help"},jy=["id"],My={class:"column is-one-third"},Wy={class:"has-text-weight-semibold"},By={class:"column"},$y={class:"has-text-weight-semibold"},Hy=Object.assign({inheritAttrs:!0},{__name:"FormPasswordField",props:{modelValue:[String],label:{type:String,default:""},fieldName:{type:String,default:"",required:!0},errorMessage:[String],inputType:{type:String,default:"password"},placeholder:{type:String,default:""},help:{type:String,default:""},hasOffset:{type:Boolean,default:!1},isDisabled:{type:Boolean,default:!1},showRules:{type:Boolean,default:!1},idSuffix:{type:String,default:""},isLocked:Boolean},setup(t){const e=t,{inputId:i}=qe(e.inputType,e.fieldName+e.idSuffix),{valErrorId:s}=Os(e.fieldName),a=qe("legend",e.fieldName).inputId,o=vt(e.inputType),r=vt(!1),n=st(()=>/[a-z]/.test(e.modelValue??"")),l=st(()=>/[A-Z]/.test(e.modelValue??"")),u=st(()=>/[0-9]/.test(e.modelValue??"")),d=st(()=>/[^A-Za-z0-9]/.test(e.modelValue??"")),c=st(()=>e.modelValue?.length>=8);function _(v){typeof v.getModifierState=="function"&&(r.value=!!v.getModifierState("CapsLock"))}function p(v){o.value!=v&&(o.value=v)}return(v,g)=>(D(),W("div",{class:nt(["field",{"pt-3":t.hasOffset}])},[V("label",{for:G(i),class:"label"},[V("span",qy,[V("span",null,at(v.$t(e.label)),1),t.isLocked?(D(),W("span",Cy,[rt(G(os),{class:"icon-size-1"})])):it("",!0)])],8,Ry),V("div",Iy,[V("input",ba({disabled:t.isDisabled||t.isLocked,name:t.fieldName,id:G(i),type:o.value,class:"input",value:t.modelValue,placeholder:t.placeholder},v.$attrs,{onInput:g[0]||(g[0]=y=>v.$emit("update:modelValue",y.target.value)),onKeyup:_,"aria-describedby":t.help?G(a):void 0,"aria-invalid":t.errorMessage!=null,"aria-errormessage":t.errorMessage!=null?G(s):void 0}),null,16,zy),o.value=="password"?(D(),W("span",{key:0,role:"button",id:"btnTogglePassword",tabindex:"0",class:"icon is-small is-right is-clickable",onKeyup:g[1]||(g[1]=Ts(y=>p("text"),["enter"])),onClick:g[2]||(g[2]=y=>p("text")),title:v.$t("tooltip.reveal_password")},[rt(G(Iw))],40,Dy)):(D(),W("span",{key:1,role:"button",id:"btnTogglePassword",tabindex:"0",class:"icon is-small is-right is-clickable",onKeyup:g[3]||(g[3]=Ts(y=>p("password"),["enter"])),onClick:g[4]||(g[4]=y=>p("password")),title:v.$t("tooltip.hide_password")},[rt(G(Dw))],40,Ny))]),r.value?(D(),W("p",Ly,at(v.$t("message.caps_lock_is_on")),1)):it("",!0),t.errorMessage!=null?(D(),Nt(G(rs),{key:1,error:t.errorMessage,field:t.fieldName},null,8,["error","field"])):it("",!0),t.help?(D(),W("p",Uy,at(v.$t(t.help)),1)):it("",!0),t.showRules?(D(),W("div",{key:3,id:G(a),class:"columns is-mobile is-size-7 mt-0"},[V("div",My,[V("span",Wy,at(v.$t("message.mandatory_rules")),1),g[5]||(g[5]=V("br",null,null,-1)),V("span",{class:nt(["is-underscored",{"is-dot":c.value}]),id:"valPwdIsLongEnough"},null,2),Ot(at(v.$t("message.is_long_enough")),1),g[6]||(g[6]=V("br",null,null,-1))]),V("div",By,[V("span",$y,at(v.$t("message.optional_rules_you_should_follow")),1),g[7]||(g[7]=V("br",null,null,-1)),V("span",{class:nt(["is-underscored",{"is-dot":n.value}]),id:"valPwdHasLowerCase"},null,2),Ot(at(v.$t("message.has_lower_case")),1),g[8]||(g[8]=V("br",null,null,-1)),V("span",{class:nt(["is-underscored",{"is-dot":l.value}]),id:"valPwdHasUpperCase"},null,2),Ot(at(v.$t("message.has_upper_case")),1),g[9]||(g[9]=V("br",null,null,-1)),V("span",{class:nt(["is-underscored",{"is-dot":d.value}]),id:"valPwdHasSpecialChar"},null,2),Ot(at(v.$t("message.has_special_char")),1),g[10]||(g[10]=V("br",null,null,-1)),V("span",{class:nt(["is-underscored",{"is-dot":u.value}]),id:"valPwdHasNumber"},null,2),Ot(at(v.$t("message.has_number")),1)])],8,jy)):it("",!0)],2))}}),Gy={class:"field is-flex"},Vy=["for"],Qy=["disabled","id","type","value","placeholder","maxlength","aria-describedby","aria-invalid","aria-errormessage"],Ky={key:0,class:"control"},Yy=["title"],Jy={class:"icon"},Zy={key:1,class:"control"},Xy=["title"],tk={class:"icon has-text-danger"},ek=["id"],JP=Object.assign({inheritAttrs:!1},{__name:"FormProtectedField",props:{modelValue:String,modelModifiers:{default:()=>({})},enableProtection:{type:Boolean,default:!1},label:{type:String,default:""},fieldName:{type:String,default:"",required:!0},errorMessage:[String],inputType:{type:String,default:"text"},placeholder:{type:String,default:""},help:{type:String,default:""},hasOffset:{type:Boolean,default:!1},isDisabled:{type:Boolean,default:!1},isExpanded:{type:Boolean,default:!0},maxLength:{type:Number,default:null},idSuffix:{type:String,default:""},isIndented:Boolean,isLocked:Boolean},emits:["update:modelValue"],setup(t,{emit:e}){const i=t,{inputId:s}=qe(i.inputType,i.fieldName+i.idSuffix),{valErrorId:a}=Os(i.fieldName),o=qe("legend",i.fieldName).inputId,r=vt(i.enableProtection),n=vt(!1),l=vt(0),u=st(()=>!!(i.isDisabled||i.isLocked||i.enableProtection==!0&&r.value==!0)),d=e;function c(v){const g=v.target.value.replace(/\s+/g,"");d("update:modelValue",g)}function _(v){let g=v.target.value;n.value=g.includes(" "),d("update:modelValue",g)}function p(v){n.value=v.target.value.includes(" "),l.value+=1}return(v,g)=>(D(),W("div",Gy,[t.isIndented?(D(),W("div",{key:0,class:nt(["pr-1",{"is-opacity-5":t.isDisabled||t.isLocked}])},[rt(G(ao),{class:"has-text-grey rotate-135"})],2)):it("",!0),V("div",null,[V("label",{for:G(s),class:nt(["label",{"is-opacity-5":t.isDisabled||t.isLocked}])},[Ot(at(v.$t(i.label)),1),t.isLocked?(D(),Nt(G(os),{key:0,class:"ml-2 icon-size-1"})):it("",!0)],10,Vy),V("div",{class:nt(["field has-addons mb-0",{"pt-3":t.hasOffset}])},[V("div",{class:nt(["control",{"is-expanded":t.isExpanded}])},[(D(),W("input",ba({key:l.value,disabled:u.value,id:G(s),type:t.inputType,class:"input",value:t.modelValue,placeholder:t.placeholder},v.$attrs,{onInput:_,onChange:c,onBlur:p,maxlength:t.maxLength,"aria-describedby":t.help?G(o):void 0,"aria-invalid":t.errorMessage!=null,"aria-errormessage":t.errorMessage!=null?G(a):void 0}),null,16,Qy))],2),t.enableProtection&&!t.isLocked?(D(),Nt(G(Gh),{key:0},{default:$t(({mode:y})=>[r.value?(D(),W("div",Ky,[V("button",{type:"button",class:nt(["button field-lock",{"is-dark":y=="dark"}]),onClick:g[0]||(g[0]=We(m=>r.value=!1,["stop"])),title:v.$t("tooltip.unlock")},[V("span",Jy,[rt(G(os))])],10,Yy)])):(D(),W("div",Zy,[V("button",{type:"button",class:nt(["button field-unlock",{"is-dark":y=="dark"}]),onClick:g[1]||(g[1]=We(m=>r.value=!0,["stop"])),title:v.$t("tooltip.lock")},[V("span",tk,[rt(G(Lw))])],10,Xy)]))]),_:1})):it("",!0)],2),n.value?(D(),Nt(G(rs),{key:0,error:v.$t("error.spaces_are_ignored"),field:"spaces",alertType:"is-warning"},null,8,["error"])):it("",!0),t.errorMessage!=null?(D(),Nt(G(rs),{key:1,error:t.errorMessage,field:t.fieldName},null,8,["error","field"])):it("",!0),t.help?(D(),W("p",{key:2,id:G(o),class:"help"},at(v.$t(t.help)),9,ek)):it("",!0)])]))}}),ik={class:"field is-flex"},sk=["for"],ak={class:"control"},ok=["id","name","disabled","aria-describedby","aria-invalid","aria-errormessage"],rk=["value"],nk=["id"],lk={__name:"FormSelect",props:Bi({label:{type:String,default:""},fieldName:{type:String,default:"",required:!0},errorMessage:[String],options:{type:Array,required:!0},help:{type:String,default:""},isIndented:Boolean,isDisabled:Boolean,isLocked:Boolean,isLoading:{type:Boolean,default:!1},idSuffix:{type:String,default:""}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const e=Ti(t,"modelValue"),i=t,{inputId:s}=qe("select",i.fieldName+i.idSuffix),{valErrorId:a}=Os(i.fieldName),o=qe("legend",i.fieldName+i.idSuffix).inputId;return(r,n)=>(D(),W("div",ik,[t.isIndented?(D(),W("div",{key:0,class:nt(["pr-1",{"is-opacity-5":t.isDisabled||t.isLocked}])},[rt(G(ao),{class:"has-text-grey rotate-135"})],2)):it("",!0),V("div",null,[V("label",{for:G(s),class:nt(["label",{"is-opacity-5":t.isDisabled||t.isLocked}])},[Ot(at(r.$t(i.label)),1),t.isLocked?(D(),Nt(G(os),{key:0,class:"ml-2 icon-size-1"})):it("",!0)],10,sk),V("div",ak,[V("div",{class:nt(["select",{"is-loading":t.isLoading==!0}])},[Ma(V("select",{id:G(s),name:t.fieldName,"onUpdate:modelValue":n[0]||(n[0]=l=>e.value=l),disabled:t.isDisabled||t.isLocked,"aria-describedby":t.help?G(o):void 0,"aria-invalid":t.errorMessage!=null,"aria-errormessage":t.errorMessage!=null?G(a):void 0},[(D(!0),W(xt,null,da(t.options,l=>(D(),W("option",{key:l.value,value:l.value},at(r.$t(l.text)),9,rk))),128))],8,ok),[[rf,e.value]])],2),ee(r.$slots,"default")]),t.errorMessage!=null?(D(),Nt(G(rs),{key:0,error:t.errorMessage,field:t.fieldName},null,8,["error","field"])):it("",!0),t.help?(D(),W("p",{key:1,id:G(o),class:"help"},at(r.$t(t.help)),9,nk)):it("",!0)])]))}},uk=["for"],dk=["disabled","name","id","value","placeholder","maxlength","aria-describedby","aria-invalid","aria-errormessage"],ck=["id"],ZP=Object.assign({inheritAttrs:!1},{__name:"FormTextarea",props:{modelValue:[String,Number,Boolean],label:{type:String,default:""},fieldName:{type:String,default:"",required:!0},errorMessage:[String],placeholder:{type:String,default:""},help:{type:String,default:""},fontSize:{type:String,default:"is-small"},hasOffset:{type:Boolean,default:!1},isDisabled:{type:Boolean,default:!1},maxLength:{type:Number,default:null},isIndented:Boolean,isLocked:Boolean,leftIcon:{type:String,default:""},rightIcon:{type:String,default:""},idSuffix:{type:String,default:""}},setup(t){const e=t,{inputId:i}=qe(e.inputType,e.fieldName+e.idSuffix),{valErrorId:s}=Os(e.fieldName),a=qe("legend",e.fieldName).inputId;return(o,r)=>(D(),W("div",{class:nt(["mb-3",{"pt-3":t.hasOffset,"is-flex":t.isIndented}])},[t.isIndented?(D(),W("div",{key:0,class:nt(["mx-2 pr-1",{"is-opacity-5":t.isDisabled||t.isLocked}])},[rt(G(ao),{class:"has-text-grey rotate-135"})],2)):it("",!0),V("div",{class:nt(["field",{"is-flex-grow-5":t.isIndented}])},[t.label?(D(),W("label",{key:0,for:G(i),class:"label"},[Ot(at(o.$t(e.label)),1),t.isLocked?(D(),Nt(G(os),{key:0,class:"ml-2 icon-size-1"})):it("",!0)],8,uk)):it("",!0),V("div",{class:nt(["control",{"has-icons-left":t.leftIcon,"has-icons-right":t.rightIcon}])},[V("textarea",ba({disabled:t.isDisabled||t.isLocked,name:t.fieldName,id:G(i),class:["textarea has-fixed-size",t.fontSize],value:t.modelValue,placeholder:t.placeholder},o.$attrs,{onInput:r[0]||(r[0]=n=>o.$emit("update:modelValue",n.target.value)),onChange:r[1]||(r[1]=n=>o.$emit("change:modelValue",n.target.value)),maxlength:t.maxLength,"aria-describedby":t.help?G(a):void 0,"aria-invalid":t.errorMessage!=null,"aria-errormessage":t.errorMessage!=null?G(s):void 0}),null,16,dk)],2),t.errorMessage!=null?(D(),Nt(G(rs),{key:1,error:t.errorMessage,field:t.fieldName},null,8,["error","field"])):it("",!0),t.help?(D(),W("p",{key:2,id:G(a),class:"help"},at(o.$t(t.help)),9,ck)):it("",!0)],2)],2))}}),bk=["aria-describedby","aria-invalid","aria-errormessage"],_k=["id","title","aria-checked","disabled","onClick"],hk=["id","checked","value","disabled"],pk={key:0,class:"is-block is-size-7"},mk=["for"],gk=["id"],fk={__name:"FormToggle",props:{modelValue:[String,Number,Boolean],choices:{type:Array,required:!0},fieldName:{type:String,required:!0},errorMessage:[String],hasOffset:Boolean,isDisabled:Boolean,isLocked:Boolean,label:{type:String,default:""},help:{type:String,default:""}},emits:["update:modelValue"],setup(t,{emit:e}){const i=t,s=e,{valErrorId:a}=Os(i.fieldName),o=qe("legend",i.fieldName).inputId;function r(n){s("update:modelValue",n)}return(n,l)=>(D(),W("div",{class:nt(["field",{"pt-3":t.hasOffset}])},[t.label?(D(),W("span",{key:0,class:nt(["label",{"is-opacity-5":t.isDisabled||t.isLocked}])},[Ot(at(n.$t(i.label)),1),t.isLocked?(D(),Nt(G(os),{key:0,class:"ml-2 icon-size-1"})):it("",!0)],2)):it("",!0),V("div",{id:"rdoGroup",role:"radiogroup","aria-describedby":t.help?G(o):void 0,"aria-invalid":t.errorMessage!=null,"aria-errormessage":t.errorMessage!=null?G(a):void 0,class:"is-toggle buttons"},[rt(G(Gh),null,{default:$t(({mode:u})=>[(D(!0),W(xt,null,da(t.choices,d=>(D(),W("button",{key:d.value,id:G(qe)("button",t.fieldName+d.value).inputId,role:"radio",type:"button",class:nt(["button",{"is-link":t.modelValue===d.value,"is-dark":u=="dark"&&t.modelValue!==d.value,"is-multiline":d.legend}]),title:d.title?n.$t(d.title):n.$t(d.text),"aria-checked":t.modelValue===d.value,disabled:t.isDisabled||t.isLocked,onClick:We(c=>r(d.value),["stop"])},[V("input",{id:G(qe)("radio",d.value).inputId,type:"radio",class:"is-hidden",checked:t.modelValue===d.value,value:d.value,disabled:t.isDisabled||t.isLocked},null,8,hk),d.legend?(D(),W("span",pk,at(n.$t(d.legend)),1)):it("",!0),d.icon?(D(),Nt(G(ur),{key:1,name:d.icon,class:"mr-2"},null,8,["name"])):it("",!0),V("label",{for:G(qe)("button",t.fieldName+d.value).inputId,class:"is-clickable"},at(n.$t(d.text)),9,mk)],10,_k))),128))]),_:1})],8,bk),t.errorMessage!=null?(D(),Nt(G(rs),{key:1,error:t.errorMessage,field:t.fieldName},null,8,["error","field"])):it("",!0),t.help?(D(),W("p",{key:2,id:G(o),class:"help"},at(n.$t(i.help)),9,gk)):it("",!0)],2))}},vk={key:0,class:"control"},wk=["aria-label"],yk=["aria-label"],kk={key:1,class:"control"},Vh={__name:"NavigationButton",props:{currentPageTitle:{type:String,default:""},previousPageTitle:{type:String,default:""},action:{type:String,default:"close"},useLinkTag:{type:Boolean,default:!0},isText:{type:Boolean,default:!1},isCapture:{type:Boolean,default:!1},isRounded:{type:Boolean,default:!0}},emits:["closed","goback","canceled"],setup(t,{emit:e}){const i=Hh(),s=t,a=st(()=>"button"+(i.value==="dark"&&s.isText==!1&&s.isCapture==!1?" is-dark":"")+(s.isText==!0?" is-text":"")+(s.isCapture==!0?" is-large is-warning":"")+(s.isRounded==!0?" is-rounded":""));return(o,r)=>t.useLinkTag?(D(),W("p",vk,[t.action=="close"?(D(),W("a",{key:0,id:"lnkClose",onClick:r[0]||(r[0]=We(n=>o.$emit("closed"),["prevent"])),class:nt(a.value),tabindex:"0",role:"button","aria-label":o.$t("tooltip.close_the_x_page",{pagetitle:t.currentPageTitle})},at(o.$t("label.close")),11,wk)):t.action=="back"?(D(),W("a",{key:1,id:"lnkBack",onClick:r[1]||(r[1]=We(n=>o.$emit("goback"),["prevent"])),class:nt(a.value),"aria-label":o.$t("tooltip.go_back_to_the_x_page",{pagetitle:t.previousPageTitle})},at(o.$t("label.back")),11,yk)):t.action=="cancel"?(D(),W("a",{key:2,id:"lnkCancel",onClick:r[2]||(r[2]=We(n=>o.$emit("canceled"),["prevent"])),class:nt(a.value)},at(o.$t("label.cancel")),3)):it("",!0)])):(D(),W("p",kk,[t.action=="close"?(D(),W("button",{key:0,id:"btnClose",class:nt(a.value),onClick:r[3]||(r[3]=n=>o.$emit("closed")),type:"button"},at(o.$t("label.close")),3)):it("",!0),t.action=="cancel"?(D(),W("button",{key:1,id:"btnCancel",class:nt(a.value),onClick:r[4]||(r[4]=n=>o.$emit("canceled")),type:"button"},at(o.$t("label.cancel")),3)):it("",!0)]))}};function Ak(t,e){typeof console<"u"&&(console.warn("[intlify] "+t),e&&console.warn(e.stack))}const or=typeof window<"u",ds=(t,e=!1)=>e?Symbol.for(t):Symbol(t),xk=(t,e,i)=>Tk({l:t,k:e,s:i}),Tk=t=>JSON.stringify(t).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),be=t=>typeof t=="number"&&isFinite(t),Qh=t=>ou(t)==="[object Date]",rr=t=>ou(t)==="[object RegExp]",Ur=t=>Dt(t)&&Object.keys(t).length===0,me=Object.assign,Sk=Object.create,Gt=(t=null)=>Sk(t);let pc;const su=()=>pc||(pc=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:Gt());function mc(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/=/g,"=")}function Fk(t){return t.replace(/&(?![a-zA-Z0-9#]{2,6};)/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}const Pk=/^\s*javascript\s*(?::|�*58;?|�*3a;?|:?)/i,Ek=/^(?:href|src|action|formaction)$/i;function au(t){return Pk.test(t)}function Ok(t){const e=/url\s*\(/gi;let i="",s=0,a;for(;(a=e.exec(t))!==null;){const o=a.index,r=e.lastIndex-1;let n=r+1,l=1,u=null;for(;n`${s}="${gc(s,a)}"`),t=t.replace(/([\w:-]+)\s*=\s*'([^']*)'/g,(i,s,a)=>`${s}='${gc(s,a)}'`),/\s*on\w+\s*=\s*["']?[^"'>]+["']?/gi.test(t)&&(t=t.replace(/(\s+)(on)(\w+\s*=)/gi,"$1on$3")),t=t.replace(/(\s+(?:href|src|action|formaction)\s*=\s*)([^\s"'=<>`]+)/gi,(i,s,a)=>au(a)?`${s}about:blank`:i),t}const qk=Object.prototype.hasOwnProperty;function Xe(t,e){return qk.call(t,e)}const ue=Array.isArray,ne=t=>typeof t=="function",ct=t=>typeof t=="string",ae=t=>typeof t=="boolean",It=t=>t!==null&&typeof t=="object",Ck=t=>It(t)&&ne(t.then)&&ne(t.catch),Kh=Object.prototype.toString,ou=t=>Kh.call(t),Dt=t=>ou(t)==="[object Object]",Ik=t=>t==null?"":ue(t)||Dt(t)&&t.toString===Kh?JSON.stringify(t,null,2):String(t);function ru(t,e=""){return t.reduce((i,s,a)=>a===0?i+s:i+e+s,"")}const To=t=>!It(t)||ue(t);function Lo(t,e){if(To(t)||To(e))throw new Error("Invalid value");const i=[{src:t,des:e}];for(;i.length;){const{src:s,des:a}=i.pop();Object.keys(s).forEach(o=>{o!=="__proto__"&&(It(s[o])&&!It(a[o])&&(a[o]=Array.isArray(s[o])?[]:Gt()),To(a[o])||To(s[o])?a[o]=s[o]:i.push({src:s[o],des:a[o]}))})}}function zk(t,e,i){return{line:t,column:e,offset:i}}function dl(t,e,i){return{start:t,end:e}}const Mt={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14},Dk=17;function jr(t,e,i={}){const{domain:s,messages:a,args:o}=i,r=t,n=new SyntaxError(String(r));return n.code=t,e&&(n.location=e),n.domain=s,n}function Nk(t){throw t}const _i=" ",Lk="\r",ke=` +`,Uk="\u2028",jk="\u2029";function Mk(t){const e=t;let i=0,s=1,a=1,o=0;const r=F=>e[F]===Lk&&e[F+1]===ke,n=F=>e[F]===ke,l=F=>e[F]===jk,u=F=>e[F]===Uk,d=F=>r(F)||n(F)||l(F)||u(F),c=()=>i,_=()=>s,p=()=>a,v=()=>o,g=F=>r(F)||l(F)||u(F)?ke:e[F],y=()=>g(i),m=()=>g(i+o);function w(){return o=0,d(i)&&(s++,a=0),r(i)&&i++,i++,a++,e[i]}function x(){return r(i+o)&&o++,o++,e[i+o]}function f(){i=0,s=1,a=1,o=0}function T(F=0){o=F}function P(){const F=i+o;for(;F!==i;)w();o=0}return{index:c,line:_,column:p,peekOffset:v,charAt:g,currentChar:y,currentPeek:m,next:w,peek:x,reset:f,resetPeek:T,skipToPeek:P}}const Ei=void 0,Wk=".",fc="'",Bk="tokenizer";function $k(t,e={}){const i=e.location!==!1,s=Mk(t),a=()=>s.index(),o=()=>zk(s.line(),s.column(),s.index()),r=o(),n=a(),l={currentType:13,offset:n,startLoc:r,endLoc:r,lastType:13,lastOffset:n,lastStartLoc:r,lastEndLoc:r,braceNest:0,inLinked:!1,text:""},u=()=>l,{onError:d}=e;function c(b,h,A,...E){const Y=u();if(h.column+=A,h.offset+=A,d){const U=i?dl(Y.startLoc,h):null,k=jr(b,U,{domain:Bk,args:E});d(k)}}function _(b,h,A){b.endLoc=o(),b.currentType=h;const E={type:h};return i&&(E.loc=dl(b.startLoc,b.endLoc)),A!=null&&(E.value=A),E}const p=b=>_(b,13);function v(b,h){return b.currentChar()===h?(b.next(),h):(c(Mt.EXPECTED_TOKEN,o(),0,h),"")}function g(b){let h="";for(;b.currentPeek()===_i||b.currentPeek()===ke;)h+=b.currentPeek(),b.peek();return h}function y(b){const h=g(b);return b.skipToPeek(),h}function m(b){if(b===Ei)return!1;const h=b.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h===95}function w(b){if(b===Ei)return!1;const h=b.charCodeAt(0);return h>=48&&h<=57}function x(b,h){const{currentType:A}=h;if(A!==2)return!1;g(b);const E=m(b.currentPeek());return b.resetPeek(),E}function f(b,h){const{currentType:A}=h;if(A!==2)return!1;g(b);const E=b.currentPeek()==="-"?b.peek():b.currentPeek(),Y=w(E);return b.resetPeek(),Y}function T(b,h){const{currentType:A}=h;if(A!==2)return!1;g(b);const E=b.currentPeek()===fc;return b.resetPeek(),E}function P(b,h){const{currentType:A}=h;if(A!==7)return!1;g(b);const E=b.currentPeek()===".";return b.resetPeek(),E}function F(b,h){const{currentType:A}=h;if(A!==8)return!1;g(b);const E=m(b.currentPeek());return b.resetPeek(),E}function B(b,h){const{currentType:A}=h;if(!(A===7||A===11))return!1;g(b);const E=b.currentPeek()===":";return b.resetPeek(),E}function q(b,h){const{currentType:A}=h;if(A!==9)return!1;const E=()=>{const U=b.currentPeek();return U==="{"?m(b.peek()):U==="@"||U==="|"||U===":"||U==="."||U===_i||!U?!1:U===ke?(b.peek(),E()):Q(b,!1)},Y=E();return b.resetPeek(),Y}function N(b){g(b);const h=b.currentPeek()==="|";return b.resetPeek(),h}function Q(b,h=!0){const A=(Y=!1,U="")=>{const k=b.currentPeek();return k==="{"||k==="@"||!k?Y:k==="|"?!(U===_i||U===ke):k===_i?(b.peek(),A(!0,_i)):k===ke?(b.peek(),A(!0,ke)):!0},E=A();return h&&b.resetPeek(),E}function z(b,h){const A=b.currentChar();return A===Ei?Ei:h(A)?(b.next(),A):null}function X(b){const h=b.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h>=48&&h<=57||h===95||h===36}function L(b){return z(b,X)}function tt(b){const h=b.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h>=48&&h<=57||h===95||h===36||h===45}function et(b){return z(b,tt)}function ht(b){const h=b.charCodeAt(0);return h>=48&&h<=57}function mt(b){return z(b,ht)}function yt(b){const h=b.charCodeAt(0);return h>=48&&h<=57||h>=65&&h<=70||h>=97&&h<=102}function Pt(b){return z(b,yt)}function _t(b){let h="",A="";for(;h=mt(b);)A+=h;return A}function lt(b){let h="";for(;;){const A=b.currentChar();if(A==="\\"){const E=b.peek();E==="{"||E==="}"||E==="@"||E==="|"||E==="\\"?(h+=A+E,b.next(),b.next()):(b.resetPeek(),h+=A,b.next())}else{if(A==="{"||A==="}"||A==="@"||A==="|"||!A)break;if(A===_i||A===ke)if(Q(b))h+=A,b.next();else{if(N(b))break;h+=A,b.next()}else h+=A,b.next()}}return h}function gt(b){y(b);let h="",A="";for(;h=et(b);)A+=h;const E=b.currentChar();if(E&&E!=="}"&&E!==Ei&&E!==_i&&E!==ke&&E!==" "){const Y=ut(b);return c(Mt.INVALID_TOKEN_IN_PLACEHOLDER,o(),0,A+Y),A+Y}return b.currentChar()===Ei&&c(Mt.UNTERMINATED_CLOSING_BRACE,o(),0),A}function Qt(b){y(b);let h="";return b.currentChar()==="-"?(b.next(),h+=`-${_t(b)}`):h+=_t(b),b.currentChar()===Ei&&c(Mt.UNTERMINATED_CLOSING_BRACE,o(),0),h}function Xt(b){return b!==fc&&b!==ke}function te(b){y(b),v(b,"'");let h="",A="";for(;h=z(b,Xt);)h==="\\"?A+=j(b):A+=h;const E=b.currentChar();return E===ke||E===Ei?(c(Mt.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,o(),0),E===ke&&(b.next(),v(b,"'")),A):(v(b,"'"),A)}function j(b){const h=b.currentChar();switch(h){case"\\":case"'":return b.next(),`\\${h}`;case"u":return K(b,h,4);case"U":return K(b,h,6);default:return c(Mt.UNKNOWN_ESCAPE_SEQUENCE,o(),0,h),""}}function K(b,h,A){v(b,h);let E="";for(let Y=0;Y{const E=b.currentChar();return E==="{"||E==="@"||E==="|"||E==="("||E===")"||!E||E===_i?A:(A+=E,b.next(),h(A))};return h("")}function O(b){y(b);const h=v(b,"|");return y(b),h}function C(b,h){let A=null;switch(b.currentChar()){case"{":return h.braceNest>=1&&c(Mt.NOT_ALLOW_NEST_PLACEHOLDER,o(),0),b.next(),A=_(h,2,"{"),y(b),h.braceNest++,A;case"}":return h.braceNest>0&&h.currentType===2&&c(Mt.EMPTY_PLACEHOLDER,o(),0),b.next(),A=_(h,3,"}"),h.braceNest--,h.braceNest>0&&y(b),h.inLinked&&h.braceNest===0&&(h.inLinked=!1),A;case"@":return h.braceNest>0&&c(Mt.UNTERMINATED_CLOSING_BRACE,o(),0),A=M(b,h)||p(h),h.braceNest=0,A;default:{let Y=!0,U=!0,k=!0;if(N(b))return h.braceNest>0&&c(Mt.UNTERMINATED_CLOSING_BRACE,o(),0),A=_(h,1,O(b)),h.braceNest=0,h.inLinked=!1,A;if(h.braceNest>0&&(h.currentType===4||h.currentType===5||h.currentType===6))return c(Mt.UNTERMINATED_CLOSING_BRACE,o(),0),h.braceNest=0,H(b,h);if(Y=x(b,h))return A=_(h,4,gt(b)),y(b),A;if(U=f(b,h))return A=_(h,5,Qt(b)),y(b),A;if(k=T(b,h))return A=_(h,6,te(b)),y(b),A;if(!Y&&!U&&!k)return A=_(h,12,ut(b)),c(Mt.INVALID_TOKEN_IN_PLACEHOLDER,o(),0,A.value),y(b),A;break}}return A}function M(b,h){const{currentType:A}=h;let E=null;const Y=b.currentChar();switch((A===7||A===8||A===11||A===9)&&(Y===ke||Y===_i)&&c(Mt.INVALID_LINKED_FORMAT,o(),0),Y){case"@":return b.next(),E=_(h,7,"@"),h.inLinked=!0,E;case".":return y(b),b.next(),_(h,8,".");case":":return y(b),b.next(),_(h,9,":");default:return N(b)?(E=_(h,1,O(b)),h.braceNest=0,h.inLinked=!1,E):P(b,h)||B(b,h)?(y(b),M(b,h)):F(b,h)?(y(b),_(h,11,ft(b))):q(b,h)?(y(b),Y==="{"?C(b,h)||E:_(h,10,S(b))):(A===7&&c(Mt.INVALID_LINKED_FORMAT,o(),0),h.braceNest=0,h.inLinked=!1,H(b,h))}}function H(b,h){let A={type:13};if(h.braceNest>0)return C(b,h)||p(h);if(h.inLinked)return M(b,h)||p(h);switch(b.currentChar()){case"{":return C(b,h)||p(h);case"}":return c(Mt.UNBALANCED_CLOSING_BRACE,o(),0),b.next(),_(h,3,"}");case"@":return M(b,h)||p(h);default:{if(N(b))return A=_(h,1,O(b)),h.braceNest=0,h.inLinked=!1,A;if(Q(b))return _(h,0,lt(b));break}}return A}function $(){const{currentType:b,offset:h,startLoc:A,endLoc:E}=l;return l.lastType=b,l.lastOffset=h,l.lastStartLoc=A,l.lastEndLoc=E,l.offset=a(),l.startLoc=o(),s.currentChar()===Ei?_(l,13):H(s,l)}return{nextToken:$,currentOffset:a,currentPosition:o,context:u}}const Hk="parser",Gk=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g,Vk=/\\([\\@{}|])/g;function Qk(t,e){return e}function Kk(t,e,i){switch(t){case"\\\\":return"\\";case"\\'":return"'";default:{const s=parseInt(e||i,16);return s<=55295||s>=57344?String.fromCodePoint(s):"�"}}}function Yk(t={}){const e=t.location!==!1,{onError:i}=t;function s(m,w,x,f,...T){const P=m.currentPosition();if(P.offset+=f,P.column+=f,i){const F=e?dl(x,P):null,B=jr(w,F,{domain:Hk,args:T});i(B)}}function a(m,w,x){const f={type:m};return e&&(f.start=w,f.end=w,f.loc={start:x,end:x}),f}function o(m,w,x,f){e&&(m.end=w,m.loc&&(m.loc.end=x))}function r(m,w){const x=m.context(),f=a(3,x.offset,x.startLoc);return f.value=w.replace(Vk,Qk),o(f,m.currentOffset(),m.currentPosition()),f}function n(m,w){const x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(5,f,T);return P.index=parseInt(w,10),m.nextToken(),o(P,m.currentOffset(),m.currentPosition()),P}function l(m,w){const x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(4,f,T);return P.key=w,m.nextToken(),o(P,m.currentOffset(),m.currentPosition()),P}function u(m,w){const x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(9,f,T);return P.value=w.replace(Gk,Kk),m.nextToken(),o(P,m.currentOffset(),m.currentPosition()),P}function d(m){const w=m.nextToken(),x=m.context(),{lastOffset:f,lastStartLoc:T}=x,P=a(8,f,T);return w.type!==11?(s(m,Mt.UNEXPECTED_EMPTY_LINKED_MODIFIER,x.lastStartLoc,0),P.value="",o(P,f,T),{nextConsumeToken:w,node:P}):(w.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,hi(w)),P.value=w.value||"",o(P,m.currentOffset(),m.currentPosition()),{node:P})}function c(m,w){const x=m.context(),f=a(7,x.offset,x.startLoc);return f.value=w,o(f,m.currentOffset(),m.currentPosition()),f}function _(m){const w=m.context(),x=a(6,w.offset,w.startLoc);let f=m.nextToken();if(f.type===8){const T=d(m);x.modifier=T.node,f=T.nextConsumeToken||m.nextToken()}switch(f.type!==9&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(f)),f=m.nextToken(),f.type===2&&(f=m.nextToken()),f.type){case 10:f.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(f)),x.key=c(m,f.value||"");break;case 4:f.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(f)),x.key=l(m,f.value||"");break;case 5:f.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(f)),x.key=n(m,f.value||"");break;case 6:f.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(f)),x.key=u(m,f.value||"");break;default:{s(m,Mt.UNEXPECTED_EMPTY_LINKED_KEY,w.lastStartLoc,0);const T=m.context(),P=a(7,T.offset,T.startLoc);return P.value="",o(P,T.offset,T.startLoc),x.key=P,o(x,T.offset,T.startLoc),{nextConsumeToken:f,node:x}}}return o(x,m.currentOffset(),m.currentPosition()),{node:x}}function p(m){const w=m.context(),x=w.currentType===1?m.currentOffset():w.offset,f=w.currentType===1?w.endLoc:w.startLoc,T=a(2,x,f);T.items=[];let P=null;do{const q=P||m.nextToken();switch(P=null,q.type){case 0:q.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(q)),T.items.push(r(m,q.value||""));break;case 5:q.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(q)),T.items.push(n(m,q.value||""));break;case 4:q.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(q)),T.items.push(l(m,q.value||""));break;case 6:q.value==null&&s(m,Mt.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hi(q)),T.items.push(u(m,q.value||""));break;case 7:{const N=_(m);T.items.push(N.node),P=N.nextConsumeToken||null;break}}}while(w.currentType!==13&&w.currentType!==1);const F=w.currentType===1?w.lastOffset:m.currentOffset(),B=w.currentType===1?w.lastEndLoc:m.currentPosition();return o(T,F,B),T}function v(m,w,x,f){const T=m.context();let P=f.items.length===0;const F=a(1,w,x);F.cases=[],F.cases.push(f);do{const B=p(m);P||(P=B.items.length===0),F.cases.push(B)}while(T.currentType!==13);return P&&s(m,Mt.MUST_HAVE_MESSAGES_IN_PLURAL,x,0),o(F,m.currentOffset(),m.currentPosition()),F}function g(m){const w=m.context(),{offset:x,startLoc:f}=w,T=p(m);return w.currentType===13?T:v(m,x,f,T)}function y(m){const w=$k(m,me({},t)),x=w.context(),f=a(0,x.offset,x.startLoc);return e&&f.loc&&(f.loc.source=m),f.body=g(w),t.onCacheKey&&(f.cacheKey=t.onCacheKey(m)),x.currentType!==13&&s(w,Mt.UNEXPECTED_LEXICAL_ANALYSIS,x.lastStartLoc,0,m[x.offset]||""),o(f,w.currentOffset(),w.currentPosition()),f}return{parse:y}}function hi(t){if(t.type===13)return"EOF";const e=(t.value||"").replace(/\r?\n/gu,"\\n");return e.length>10?e.slice(0,9)+"…":e}function Jk(t,e={}){const i={ast:t,helpers:new Set};return{context:()=>i,helper:o=>(i.helpers.add(o),o)}}function vc(t,e){for(let i=0;iwc(i)),t}function wc(t){if(t.items.length===1){const e=t.items[0];(e.type===3||e.type===9)&&(t.static=e.value,delete e.value)}else{const e=[];for(let i=0;ir;function l(g,y){r.code+=g}function u(g,y=!0){const m=y?s:"";l(a?m+" ".repeat(g):m)}function d(g=!0){const y=++r.indentLevel;g&&u(y)}function c(g=!0){const y=--r.indentLevel;g&&u(y)}function _(){u(r.indentLevel)}return{context:n,push:l,indent:d,deindent:c,newline:_,helper:g=>`_${g}`,needIndent:()=>r.needIndent}}function eA(t,e){const{helper:i}=t;t.push(`${i("linked")}(`),ra(t,e.key),e.modifier?(t.push(", "),ra(t,e.modifier),t.push(", _type")):t.push(", undefined, _type"),t.push(")")}function iA(t,e){const{helper:i,needIndent:s}=t;t.push(`${i("normalize")}([`),t.indent(s());const a=e.items.length;for(let o=0;o1){t.push(`${i("plural")}([`),t.indent(s());const a=e.cases.length;for(let o=0;o{const i=ct(e.mode)?e.mode:"normal",s=ct(e.filename)?e.filename:"message.intl";e.sourceMap;const a=e.breakLineCode!=null?e.breakLineCode:i==="arrow"?";":` +`,o=e.needIndent?e.needIndent:i!=="arrow",r=t.helpers||[],n=tA(t,{filename:s,breakLineCode:a,needIndent:o});n.push(i==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),n.indent(o),r.length>0&&(n.push(`const { ${ru(r.map(d=>`${d}: _${d}`),", ")} } = ctx`),n.newline()),n.push("return "),ra(n,t),n.deindent(o),n.push("}"),delete t.helpers;const{code:l,map:u}=n.context();return{ast:t,code:l,map:u?u.toJSON():void 0}};function rA(t,e={}){const i=me({},e),s=!!i.jit,a=!!i.minify,o=i.optimize==null?!0:i.optimize,n=Yk(i).parse(t);return s?(o&&Xk(n),a&&Bs(n),{ast:n,code:""}):(Zk(n,i),oA(n,i))}function nA(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(su().__INTLIFY_PROD_DEVTOOLS__=!1)}function xi(t){return It(t)&&lu(t)===0&&(Xe(t,"b")||Xe(t,"body"))}const Yh=["b","body"];function lA(t){return cs(t,Yh)}const Jh=["c","cases"];function uA(t){return cs(t,Jh,[])}const Zh=["s","static"];function dA(t){return cs(t,Zh)}const Xh=["i","items"];function cA(t){return cs(t,Xh,[])}const tp=["t","type"];function lu(t){return cs(t,tp)}const ep=["v","value"];function So(t,e){const i=cs(t,ep);if(i!=null)return i;throw Qa(e)}const ip=["m","modifier"];function bA(t){return cs(t,ip)}const sp=["k","key"];function _A(t){const e=cs(t,sp);if(e)return e;throw Qa(6)}function cs(t,e,i){for(let s=0;shA(i,t)}function hA(t,e){const i=lA(e);if(i==null)throw Qa(0);if(lu(i)===1){const o=uA(i);return t.plural(o.reduce((r,n)=>[...r,yc(t,n)],[]))}else return yc(t,i)}function yc(t,e){const i=dA(e);if(i!=null)return t.type==="text"?i:t.normalize([i]);{const s=cA(e).reduce((a,o)=>[...a,cl(t,o)],[]);return t.normalize(s)}}function cl(t,e){const i=lu(e);switch(i){case 3:return So(e,i);case 9:return So(e,i);case 4:{const s=e;if(Xe(s,"k")&&s.k)return t.interpolate(t.named(s.k));if(Xe(s,"key")&&s.key)return t.interpolate(t.named(s.key));throw Qa(i)}case 5:{const s=e;if(Xe(s,"i")&&be(s.i))return t.interpolate(t.list(s.i));if(Xe(s,"index")&&be(s.index))return t.interpolate(t.list(s.index));throw Qa(i)}case 6:{const s=e,a=bA(s),o=_A(s);return t.linked(cl(t,o),a?cl(t,a):void 0,t.type)}case 7:return So(e,i);case 8:return So(e,i);default:throw new Error(`unhandled node on format message part: ${i}`)}}const pA=t=>t;let Fo=Gt();function mA(t,e={}){let i=!1;const s=e.onError||Nk;return e.onError=a=>{i=!0,s(a)},{...rA(t,e),detectError:i}}function gA(t,e){if(ct(t)){ae(e.warnHtmlMessage)&&e.warnHtmlMessage;const s=(e.onCacheKey||pA)(t),a=Fo[s];if(a)return a;const{ast:o,detectError:r}=mA(t,{...e,location:!1,jit:!0}),n=xn(o);return r?n:Fo[s]=n}else{const i=t.cacheKey;if(i){const s=Fo[i];return s||(Fo[i]=xn(t))}else return xn(t)}}let Ka=null;function fA(t){Ka=t}function vA(t,e,i){Ka&&Ka.emit("i18n:init",{timestamp:Date.now(),i18n:t,version:e,meta:i})}const wA=yA("function:translate");function yA(t){return e=>Ka&&Ka.emit(t,e)}const Di={INVALID_ARGUMENT:Dk,INVALID_DATE_ARGUMENT:18,INVALID_ISO_DATE_ARGUMENT:19,NOT_SUPPORT_LOCALE_PROMISE_VALUE:21,NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:22,NOT_SUPPORT_LOCALE_TYPE:23},kA=24;function Ni(t){return jr(t,null,void 0)}function uu(t,e){return e.locale!=null?kc(e.locale):kc(t.locale)}let Tn;function kc(t){if(ct(t))return t;if(ne(t)){if(t.resolvedOnce&&Tn!=null)return Tn;if(t.constructor.name==="Function"){const e=t();if(Ck(e))throw Ni(Di.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return Tn=e}else throw Ni(Di.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw Ni(Di.NOT_SUPPORT_LOCALE_TYPE)}function AA(t,e,i){return[...new Set([i,...ue(e)?e:It(e)?Object.keys(e):ct(e)?[e]:[i]])]}function bl(t,e,i){const s=ct(i)?i:nr,a=t;a.__localeChainCache||(a.__localeChainCache=new Map);let o=a.__localeChainCache.get(s);if(!o){o=[];let r=[i];for(;ue(r);)r=Ac(o,r,e);const n=ue(e)||!Dt(e)?e:e.default?e.default:null;r=ct(n)?[n]:n,ue(r)&&Ac(o,r,!1),a.__localeChainCache.set(s,o)}return o}function Ac(t,e,i){let s=!0;for(let a=0;a{r===void 0?r=n:r+=n},_[1]=()=>{r!==void 0&&(e.push(r),r=void 0)},_[2]=()=>{_[0](),a++},_[3]=()=>{if(a>0)a--,s=4,_[0]();else{if(a=0,r===void 0||(r=OA(r),r===!1))return!1;_[1]()}};function p(){const v=t[i+1];if(s===5&&v==="'"||s===6&&v==='"')return i++,n="\\"+v,_[0](),!0}for(;s!==null;)if(i++,o=t[i],!(o==="\\"&&p())){if(l=EA(o),c=bs[s],u=c[l]||c.l||8,u===8||(s=u[0],u[1]!==void 0&&(d=_[u[1]],d&&(n=o,d()===!1))))return;if(s===7)return e}}const xc=new Map;function qA(t,e){return It(t)?t[e]:null}function CA(t,e){if(!It(t))return null;let i=xc.get(e);if(i||(i=RA(e),i&&xc.set(e,i)),!i)return null;const s=i.length;let a=t,o=0;for(;o`${t.charAt(0).toLocaleUpperCase()}${t.substr(1)}`;function zA(){return{upper:(t,e)=>e==="text"&&ct(t)?t.toUpperCase():e==="vnode"&&It(t)&&"__v_isVNode"in t?t.children.toUpperCase():t,lower:(t,e)=>e==="text"&&ct(t)?t.toLowerCase():e==="vnode"&&It(t)&&"__v_isVNode"in t?t.children.toLowerCase():t,capitalize:(t,e)=>e==="text"&&ct(t)?Tc(t):e==="vnode"&&It(t)&&"__v_isVNode"in t?Tc(t.children):t}}let op;function DA(t){op=t}let rp;function NA(t){rp=t}let np;function LA(t){np=t}let lp=null;const UA=t=>{lp=t},jA=()=>lp;let up=null;const Sc=t=>{up=t},MA=()=>up;let Fc=0;function WA(t={}){const e=ne(t.onWarn)?t.onWarn:Ak,i=ct(t.version)?t.version:IA,s=ct(t.locale)||ne(t.locale)?t.locale:nr,a=ne(s)?nr:s,o=ue(t.fallbackLocale)||Dt(t.fallbackLocale)||ct(t.fallbackLocale)||t.fallbackLocale===!1?t.fallbackLocale:a,r=Dt(t.messages)?t.messages:Sn(a),n=Dt(t.datetimeFormats)?t.datetimeFormats:Sn(a),l=Dt(t.numberFormats)?t.numberFormats:Sn(a),u=me(Gt(),t.modifiers,zA()),d=t.pluralRules||Gt(),c=ne(t.missing)?t.missing:null,_=ae(t.missingWarn)||rr(t.missingWarn)?t.missingWarn:!0,p=ae(t.fallbackWarn)||rr(t.fallbackWarn)?t.fallbackWarn:!0,v=!!t.fallbackFormat,g=!!t.unresolving,y=ne(t.postTranslation)?t.postTranslation:null,m=Dt(t.processor)?t.processor:null,w=ae(t.warnHtmlMessage)?t.warnHtmlMessage:!0,x=!!t.escapeParameter,f=ne(t.messageCompiler)?t.messageCompiler:op,T=ne(t.messageResolver)?t.messageResolver:rp||qA,P=ne(t.localeFallbacker)?t.localeFallbacker:np||AA,F=It(t.fallbackContext)?t.fallbackContext:void 0,B=t,q=It(B.__datetimeFormatters)?B.__datetimeFormatters:new Map,N=It(B.__numberFormatters)?B.__numberFormatters:new Map,Q=It(B.__meta)?B.__meta:{};Fc++;const z={version:i,cid:Fc,locale:s,fallbackLocale:o,messages:r,modifiers:u,pluralRules:d,missing:c,missingWarn:_,fallbackWarn:p,fallbackFormat:v,unresolving:g,postTranslation:y,processor:m,warnHtmlMessage:w,escapeParameter:x,messageCompiler:f,messageResolver:T,localeFallbacker:P,fallbackContext:F,onWarn:e,__meta:Q};return z.datetimeFormats=n,z.numberFormats=l,z.__datetimeFormatters=q,z.__numberFormatters=N,__INTLIFY_PROD_DEVTOOLS__&&vA(z,i,Q),z}const Sn=t=>({[t]:Gt()});function du(t,e,i,s,a){const{missing:o,onWarn:r}=t;if(o!==null){const n=o(t,i,e,a);return ct(n)?n:e}else return e}function ya(t,e,i){const s=t;s.__localeChainCache=new Map,t.localeFallbacker(t,i,e)}function BA(t,e){return t===e?!1:t.split("-")[0]===e.split("-")[0]}function $A(t,e){const i=e.indexOf(t);if(i===-1)return!1;for(let s=i+1;s{dp.includes(l)?r[l]=i[l]:o[l]=i[l]}),ct(s)?o.locale=s:Dt(s)&&(r=s),Dt(a)&&(r=a),[o.key||"",n,o,r]}function Ec(t,e,i){const s=t;for(const a in i){const o=`${e}__${a}`;s.__datetimeFormatters.has(o)&&s.__datetimeFormatters.delete(o)}}function Oc(t,...e){const{numberFormats:i,unresolving:s,fallbackLocale:a,onWarn:o,localeFallbacker:r}=t,{__numberFormatters:n}=t;if(!be(e[0]))return lr;const[l,u,d,c]=hl(...e),_=ae(d.missingWarn)?d.missingWarn:t.missingWarn;ae(d.fallbackWarn)?d.fallbackWarn:t.fallbackWarn;const p=!!d.part,v=uu(t,d),g=r(t,a,v);if(!ct(l)||l==="")return new Intl.NumberFormat(v.replace(/!/g,""),c).format(u);let y={},m,w=null;const x="number format";for(let P=0;P{cp.includes(l)?r[l]=i[l]:o[l]=i[l]}),ct(s)?o.locale=s:Dt(s)&&(r=s),Dt(a)&&(r=a),[o.key||"",n,o,r]}function Rc(t,e,i){const s=t;for(const a in i){const o=`${e}__${a}`;s.__numberFormatters.has(o)&&s.__numberFormatters.delete(o)}}const HA=t=>t,GA=t=>"",VA="text",QA=t=>t.length===0?"":ru(t),KA=Ik;function Fn(t,e){return t=Math.abs(t),e===2?t===1?0:1:Math.min(t,2)}function YA(t){const e=be(t.pluralIndex)?t.pluralIndex:-1;return be(t.named?.count)?t.named.count:be(t.named?.n)?t.named.n:e}function JA(t={}){const e=t.locale,i=YA(t),s=ct(e)&&ne(t.pluralRules?.[e])?t.pluralRules[e]:Fn,a=s===Fn?void 0:Fn,o=m=>m[s(i,m.length,a)],r=t.list||[],n=m=>r[m],l=t.named||Gt();be(t.pluralIndex)&&(l.count||=t.pluralIndex,l.n||=t.pluralIndex);const u=m=>l[m];function d(m,w){const x=ne(t.messages)?t.messages(m,!!w):It(t.messages)?t.messages[m]:!1;return x||(t.parent?t.parent.message(m):GA)}const c=m=>t.modifiers?t.modifiers[m]:HA,_=ne(t.processor?.normalize)?t.processor.normalize:QA,p=ne(t.processor?.interpolate)?t.processor.interpolate:KA,v=ct(t.processor?.type)?t.processor.type:VA,y={list:n,named:u,plural:o,linked:(m,...w)=>{const[x,f]=w;let T="text",P="";w.length===1?It(x)?(P=x.modifier||P,T=x.type||T):ct(x)&&(P=x||P):w.length===2&&(ct(x)&&(P=x||P),ct(f)&&(T=f||T));const F=d(m,!0)(y),B=F===""||F===void 0?m:F,q=T==="vnode"&&ue(B)&&P?B[0]:B;return P?c(P)(q,T):q},message:d,type:v,interpolate:p,normalize:_,values:me(Gt(),r,l)};return y}const qc=()=>"",Je=t=>ne(t);function Cc(t,...e){const{fallbackFormat:i,postTranslation:s,unresolving:a,messageCompiler:o,fallbackLocale:r,messages:n}=t,[l,u]=pl(...e),d=ae(u.missingWarn)?u.missingWarn:t.missingWarn,c=ae(u.fallbackWarn)?u.fallbackWarn:t.fallbackWarn,_=ae(u.escapeParameter)?u.escapeParameter:t.escapeParameter,p=!!u.resolvedMessage,v=ct(u.default)||ae(u.default)?ae(u.default)?o?l:()=>l:u.default:i?o?l:()=>l:null,g=i||v!=null&&(ct(v)||ne(v)),y=uu(t,u);_&&ZA(u);let[m,w,x]=p?[l,y,n[y]||Gt()]:bp(t,l,y,r,c,d),f=m,T=l;if(!p&&!(ct(f)||xi(f)||Je(f))&&g&&(f=v,T=f),!p&&(!(ct(f)||xi(f)||Je(f))||!ct(w)))return a?Mr:l;let P=!1;const F=()=>{P=!0},B=Je(f)?f:_p(t,l,w,f,T,F);if(P)return f;const q=ex(t,w,x,u),N=JA(q),Q=XA(t,B,N);let z=s?s(Q,l):Q;if(_&&ct(z)&&(z=Rk(z)),__INTLIFY_PROD_DEVTOOLS__){const X={timestamp:Date.now(),key:ct(l)?l:Je(f)?f.key:"",locale:w||(Je(f)?f.locale:""),format:ct(f)?f:Je(f)?f.source:"",message:z};X.meta=me({},t.__meta,jA()||{}),wA(X)}return z}function ZA(t){ue(t.list)?t.list=t.list.map(e=>ct(e)?mc(e):e):It(t.named)&&Object.keys(t.named).forEach(e=>{ct(t.named[e])&&(t.named[e]=mc(t.named[e]))})}function bp(t,e,i,s,a,o){const{messages:r,onWarn:n,messageResolver:l,localeFallbacker:u}=t,d=u(t,s,i);let c=Gt(),_,p=null;const v="translate";for(let g=0;gs);return u.locale=i,u.key=e,u}const l=r(s,tx(t,i,a,s,n,o));return l.locale=i,l.key=e,l.source=s,l}function XA(t,e,i){return e(i)}function pl(...t){const[e,i,s]=t,a=Gt();if(!ct(e)&&!be(e)&&!Je(e)&&!xi(e))throw Ni(Di.INVALID_ARGUMENT);const o=be(e)?String(e):(Je(e),e);return be(i)?a.plural=i:ct(i)?a.default=i:Dt(i)&&!Ur(i)?a.named=i:ue(i)&&(a.list=i),be(s)?a.plural=s:ct(s)?a.default=s:Dt(s)&&me(a,s),[o,a]}function tx(t,e,i,s,a,o){return{locale:e,key:i,warnHtmlMessage:a,onError:r=>{throw o&&o(r),r},onCacheKey:r=>xk(e,i,r)}}function ex(t,e,i,s){const{modifiers:a,pluralRules:o,messageResolver:r,fallbackLocale:n,fallbackWarn:l,missingWarn:u,fallbackContext:d}=t,_={locale:e,modifiers:a,pluralRules:o,messages:(p,v)=>{let g=r(i,p);if(g==null&&(d||v)){const[y,,m]=bp(d||t,p,e,n,l,u);g=y??r(m,p)}if(ct(g)||xi(g)){let y=!1;const w=_p(t,p,e,g,p,()=>{y=!0});return y?qc:w}else return Je(g)?g:qc}};return t.processor&&(_.processor=t.processor),s.list&&(_.list=s.list),s.named&&(_.named=s.named),be(s.plural)&&(_.pluralIndex=s.plural),_}nA();const ix="11.4.4";function sx(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(su().__INTLIFY_PROD_DEVTOOLS__=!1)}const $e={UNEXPECTED_RETURN_TYPE:kA,INVALID_ARGUMENT:25,MUST_BE_CALL_SETUP_TOP:26,NOT_INSTALLED:27,REQUIRED_VALUE:28,INVALID_VALUE:29,NOT_INSTALLED_WITH_PROVIDE:31,UNEXPECTED_ERROR:32,NOT_AVAILABLE_COMPOSITION_IN_LEGACY:34};function ei(t,...e){return jr(t,null,void 0)}const ml=ds("__translateVNode"),gl=ds("__datetimeParts"),fl=ds("__numberParts"),ax=ds("__setPluralRules"),ox=ds("__injectWithOption"),Vs=ds("__dispose");function Ya(t){if(!It(t)||xi(t))return t;for(const e in t)if(Xe(t,e))if(!e.includes("."))It(t[e])&&Ya(t[e]);else{const i=e.split("."),s=i.length-1;let a=t,o=!1;for(let r=0;r{if("locale"in n&&"resource"in n){const{locale:l,resource:u}=n;l?(r[l]=r[l]||Gt(),Lo(u,r[l])):Lo(u,r)}else ct(n)&&Lo(JSON.parse(n),r)}),a==null&&o)for(const n in r)Xe(r,n)&&Ya(r[n]);return r}function pp(t){return t.type}function rx(t,e,i){let s=It(e.messages)?e.messages:Gt();"__i18nGlobal"in i&&(s=hp(t.locale.value,{messages:s,__i18n:i.__i18nGlobal}));const a=Object.keys(s);a.length&&a.forEach(o=>{t.mergeLocaleMessage(o,s[o])});{if(It(e.datetimeFormats)){const o=Object.keys(e.datetimeFormats);o.length&&o.forEach(r=>{t.mergeDateTimeFormat(r,e.datetimeFormats[r])})}if(It(e.numberFormats)){const o=Object.keys(e.numberFormats);o.length&&o.forEach(r=>{t.mergeNumberFormat(r,e.numberFormats[r])})}}}function Ic(t){return rt(ca,null,t,0)}function cu(){return ge()}const zc="__INTLIFY_META__",Dc=()=>[],nx=()=>!1;let Nc=0;function Lc(t){return((e,i,s,a)=>t(i,s,cu()||void 0,a))}const lx=()=>{const t=cu();let e=null;return t&&(e=pp(t)[zc])?{[zc]:e}:null};function vl(t={}){const{__root:e,__injectWithOption:i}=t,s=e===void 0,a=t.flatJson,o=or?vt:Rt;let r=ae(t.inheritLocale)?t.inheritLocale:!0;const n=o(e&&r?e.locale.value:ct(t.locale)?t.locale:nr),l=o(e&&r?e.fallbackLocale.value:ct(t.fallbackLocale)||ue(t.fallbackLocale)||Dt(t.fallbackLocale)||t.fallbackLocale===!1?t.fallbackLocale:n.value),u=o(hp(n.value,t)),d=o(Dt(t.datetimeFormats)?t.datetimeFormats:{[n.value]:{}}),c=o(Dt(t.numberFormats)?t.numberFormats:{[n.value]:{}});let _=e?e.missingWarn:ae(t.missingWarn)||rr(t.missingWarn)?t.missingWarn:!0,p=e?e.fallbackWarn:ae(t.fallbackWarn)||rr(t.fallbackWarn)?t.fallbackWarn:!0,v=e?e.fallbackRoot:ae(t.fallbackRoot)?t.fallbackRoot:!0,g=!!t.fallbackFormat,y=ne(t.missing)?t.missing:null,m=ne(t.missing)?Lc(t.missing):null,w=ne(t.postTranslation)?t.postTranslation:null,x=e?e.warnHtmlMessage:ae(t.warnHtmlMessage)?t.warnHtmlMessage:!0,f=!!t.escapeParameter;const T=e?e.modifiers:Dt(t.modifiers)?t.modifiers:{};let P=t.pluralRules||e&&e.pluralRules,F;F=(()=>{s&&Sc(null);const k={version:ix,locale:n.value,fallbackLocale:l.value,messages:u.value,modifiers:T,pluralRules:P,missing:m===null?void 0:m,missingWarn:_,fallbackWarn:p,fallbackFormat:g,unresolving:!0,postTranslation:w===null?void 0:w,warnHtmlMessage:x,escapeParameter:f,messageResolver:t.messageResolver,messageCompiler:t.messageCompiler,__meta:{framework:"vue"}};k.datetimeFormats=d.value,k.numberFormats=c.value,k.__datetimeFormatters=Dt(F)?F.__datetimeFormatters:void 0,k.__numberFormatters=Dt(F)?F.__numberFormatters:void 0;const R=WA(k);return s&&Sc(R),R})(),ya(F,n.value,l.value);function q(){return[n.value,l.value,u.value,d.value,c.value]}const N=st({get:()=>n.value,set:k=>{F.locale=k,n.value=k}}),Q=st({get:()=>l.value,set:k=>{F.fallbackLocale=k,l.value=k,ya(F,n.value,k)}}),z=st(()=>u.value),X=st(()=>d.value),L=st(()=>c.value);function tt(){return ne(w)?w:null}function et(k){w=k,F.postTranslation=k}function ht(){return y}function mt(k){k!==null&&(m=Lc(k)),y=k,F.missing=m}const yt=(k,R,J,ot,kt,Tt)=>{q();let At;try{__INTLIFY_PROD_DEVTOOLS__,s||(F.fallbackContext=e?MA():void 0),At=k(F)}finally{__INTLIFY_PROD_DEVTOOLS__,s||(F.fallbackContext=void 0)}if(J!=="translate exists"&&be(At)&&At===Mr||J==="translate exists"&&!At){const[ze,Ge]=R();return e&&v?ot(e):kt(ze)}else{if(Tt(At))return At;throw ei($e.UNEXPECTED_RETURN_TYPE)}};function Pt(...k){return yt(R=>Reflect.apply(Cc,null,[R,...k]),()=>pl(...k),"translate",R=>Reflect.apply(R.t,R,[...k]),R=>R,R=>ct(R))}function _t(...k){const[R,J,ot]=k;if(ot&&!It(ot))throw ei($e.INVALID_ARGUMENT);return Pt(R,J,me({resolvedMessage:!0},ot||{}))}function lt(...k){return yt(R=>Reflect.apply(Pc,null,[R,...k]),()=>_l(...k),"datetime format",R=>Reflect.apply(R.d,R,[...k]),()=>lr,R=>ct(R)||ue(R))}function gt(...k){return yt(R=>Reflect.apply(Oc,null,[R,...k]),()=>hl(...k),"number format",R=>Reflect.apply(R.n,R,[...k]),()=>lr,R=>ct(R)||ue(R))}function Qt(k){return k.map(R=>ct(R)||be(R)||ae(R)?Ic(String(R)):R)}const te={normalize:Qt,interpolate:k=>k,type:"vnode"};function j(...k){return yt(R=>{let J;const ot=R;try{ot.processor=te,J=Reflect.apply(Cc,null,[ot,...k])}finally{ot.processor=null}return J},()=>pl(...k),"translate",R=>R[ml](...k),R=>[Ic(R)],R=>ue(R))}function K(...k){return yt(R=>Reflect.apply(Oc,null,[R,...k]),()=>hl(...k),"number format",R=>R[fl](...k),Dc,R=>ct(R)||ue(R))}function Z(...k){return yt(R=>Reflect.apply(Pc,null,[R,...k]),()=>_l(...k),"datetime format",R=>R[gl](...k),Dc,R=>ct(R)||ue(R))}function ut(k){P=k,F.pluralRules=P}function ft(k,R){return yt(()=>{if(!k)return!1;const J=ct(R)?R:n.value,ot=ct(R)?[J]:bl(F,l.value,J);for(let kt=0;kt[k],"translate exists",J=>Reflect.apply(J.te,J,[k,R]),nx,J=>ae(J))}function S(k){let R=null;const J=bl(F,l.value,n.value);for(let ot=0;ot{r&&(n.value=k,F.locale=k,ya(F,n.value,l.value))}),Bt(e.fallbackLocale,k=>{r&&(l.value=k,F.fallbackLocale=k,ya(F,n.value,l.value))}));const U={id:Nc,locale:N,fallbackLocale:Q,get inheritLocale(){return r},set inheritLocale(k){r=k,k&&e&&(n.value=e.locale.value,l.value=e.fallbackLocale.value,ya(F,n.value,l.value))},get availableLocales(){return Object.keys(u.value).sort()},messages:z,get modifiers(){return T},get pluralRules(){return P||{}},get isGlobal(){return s},get missingWarn(){return _},set missingWarn(k){_=k,F.missingWarn=_},get fallbackWarn(){return p},set fallbackWarn(k){p=k,F.fallbackWarn=p},get fallbackRoot(){return v},set fallbackRoot(k){v=k},get fallbackFormat(){return g},set fallbackFormat(k){g=k,F.fallbackFormat=g},get warnHtmlMessage(){return x},set warnHtmlMessage(k){x=k,F.warnHtmlMessage=k},get escapeParameter(){return f},set escapeParameter(k){f=k,F.escapeParameter=k},t:Pt,getLocaleMessage:C,setLocaleMessage:M,mergeLocaleMessage:H,getPostTranslationHandler:tt,setPostTranslationHandler:et,getMissingHandler:ht,setMissingHandler:mt,[ax]:ut};return U.datetimeFormats=X,U.numberFormats=L,U.rt=_t,U.te=ft,U.tm=O,U.d=lt,U.n=gt,U.getDateTimeFormat=$,U.setDateTimeFormat=b,U.mergeDateTimeFormat=h,U.getNumberFormat=A,U.setNumberFormat=E,U.mergeNumberFormat=Y,U[ox]=i,U[ml]=j,U[gl]=Z,U[fl]=K,U}const bu={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:t=>t==="parent"||t==="global",default:"parent"},i18n:{type:Object}};function ux({slots:t},e){return e.length===1&&e[0]==="default"?(t.default?t.default():[]).reduce((s,a)=>[...s,...a.type===xt?a.children:[a]],[]):e.reduce((i,s)=>{const a=t[s];return a&&(i[s]=a()),i},Gt())}function mp(){return xt}const dx=ni({name:"i18n-t",props:me({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:t=>be(t)||!isNaN(t)}},bu),setup(t,e){const{slots:i,attrs:s}=e,a=t.i18n||_u({useScope:t.scope,__useComponent:!0});return()=>{const o=()=>{const l=Object.keys(i).filter(c=>c[0]!=="_"),u=Gt();t.locale&&(u.locale=t.locale),t.plural!==void 0&&(u.plural=ct(t.plural)?+t.plural:t.plural);const d=ux(e,l);return a[ml](t.keypath,d,u)},r=me(Gt(),s),n=ct(t.tag)||It(t.tag)?t.tag:mp();return It(n)?we(n,r,{default:o}):we(n,r,o())}}}),Uc=dx;function cx(t){return ue(t)&&!ct(t[0])}function gp(t,e,i,s){const{slots:a,attrs:o}=e;return()=>{const r=()=>{const u={part:!0};let d=Gt();t.locale&&(u.locale=t.locale),ct(t.format)?u.key=t.format:It(t.format)&&(ct(t.format.key)&&(u.key=t.format.key),d=Object.keys(t.format).reduce((p,v)=>i.includes(v)?me(Gt(),p,{[v]:t.format[v]}):p,Gt()));const c=s(t.value,u,d);let _=[u.key];return ue(c)?_=c.map((p,v)=>{const g=a[p.type],y=g?g({[p.type]:p.value,index:v,parts:c}):[p.value];return cx(y)&&(y[0].key=`${p.type}-${v}`),y}):ct(c)&&(_=[c]),_},n=me(Gt(),o),l=ct(t.tag)||It(t.tag)?t.tag:mp();return It(l)?we(l,n,{default:r}):we(l,n,r())}}const bx=ni({name:"i18n-n",props:me({value:{type:Number,required:!0},format:{type:[String,Object]}},bu),setup(t,e){const i=t.i18n||_u({useScope:t.scope,__useComponent:!0});return gp(t,e,cp,(...s)=>i[fl](...s))}}),jc=bx;function _x(t,e){const i=t;if(t.mode==="composition")return i.__getInstance(e)||t.global;{const s=i.__getInstance(e);return s!=null?s.__composer:t.global.__composer}}function hx(t){const e=r=>{const{instance:n,value:l}=r;if(!n||!n.$)throw ei($e.UNEXPECTED_ERROR);const u=_x(t,n.$),d=Mc(l);return[Reflect.apply(u.t,u,[...Wc(d)]),u]};return{created:(r,n)=>{const[l,u]=e(n);or&&(r.__i18nWatcher=Bt(u.locale,()=>{n.instance&&n.instance.$forceUpdate()})),r.__composer=u,r.textContent=l},unmounted:r=>{or&&r.__i18nWatcher&&(r.__i18nWatcher(),r.__i18nWatcher=void 0,delete r.__i18nWatcher),r.__composer&&(r.__composer=void 0,delete r.__composer)},beforeUpdate:(r,{value:n})=>{if(r.__composer){const l=r.__composer,u=Mc(n);r.textContent=Reflect.apply(l.t,l,[...Wc(u)])}},getSSRProps:r=>{const[n]=e(r);return{textContent:n}}}}function Mc(t){if(ct(t))return{path:t};if(Dt(t)){if(!("path"in t))throw ei($e.REQUIRED_VALUE,"path");return t}else throw ei($e.INVALID_VALUE)}function Wc(t){const{path:e,locale:i,args:s,choice:a,plural:o}=t,r={},n=s||{};return ct(i)&&(r.locale=i),be(a)&&(r.plural=a),be(o)&&(r.plural=o),[e,n,r]}function px(t,e,...i){const s=Dt(i[0])?i[0]:{};(!ae(s.globalInstall)||s.globalInstall)&&([Uc.name,"I18nT"].forEach(o=>t.component(o,Uc)),[jc.name,"I18nN"].forEach(o=>t.component(o,jc)),[Hc.name,"I18nD"].forEach(o=>t.component(o,Hc))),t.directive("t",hx(e))}const mx=ds("global-vue-i18n");function gx(t={}){const e=ae(t.globalInjection)?t.globalInjection:!0,i=new Map,[s,a]=fx(t),o=ds("");function r(d){return i.get(d)||null}function n(d,c){i.set(d,c)}function l(d){i.delete(d)}const u={get mode(){return"composition"},async install(d,...c){if(d.__VUE_I18N_SYMBOL__=o,d.provide(d.__VUE_I18N_SYMBOL__,u),Dt(c[0])){const v=c[0];u.__composerExtend=v.__composerExtend,u.__vueI18nExtend=v.__vueI18nExtend}let _=null;e&&(_=Tx(d,u.global)),px(d,u,...c);const p=d.unmount;d.unmount=()=>{_&&_(),u.dispose(),p()}},get global(){return a},dispose(){s.stop()},__instances:i,__getInstance:r,__setInstance:n,__deleteInstance:l};return u}function _u(t={}){const e=cu();if(e==null)throw ei($e.MUST_BE_CALL_SETUP_TOP);if(!e.isCE&&e.appContext.app!=null&&!e.appContext.app.__VUE_I18N_SYMBOL__)throw ei($e.NOT_INSTALLED);const i=vx(e),s=yx(i),a=pp(e),o=wx(t,a);if(o==="global")return rx(s,t,a),s;if(o==="parent"){let l=Bc(i,e,t.__useComponent);return l==null&&(l=s),l}if(o==="isolated"){if(i.mode!=="composition")throw ei($e.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const l=i,u=me({},t),d=Bc(i,e);u.__root=d||s;const c=vl(u);return l.__composerExtend&&(c[Vs]=l.__composerExtend(c)),Gi()&&Za(()=>{const p=c[Vs];p&&(p(),delete c[Vs])}),c}const r=i;let n=r.__getInstance(e);if(n==null){const l=me({},t);"__i18n"in a&&(l.__i18n=a.__i18n),s&&(l.__root=s),n=vl(l),r.__composerExtend&&(n[Vs]=r.__composerExtend(n)),Ax(r,e,n),r.__setInstance(e,n)}return n}function fx(t,e){const i=kr(),s=i.run(()=>vl(t));if(s==null)throw ei($e.UNEXPECTED_ERROR);return[i,s]}function vx(t){const e=Jt(t.isCE?mx:t.appContext.app.__VUE_I18N_SYMBOL__);if(!e)throw ei(t.isCE?$e.NOT_INSTALLED_WITH_PROVIDE:$e.UNEXPECTED_ERROR);return e}function wx(t,e){return Ur(t)?"__i18n"in e?"local":"global":t.useScope?t.useScope:"local"}function yx(t){return t.mode==="composition"?t.global:t.global.__composer}function Bc(t,e,i=!1){let s=null;const a=e.root;let o=kx(e,i);for(;o!=null;){const r=t;if(t.mode==="composition"&&(s=r.__getInstance(o)),s!=null||a===o)break;o=o.parent}return s}function kx(t,e=!1){return t==null?null:e&&t.vnode.ctx||t.parent}function Ax(t,e,i){Ie(()=>{},e),Qi(()=>{const s=i;t.__deleteInstance(e);const a=s[Vs];a&&(a(),delete s[Vs])},e)}const xx=["locale","fallbackLocale","availableLocales"],$c=["t","rt","d","n","tm","te"];function Tx(t,e){const i=Object.create(null);return xx.forEach(a=>{const o=Object.getOwnPropertyDescriptor(e,a);if(!o)throw ei($e.UNEXPECTED_ERROR);const r=Yt(o.value)?{get(){return o.value.value},set(n){o.value.value=n}}:{get(){return o.get&&o.get()}};Object.defineProperty(i,a,r)}),t.config.globalProperties.$i18n=i,$c.forEach(a=>{const o=Object.getOwnPropertyDescriptor(e,a);if(!o||!o.value)throw ei($e.UNEXPECTED_ERROR);Object.defineProperty(t.config.globalProperties,`$${a}`,o)}),()=>{delete t.config.globalProperties.$i18n,$c.forEach(a=>{delete t.config.globalProperties[`$${a}`]})}}const Sx=ni({name:"i18n-d",props:me({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},bu),setup(t,e){const i=t.i18n||_u({useScope:t.scope,__useComponent:!0});return gp(t,e,dp,(...s)=>i[gl](...s))}}),Hc=Sx;sx();DA(gA);NA(CA);LA(bl);if(__INTLIFY_PROD_DEVTOOLS__){const t=su();t.__INTLIFY__=!0,fA(t.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const Fx=["data-is-active"],Px={__name:"Dots",props:{stepCount:{type:Number,default:10},initialIndex:{type:Number,default:null},period:{type:Number,default:null},isCondensed:{type:Boolean}},setup(t,{expose:e}){const i=t,s=vt(0),a=st(()=>s.value==-1);function o(n){s.value=n{isNaN(i.initialIndex)||o(i.initialIndex)}),e({turnOn:o,turnOff:r,props:i}),(n,l)=>(D(),W("ul",{class:nt(["dots",{off:a.value,condensed:t.isCondensed}])},[(D(!0),W(xt,null,da(t.stepCount,u=>(D(),W("li",{key:u,"data-is-active":u==s.value?!0:null},null,8,Fx))),128))],2))}},Ex={__name:"DotsController",props:{step_count:{type:Number,default:10},period:{type:Number,default:30},generated_at:Number,autostart:{type:Boolean,default:!0}},emits:["stepping-started","stepping-ended","stepped-up"],setup(t,{expose:e,emit:i}){const s=t,a=vt(null),o=vt(null),r=vt(null),n=vt(null),l=vt(null),u=st(()=>a.value%s.period),d=st(()=>s.period-u.value),c=st(()=>s.period/s.step_count),_=st(()=>{let y=u.value*s.step_count/s.period;return Math.floor(y)+0}),p=i,v=(y=0)=>{g(),a.value=y!=0?y:s.generated_at,p("stepping-started",_.value),l.value=_.value,o.value=setTimeout(function(){g(),p("stepping-ended")},d.value*1e3);let m=Math.ceil(u.value/c.value)*c.value-u.value;r.value=setTimeout(function(){m>0&&(l.value+=1,p("stepped-up",l.value)),n.value=setInterval(function(){l.value+=1,p("stepped-up",l.value)},c.value*1e3)},m*1e3)},g=()=>{clearTimeout(o.value),clearTimeout(r.value),clearInterval(n.value),l.value=a.value=null};return Ie(()=>{s.autostart==!0&&v()}),Qi(()=>{g()}),e({startStepping:v,reset:g,props:s}),(y,m)=>(D(),W("div"))}},Ox={key:0,class:"title"},Rx={key:1,id:"punchline",class:"block"},qx={__name:"FormWrapper",props:{title:{type:String,default:""},punchline:{type:String,default:""}},setup(t){return(e,i)=>{const s=to("ResponsiveWidthWrapper");return D(),Nt(s,null,{default:$t(()=>[t.title?(D(),W("h1",Ox,at(e.$t(t.title)),1)):it("",!0),t.punchline?(D(),W("div",Rx,at(e.$t(t.punchline)),1)):it("",!0),ee(e.$slots,"default")]),_:3})}}},Cx=["title"],XP={__name:"GroupCallToSwitch",props:Bi({currentGroup:{type:String,default:null},activeGroup:{type:Number,default:0},filteredCount:{type:Number,default:null},useShare:{type:Boolean,default:!1}},{showGroupSwitch:{},showGroupSwitchModifiers:{}}),emits:["update:showGroupSwitch"],setup(t){const e=Ti(t,"showGroupSwitch");return(i,s)=>(D(),Nt(G(io),null,{default:$t(({mode:a})=>[V("button",{type:"button",id:"btnShowGroupSwitch",title:i.$t("tooltip.show_group_selector"),tabindex:"1",class:nt(["button is-text is-like-text has-text-grey-dark",{"has-text-grey":a!="dark"}]),onClick:s[0]||(s[0]=We(o=>e.value=!e.value,["stop"]))},[parseInt(t.activeGroup)==-1?(D(),W(xt,{key:0},[Ot(at(i.$t("label.group_less"))+" ("+at(t.filteredCount)+")  ",1)],64)):t.useShare&&parseInt(t.activeGroup)==-2?(D(),W(xt,{key:1},[Ot(at(i.$t("label.shared_by_me"))+" ("+at(t.filteredCount)+")  ",1)],64)):t.useShare&&parseInt(t.activeGroup)==-3?(D(),W(xt,{key:2},[Ot(at(i.$t("label.shared_with_me"))+" ("+at(t.filteredCount)+")  ",1)],64)):t.currentGroup?(D(),W(xt,{key:3},[Ot(at(t.currentGroup)+" ("+at(t.filteredCount)+")  ",1)],64)):(D(),W(xt,{key:4},[Ot(at(i.$t("label.all"))+" ("+at(t.filteredCount)+")  ",1)],64)),rt(G(cv),{class:"mt-1"})],10,Cx)]),_:1}))}},Ix={id:"groupChips",class:"mx-3 tags is-justify-content-center"},zx=["title"],Dx=["onClick"],Nx={class:"chip-label mr-1"},Lx=["title"],Ux=["title"],jx=["title"],tE={__name:"GroupChips",props:Bi({groups:Array,filteredCount:{type:Number,default:null},useVirtualChips:{type:Boolean,default:!1},useShare:{type:Boolean,default:!1},useShareAllScope:{type:Boolean,default:!1}},{activeGroup:{},activeGroupModifiers:{},showGroupSwitch:{},showGroupSwitchModifiers:{}}),emits:Bi(["active-group-changed"],["update:activeGroup","update:showGroupSwitch"]),setup(t,{emit:e}){const i=Ti(t,"activeGroup"),s=Ti(t,"showGroupSwitch"),a=e;function o(r){i.value=r,a("active-group-changed",r)}return(r,n)=>(D(),W("div",Ix,[rt(G(io),null,{default:$t(({mode:l})=>[V("button",{class:nt(["button tag",{"is-white":l!="dark","has-text-grey":i.value!=0}]),onClick:n[0]||(n[0]=u=>o(-0)),title:r.$t("label.all_accounts")},at(r.$t("label.all"))+at(i.value==0?` • ${t.filteredCount}`:""),11,zx),(D(!0),W(xt,null,da(t.groups,u=>(D(),W(xt,{key:u.id},[u.id!=0&&u.show_in_chips||i.value>0&&u.id==i.value&&u.show_in_chips!=!0?(D(),W("button",{key:0,class:nt(["button tag",{"has-text-grey":l=="dark"&&i.value!=u.id,"is-white has-text-grey":l!="dark"&&i.value!=u.id,"is-link":i.value==u.id}]),onClick:d=>o(u.id)},[V("span",Nx,at(u.name),1),Ot(at(i.value==u.id?`• ${t.filteredCount}`:""),1)],10,Dx)):it("",!0)],64))),128)),V("button",{class:nt(["button tag has-text-grey",l=="dark"?"":"is-white"]),onClick:n[1]||(n[1]=u=>s.value=!0)}," ... ",2),t.useVirtualChips?(D(),W(xt,{key:0},[t.useShare?(D(),W("button",{key:0,class:nt(["button tag",{"has-text-grey":l=="dark"&&i.value!=-2,"is-white has-text-grey":l!="dark"&&i.value!=-2,"is-link":i.value==-2}]),onClick:n[2]||(n[2]=u=>o(-2)),title:r.$t("label.accounts_I_m_sharing")},[t.useShareAllScope?(D(),W(xt,{key:0},[rt(G(Ch),{class:"icon-size-0-9 mr-1"}),n[5]||(n[5]=Ot("| ",-1))],64)):it("",!0),rt(G(qh),{class:nt(["ml-1 icon-size-0-9",{"mr-1":i.value==-2}])},null,8,["class"]),Ot(at(i.value==-2?`• ${t.filteredCount}`:""),1)],10,Lx)):it("",!0),t.useShare?(D(),W("button",{key:1,class:nt(["button tag",{"has-text-grey":l=="dark"&&i.value!=-3,"is-white has-text-grey":l!="dark"&&i.value!=-3,"is-link":i.value==-3}]),onClick:n[3]||(n[3]=u=>o(-3)),title:r.$t("label.accounts_shared_with_me")},[rt(G(Oh),{class:nt(["icon-size-0-9",{"mr-1":i.value==-3}])},null,8,["class"]),Ot(at(i.value==-3?`• ${t.filteredCount}`:""),1)],10,Ux)):it("",!0),V("button",{class:nt(["button tag",{"has-text-grey":l=="dark"&&i.value!=-1,"is-white has-text-grey":l!="dark"&&i.value!=-1,"is-link":i.value==-1}]),onClick:n[4]||(n[4]=u=>o(-1)),title:r.$t("label.group_less_accounts")},[rt(G(Rh),{class:nt(["icon-size-1",{"mr-1":i.value==-1}])},null,8,["class"]),Ot(at(i.value==-1?`• ${t.filteredCount}`:""),1)],10,jx)],64)):it("",!0)]),_:1})]))}},Mx={key:0,id:"groupSwitch"},Wx={class:"columns is-centered m-0"},Bx={class:"column is-half-tablet is-one-third-desktop is-one-quarter-widescreen is-one-quarter-fullhd"},$x={class:"columns is-multiline m-0"},Hx={class:"column is-full"},Gx={key:0,class:"column is-full"},Vx={class:"ml-2 button tag"},Qx={key:1,class:"column is-full"},Kx={class:"ml-2 button tag"},Yx={key:2,class:"column is-full"},Jx={class:"ml-2 button tag"},Zx={key:3,class:"column has-text-centered"},Xx={key:0,class:"column is-full"},tT=["onClick"],eT={key:0,class:"columns is-centered mt-0"},iT={class:"column has-text-centered"},eE={__name:"GroupSwitch",props:Bi({groups:Array,useShare:{type:Boolean,default:!1},useShareAllScope:{type:Boolean,default:!1}},{activeGroup:{},activeGroupModifiers:{},isVisible:{},isVisibleModifiers:{}}),emits:Bi(["active-group-changed"],["update:activeGroup","update:isVisible"]),setup(t,{emit:e}){const i=Ti(t,"activeGroup"),s=Ti(t,"isVisible"),a=e;function o(r){s.value=!1,i.value=r,a("active-group-changed",r)}return(r,n)=>{const l=to("StackLayout");return s.value?(D(),W("div",Mx,[rt(l,{"should-grow":!1},{content:$t(()=>[V("div",Wx,[V("div",Bx,[V("div",$x,[rt(G(io),null,{default:$t(({mode:u})=>[V("div",Hx,[V("button",{type:"button",class:nt(["button is-fullwidth",{"is-dark has-text-light is-outlined":u=="dark"}]),onClick:n[0]||(n[0]=d=>o(0))},at(r.$t("label.all_accounts")),3)]),t.groups.length>1?(D(),W("div",Gx,[V("button",{type:"button",class:nt(["button is-fullwidth",{"is-dark has-text-light is-outlined":u=="dark"}]),onClick:n[1]||(n[1]=d=>o(-1))},[Ot(at(r.$t("label.group_less_accounts")),1),V("span",Vx,[rt(G(Rh),{class:"icon-size-1 has-text-grey"})])],2)])):it("",!0),t.useShare?(D(),W("div",Qx,[V("button",{type:"button",class:nt(["button is-fullwidth",{"is-dark has-text-light is-outlined":u=="dark"}]),onClick:n[2]||(n[2]=d=>o(-2))},[Ot(at(r.$t("label.accounts_I_m_sharing")),1),V("span",Kx,[t.useShareAllScope?(D(),W(xt,{key:0},[rt(G(Ch),{class:"icon-size-1 mr-1 has-text-grey"}),n[4]||(n[4]=Ot("| ",-1))],64)):it("",!0),rt(G(qh),{class:nt(["icon-size-1 has-text-grey",{"ml-1":t.useShareAllScope}])},null,8,["class"])])],2)])):it("",!0),t.useShare?(D(),W("div",Yx,[V("button",{type:"button",class:nt(["button is-fullwidth",{"is-dark has-text-light is-outlined":u=="dark"}]),onClick:n[3]||(n[3]=d=>o(-3))},[Ot(at(r.$t("label.accounts_shared_with_me")),1),V("span",Jx,[rt(G(Oh),{class:"icon-size-1 has-text-grey"})])],2)])):it("",!0),t.groups.length>1?(D(),W("div",Zx,at(r.$t("message.or_filter_by_group")),1)):it("",!0),(D(!0),W(xt,null,da(t.groups,d=>(D(),W(xt,{key:d.id},[d.id>0?(D(),W("div",Xx,[V("button",{type:"button",class:nt(["button is-fullwidth",{"is-dark has-text-light is-outlined":u=="dark"}]),onClick:c=>o(d.id)},at(d.name),11,tT)])):it("",!0)],64))),128))]),_:1})]),r.$slots.default?(D(),W("div",eT,[V("div",iT,[ee(r.$slots,"default")])])):it("",!0)])])]),_:3})])):it("",!0)}}},sT={__name:"Kicker",props:{kickAfter:{type:Number,required:!0}},emits:["kicked"],setup(t,{emit:e}){const i=e,s=vt(["mousedown","scroll","keypress"]),a=vt(null),o=t;Bt(()=>o.kickAfter,()=>{l()}),Ie(()=>{s.value.forEach(function(d){window.addEventListener(d,l)},this),r()}),Qi(()=>{s.value.forEach(function(d){window.removeEventListener(d,l)},this),u()});function r(){a.value=setTimeout(n,o.kickAfter*60*1e3)}async function n(){clearTimeout(a.value),i("kicked")}function l(){u(),r()}function u(){clearTimeout(a.value)}return()=>{}}},ur={__name:"LucideGenericIcon",props:{name:{type:String,required:!0},size:Number,color:String,strokeWidth:Number,defaultClass:String},setup(t){const e={Sun:Vv,Moon:qv,Grid3X3:vv,List:Tv,MonitorCheck:Ov,Slash:Wv,SlidersHorizontal:$v,CircleUser:_v,KeySquare:Av,ScanFace:Iv,Settings:Lv,UsersRound:Yv,ShieldUser:jv,Info:yv},i=t,s=st(()=>e[i.name]);return(a,o)=>(D(),Nt(Wm(s.value),{size:t.size,color:t.color,"stroke-width":t.strokeWidth,"default-class":t.defaultClass},null,8,["size","color","stroke-width","default-class"]))}},Ss=()=>{const{notify:t}=Yf();return{info:e=>{t({type:"is-info",...e})},success:e=>{t({type:"is-success",...e})},warn:e=>{t({type:"is-warning",...e})},alert:e=>{t({type:"is-danger",...e})},action:e=>{t({type:"is-dark",...e})},clear:()=>{t({clean:!0})}}},aT={key:0,class:"columns is-gapless mb-3"},oT={class:"column has-text-centered"},rT={class:"field is-grouped"},nT={class:"content has-text-centered"},lT={key:0,class:"columns is-gapless"},uT={class:"column has-text-centered"},dT=["inert"],cT={key:1,class:"submenu content has-text-centered mb-4"},bT={class:"ml-0 mt-1"},_T={class:"column"},hT={key:0,class:"column"},pT={key:0,class:"release-flag"},mT={key:1,class:"column"},gT={class:"content has-text-centered"},fT={key:0},vT={key:0,class:"has-text-weight-bold"},wT={key:1,class:""},yT={key:1},kT={key:1},AT={key:0},xT={key:0,class:"release-flag"},TT={key:1},ST={key:2},FT={class:"mr-2 has-ellipsis"},wl={__name:"VueFooterContent",props:{showMenu:{},showMenuModifiers:{}},emits:["update:showMenu"],setup(t){const e=Ti(t,"showMenu");e.value=!1;const i=Jt("appSettingsStore",{latestRelease:null,checkForUpdate:!0}),s=Jt("userStore",{isAdmin:!1,isAuthenticated:!1,email:null,preferences:{showEmailInFooter:!0},logout:function(){}}),a=Jt("2fauth",{context:"webapp",version:"x.y.z",config:{proxyAuth:!1,proxyLogoutUrl:null}}),o=st(()=>i.latestRelease&&i.checkForUpdate),r=st(()=>!a.config.proxyAuth||a.config.proxyAuth&&a.config.proxyLogoutUrl);function n(l){confirm(l)&&s.logout()}return(l,u)=>{const d=to("router-link");return G(a).context=="webext"?(D(),W(xt,{key:0},[l.$slots.default?(D(),W("div",aT,[V("div",oT,[V("div",rT,[ee(l.$slots,"default")])])])):it("",!0),V("div",nT,[ee(l.$slots,"subpart")])],64)):G(a).context=="webapp"?(D(),W(xt,{key:1},[l.$slots.default?(D(),W("div",lT,[V("div",uT,[V("div",{class:"field is-grouped",inert:e.value},[ee(l.$slots,"default")],8,dT)])])):it("",!0),e.value?(D(),W("div",cT,[ee(l.$slots,"submenu",{},()=>[V("ul",bT,[V("li",_T,[rt(d,{id:"lnkSettings",to:{name:"settings.options"},class:"is-link"},{default:$t(()=>[Ot(at(l.$t("link.settings")),1)]),_:1})]),G(s).isAdmin?(D(),W("li",hT,[rt(d,{id:"lnkAdmin",to:{name:"admin.appSetup"},class:"is-link"},{default:$t(()=>[o.value?(D(),W("span",pT)):it("",!0),Ot(" "+at(l.$t("link.admin_panel")),1)]),_:1})])):it("",!0),r.value?(D(),W("li",mT,[rt(G(io),null,{default:$t(({mode:c})=>[V("button",{type:"button",id:"lnkSignOut",class:nt(["button is-text is-like-text",c=="dark"?"has-text-grey-lighter":"has-text-grey-darker"]),onClick:u[0]||(u[0]=_=>n(l.$t("confirmation.logout")))},at(l.$t("label.sign_out")),3)]),_:1})])):it("",!0)])])])):it("",!0),V("div",gT,[ee(l.$slots,"subpart",{},()=>[l.$route.meta.showAbout===!0?(D(),W("div",fT,[l.$route.name!="about"?(D(),Nt(d,{key:0,id:"lnkAbout",to:{name:"about"},class:"has-text-grey"},{default:$t(()=>[G(s).isAuthenticated&&l.$route.meta.watchedByKicker?(D(),W("span",vT,"2FAuth – v"+at(G(a).version),1)):(D(),W("span",wT,at(l.$t("link.about")),1))]),_:1})):(D(),W("span",yT," "))])):G(s).preferences.showEmailInFooter==!1?(D(),W("div",kT,[rt(d,{id:"lnkSettings",to:{name:"settings.options"},class:"has-text-grey"},{default:$t(()=>[Ot(at(l.$t("link.settings")),1)]),_:1}),G(s).isAdmin?(D(),W("span",AT,[u[3]||(u[3]=Ot(" - ",-1)),rt(d,{id:"lnkAdmin",to:{name:"admin.appSetup"},class:"has-text-grey"},{default:$t(()=>[Ot(at(l.$t("link.admin_panel")),1),o.value?(D(),W("span",xT)):it("",!0)]),_:1})])):it("",!0),r.value?(D(),W("span",TT,[u[4]||(u[4]=Ot(" - ",-1)),V("button",{type:"button",id:"lnkSignOut",class:"button is-text is-like-text has-text-grey",onClick:u[1]||(u[1]=c=>n(l.$t("confirmation.logout")))},at(l.$t("label.sign_out")),1)])):it("",!0)])):(D(),W("div",ST,[V("button",{type:"button",id:"btnEmailMenu",onClick:u[2]||(u[2]=c=>e.value=!e.value),class:"button is-text is-like-text has-text-grey",style:{width:"100%"}},[V("span",FT,at(G(s).email),1),e.value?(D(),Nt(G(Xv),{key:1})):(D(),Nt(G(Pv),{key:0}))])]))])])],64)):it("",!0)}}},PT={class:"modal-card is-flex-grow-1"},ET={class:"modal-card-body modal-slot py-0 is-align-content-center has-text-centered"},OT={class:"modal-card-foot is-flex-direction-column main toto"},RT={key:1},qT={__name:"Modal",props:Bi({modelValue:Boolean,isFullHeight:{type:Boolean,default:!1}},{isActive:{},isActiveModifiers:{},showFooterMenu:{},showFooterMenuModifiers:{}}),emits:["update:isActive","update:showFooterMenu"],setup(t){const e=Ti(t,"isActive"),i=Ti(t,"showFooterMenu");function s(a){Ss().clear(),e.value=!1}return(a,o)=>{const r=to("router-link");return D(),W("div",{class:nt(["modal modal-otp",{"is-active":e.value}])},[V("div",{class:"modal-background",onClick:We(s,["stop"])}),V("div",PT,[V("section",ET,[ee(a.$slots,"default")]),i.value==!0?(D(),W("div",{key:0,onClick:o[0]||(o[0]=n=>i.value=!1),class:"footer-overlay"})):it("",!0),V("footer",OT,[rt(G(wl),{"show-menu":i.value,"onUpdate:showMenu":o[1]||(o[1]=n=>i.value=n)},{default:$t(()=>[rt(G(Vh),{action:"close",useLinkTag:!1,onClosed:s})]),submenu:$t(()=>[ee(a.$slots,"footer-submenu")]),subpart:$t(()=>[ee(a.$slots,"footer-subpart",{},()=>[a.$route.name!="accounts"?(D(),Nt(r,{key:0,id:"lnkBackToHome",to:{name:"accounts"},class:"has-text-grey"},{default:$t(()=>[Ot(at(a.$t("link.back_to_home")),1)]),_:1})):(D(),W("span",RT," "))])]),_:3},8,["show-menu"])])])],2)}}},CT=gx({locale:"en",fallbackLocale:"en",globalInjection:!0});function Gc(t,e,i,s,a){t||(t="");var o=String(Ft(t));const r=()=>{const l=Ft(i);if(o.length>0){const u=Math.ceil(l<1?o.length*l:l),d=o.match(new RegExp(`.{1,${u}}`,"g"));d&&(o=d.join(" "))}},n=()=>{o.length>0&&!Ft(a)&&(o=o.replace(/[0-9]/g,"●"))};return Ft(e)==!0&&r(),Ft(s)&&n(),o}const IT={key:0},zT={key:0,class:"spinner-container"},DT={class:"spinner-wrapper"},NT={id:"icnSpinnerFull",class:"is-size-1 spinner"},LT={key:1,class:"spinner-overlay-container"},UT={class:"spinner-wrapper"},jT={id:"icnSpinnerFull",class:"is-size-1 spinner"},MT={key:3,class:"has-text-centered mt-6"},WT={id:"icnSpinner"},fp={__name:"Spinner",props:{isVisible:Boolean,type:{type:String,default:"raw",required:!0,validator(t,e){return["raw","list-loading","fullscreen","fullscreen-overlay"].includes(t)}},message:{type:String,default:"[[awaiting_message]]"},rawSize:{type:Number,default:24}},setup(t){return(e,i)=>t.isVisible?(D(),W("div",IT,[t.type=="fullscreen"?(D(),W("div",zT,[V("div",DT,[V("span",NT,[rt(G(wo),{class:"spinning icon-size-3"})]),V("span",null,at(e.$t(t.message)),1)])])):t.type=="fullscreen-overlay"?(D(),W("div",LT,[V("div",UT,[V("span",jT,[rt(G(wo),{class:"spinning icon-size-3"})]),V("span",null,at(e.$t(t.message)),1)])])):t.type=="raw"?(D(),Nt(G(wo),{key:2,class:"spinning lucide-default-size",size:t.rawSize},null,8,["size"])):t.type=="list-loading"?(D(),W("div",MT,[V("span",WT,[rt(G(wo),{class:"spinning icon-size-2"})])])):it("",!0)])):it("",!0)}},BT=["src","alt"],$T=["title"],HT={key:1,tabindex:"0",class:"otp is-size-1"},GT={key:0,class:"mt-3 is-size-4"},VT=["title"],QT={key:1},KT={key:1,class:"mt-3"},iE={__name:"OtpDisplay",props:{twofaccountService:{required:!0},preferences:{type:Object,required:!0},can_showNextOtp:{type:Boolean,default:!0},can_autoCloseTimeout:{type:Boolean,default:!0},iconPathPrefix:String,accountParams:{type:Object,default(t){return{otp_type:"",account:"",service:"",icon:"",secret:"",digits:null,algorithm:"",period:null,counter:null,image:""}}},uri:String},emits:["please-close-me","please-clear-search","please-update-active-group","kickme","increment-hotp","error","validation-error","otp-copied-to-clipboard"],setup(t,{expose:e,emit:i}){const{t:s}=CT.global,{copy:a,copied:o}=gw({legacy:!0}),r=i,n=t,l=n.twofaccountService,u=vt(null),d=vt(null),c=vt({otp_type:"",account:"",service:"",icon:"",secret:"",digits:null,algorithm:"",period:null,counter:null,image:""}),_=vt(!1),p=vt(""),v=st(()=>Gc(p,n.preferences.formatPassword,n.preferences.formatPasswordBy,n.preferences.showOtpAsDot,_)),g=vt(""),y=st(()=>Gc(g,n.preferences.formatPassword,n.preferences.formatPasswordBy,n.preferences.showOtpAsDot,_)),m=vt(null),w=vt(!1),x=vt(!1),f=vt("0"),T=vt(null),P=Do("dotsController"),F=Do("dots"),B=Do("otpSpanTag");Bt(()=>n.accountParams.icon,_t=>{_t!=null&&(c.value.icon=_t)});const q=async _t=>{if(_.value=!1,c.value.otp_type=n.accountParams.otp_type,c.value.account=n.accountParams.account,c.value.service=n.accountParams.service,c.value.icon=n.accountParams.icon,c.value.secret=n.accountParams.secret,c.value.digits=n.accountParams.digits,c.value.algorithm=n.accountParams.algorithm,c.value.period=n.accountParams.period,c.value.counter=n.accountParams.counter,Q(),_t){u.value=_t;const{data:lt}=await l.get(u.value);c.value.service=lt.service,c.value.account=lt.account,c.value.icon=lt.icon,c.value.otp_type=lt.otp_type,mt(lt.otp_type)&<.counter&&(c.value.counter=lt.counter)}else n.uri?(d.value=n.uri,c.value.otp_type=n.uri.slice(0,15).toLowerCase()==="otpauth://totp/"?"totp":"hotp"):(n.accountParams.secret?!ht(c.value.otp_type)&&!mt(c.value.otp_type)&&r("error",new Error(s("error.not_a_supported_otp_type"))):r("error",new Error(s("error.cannot_create_otp_without_secret"))),ht(c.value.otp_type)&&(w.value=!0));try{await N(),tt(),n.preferences.getOtpOnRequest&&n.can_autoCloseTimeout&&parseInt(n.preferences.autoCloseTimeout)>0&&Pt()}catch{L()}};async function N(){n.can_showNextOtp&&g.value?(p.value=g.value,g.value="",F.value.turnOff(),yt(0)):Q(),await z().then(_t=>{let lt=_t.data;p.value=lt.password,g.value=n.can_showNextOtp&&Object.prototype.hasOwnProperty.call(lt,"next_password")?lt.next_password:"",n.preferences.copyOtpOnDisplay&&et(lt.password),ht(lt.otp_type)?(m.value=lt.generated_at,c.value.period=lt.period,w.value=!0,si().then(()=>{P.value.startStepping()})):mt(lt.otp_type)&&(c.value.counter=lt.counter,r("increment-hotp",{nextHotpCounter:lt.counter,nextUri:lt.uri}))}).catch(_t=>{_t.response.status===422&&r("validation-error",_t.response)}).finally(()=>{x.value=!1})}function Q(){x.value=!0,F.value.turnOff()}function z(){return u.value?l.getOtpById(u.value):d.value?l.getOtpByUri(d.value):l.getOtpByParams(c.value)}function X(){r("please-close-me"),_.value=!1,L()}function L(){u.value=c.value.counter=m.value=null,c.value.service=c.value.account=c.value.icon=c.value.otp_type=c.value.secret="",p.value="... ...",g.value="",w.value=!1,clearTimeout(T.value),P.value?.reset()}function tt(){si().then(()=>{B.value?.focus()})}function et(_t,lt){if(a(_t.replace(/ /g,"")),o){if(n.preferences.kickUserAfter==-1&&(lt||!1)===!0?r("kickme"):n.preferences.closeOtpOnCopy&&(lt||!1)===!0&&X(),n.preferences.clearSearchOnCopy&&r("please-clear-search"),n.preferences.viewDefaultGroupOnCopy){const gt=n.preferences.defaultGroup==-1?n.preferences.activeGroup:n.preferences.defaultGroup;r("please-update-active-group",gt)}r("otp-copied-to-clipboard")}}function ht(_t){return _t==="totp"||_t==="steamtotp"}function mt(_t){return _t==="hotp"}function yt(_t){F.value.turnOn(_t),f.value="is-opacity-"+_t}e({show:q,clearOTP:L});function Pt(){let _t=parseInt(n.preferences.autoCloseTimeout);T.value=setTimeout(function(){X()},_t*60*1e3)}return(_t,lt)=>(D(),W("div",null,[V("figure",{class:nt(["image is-64x64",{"no-icon":!c.value.icon}]),style:{display:"inline-flex"}},[c.value.icon?(D(),W("img",{key:0,src:t.iconPathPrefix+"/storage/icons/"+c.value.icon,alt:_t.$t("alttext.icon_to_illustrate_the_account")},null,8,BT)):it("",!0)],2),rt(G(io),null,{default:$t(({mode:gt})=>[V("p",{class:nt(["is-size-4 has-ellipsis",gt=="dark"?"has-text-grey-light":"has-text-grey"])},at(c.value.service),3),V("p",{class:nt(["is-size-6 has-ellipsis",gt=="dark"?"has-text-grey":"has-text-grey-light"])},at(c.value.account),3),V("p",null,[x.value?(D(),W("span",HT,[rt(fp,{isVisible:x.value,type:"raw"},null,8,["isVisible"])])):(D(),W("span",{key:0,id:"otp",role:"log",ref:"otpSpanTag",tabindex:"0",class:nt(["otp is-size-1 is-clickable px-3",gt=="dark"?"has-text-white":"has-text-grey-dark"]),onClick:lt[0]||(lt[0]=Qt=>et(p.value,!0)),onKeyup:lt[1]||(lt[1]=Ts(Qt=>et(p.value,!0),["enter"])),title:_t.$t("tooltip.copy_to_clipboard")},at(v.value),43,$T))])]),_:1}),Ma(rt(Px,{ref:"dots"},null,512),[[pd,ht(c.value.otp_type)]]),Ma(V("p",null,at(_t.$t("field.counter"))+": "+at(c.value.counter),513),[[pd,mt(c.value.otp_type)]]),n.can_showNextOtp&&n.preferences.showNextOtp?(D(),W("p",GT,[g.value?(D(),W("span",{key:0,class:nt(["is-clickable",f.value]),onClick:lt[2]||(lt[2]=gt=>et(g.value,!0)),onKeyup:lt[3]||(lt[3]=Ts(gt=>et(g.value,!0),["enter"])),title:_t.$t("tooltip.copy_next_password")},at(y.value),43,VT)):(D(),W("span",QT," "))])):it("",!0),n.preferences.showOtpAsDot&&n.preferences.revealDottedOTP?(D(),W("p",KT,[V("button",{type:"button",class:"button is-ghost has-text-grey-dark",onClick:lt[4]||(lt[4]=We(gt=>_.value=!_.value,["stop"]))},[_.value?(D(),Nt(G(gv),{key:0})):(D(),Nt(G(pv),{key:1}))])])):it("",!0),w.value?(D(),Nt(Ex,{key:2,period:c.value.period,generated_at:m.value,autostart:!1,onSteppingEnded:lt[5]||(lt[5]=gt=>N()),onSteppingStarted:lt[6]||(lt[6]=gt=>yt(gt)),onSteppedUp:lt[7]||(lt[7]=gt=>yt(gt)),ref:"dotsController"},null,8,["period","generated_at"])):it("",!0)]))}},vp={__name:"ResponsiveWidthWrapper",props:{isActive:{type:Boolean,default:!0},isCompact:{type:Boolean,default:!1}},setup(t){return(e,i)=>t.isActive?(D(),W("div",{key:0,class:nt(["container",t.isCompact?"pt-3":"pt-6"])},[ee(e.$slots,"default")],2)):ee(e.$slots,"default",{key:1})}},YT={role:"search",class:"field"},JT={class:"control has-icons-right"},ZT=["aria-label","title","placeholder"],XT={class:"icon is-small is-right"},tS=["title"],sE={__name:"SearchBox",props:Bi({hasNoBackground:{type:Boolean,default:!1},placeholder:String,isSmall:{type:Boolean,default:!1}},{keyword:{},keywordModifiers:{}}),emits:Bi(["cleared"],["update:keyword"]),setup(t,{emit:e}){const i=Ti(t,"keyword"),s=Do("searchInput"),a=e;Ie(()=>{document.addEventListener("keydown",o),document.addEventListener("keypress",n)}),Qi(()=>{document.removeEventListener("keydown",o),document.removeEventListener("keypress",n)});function o(l){l.key==="f"&&(l.ctrlKey||l.metaKey)&&(l.preventDefault(),s.value?.focus())}function r(){i.value="",a("cleared")}function n(l){l.key==="Enter"||l.code==="Space"||l.key===" "||(i.value=l.key,s.value?.setSelectionRange(1,1),s.value?.focus(),l.preventDefault())}return(l,u)=>(D(),W("div",YT,[V("div",JT,[Ma(V("input",{"onUpdate:modelValue":u[0]||(u[0]=d=>i.value=d),onKeyup:[u[1]||(u[1]=Ts(We(d=>{r(),d.target.blur()},["prevent"]),["esc"])),u[2]||(u[2]=Ts(We(d=>d.target.blur(),["prevent"]),["enter"]))],onKeypress:u[3]||(u[3]=We(()=>{},["stop"])),ref:"searchInput",id:"txtSearch",type:"search",tabindex:"1","aria-label":l.$t("label.search"),title:l.$t("tooltip.search"),placeholder:t.placeholder,class:nt(["input is-rounded is-search",{"has-no-background":t.hasNoBackground,"is-small":t.isSmall}])},null,42,ZT),[[af,i.value]]),V("span",XT,[i.value!=""?(D(),W("button",{key:0,type:"button",id:"btnClearSearch",tabindex:"1",title:l.$t("tooltip.clear_search"),class:"clear-selection delete",onClick:r},null,8,tS)):(D(),Nt(G(Dv),{key:1,class:"mr-2 icon-size-1"}))])])]))}},eS={key:0,class:"stack-header"},iS={class:"stack-content"},sS={key:3,class:"stack-footer"},aS={__name:"StackLayout",props:{isVerticalCentered:{type:Boolean,default:!1},shouldGrow:{type:Boolean,default:!0},shouldShrinkSubheader:{type:Boolean,default:!1}},setup(t){return(e,i)=>(D(),W("div",{class:nt(["stack is-flex is-flex-direction-column",{"is-max-height":t.shouldGrow}])},[e.$slots.header?(D(),W("div",eS,[ee(e.$slots,"header")])):it("",!0),e.$slots.subheader?(D(),W("div",{key:1,class:nt(["stack-subheader",{"is-flex-shrink-0":t.shouldShrinkSubheader}])},[ee(e.$slots,"subheader")],2)):it("",!0),e.$slots.content?(D(),W("div",{key:2,class:nt(["stack-content-wrapper",{"is-align-content-center":t.isVerticalCentered,"is-flex-grow-1":t.shouldGrow}])},[V("div",iS,[ee(e.$slots,"content")])],2)):it("",!0),e.$slots.footer?(D(),W("div",sS,[ee(e.$slots,"footer")])):it("",!0)],2))}},oS={class:"options-header"},rS={class:"tabs is-centered is-fullwidth"},nS={role:"menubar"},lS=["id","onClick"],uS={class:"is-invisible-tablet"},dS={class:"is-size-7-mobile"},aE={__name:"TabBar",props:{tabs:{type:Array},activeTab:{type:String,default:""},isResponsive:{type:Boolean,default:!0}},emits:["tab-selected"],setup(t,{emit:e}){const i=t,s=e;return(a,o)=>(D(),W("div",oS,[rt(vp,{"is-active":t.isResponsive,"is-compact":!0},{default:$t(()=>[V("nav",rS,[V("ul",nS,[(D(!0),W(xt,null,da(i.tabs,r=>(D(),W("li",{key:r.view,class:nt({"is-active":r.view===i.activeTab})},[V("a",{id:r.id,onClick:n=>s("tab-selected",r.view),class:"is-flex-direction-column"},[V("span",uS,[rt(G(ur),{name:r.icon,strokeWidth:1},null,8,["name"])]),V("span",dS,at(a.$t(r.name)),1)],8,lS)],2))),128))])])]),_:1},8,["is-active"])]))}},cS={key:1,class:"main"},bS={__name:"VueFooter",setup(t){const e=Jt("2fauth",{context:"webapp",version:"x.y.z",config:{proxyAuth:!1,proxyLogoutUrl:null}}),i=vt(!1);return(s,a)=>(D(),W(xt,null,[i.value==!0?(D(),W("div",{key:0,onClick:a[0]||(a[0]=o=>i.value=!1),class:"footer-overlay"})):it("",!0),G(e).context=="webext"?(D(),W("footer",cS,[rt(wl,null,{default:$t(()=>[ee(s.$slots,"default")]),submenu:$t(()=>[ee(s.$slots,"submenu")]),subpart:$t(()=>[ee(s.$slots,"subpart")]),_:3})])):G(e).context=="webapp"?(D(),W("footer",{key:2,class:nt(["main",{menu:i.value}])},[rt(wl,{"show-menu":i.value,"onUpdate:showMenu":a[1]||(a[1]=o=>i.value=o)},{default:$t(()=>[ee(s.$slots,"default")]),submenu:$t(()=>[ee(s.$slots,"submenu")]),subpart:$t(()=>[ee(s.$slots,"subpart")]),_:3},8,["show-menu"])],2)):it("",!0)],64))}};function _S(){return Dr()}function hS(t,e){return Gi()?(Za(t,e),!0):!1}const Pn=new WeakMap,pS=(...t)=>{var e;const i=t[0],s=(e=ge())===null||e===void 0?void 0:e.proxy,a=s??Gi();if(a==null&&!Es())throw new Error("injectLocal must be called in setup");return a&&Pn.has(a)&&i in Pn.get(a)?Pn.get(a)[i]:Jt(...t)},Wr=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const mS=Object.prototype.toString,gS=t=>mS.call(t)==="[object Object]",fS=()=>{};function wp(...t){if(t.length!==1)return Bl(...t);const e=t[0];return typeof e=="function"?ss(Er(()=>({get:e,set:fS}))):vt(e)}function vS(t,e){function i(...s){return new Promise((a,o)=>{Promise.resolve(t(()=>e.apply(this,s),{fn:e,thisArg:this,args:s})).then(a).catch(o)})}return i}const yp=t=>t();function wS(t=yp,e={}){const{initialState:i="active"}=e,s=wp(i==="active");function a(){s.value=!1}function o(){s.value=!0}return{isActive:Ai(s),pause:a,resume:o,eventFilter:(...n)=>{s.value&&t(...n)}}}function yS(t){let e;function i(){return e||(e=t()),e}return i.reset=async()=>{const s=e;e=void 0,s&&await s},i}function kS(t,e){var i;if(typeof t=="number")return t+e;const s=((i=t.match(/^-?\d+\.?\d*/))===null||i===void 0?void 0:i[0])||"",a=t.slice(s.length),o=Number.parseFloat(s)+e;return Number.isNaN(o)?t:o+a}function Ia(t){return t.endsWith("rem")?Number.parseFloat(t)*16:Number.parseFloat(t)}function En(t){return Array.isArray(t)?t:[t]}function AS(t){return ge()}function xS(t,e,i={}){const{eventFilter:s=yp,...a}=i;return Bt(t,vS(s,e),a)}function TS(t,e,i={}){const{eventFilter:s,initialState:a="active",...o}=i,{eventFilter:r,pause:n,resume:l,isActive:u}=wS(s,{initialState:a});return{stop:xS(t,e,{...o,eventFilter:r}),pause:n,resume:l,isActive:u}}function hu(t,e=!0,i){AS()?Ie(t,i):e?t():si(t)}function SS(t,e,i={}){const{immediate:s=!0,immediateCallback:a=!1}=i,o=Rt(!1);let r;function n(){r&&(clearTimeout(r),r=void 0)}function l(){o.value=!1,n()}function u(...d){a&&t(),n(),o.value=!0,r=setTimeout(()=>{o.value=!1,r=void 0,t(...d)},Ft(e))}return s&&(o.value=!0,Wr&&u()),hS(l),{isPending:Ai(o),start:u,stop:l}}function FS(t,e,i){return Bt(t,e,{...i,immediate:!0})}const wi=Wr?window:void 0,oE=Wr?window.document:void 0,kp=Wr?window.navigator:void 0;function pu(t){var e;const i=Ft(t);return(e=i?.$el)!==null&&e!==void 0?e:i}function $i(...t){const e=(s,a,o,r)=>(s.addEventListener(a,o,r),()=>s.removeEventListener(a,o,r)),i=st(()=>{const s=En(Ft(t[0])).filter(a=>a!=null);return s.every(a=>typeof a!="string")?s:void 0});return FS(()=>{var s,a;return[(s=(a=i.value)===null||a===void 0?void 0:a.map(o=>pu(o)))!==null&&s!==void 0?s:[wi].filter(o=>o!=null),En(Ft(i.value?t[1]:t[0])),En(G(i.value?t[2]:t[1])),Ft(i.value?t[3]:t[2])]},([s,a,o,r],n,l)=>{if(!s?.length||!a?.length||!o?.length)return;const u=gS(r)?{...r}:r,d=s.flatMap(c=>a.flatMap(_=>o.map(p=>e(c,_,p,u))));l(()=>{d.forEach(c=>c())})},{flush:"post"})}function PS(){const t=Rt(!1),e=ge();return e&&Ie(()=>{t.value=!0},e),t}function Br(t){const e=PS();return st(()=>(e.value,!!t()))}function ES(t){return typeof t=="function"?t:typeof t=="string"?e=>e.key===t:Array.isArray(t)?e=>t.includes(e.key):()=>!0}function rE(...t){let e,i,s={};t.length===3?(e=t[0],i=t[1],s=t[2]):t.length===2?typeof t[1]=="object"?(e=!0,i=t[0],s=t[1]):(e=t[0],i=t[1]):(e=!0,i=t[0]);const{target:a=wi,eventName:o="keydown",passive:r=!1,dedupe:n=!1}=s,l=ES(e);return $i(a,o,d=>{d.repeat&&Ft(n)||l(d)&&i(d)},r)}const OS=Symbol("vueuse-ssr-width");function Ap(){const t=Es()?pS(OS,null):null;return typeof t=="number"?t:void 0}function $s(t,e={}){const{window:i=wi,ssrWidth:s=Ap()}=e,a=Br(()=>i&&"matchMedia"in i&&typeof i.matchMedia=="function"),o=Rt(typeof s=="number"),r=Rt(),n=Rt(!1),l=u=>{n.value=u.matches};return Hl(()=>{if(o.value){o.value=!a.value,n.value=Ft(t).split(",").some(u=>{const d=u.includes("not all"),c=u.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=u.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let p=!!(c||_);return c&&p&&(p=s>=Ia(c[1])),_&&p&&(p=s<=Ia(_[1])),d?!p:p});return}a.value&&(r.value=i.matchMedia(Ft(t)),n.value=r.value.matches)}),$i(r,"change",l,{passive:!0}),st(()=>n.value)}function nE(t,e={}){function i(p,v){let g=Ft(t[Ft(p)]);return v!=null&&(g=kS(g,v)),typeof g=="number"&&(g=`${g}px`),g}const{window:s=wi,strategy:a="min-width",ssrWidth:o=Ap()}=e,r=typeof o=="number",n=r?Rt(!1):{value:!0};r&&hu(()=>n.value=!!s);function l(p,v){return!n.value&&r?p==="min"?o>=Ia(v):o<=Ia(v):s?s.matchMedia(`(${p}-width: ${v})`).matches:!1}const u=p=>$s(()=>`(min-width: ${i(p)})`,e),d=p=>$s(()=>`(max-width: ${i(p)})`,e),c=Object.keys(t).reduce((p,v)=>(Object.defineProperty(p,v,{get:()=>a==="min-width"?u(v):d(v),enumerable:!0,configurable:!0}),p),{});function _(){const p=Object.keys(t).map(v=>[v,c[v],Ia(i(v))]).sort((v,g)=>v[2]-g[2]);return st(()=>p.filter(([,v])=>v.value).map(([v])=>v))}return Object.assign(c,{greaterOrEqual:u,smallerOrEqual:d,greater(p){return $s(()=>`(min-width: ${i(p,.1)})`,e)},smaller(p){return $s(()=>`(max-width: ${i(p,-.1)})`,e)},between(p,v){return $s(()=>`(min-width: ${i(p)}) and (max-width: ${i(v,-.1)})`,e)},isGreater(p){return l("min",i(p,.1))},isGreaterOrEqual(p){return l("min",i(p))},isSmaller(p){return l("max",i(p,-.1))},isSmallerOrEqual(p){return l("max",i(p))},isInBetween(p,v){return l("min",i(p))&&l("max",i(v,-.1))},current:_,active(){const p=_();return st(()=>p.value.length===0?"":p.value.at(a==="min-width"?-1:0))}})}function Vc(t,e={}){const{controls:i=!1,navigator:s=kp}=e,a=Br(()=>s&&"permissions"in s),o=Rt(),r=typeof t=="string"?{name:t}:t,n=Rt(),l=()=>{var d,c;n.value=(d=(c=o.value)===null||c===void 0?void 0:c.state)!==null&&d!==void 0?d:"prompt"};$i(o,"change",l,{passive:!0});const u=yS(async()=>{if(a.value){if(!o.value)try{o.value=await s.permissions.query(r)}catch{o.value=void 0}finally{l()}if(i)return St(o.value)}});return u(),i?{state:n,isSupported:a,query:u}:n}function lE(t={}){const{navigator:e=kp,read:i=!1,source:s,copiedDuring:a=1500,legacy:o=!1}=t,r=Br(()=>e&&"clipboard"in e),n=Vc("clipboard-read"),l=Vc("clipboard-write"),u=st(()=>r.value||o),d=Rt(""),c=Rt(!1),_=Rt(!1),p=SS(()=>c.value=!1,a,{immediate:!1});let v=0;async function g(){let T=!(r.value&&f(n.value));if(!T)try{d.value=await e.clipboard.readText()}catch{T=!0}T&&(d.value=x())}u.value&&i&&$i(["copy","cut"],g,{passive:!0});async function y(T){const P=T??Ft(s);if(u.value&&P!=null){_.value=!0;let F=!(r.value&&f(l.value));if(!F)try{const B=m(P);await e.clipboard.write([B])}catch{F=!0}if(F)if(typeof P=="string")d.value=P,w(P);else{const B=++v,q=await P();q!=null&&B===v&&(d.value=q,w(q))}c.value=!0,p.start(),_.value=!1}}function m(T){return typeof T=="string"?(d.value=T,new ClipboardItem({"text/plain":T})):new ClipboardItem({"text/plain":T().then((P="")=>(d.value=P,new Blob([P],{type:"text/plain"})))})}function w(T){const P=document.createElement("textarea");P.value=T,P.style.position="absolute",P.style.opacity="0",P.setAttribute("readonly",""),document.body.appendChild(P),P.select(),document.execCommand("copy"),P.remove()}function x(){var T,P,F;return(T=(P=document)===null||P===void 0||(F=P.getSelection)===null||F===void 0||(F=F.call(P))===null||F===void 0?void 0:F.toString())!==null&&T!==void 0?T:""}function f(T){return T==="granted"||T==="prompt"}return{copyPending:Ai(_),isSupported:u,text:Ai(d),copied:Ai(c),copy:y}}const Po=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Eo="__vueuse_ssr_handlers__",RS=qS();function qS(){return Eo in Po||(Po[Eo]=Po[Eo]||{}),Po[Eo]}function xp(t,e){return RS[t]||e}function CS(t){return $s("(prefers-color-scheme: dark)",t)}function IS(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}const zS={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},Qc="vueuse-storage";function Tp(t,e,i,s={}){var a;const{flush:o="pre",deep:r=!0,listenToStorageChanges:n=!0,writeDefaults:l=!0,mergeDefaults:u=!1,shallow:d,window:c=wi,eventFilter:_,onError:p=L=>{console.error(L)},initOnMounted:v}=s,g=(d?Rt:vt)(typeof e=="function"?e():e),y=st(()=>Ft(t));if(!i)try{i=xp("getDefaultStorage",()=>wi?.localStorage)()}catch(L){p(L)}if(!i)return g;const m=Ft(e),w=IS(m),x=(a=s.serializer)!==null&&a!==void 0?a:zS[w],{pause:f,resume:T}=TS(g,L=>N(L),{flush:o,deep:r,eventFilter:_});Bt(y,()=>z(),{flush:o});let P=!1;const F=L=>{v&&!P||z(L)},B=L=>{v&&!P||X(L)};c&&n&&(i instanceof Storage?$i(c,"storage",F,{passive:!0}):$i(c,Qc,B)),v?hu(()=>{P=!0,z()}):z();function q(L,tt){if(c){const et={key:y.value,oldValue:L,newValue:tt,storageArea:i};c.dispatchEvent(i instanceof Storage?new StorageEvent("storage",et):new CustomEvent(Qc,{detail:et}))}}function N(L){try{const tt=i.getItem(y.value);if(L==null)q(tt,null),i.removeItem(y.value);else{const et=x.write(L);tt!==et&&(i.setItem(y.value,et),q(tt,et))}}catch(tt){p(tt)}}function Q(L){const tt=L?L.newValue:i.getItem(y.value);if(tt==null)return l&&m!=null&&i.setItem(y.value,x.write(m)),m;if(!L&&u){const et=x.read(tt);return typeof u=="function"?u(et,m):w==="object"&&!Array.isArray(et)?{...m,...et}:et}else return typeof tt!="string"?tt:x.read(tt)}function z(L){if(!(L&&L.storageArea!==i)){if(L&&L.key==null){g.value=m;return}if(!(L&&L.key!==y.value)){f();try{const tt=x.write(g.value);(L===void 0||L?.newValue!==tt)&&(g.value=Q(L))}catch(tt){p(tt)}finally{L?si(T):T()}}}}function X(L){z(L.detail)}return g}const DS="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function NS(t={}){const{selector:e="html",attribute:i="class",initialValue:s="auto",window:a=wi,storage:o,storageKey:r="vueuse-color-scheme",listenToStorageChanges:n=!0,storageRef:l,emitAuto:u,disableTransition:d=!0}=t,c={auto:"",light:"light",dark:"dark",...t.modes||{}},_=CS({window:a}),p=st(()=>_.value?"dark":"light"),v=l||(r==null?wp(s):Tp(r,s,o,{window:a,listenToStorageChanges:n})),g=st(()=>v.value==="auto"?p.value:v.value),y=xp("updateHTMLAttrs",(f,T,P)=>{const F=typeof f=="string"?a?.document.querySelector(f):pu(f);if(!F)return;const B=new Set,q=new Set;let N=null;if(T==="class"){const z=P.split(/\s/g);Object.values(c).flatMap(X=>(X||"").split(/\s/g)).filter(Boolean).forEach(X=>{z.includes(X)?B.add(X):q.add(X)})}else N={key:T,value:P};if(B.size===0&&q.size===0&&N===null)return;let Q;d&&(Q=a.document.createElement("style"),Q.appendChild(document.createTextNode(DS)),a.document.head.appendChild(Q));for(const z of B)F.classList.add(z);for(const z of q)F.classList.remove(z);N&&F.setAttribute(N.key,N.value),d&&(a.getComputedStyle(Q).opacity,document.head.removeChild(Q))});function m(f){var T;y(e,i,(T=c[f])!==null&&T!==void 0?T:f)}function w(f){t.onChanged?t.onChanged(f,m):m(f)}Bt(g,w,{flush:"post",immediate:!0}),hu(()=>w(g.value));const x=st({get(){return u?v.value:g.value},set(f){v.value=f}});return Object.assign(x,{store:v,system:p,state:g})}function uE(t,e={}){const{initialValue:i=!1,focusVisible:s=!1,preventScroll:a=!1}=e,o=Rt(!1),r=st(()=>pu(t)),n={passive:!0};$i(r,"focus",u=>{var d,c;(!s||!((d=(c=u.target).matches)===null||d===void 0)&&d.call(c,":focus-visible"))&&(o.value=!0)},n),$i(r,"blur",()=>o.value=!1,n);const l=st({get:()=>o.value,set(u){var d,c;!u&&o.value?(d=r.value)===null||d===void 0||d.blur():u&&!o.value&&((c=r.value)===null||c===void 0||c.focus({preventScroll:a}))}});return Bt(r,()=>{l.value=i},{immediate:!0,flush:"post"}),{focused:l}}function Sp(t={}){const{window:e=wi}=t,i=e?.navigator,s=Br(()=>i&&"language"in i),a=Rt(i?.language);return $i(e,"languagechange",()=>{i&&(a.value=i.language)},{passive:!0}),{isSupported:s,language:a}}const LS="modulepreload",US=function(t,e){return new URL(t,e).href},Kc={},Et=function(e,i,s){let a=Promise.resolve();if(i&&i.length>0){let u=function(d){return Promise.all(d.map(c=>Promise.resolve(c).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};const r=document.getElementsByTagName("link"),n=document.querySelector("meta[property=csp-nonce]"),l=n?.nonce||n?.getAttribute("nonce");a=u(i.map(d=>{if(d=US(d,s),d in Kc)return;Kc[d]=!0;const c=d.endsWith(".css"),_=c?'[rel="stylesheet"]':"";if(s)for(let v=r.length-1;v>=0;v--){const g=r[v];if(g.href===d&&(!c||g.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${d}"]${_}`))return;const p=document.createElement("link");if(p.rel=c?"stylesheet":LS,c||(p.as="script"),p.crossOrigin="",p.href=d,l&&p.setAttribute("nonce",l),document.head.appendChild(p),c)return new Promise((v,g)=>{p.addEventListener("load",v),p.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${d}`)))})}))}function o(r){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=r,window.dispatchEvent(n),!n.defaultPrevented)throw r}return a.then(r=>{for(const n of r||[])n.status==="rejected"&&o(n.reason);return e().catch(o)})};function Fp(t,e,i){const s=e[i];return s?()=>{s({...t,nextMiddleware:Fp(t,e,i+1)})}:t.next}let Pp;const $r=t=>Pp=t,Ep=Symbol();function yl(t){return t&&typeof t=="object"&&Object.prototype.toString.call(t)==="[object Object]"&&typeof t.toJSON!="function"}var za;(function(t){t.direct="direct",t.patchObject="patch object",t.patchFunction="patch function"})(za||(za={}));function jS(){const t=kr(!0),e=t.run(()=>vt({}));let i=[],s=[];const a=Pr({install(o){$r(a),a._a=o,o.provide(Ep,a),o.config.globalProperties.$pinia=a,s.forEach(r=>i.push(r)),s=[]},use(o){return this._a?i.push(o):s.push(o),this},_p:i,_a:null,_e:t,_s:new Map,state:e});return a}const Op=()=>{};function Yc(t,e,i,s=Op){t.add(e);const a=()=>{t.delete(e)&&s()};return!i&&Gi()&&Za(a),a}function zs(t,...e){t.forEach(i=>{i(...e)})}const MS=t=>t(),Jc=Symbol(),On=Symbol();function kl(t,e){t instanceof Map&&e instanceof Map?e.forEach((i,s)=>t.set(s,i)):t instanceof Set&&e instanceof Set&&e.forEach(t.add,t);for(const i in e){if(!e.hasOwnProperty(i))continue;const s=e[i],a=t[i];yl(a)&&yl(s)&&t.hasOwnProperty(i)&&!Yt(s)&&!Li(s)?t[i]=kl(a,s):t[i]=s}return t}const WS=Symbol();function BS(t){return!yl(t)||!Object.prototype.hasOwnProperty.call(t,WS)}const{assign:Xi}=Object;function $S(t){return!!(Yt(t)&&t.effect)}function HS(t,e,i,s){const{state:a,actions:o,getters:r}=e,n=i.state.value[t];let l;function u(){n||(i.state.value[t]=a?a():{});const d=fm(i.state.value[t]);return Xi(d,o,Object.keys(r||{}).reduce((c,_)=>(c[_]=Pr(st(()=>{$r(i);const p=i._s.get(t);return r[_].call(p,p)})),c),{}))}return l=Rp(t,u,e,i,s,!0),l}function Rp(t,e,i={},s,a,o){let r;const n=Xi({actions:{}},i),l={deep:!0};let u,d,c=new Set,_=new Set,p;const v=s.state.value[t];!o&&!v&&(s.state.value[t]={});let g;function y(B){let q;u=d=!1,typeof B=="function"?(B(s.state.value[t]),q={type:za.patchFunction,storeId:t,events:p}):(kl(s.state.value[t],B),q={type:za.patchObject,payload:B,storeId:t,events:p});const N=g=Symbol();si().then(()=>{g===N&&(u=!0)}),d=!0,zs(c,q,s.state.value[t])}const m=o?function(){const{state:q}=i,N=q?q():{};this.$patch(Q=>{Xi(Q,N)})}:Op;function w(){r.stop(),c.clear(),_.clear(),s._s.delete(t)}const x=(B,q="")=>{if(Jc in B)return B[On]=q,B;const N=function(){$r(s);const Q=Array.from(arguments),z=new Set,X=new Set;function L(ht){z.add(ht)}function tt(ht){X.add(ht)}zs(_,{args:Q,name:N[On],store:T,after:L,onError:tt});let et;try{et=B.apply(this&&this.$id===t?this:T,Q)}catch(ht){throw zs(X,ht),ht}return et instanceof Promise?et.then(ht=>(zs(z,ht),ht)).catch(ht=>(zs(X,ht),Promise.reject(ht))):(zs(z,et),et)};return N[Jc]=!0,N[On]=q,N},f={_p:s,$id:t,$onAction:Yc.bind(null,_),$patch:y,$reset:m,$subscribe(B,q={}){const N=Yc(c,B,q.detached,()=>Q()),Q=r.run(()=>Bt(()=>s.state.value[t],z=>{(q.flush==="sync"?d:u)&&B({storeId:t,type:za.direct,events:p},z)},Xi({},l,q)));return N},$dispose:w},T=Ps(f);s._s.set(t,T);const F=(s._a&&s._a.runWithContext||MS)(()=>s._e.run(()=>(r=kr()).run(()=>e({action:x}))));for(const B in F){const q=F[B];if(Yt(q)&&!$S(q)||Li(q))o||(v&&BS(q)&&(Yt(q)?q.value=v[B]:kl(q,v[B])),s.state.value[t][B]=q);else if(typeof q=="function"){const N=x(q,B);F[B]=N,n.actions[B]=q}}return Xi(T,F),Xi(St(T),F),Object.defineProperty(T,"$state",{get:()=>s.state.value[t],set:B=>{y(q=>{Xi(q,B)})}}),s._p.forEach(B=>{Xi(T,r.run(()=>B({store:T,app:s._a,pinia:s,options:n})))}),v&&o&&i.hydrate&&i.hydrate(T.$state,v),u=!0,d=!0,T}function oo(t,e,i){let s;const a=typeof e=="function";s=a?i:e;function o(r,n){const l=Es();return r=r||(l?Jt(Ep,null):null),r&&$r(r),r=Pp,r._s.has(t)||(a?Rp(t,e,s,r):HS(t,s,r)),r._s.get(t)}return o.$id=t,o}function qp(t,e){return function(){return t.apply(e,arguments)}}const{toString:GS}=Object.prototype,{getPrototypeOf:Hr}=Object,{iterator:Gr,toStringTag:Cp}=Symbol,Vr=(t=>e=>{const i=GS.call(e);return t[i]||(t[i]=i.slice(8,-1).toLowerCase())})(Object.create(null)),li=t=>(t=t.toLowerCase(),e=>Vr(e)===t),Qr=t=>e=>typeof e===t,{isArray:_a}=Array,na=Qr("undefined");function ro(t){return t!==null&&!na(t)&&t.constructor!==null&&!na(t.constructor)&&Le(t.constructor.isBuffer)&&t.constructor.isBuffer(t)}const Ip=li("ArrayBuffer");function VS(t){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(t):e=t&&t.buffer&&Ip(t.buffer),e}const QS=Qr("string"),Le=Qr("function"),zp=Qr("number"),no=t=>t!==null&&typeof t=="object",KS=t=>t===!0||t===!1,Uo=t=>{if(Vr(t)!=="object")return!1;const e=Hr(t);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Cp in t)&&!(Gr in t)},YS=t=>{if(!no(t)||ro(t))return!1;try{return Object.keys(t).length===0&&Object.getPrototypeOf(t)===Object.prototype}catch{return!1}},JS=li("Date"),ZS=li("File"),XS=t=>!!(t&&typeof t.uri<"u"),tF=t=>t&&typeof t.getParts<"u",eF=li("Blob"),iF=li("FileList"),sF=t=>no(t)&&Le(t.pipe);function aF(){return typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}}const Zc=aF(),Xc=typeof Zc.FormData<"u"?Zc.FormData:void 0,oF=t=>{if(!t)return!1;if(Xc&&t instanceof Xc)return!0;const e=Hr(t);if(!e||e===Object.prototype||!Le(t.append))return!1;const i=Vr(t);return i==="formdata"||i==="object"&&Le(t.toString)&&t.toString()==="[object FormData]"},rF=li("URLSearchParams"),[nF,lF,uF,dF]=["ReadableStream","Request","Response","Headers"].map(li),cF=t=>t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function lo(t,e,{allOwnKeys:i=!1}={}){if(t===null||typeof t>"u")return;let s,a;if(typeof t!="object"&&(t=[t]),_a(t))for(s=0,a=t.length;s0;)if(a=i[s],e===a.toLowerCase())return a;return null}const ws=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Np=t=>!na(t)&&t!==ws;function Al(...t){const{caseless:e,skipUndefined:i}=Np(this)&&this||{},s={},a=(o,r)=>{if(r==="__proto__"||r==="constructor"||r==="prototype")return;const n=e&&Dp(s,r)||r,l=xl(s,n)?s[n]:void 0;Uo(l)&&Uo(o)?s[n]=Al(l,o):Uo(o)?s[n]=Al({},o):_a(o)?s[n]=o.slice():(!i||!na(o))&&(s[n]=o)};for(let o=0,r=t.length;o(lo(e,(a,o)=>{i&&Le(a)?Object.defineProperty(t,o,{__proto__:null,value:qp(a,i),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(t,o,{__proto__:null,value:a,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:s}),t),_F=t=>(t.charCodeAt(0)===65279&&(t=t.slice(1)),t),hF=(t,e,i,s)=>{t.prototype=Object.create(e.prototype,s),Object.defineProperty(t.prototype,"constructor",{__proto__:null,value:t,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(t,"super",{__proto__:null,value:e.prototype}),i&&Object.assign(t.prototype,i)},pF=(t,e,i,s)=>{let a,o,r;const n={};if(e=e||{},t==null)return e;do{for(a=Object.getOwnPropertyNames(t),o=a.length;o-- >0;)r=a[o],(!s||s(r,t,e))&&!n[r]&&(e[r]=t[r],n[r]=!0);t=i!==!1&&Hr(t)}while(t&&(!i||i(t,e))&&t!==Object.prototype);return e},mF=(t,e,i)=>{t=String(t),(i===void 0||i>t.length)&&(i=t.length),i-=e.length;const s=t.indexOf(e,i);return s!==-1&&s===i},gF=t=>{if(!t)return null;if(_a(t))return t;let e=t.length;if(!zp(e))return null;const i=new Array(e);for(;e-- >0;)i[e]=t[e];return i},fF=(t=>e=>t&&e instanceof t)(typeof Uint8Array<"u"&&Hr(Uint8Array)),vF=(t,e)=>{const s=(t&&t[Gr]).call(t);let a;for(;(a=s.next())&&!a.done;){const o=a.value;e.call(t,o[0],o[1])}},wF=(t,e)=>{let i;const s=[];for(;(i=t.exec(e))!==null;)s.push(i);return s},yF=li("HTMLFormElement"),kF=t=>t.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(i,s,a){return s.toUpperCase()+a}),xl=(({hasOwnProperty:t})=>(e,i)=>t.call(e,i))(Object.prototype),AF=li("RegExp"),Lp=(t,e)=>{const i=Object.getOwnPropertyDescriptors(t),s={};lo(i,(a,o)=>{let r;(r=e(a,o,t))!==!1&&(s[o]=r||a)}),Object.defineProperties(t,s)},xF=t=>{Lp(t,(e,i)=>{if(Le(t)&&["arguments","caller","callee"].includes(i))return!1;const s=t[i];if(Le(s)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+i+"'")})}})},TF=(t,e)=>{const i={},s=a=>{a.forEach(o=>{i[o]=!0})};return _a(t)?s(t):s(String(t).split(e)),i},SF=()=>{},FF=(t,e)=>t!=null&&Number.isFinite(t=+t)?t:e;function PF(t){return!!(t&&Le(t.append)&&t[Cp]==="FormData"&&t[Gr])}const EF=t=>{const e=new WeakSet,i=s=>{if(no(s)){if(e.has(s))return;if(ro(s))return s;if(!("toJSON"in s)){e.add(s);const a=_a(s)?[]:{};return lo(s,(o,r)=>{const n=i(o);!na(n)&&(a[r]=n)}),e.delete(s),a}}return s};return i(t)},OF=li("AsyncFunction"),RF=t=>t&&(no(t)||Le(t))&&Le(t.then)&&Le(t.catch),Up=((t,e)=>t?setImmediate:e?((i,s)=>(ws.addEventListener("message",({source:a,data:o})=>{a===ws&&o===i&&s.length&&s.shift()()},!1),a=>{s.push(a),ws.postMessage(i,"*")}))(`axios@${Math.random()}`,[]):i=>setTimeout(i))(typeof setImmediate=="function",Le(ws.postMessage)),qF=typeof queueMicrotask<"u"?queueMicrotask.bind(ws):typeof process<"u"&&process.nextTick||Up,CF=t=>t!=null&&Le(t[Gr]),I={isArray:_a,isArrayBuffer:Ip,isBuffer:ro,isFormData:oF,isArrayBufferView:VS,isString:QS,isNumber:zp,isBoolean:KS,isObject:no,isPlainObject:Uo,isEmptyObject:YS,isReadableStream:nF,isRequest:lF,isResponse:uF,isHeaders:dF,isUndefined:na,isDate:JS,isFile:ZS,isReactNativeBlob:XS,isReactNative:tF,isBlob:eF,isRegExp:AF,isFunction:Le,isStream:sF,isURLSearchParams:rF,isTypedArray:fF,isFileList:iF,forEach:lo,merge:Al,extend:bF,trim:cF,stripBOM:_F,inherits:hF,toFlatObject:pF,kindOf:Vr,kindOfTest:li,endsWith:mF,toArray:gF,forEachEntry:vF,matchAll:wF,isHTMLForm:yF,hasOwnProperty:xl,hasOwnProp:xl,reduceDescriptors:Lp,freezeMethods:xF,toObjectSet:TF,toCamelCase:kF,noop:SF,toFiniteNumber:FF,findKey:Dp,global:ws,isContextDefined:Np,isSpecCompliantForm:PF,toJSONObject:EF,isAsyncFn:OF,isThenable:RF,setImmediate:Up,asap:qF,isIterable:CF},IF=I.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),zF=t=>{const e={};let i,s,a;return t&&t.split(` +`).forEach(function(r){a=r.indexOf(":"),i=r.substring(0,a).trim().toLowerCase(),s=r.substring(a+1).trim(),!(!i||e[i]&&IF[i])&&(i==="set-cookie"?e[i]?e[i].push(s):e[i]=[s]:e[i]=e[i]?e[i]+", "+s:s)}),e};function DF(t){let e=0,i=t.length;for(;ee;){const s=t.charCodeAt(i-1);if(s!==9&&s!==32)break;i-=1}return e===0&&i===t.length?t:t.slice(e,i)}const NF=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),LF=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function mu(t,e){return I.isArray(t)?t.map(i=>mu(i,e)):DF(String(t).replace(e,""))}const UF=t=>mu(t,NF),jF=t=>mu(t,LF);function jp(t){const e=Object.create(null);return I.forEach(t.toJSON(),(i,s)=>{e[s]=jF(i)}),e}const tb=Symbol("internals");function ka(t){return t&&String(t).trim().toLowerCase()}function jo(t){return t===!1||t==null?t:I.isArray(t)?t.map(jo):UF(String(t))}function MF(t){const e=Object.create(null),i=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=i.exec(t);)e[s[1]]=s[2];return e}const WF=t=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(t.trim());function Rn(t,e,i,s,a){if(I.isFunction(s))return s.call(this,e,i);if(a&&(e=i),!!I.isString(e)){if(I.isString(s))return e.indexOf(s)!==-1;if(I.isRegExp(s))return s.test(e)}}function BF(t){return t.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,i,s)=>i.toUpperCase()+s)}function $F(t,e){const i=I.toCamelCase(" "+e);["get","set","has"].forEach(s=>{Object.defineProperty(t,s+i,{__proto__:null,value:function(a,o,r){return this[s].call(this,e,a,o,r)},configurable:!0})})}let Ce=class{constructor(e){e&&this.set(e)}set(e,i,s){const a=this;function o(n,l,u){const d=ka(l);if(!d)throw new Error("header name must be a non-empty string");const c=I.findKey(a,d);(!c||a[c]===void 0||u===!0||u===void 0&&a[c]!==!1)&&(a[c||l]=jo(n))}const r=(n,l)=>I.forEach(n,(u,d)=>o(u,d,l));if(I.isPlainObject(e)||e instanceof this.constructor)r(e,i);else if(I.isString(e)&&(e=e.trim())&&!WF(e))r(zF(e),i);else if(I.isObject(e)&&I.isIterable(e)){let n={},l,u;for(const d of e){if(!I.isArray(d))throw TypeError("Object iterator must return a key-value pair");n[u=d[0]]=(l=n[u])?I.isArray(l)?[...l,d[1]]:[l,d[1]]:d[1]}r(n,i)}else e!=null&&o(i,e,s);return this}get(e,i){if(e=ka(e),e){const s=I.findKey(this,e);if(s){const a=this[s];if(!i)return a;if(i===!0)return MF(a);if(I.isFunction(i))return i.call(this,a,s);if(I.isRegExp(i))return i.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,i){if(e=ka(e),e){const s=I.findKey(this,e);return!!(s&&this[s]!==void 0&&(!i||Rn(this,this[s],s,i)))}return!1}delete(e,i){const s=this;let a=!1;function o(r){if(r=ka(r),r){const n=I.findKey(s,r);n&&(!i||Rn(s,s[n],n,i))&&(delete s[n],a=!0)}}return I.isArray(e)?e.forEach(o):o(e),a}clear(e){const i=Object.keys(this);let s=i.length,a=!1;for(;s--;){const o=i[s];(!e||Rn(this,this[o],o,e,!0))&&(delete this[o],a=!0)}return a}normalize(e){const i=this,s={};return I.forEach(this,(a,o)=>{const r=I.findKey(s,o);if(r){i[r]=jo(a),delete i[o];return}const n=e?BF(o):String(o).trim();n!==o&&delete i[o],i[n]=jo(a),s[n]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const i=Object.create(null);return I.forEach(this,(s,a)=>{s!=null&&s!==!1&&(i[a]=e&&I.isArray(s)?s.join(", "):s)}),i}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,i])=>e+": "+i).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...i){const s=new this(e);return i.forEach(a=>s.set(a)),s}static accessor(e){const s=(this[tb]=this[tb]={accessors:{}}).accessors,a=this.prototype;function o(r){const n=ka(r);s[n]||($F(a,r),s[n]=!0)}return I.isArray(e)?e.forEach(o):o(e),this}};Ce.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);I.reduceDescriptors(Ce.prototype,({value:t},e)=>{let i=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(s){this[i]=s}}});I.freezeMethods(Ce);const HF="[REDACTED ****]";function GF(t){if(I.hasOwnProp(t,"toJSON"))return!0;let e=Object.getPrototypeOf(t);for(;e&&e!==Object.prototype;){if(I.hasOwnProp(e,"toJSON"))return!0;e=Object.getPrototypeOf(e)}return!1}function VF(t,e){const i=new Set(e.map(o=>String(o).toLowerCase())),s=[],a=o=>{if(o===null||typeof o!="object"||I.isBuffer(o))return o;if(s.indexOf(o)!==-1)return;o instanceof Ce&&(o=o.toJSON()),s.push(o);let r;if(I.isArray(o))r=[],o.forEach((n,l)=>{const u=a(n);I.isUndefined(u)||(r[l]=u)});else{if(!I.isPlainObject(o)&&GF(o))return s.pop(),o;r=Object.create(null);for(const[n,l]of Object.entries(o)){const u=i.has(n.toLowerCase())?HF:a(l);I.isUndefined(u)||(r[n]=u)}}return s.pop(),r};return a(t)}let bt=class Mp extends Error{static from(e,i,s,a,o,r){const n=new Mp(e.message,i||e.code,s,a,o);return n.cause=e,n.name=e.name,e.status!=null&&n.status==null&&(n.status=e.status),r&&Object.assign(n,r),n}constructor(e,i,s,a,o){super(e),Object.defineProperty(this,"message",{__proto__:null,value:e,enumerable:!0,writable:!0,configurable:!0}),this.name="AxiosError",this.isAxiosError=!0,i&&(this.code=i),s&&(this.config=s),a&&(this.request=a),o&&(this.response=o,this.status=o.status)}toJSON(){const e=this.config,i=e&&I.hasOwnProp(e,"redact")?e.redact:void 0,s=I.isArray(i)&&i.length>0?VF(e,i):I.toJSONObject(e);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:s,code:this.code,status:this.status}}};bt.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";bt.ERR_BAD_OPTION="ERR_BAD_OPTION";bt.ECONNABORTED="ECONNABORTED";bt.ETIMEDOUT="ETIMEDOUT";bt.ECONNREFUSED="ECONNREFUSED";bt.ERR_NETWORK="ERR_NETWORK";bt.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";bt.ERR_DEPRECATED="ERR_DEPRECATED";bt.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";bt.ERR_BAD_REQUEST="ERR_BAD_REQUEST";bt.ERR_CANCELED="ERR_CANCELED";bt.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";bt.ERR_INVALID_URL="ERR_INVALID_URL";bt.ERR_FORM_DATA_DEPTH_EXCEEDED="ERR_FORM_DATA_DEPTH_EXCEEDED";const QF=null;function Tl(t){return I.isPlainObject(t)||I.isArray(t)}function Wp(t){return I.endsWith(t,"[]")?t.slice(0,-2):t}function qn(t,e,i){return t?t.concat(e).map(function(a,o){return a=Wp(a),!i&&o?"["+a+"]":a}).join(i?".":""):e}function KF(t){return I.isArray(t)&&!t.some(Tl)}const YF=I.toFlatObject(I,{},null,function(e){return/^is[A-Z]/.test(e)});function Kr(t,e,i){if(!I.isObject(t))throw new TypeError("target must be an object");e=e||new FormData,i=I.toFlatObject(i,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,m){return!I.isUndefined(m[y])});const s=i.metaTokens,a=i.visitor||c,o=i.dots,r=i.indexes,n=i.Blob||typeof Blob<"u"&&Blob,l=i.maxDepth===void 0?100:i.maxDepth,u=n&&I.isSpecCompliantForm(e);if(!I.isFunction(a))throw new TypeError("visitor must be a function");function d(g){if(g===null)return"";if(I.isDate(g))return g.toISOString();if(I.isBoolean(g))return g.toString();if(!u&&I.isBlob(g))throw new bt("Blob is not supported. Use a Buffer instead.");return I.isArrayBuffer(g)||I.isTypedArray(g)?u&&typeof Blob=="function"?new Blob([g]):Buffer.from(g):g}function c(g,y,m){let w=g;if(I.isReactNative(e)&&I.isReactNativeBlob(g))return e.append(qn(m,y,o),d(g)),!1;if(g&&!m&&typeof g=="object"){if(I.endsWith(y,"{}"))y=s?y:y.slice(0,-2),g=JSON.stringify(g);else if(I.isArray(g)&&KF(g)||(I.isFileList(g)||I.endsWith(y,"[]"))&&(w=I.toArray(g)))return y=Wp(y),w.forEach(function(f,T){!(I.isUndefined(f)||f===null)&&e.append(r===!0?qn([y],T,o):r===null?y:y+"[]",d(f))}),!1}return Tl(g)?!0:(e.append(qn(m,y,o),d(g)),!1)}const _=[],p=Object.assign(YF,{defaultVisitor:c,convertValue:d,isVisitable:Tl});function v(g,y,m=0){if(!I.isUndefined(g)){if(m>l)throw new bt("Object is too deeply nested ("+m+" levels). Max depth: "+l,bt.ERR_FORM_DATA_DEPTH_EXCEEDED);if(_.indexOf(g)!==-1)throw Error("Circular reference detected in "+y.join("."));_.push(g),I.forEach(g,function(x,f){(!(I.isUndefined(x)||x===null)&&a.call(e,x,I.isString(f)?f.trim():f,y,p))===!0&&v(x,y?y.concat(f):[f],m+1)}),_.pop()}}if(!I.isObject(t))throw new TypeError("data must be an object");return v(t),e}function eb(t){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(t).replace(/[!'()~]|%20/g,function(s){return e[s]})}function gu(t,e){this._pairs=[],t&&Kr(t,this,e)}const Bp=gu.prototype;Bp.append=function(e,i){this._pairs.push([e,i])};Bp.toString=function(e){const i=e?function(s){return e.call(this,s,eb)}:eb;return this._pairs.map(function(a){return i(a[0])+"="+i(a[1])},"").join("&")};function JF(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function $p(t,e,i){if(!e)return t;const s=i&&i.encode||JF,a=I.isFunction(i)?{serialize:i}:i,o=a&&a.serialize;let r;if(o?r=o(e,a):r=I.isURLSearchParams(e)?e.toString():new gu(e,a).toString(s),r){const n=t.indexOf("#");n!==-1&&(t=t.slice(0,n)),t+=(t.indexOf("?")===-1?"?":"&")+r}return t}class ib{constructor(){this.handlers=[]}use(e,i,s){return this.handlers.push({fulfilled:e,rejected:i,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){I.forEach(this.handlers,function(s){s!==null&&e(s)})}}const fu={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},ZF=typeof URLSearchParams<"u"?URLSearchParams:gu,XF=typeof FormData<"u"?FormData:null,tP=typeof Blob<"u"?Blob:null,eP={isBrowser:!0,classes:{URLSearchParams:ZF,FormData:XF,Blob:tP},protocols:["http","https","file","blob","url","data"]},vu=typeof window<"u"&&typeof document<"u",Sl=typeof navigator=="object"&&navigator||void 0,iP=vu&&(!Sl||["ReactNative","NativeScript","NS"].indexOf(Sl.product)<0),sP=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",aP=vu&&window.location.href||"http://localhost",oP=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:vu,hasStandardBrowserEnv:iP,hasStandardBrowserWebWorkerEnv:sP,navigator:Sl,origin:aP},Symbol.toStringTag,{value:"Module"})),Fe={...oP,...eP};function rP(t,e){return Kr(t,new Fe.classes.URLSearchParams,{visitor:function(i,s,a,o){return Fe.isNode&&I.isBuffer(i)?(this.append(s,i.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)},...e})}function nP(t){return I.matchAll(/\w+|\[(\w*)]/g,t).map(e=>e[0]==="[]"?"":e[1]||e[0])}function lP(t){const e={},i=Object.keys(t);let s;const a=i.length;let o;for(s=0;s=i.length;return r=!r&&I.isArray(a)?a.length:r,l?(I.hasOwnProp(a,r)?a[r]=I.isArray(a[r])?a[r].concat(s):[a[r],s]:a[r]=s,!n):((!I.hasOwnProp(a,r)||!I.isObject(a[r]))&&(a[r]=[]),e(i,s,a[r],o)&&I.isArray(a[r])&&(a[r]=lP(a[r])),!n)}if(I.isFormData(t)&&I.isFunction(t.entries)){const i={};return I.forEachEntry(t,(s,a)=>{e(nP(s),a,i,0)}),i}return null}const Ds=(t,e)=>t!=null&&I.hasOwnProp(t,e)?t[e]:void 0;function uP(t,e,i){if(I.isString(t))try{return(e||JSON.parse)(t),I.trim(t)}catch(s){if(s.name!=="SyntaxError")throw s}return(i||JSON.stringify)(t)}const uo={transitional:fu,adapter:["xhr","http","fetch"],transformRequest:[function(e,i){const s=i.getContentType()||"",a=s.indexOf("application/json")>-1,o=I.isObject(e);if(o&&I.isHTMLForm(e)&&(e=new FormData(e)),I.isFormData(e))return a?JSON.stringify(Hp(e)):e;if(I.isArrayBuffer(e)||I.isBuffer(e)||I.isStream(e)||I.isFile(e)||I.isBlob(e)||I.isReadableStream(e))return e;if(I.isArrayBufferView(e))return e.buffer;if(I.isURLSearchParams(e))return i.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let n;if(o){const l=Ds(this,"formSerializer");if(s.indexOf("application/x-www-form-urlencoded")>-1)return rP(e,l).toString();if((n=I.isFileList(e))||s.indexOf("multipart/form-data")>-1){const u=Ds(this,"env"),d=u&&u.FormData;return Kr(n?{"files[]":e}:e,d&&new d,l)}}return o||a?(i.setContentType("application/json",!1),uP(e)):e}],transformResponse:[function(e){const i=Ds(this,"transitional")||uo.transitional,s=i&&i.forcedJSONParsing,a=Ds(this,"responseType"),o=a==="json";if(I.isResponse(e)||I.isReadableStream(e))return e;if(e&&I.isString(e)&&(s&&!a||o)){const n=!(i&&i.silentJSONParsing)&&o;try{return JSON.parse(e,Ds(this,"parseReviver"))}catch(l){if(n)throw l.name==="SyntaxError"?bt.from(l,bt.ERR_BAD_RESPONSE,this,null,Ds(this,"response")):l}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Fe.classes.FormData,Blob:Fe.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};I.forEach(["delete","get","head","post","put","patch","query"],t=>{uo.headers[t]={}});function Cn(t,e){const i=this||uo,s=e||i,a=Ce.from(s.headers);let o=s.data;return I.forEach(t,function(n){o=n.call(i,o,a.normalize(),e?e.status:void 0)}),a.normalize(),o}function Gp(t){return!!(t&&t.__CANCEL__)}let co=class extends bt{constructor(e,i,s){super(e??"canceled",bt.ERR_CANCELED,i,s),this.name="CanceledError",this.__CANCEL__=!0}};function Vp(t,e,i){const s=i.config.validateStatus;!i.status||!s||s(i.status)?t(i):e(new bt("Request failed with status code "+i.status,i.status>=400&&i.status<500?bt.ERR_BAD_REQUEST:bt.ERR_BAD_RESPONSE,i.config,i.request,i))}function dP(t){const e=/^([-+\w]{1,25}):(?:\/\/)?/.exec(t);return e&&e[1]||""}function cP(t,e){t=t||10;const i=new Array(t),s=new Array(t);let a=0,o=0,r;return e=e!==void 0?e:1e3,function(l){const u=Date.now(),d=s[o];r||(r=u),i[a]=l,s[a]=u;let c=o,_=0;for(;c!==a;)_+=i[c++],c=c%t;if(a=(a+1)%t,a===o&&(o=(o+1)%t),u-r{i=d,a=null,o&&(clearTimeout(o),o=null),t(...u)};return[(...u)=>{const d=Date.now(),c=d-i;c>=s?r(u,d):(a=u,o||(o=setTimeout(()=>{o=null,r(a)},s-c)))},()=>a&&r(a)]}const dr=(t,e,i=3)=>{let s=0;const a=cP(50,250);return bP(o=>{if(!o||typeof o.loaded!="number")return;const r=o.loaded,n=o.lengthComputable?o.total:void 0,l=n!=null?Math.min(r,n):r,u=Math.max(0,l-s),d=a(u);s=Math.max(s,l);const c={loaded:l,total:n,progress:n?l/n:void 0,bytes:u,rate:d||void 0,estimated:d&&n?(n-l)/d:void 0,event:o,lengthComputable:n!=null,[e?"download":"upload"]:!0};t(c)},i)},sb=(t,e)=>{const i=t!=null;return[s=>e[0]({lengthComputable:i,total:t,loaded:s}),e[1]]},ab=t=>(...e)=>I.asap(()=>t(...e)),_P=Fe.hasStandardBrowserEnv?((t,e)=>i=>(i=new URL(i,Fe.origin),t.protocol===i.protocol&&t.host===i.host&&(e||t.port===i.port)))(new URL(Fe.origin),Fe.navigator&&/(msie|trident)/i.test(Fe.navigator.userAgent)):()=>!0,hP=Fe.hasStandardBrowserEnv?{write(t,e,i,s,a,o,r){if(typeof document>"u")return;const n=[`${t}=${encodeURIComponent(e)}`];I.isNumber(i)&&n.push(`expires=${new Date(i).toUTCString()}`),I.isString(s)&&n.push(`path=${s}`),I.isString(a)&&n.push(`domain=${a}`),o===!0&&n.push("secure"),I.isString(r)&&n.push(`SameSite=${r}`),document.cookie=n.join("; ")},read(t){if(typeof document>"u")return null;const e=document.cookie.split(";");for(let i=0;it instanceof Ce?{...t}:t;function Fs(t,e){e=e||{};const i=Object.create(null);Object.defineProperty(i,"hasOwnProperty",{__proto__:null,value:Object.prototype.hasOwnProperty,enumerable:!1,writable:!0,configurable:!0});function s(u,d,c,_){return I.isPlainObject(u)&&I.isPlainObject(d)?I.merge.call({caseless:_},u,d):I.isPlainObject(d)?I.merge({},d):I.isArray(d)?d.slice():d}function a(u,d,c,_){if(I.isUndefined(d)){if(!I.isUndefined(u))return s(void 0,u,c,_)}else return s(u,d,c,_)}function o(u,d){if(!I.isUndefined(d))return s(void 0,d)}function r(u,d){if(I.isUndefined(d)){if(!I.isUndefined(u))return s(void 0,u)}else return s(void 0,d)}function n(u,d,c){if(I.hasOwnProp(e,c))return s(u,d);if(I.hasOwnProp(t,c))return s(void 0,u)}const l={url:o,method:o,data:o,baseURL:r,transformRequest:r,transformResponse:r,paramsSerializer:r,timeout:r,timeoutMessage:r,withCredentials:r,withXSRFToken:r,adapter:r,responseType:r,xsrfCookieName:r,xsrfHeaderName:r,onUploadProgress:r,onDownloadProgress:r,decompress:r,maxContentLength:r,maxBodyLength:r,beforeRedirect:r,transport:r,httpAgent:r,httpsAgent:r,cancelToken:r,socketPath:r,allowedSocketPaths:r,responseEncoding:r,validateStatus:n,headers:(u,d,c)=>a(ob(u),ob(d),c,!0)};return I.forEach(Object.keys({...t,...e}),function(d){if(d==="__proto__"||d==="constructor"||d==="prototype")return;const c=I.hasOwnProp(l,d)?l[d]:a,_=I.hasOwnProp(t,d)?t[d]:void 0,p=I.hasOwnProp(e,d)?e[d]:void 0,v=c(_,p,d);I.isUndefined(v)&&c!==n||(i[d]=v)}),i}const gP=["content-type","content-length"];function fP(t,e,i){if(i!=="content-only"){t.set(e);return}Object.entries(e).forEach(([s,a])=>{gP.includes(s.toLowerCase())&&t.set(s,a)})}const vP=t=>encodeURIComponent(t).replace(/%([0-9A-F]{2})/gi,(e,i)=>String.fromCharCode(parseInt(i,16))),Kp=t=>{const e=Fs({},t),i=_=>I.hasOwnProp(e,_)?e[_]:void 0,s=i("data");let a=i("withXSRFToken");const o=i("xsrfHeaderName"),r=i("xsrfCookieName");let n=i("headers");const l=i("auth"),u=i("baseURL"),d=i("allowAbsoluteUrls"),c=i("url");if(e.headers=n=Ce.from(n),e.url=$p(Qp(u,c,d),t.params,t.paramsSerializer),l&&n.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?vP(l.password):""))),I.isFormData(s)&&(Fe.hasStandardBrowserEnv||Fe.hasStandardBrowserWebWorkerEnv?n.setContentType(void 0):I.isFunction(s.getHeaders)&&fP(n,s.getHeaders(),i("formDataHeaderPolicy"))),Fe.hasStandardBrowserEnv&&(I.isFunction(a)&&(a=a(e)),a===!0||a==null&&_P(e.url))){const p=o&&r&&hP.read(r);p&&n.set(o,p)}return e},wP=typeof XMLHttpRequest<"u",yP=wP&&function(t){return new Promise(function(i,s){const a=Kp(t);let o=a.data;const r=Ce.from(a.headers).normalize();let{responseType:n,onUploadProgress:l,onDownloadProgress:u}=a,d,c,_,p,v;function g(){p&&p(),v&&v(),a.cancelToken&&a.cancelToken.unsubscribe(d),a.signal&&a.signal.removeEventListener("abort",d)}let y=new XMLHttpRequest;y.open(a.method.toUpperCase(),a.url,!0),y.timeout=a.timeout;function m(){if(!y)return;const x=Ce.from("getAllResponseHeaders"in y&&y.getAllResponseHeaders()),T={data:!n||n==="text"||n==="json"?y.responseText:y.response,status:y.status,statusText:y.statusText,headers:x,config:t,request:y};Vp(function(F){i(F),g()},function(F){s(F),g()},T),y=null}"onloadend"in y?y.onloadend=m:y.onreadystatechange=function(){!y||y.readyState!==4||y.status===0&&!(y.responseURL&&y.responseURL.startsWith("file:"))||setTimeout(m)},y.onabort=function(){y&&(s(new bt("Request aborted",bt.ECONNABORTED,t,y)),g(),y=null)},y.onerror=function(f){const T=f&&f.message?f.message:"Network Error",P=new bt(T,bt.ERR_NETWORK,t,y);P.event=f||null,s(P),g(),y=null},y.ontimeout=function(){let f=a.timeout?"timeout of "+a.timeout+"ms exceeded":"timeout exceeded";const T=a.transitional||fu;a.timeoutErrorMessage&&(f=a.timeoutErrorMessage),s(new bt(f,T.clarifyTimeoutError?bt.ETIMEDOUT:bt.ECONNABORTED,t,y)),g(),y=null},o===void 0&&r.setContentType(null),"setRequestHeader"in y&&I.forEach(jp(r),function(f,T){y.setRequestHeader(T,f)}),I.isUndefined(a.withCredentials)||(y.withCredentials=!!a.withCredentials),n&&n!=="json"&&(y.responseType=a.responseType),u&&([_,v]=dr(u,!0),y.addEventListener("progress",_)),l&&y.upload&&([c,p]=dr(l),y.upload.addEventListener("progress",c),y.upload.addEventListener("loadend",p)),(a.cancelToken||a.signal)&&(d=x=>{y&&(s(!x||x.type?new co(null,t,y):x),y.abort(),g(),y=null)},a.cancelToken&&a.cancelToken.subscribe(d),a.signal&&(a.signal.aborted?d():a.signal.addEventListener("abort",d)));const w=dP(a.url);if(w&&!Fe.protocols.includes(w)){s(new bt("Unsupported protocol "+w+":",bt.ERR_BAD_REQUEST,t));return}y.send(o||null)})},kP=(t,e)=>{if(t=t?t.filter(Boolean):[],!e&&!t.length)return;const i=new AbortController;let s=!1;const a=function(l){if(!s){s=!0,r();const u=l instanceof Error?l:this.reason;i.abort(u instanceof bt?u:new co(u instanceof Error?u.message:u))}};let o=e&&setTimeout(()=>{o=null,a(new bt(`timeout of ${e}ms exceeded`,bt.ETIMEDOUT))},e);const r=()=>{t&&(o&&clearTimeout(o),o=null,t.forEach(l=>{l.unsubscribe?l.unsubscribe(a):l.removeEventListener("abort",a)}),t=null)};t.forEach(l=>l.addEventListener("abort",a));const{signal:n}=i;return n.unsubscribe=()=>I.asap(r),n},AP=function*(t,e){let i=t.byteLength;if(i{const a=xP(t,e);let o=0,r,n=l=>{r||(r=!0,s&&s(l))};return new ReadableStream({async pull(l){try{const{done:u,value:d}=await a.next();if(u){n(),l.close();return}let c=d.byteLength;if(i){let _=o+=c;i(_)}l.enqueue(new Uint8Array(d))}catch(u){throw n(u),u}},cancel(l){return n(l),a.return()}},{highWaterMark:2})};function SP(t){if(!t||typeof t!="string"||!t.startsWith("data:"))return 0;const e=t.indexOf(",");if(e<0)return 0;const i=t.slice(5,e),s=t.slice(e+1);if(/;base64/i.test(i)){let r=s.length;const n=s.length;for(let p=0;p=48&&v<=57||v>=65&&v<=70||v>=97&&v<=102)&&(g>=48&&g<=57||g>=65&&g<=70||g>=97&&g<=102)&&(r-=2,p+=2)}let l=0,u=n-1;const d=p=>p>=2&&s.charCodeAt(p-2)===37&&s.charCodeAt(p-1)===51&&(s.charCodeAt(p)===68||s.charCodeAt(p)===100);u>=0&&(s.charCodeAt(u)===61?(l++,u--):d(u)&&(l++,u-=3)),l===1&&u>=0&&(s.charCodeAt(u)===61||d(u))&&l++;const _=Math.floor(r/4)*3-(l||0);return _>0?_:0}if(typeof Buffer<"u"&&typeof Buffer.byteLength=="function")return Buffer.byteLength(s,"utf8");let o=0;for(let r=0,n=s.length;r=55296&&l<=56319&&r+1=56320&&u<=57343?(o+=4,r++):o+=3}else o+=3}return o}const wu="1.16.1",nb=64*1024,{isFunction:Oo}=I,lb=(t,...e)=>{try{return!!t(...e)}catch{return!1}},FP=t=>{const e=I.global!==void 0&&I.global!==null?I.global:globalThis,{ReadableStream:i,TextEncoder:s}=e;t=I.merge.call({skipUndefined:!0},{Request:e.Request,Response:e.Response},t);const{fetch:a,Request:o,Response:r}=t,n=a?Oo(a):typeof fetch=="function",l=Oo(o),u=Oo(r);if(!n)return!1;const d=n&&Oo(i),c=n&&(typeof s=="function"?(m=>w=>m.encode(w))(new s):async m=>new Uint8Array(await new o(m).arrayBuffer())),_=l&&d&&lb(()=>{let m=!1;const w=new o(Fe.origin,{body:new i,method:"POST",get duplex(){return m=!0,"half"}}),x=w.headers.has("Content-Type");return w.body!=null&&w.body.cancel(),m&&!x}),p=u&&d&&lb(()=>I.isReadableStream(new r("").body)),v={stream:p&&(m=>m.body)};n&&["text","arrayBuffer","blob","formData","stream"].forEach(m=>{!v[m]&&(v[m]=(w,x)=>{let f=w&&w[m];if(f)return f.call(w);throw new bt(`Response type '${m}' is not supported`,bt.ERR_NOT_SUPPORT,x)})});const g=async m=>{if(m==null)return 0;if(I.isBlob(m))return m.size;if(I.isSpecCompliantForm(m))return(await new o(Fe.origin,{method:"POST",body:m}).arrayBuffer()).byteLength;if(I.isArrayBufferView(m)||I.isArrayBuffer(m))return m.byteLength;if(I.isURLSearchParams(m)&&(m=m+""),I.isString(m))return(await c(m)).byteLength},y=async(m,w)=>{const x=I.toFiniteNumber(m.getContentLength());return x??g(w)};return async m=>{let{url:w,method:x,data:f,signal:T,cancelToken:P,timeout:F,onDownloadProgress:B,onUploadProgress:q,responseType:N,headers:Q,withCredentials:z="same-origin",fetchOptions:X,maxContentLength:L,maxBodyLength:tt}=Kp(m);const et=I.isNumber(L)&&L>-1,ht=I.isNumber(tt)&&tt>-1;let mt=a||fetch;N=N?(N+"").toLowerCase():"text";let yt=kP([T,P&&P.toAbortSignal()],F),Pt=null;const _t=yt&&yt.unsubscribe&&(()=>{yt.unsubscribe()});let lt;try{if(et&&typeof w=="string"&&w.startsWith("data:")&&SP(w)>L)throw new bt("maxContentLength size of "+L+" exceeded",bt.ERR_BAD_RESPONSE,m,Pt);if(ht&&x!=="get"&&x!=="head"){const K=await y(Q,f);if(typeof K=="number"&&isFinite(K)&&K>tt)throw new bt("Request body larger than maxBodyLength limit",bt.ERR_BAD_REQUEST,m,Pt)}if(q&&_&&x!=="get"&&x!=="head"&&(lt=await y(Q,f))!==0){let K=new o(w,{method:"POST",body:f,duplex:"half"}),Z;if(I.isFormData(f)&&(Z=K.headers.get("content-type"))&&Q.setContentType(Z),K.body){const[ut,ft]=sb(lt,dr(ab(q)));f=rb(K.body,nb,ut,ft)}}I.isString(z)||(z=z?"include":"omit");const gt=l&&"credentials"in o.prototype;if(I.isFormData(f)){const K=Q.getContentType();K&&/^multipart\/form-data/i.test(K)&&!/boundary=/i.test(K)&&Q.delete("content-type")}Q.set("User-Agent","axios/"+wu,!1);const Qt={...X,signal:yt,method:x.toUpperCase(),headers:jp(Q.normalize()),body:f,duplex:"half",credentials:gt?z:void 0};Pt=l&&new o(w,Qt);let Xt=await(l?mt(Pt,X):mt(w,Qt));if(et){const K=I.toFiniteNumber(Xt.headers.get("content-length"));if(K!=null&&K>L)throw new bt("maxContentLength size of "+L+" exceeded",bt.ERR_BAD_RESPONSE,m,Pt)}const te=p&&(N==="stream"||N==="response");if(p&&Xt.body&&(B||et||te&&_t)){const K={};["status","statusText","headers"].forEach(C=>{K[C]=Xt[C]});const Z=I.toFiniteNumber(Xt.headers.get("content-length")),[ut,ft]=B&&sb(Z,dr(ab(B),!0))||[];let S=0;const O=C=>{if(et&&(S=C,S>L))throw new bt("maxContentLength size of "+L+" exceeded",bt.ERR_BAD_RESPONSE,m,Pt);ut&&ut(C)};Xt=new r(rb(Xt.body,nb,O,()=>{ft&&ft(),_t&&_t()}),K)}N=N||"text";let j=await v[I.findKey(v,N)||"text"](Xt,m);if(et&&!p&&!te){let K;if(j!=null&&(typeof j.byteLength=="number"?K=j.byteLength:typeof j.size=="number"?K=j.size:typeof j=="string"&&(K=typeof s=="function"?new s().encode(j).byteLength:j.length)),typeof K=="number"&&K>L)throw new bt("maxContentLength size of "+L+" exceeded",bt.ERR_BAD_RESPONSE,m,Pt)}return!te&&_t&&_t(),await new Promise((K,Z)=>{Vp(K,Z,{data:j,headers:Ce.from(Xt.headers),status:Xt.status,statusText:Xt.statusText,config:m,request:Pt})})}catch(gt){if(_t&&_t(),yt&&yt.aborted&&yt.reason instanceof bt){const Qt=yt.reason;throw Qt.config=m,Pt&&(Qt.request=Pt),gt!==Qt&&(Qt.cause=gt),Qt}throw gt&>.name==="TypeError"&&/Load failed|fetch/i.test(gt.message)?Object.assign(new bt("Network Error",bt.ERR_NETWORK,m,Pt,gt&>.response),{cause:gt.cause||gt}):bt.from(gt,gt&>.code,m,Pt,gt&>.response)}}},PP=new Map,Yp=t=>{let e=t&&t.env||{};const{fetch:i,Request:s,Response:a}=e,o=[s,a,i];let r=o.length,n=r,l,u,d=PP;for(;n--;)l=o[n],u=d.get(l),u===void 0&&d.set(l,u=n?new Map:FP(e)),d=u;return u};Yp();const yu={http:QF,xhr:yP,fetch:{get:Yp}};I.forEach(yu,(t,e)=>{if(t){try{Object.defineProperty(t,"name",{__proto__:null,value:e})}catch{}Object.defineProperty(t,"adapterName",{__proto__:null,value:e})}});const ub=t=>`- ${t}`,EP=t=>I.isFunction(t)||t===null||t===!1;function OP(t,e){t=I.isArray(t)?t:[t];const{length:i}=t;let s,a;const o={};for(let r=0;r`adapter ${l} `+(u===!1?"is not supported by the environment":"is not available in the build"));let n=i?r.length>1?`since : +`+r.map(ub).join(` +`):" "+ub(r[0]):"as no adapter specified";throw new bt("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return a}const Jp={getAdapter:OP,adapters:yu};function In(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new co(null,t)}function db(t){return In(t),t.headers=Ce.from(t.headers),t.data=Cn.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),Jp.getAdapter(t.adapter||uo.adapter,t)(t).then(function(s){In(t),t.response=s;try{s.data=Cn.call(t,t.transformResponse,s)}finally{delete t.response}return s.headers=Ce.from(s.headers),s},function(s){if(!Gp(s)&&(In(t),s&&s.response)){t.response=s.response;try{s.response.data=Cn.call(t,t.transformResponse,s.response)}finally{delete t.response}s.response.headers=Ce.from(s.response.headers)}return Promise.reject(s)})}const Yr={};["object","boolean","number","function","string","symbol"].forEach((t,e)=>{Yr[t]=function(s){return typeof s===t||"a"+(e<1?"n ":" ")+t}});const cb={};Yr.transitional=function(e,i,s){function a(o,r){return"[Axios v"+wu+"] Transitional option '"+o+"'"+r+(s?". "+s:"")}return(o,r,n)=>{if(e===!1)throw new bt(a(r," has been removed"+(i?" in "+i:"")),bt.ERR_DEPRECATED);return i&&!cb[r]&&(cb[r]=!0,console.warn(a(r," has been deprecated since v"+i+" and will be removed in the near future"))),e?e(o,r,n):!0}};Yr.spelling=function(e){return(i,s)=>(console.warn(`${s} is likely a misspelling of ${e}`),!0)};function RP(t,e,i){if(typeof t!="object")throw new bt("options must be an object",bt.ERR_BAD_OPTION_VALUE);const s=Object.keys(t);let a=s.length;for(;a-- >0;){const o=s[a],r=Object.prototype.hasOwnProperty.call(e,o)?e[o]:void 0;if(r){const n=t[o],l=n===void 0||r(n,o,t);if(l!==!0)throw new bt("option "+o+" must be "+l,bt.ERR_BAD_OPTION_VALUE);continue}if(i!==!0)throw new bt("Unknown option "+o,bt.ERR_BAD_OPTION)}}const Mo={assertOptions:RP,validators:Yr},Qe=Mo.validators;let As=class{constructor(e){this.defaults=e||{},this.interceptors={request:new ib,response:new ib}}async request(e,i){try{return await this._request(e,i)}catch(s){if(s instanceof Error){let a={};Error.captureStackTrace?Error.captureStackTrace(a):a=new Error;const o=(()=>{if(!a.stack)return"";const r=a.stack.indexOf(` +`);return r===-1?"":a.stack.slice(r+1)})();try{if(!s.stack)s.stack=o;else if(o){const r=o.indexOf(` +`),n=r===-1?-1:o.indexOf(` +`,r+1),l=n===-1?"":o.slice(n+1);String(s.stack).endsWith(l)||(s.stack+=` +`+o)}}catch{}}throw s}}_request(e,i){typeof e=="string"?(i=i||{},i.url=e):i=e||{},i=Fs(this.defaults,i);const{transitional:s,paramsSerializer:a,headers:o}=i;s!==void 0&&Mo.assertOptions(s,{silentJSONParsing:Qe.transitional(Qe.boolean),forcedJSONParsing:Qe.transitional(Qe.boolean),clarifyTimeoutError:Qe.transitional(Qe.boolean),legacyInterceptorReqResOrdering:Qe.transitional(Qe.boolean)},!1),a!=null&&(I.isFunction(a)?i.paramsSerializer={serialize:a}:Mo.assertOptions(a,{encode:Qe.function,serialize:Qe.function},!0)),i.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?i.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:i.allowAbsoluteUrls=!0),Mo.assertOptions(i,{baseUrl:Qe.spelling("baseURL"),withXsrfToken:Qe.spelling("withXSRFToken")},!0),i.method=(i.method||this.defaults.method||"get").toLowerCase();let r=o&&I.merge(o.common,o[i.method]);o&&I.forEach(["delete","get","head","post","put","patch","query","common"],v=>{delete o[v]}),i.headers=Ce.concat(r,o);const n=[];let l=!0;this.interceptors.request.forEach(function(g){if(typeof g.runWhen=="function"&&g.runWhen(i)===!1)return;l=l&&g.synchronous;const y=i.transitional||fu;y&&y.legacyInterceptorReqResOrdering?n.unshift(g.fulfilled,g.rejected):n.push(g.fulfilled,g.rejected)});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let d,c=0,_;if(!l){const v=[db.bind(this),void 0];for(v.unshift(...n),v.push(...u),_=v.length,d=Promise.resolve(i);c<_;)d=d.then(v[c++],v[c++]);return d}_=n.length;let p=i;for(;c<_;){const v=n[c++],g=n[c++];try{p=v(p)}catch(y){g.call(this,y);break}}try{d=db.call(this,p)}catch(v){return Promise.reject(v)}for(c=0,_=u.length;c<_;)d=d.then(u[c++],u[c++]);return d}getUri(e){e=Fs(this.defaults,e);const i=Qp(e.baseURL,e.url,e.allowAbsoluteUrls);return $p(i,e.params,e.paramsSerializer)}};I.forEach(["delete","get","head","options"],function(e){As.prototype[e]=function(i,s){return this.request(Fs(s||{},{method:e,url:i,data:(s||{}).data}))}});I.forEach(["post","put","patch","query"],function(e){function i(s){return function(o,r,n){return this.request(Fs(n||{},{method:e,headers:s?{"Content-Type":"multipart/form-data"}:{},url:o,data:r}))}}As.prototype[e]=i(),e!=="query"&&(As.prototype[e+"Form"]=i(!0))});let qP=class Zp{constructor(e){if(typeof e!="function")throw new TypeError("executor must be a function.");let i;this.promise=new Promise(function(o){i=o});const s=this;this.promise.then(a=>{if(!s._listeners)return;let o=s._listeners.length;for(;o-- >0;)s._listeners[o](a);s._listeners=null}),this.promise.then=a=>{let o;const r=new Promise(n=>{s.subscribe(n),o=n}).then(a);return r.cancel=function(){s.unsubscribe(o)},r},e(function(o,r,n){s.reason||(s.reason=new co(o,r,n),i(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const i=this._listeners.indexOf(e);i!==-1&&this._listeners.splice(i,1)}toAbortSignal(){const e=new AbortController,i=s=>{e.abort(s)};return this.subscribe(i),e.signal.unsubscribe=()=>this.unsubscribe(i),e.signal}static source(){let e;return{token:new Zp(function(a){e=a}),cancel:e}}};function CP(t){return function(i){return t.apply(null,i)}}function IP(t){return I.isObject(t)&&t.isAxiosError===!0}const Fl={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Fl).forEach(([t,e])=>{Fl[e]=t});function Xp(t){const e=new As(t),i=qp(As.prototype.request,e);return I.extend(i,As.prototype,e,{allOwnKeys:!0}),I.extend(i,e,null,{allOwnKeys:!0}),i.create=function(a){return Xp(Fs(t,a))},i}const oe=Xp(uo);oe.Axios=As;oe.CanceledError=co;oe.CancelToken=qP;oe.isCancel=Gp;oe.VERSION=wu;oe.toFormData=Kr;oe.AxiosError=bt;oe.Cancel=oe.CanceledError;oe.all=function(e){return Promise.all(e)};oe.spread=CP;oe.isAxiosError=IP;oe.mergeConfig=Fs;oe.AxiosHeaders=Ce;oe.formToJSON=t=>Hp(I.isHTMLForm(t)?new FormData(t):t);oe.getAdapter=Jp.getAdapter;oe.HttpStatusCode=Fl;oe.default=oe;const{Axios:_E,AxiosError:hE,CanceledError:pE,isCancel:mE,CancelToken:gE,VERSION:fE,all:vE,Cancel:wE,isAxiosError:yE,spread:kE,toFormData:AE,AxiosHeaders:xE,HttpStatusCode:TE,formToJSON:SE,getAdapter:FE,mergeConfig:PE,create:EE}=oe,Qs=oo("errorHandler",()=>{const t=vt(null),e=vt(null),i=vt(null),s=vt(null),a=vt(null);function o(l){t.value=l,l.response?(l.response.data&&(e.value=l.response.data.message??null,s.value=l.response.data.originalMessage??null,i.value=l.response.data.reason??null,a.value=l.response.data.debug??null),l.response.status===407?(e.value="error.auth_proxy_failed",s.value="error.auth_proxy_failed.legend"):l.response.status===403&&(e.value="error.unauthorized",s.value="error.unauthorized.legend")):(e.value=l.message,a.value=l.stack??null),i.value&&!Array.isArray(i.value)&&(i.value=new Array(i.value))}function r(l){o(l),this.$router.push({name:"genericError"})}function n(){this.$router.push({name:"404"})}return{lastError:t,message:e,reasons:i,originalMessage:s,debug:a,parse:o,show:r,notFound:n}}),Rs=(t="api")=>{let e;const i=window.appConfig.subdirectory;t==="web"?e=i+"/":e=i+"/api/v1";const s=oe.create({baseURL:e,headers:{"X-Requested-With":"XMLHttpRequest","Content-Type":"application/json"},withCredentials:!0});return s.interceptors.response.use(a=>a,async function(a){if(oe.isCancel(a)||a?.code==="ERR_CANCELED")return Promise.reject(a);if(!a?.response)return Qs().show(a),new Promise(()=>{});const o=a.config;return a.response.status===419&&!o._retried?(o._retried=!0,await oe.get("/refresh-csrf"),s.request(o)):(a.response.status===418&&Ne().logout({kicked:!0}),a.response&&[407].includes(a.response.status)?(Qs().show(a),new Promise(()=>{})):a.config.hasOwnProperty("returnError")&&a.config.returnError===!0||(a.response&&[401].includes(a.response.status)&&Ne().tossOut(),a.response.status===422)?Promise.reject(a):a.response.status===404?(Qs().notFound(),new Promise(()=>{})):(Qs().show(a),new Promise(()=>{})))}),s},zP=Rs("web"),DP=Rs("api"),t0={logout(t={}){return zP.get("/user/logout",{...t})},async getCurrentUser(t={}){return DP.get("/user",{...t})}},pi=Rs("api"),Ro=Rs("web"),e0={getPreferences(t={}){return pi.get("/user/preferences",{...t})},updatePreference(t,e,i={}){return pi.put("/user/preferences/"+t,{value:e},{...i})},getWebauthnDevices(t={}){return Ro.get("/webauthn/credentials",{...t})},revokeWebauthnDevice(t,e={}){return Ro.delete("/webauthn/credentials/"+t,{...e})},getPersonalAccessTokens(t={}){return Ro.get("/oauth/personal-access-tokens",{...t})},deletePersonalAccessToken(t,e={}){return Ro.delete("/oauth/personal-access-tokens/"+t,{...e})},getAll(t={}){return pi.get("/users",{...t})},getById(t,e={}){return pi.get("/users/"+t,{...e})},resetPassword(t,e={}){return pi.patch("/users/"+t+"/password/reset",{},{...e})},delete(t,e={}){return pi.delete("/users/"+t,{...e})},promote(t,e,i={}){return pi.patch("/users/"+t+"/promote",e,{...i})},revokePATs(t,e={}){return pi.delete("/users/"+t+"/pats",{...e})},revokeWebauthnCredentials(t,e={}){return pi.delete("/users/"+t+"/credentials",{...e})},getauthentications(t,e=12,i,s={}){return pi.get("/users/"+t+"/authentications?period="+e+(i?"&limit="+i:""),{...s})}},fe=Rs("api"),Aa={getAll(t=!1,e={}){return fe.get("/twofaccounts"+(t?"?withOtp=1":""),{...e})},getByIds(t,e=!1,i={}){return fe.get("/twofaccounts?ids="+t+(e?"&withOtp=1":""),{...i})},get(t,e={}){return fe.get("/twofaccounts/"+t,{...e})},getWithoutSecret(t,e={}){return fe.get("/twofaccounts/"+t+"?withSecret=0",{...e})},preview(t,e={}){return fe.post("/twofaccounts/preview",{uri:t},{...e})},storeFromUri(t,e={}){return fe.post("/twofaccounts",{uri:t},{...e})},getOtpById(t,e={}){return fe.get("/twofaccounts/"+t+"/otp",{...e})},getOtpByUri(t,e={}){return fe.post("/twofaccounts/otp",{uri:t},{...e})},getOtpByParams(t,e={}){return fe.post("/twofaccounts/otp",t,{...e})},withdraw(t,e={}){return fe.patch("/twofaccounts/withdraw?ids="+t.join(),{...e})},saveOrder(t,e={}){return fe.post("/twofaccounts/reorder",{orderedIds:t},{...e})},batchDelete(t,e={}){return fe.delete("/twofaccounts?ids="+t,{...e})},export(t,e,i={}){return fe.get("/twofaccounts/export?ids="+t+(e?"&otpauth=1":""),{...i})},getQrcode(t,e={}){return fe.get("/twofaccounts/"+t+"/qrcode",{...e})},migrate(t,e={}){return fe.post("/twofaccounts/migration",{payload:t,withSecret:!0},{...e})},count(t={}){return fe.get("/twofaccounts/count",{...t})},getOtpLogs(t,e=12,i,s={}){return fe.get("/twofaccounts/"+t+"/otp-logs?period="+e+(i?"&limit="+i:""),{...s})}};var qo=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Wo={exports:{}},NP=Wo.exports,bb;function LP(){return bb||(bb=1,(function(t,e){(function(i,s){s()})(NP,function(){function i(u,d){return typeof d>"u"?d={autoBom:!1}:typeof d!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),d={autoBom:!d}),d.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(u.type)?new Blob(["\uFEFF",u],{type:u.type}):u}function s(u,d,c){var _=new XMLHttpRequest;_.open("GET",u),_.responseType="blob",_.onload=function(){l(_.response,d,c)},_.onerror=function(){console.error("could not download file")},_.send()}function a(u){var d=new XMLHttpRequest;d.open("HEAD",u,!1);try{d.send()}catch{}return 200<=d.status&&299>=d.status}function o(u){try{u.dispatchEvent(new MouseEvent("click"))}catch{var d=document.createEvent("MouseEvents");d.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),u.dispatchEvent(d)}}var r=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof qo=="object"&&qo.global===qo?qo:void 0,n=r.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),l=r.saveAs||(typeof window!="object"||window!==r?function(){}:"download"in HTMLAnchorElement.prototype&&!n?function(u,d,c){var _=r.URL||r.webkitURL,p=document.createElement("a");d=d||u.name||"download",p.download=d,p.rel="noopener",typeof u=="string"?(p.href=u,p.origin===location.origin?o(p):a(p.href)?s(u,d,c):o(p,p.target="_blank")):(p.href=_.createObjectURL(u),setTimeout(function(){_.revokeObjectURL(p.href)},4e4),setTimeout(function(){o(p)},0))}:"msSaveOrOpenBlob"in navigator?function(u,d,c){if(d=d||u.name||"download",typeof u!="string")navigator.msSaveOrOpenBlob(i(u,c),d);else if(a(u))s(u,d,c);else{var _=document.createElement("a");_.href=u,_.target="_blank",setTimeout(function(){o(_)})}}:function(u,d,c,_){if(_=_||open("","_blank"),_&&(_.document.title=_.document.body.innerText="downloading..."),typeof u=="string")return s(u,d,c);var p=u.type==="application/octet-stream",v=/constructor/i.test(r.HTMLElement)||r.safari,g=/CriOS\/[\d]+/.test(navigator.userAgent);if((g||p&&v||n)&&typeof FileReader<"u"){var y=new FileReader;y.onloadend=function(){var x=y.result;x=g?x:x.replace(/^data:[^;]*;/,"data:attachment/file;"),_?_.location.href=x:location=x,_=null},y.readAsDataURL(u)}else{var m=r.URL||r.webkitURL,w=m.createObjectURL(u);_?_.location=w:location.href=w,_=null,setTimeout(function(){m.revokeObjectURL(w)},4e4)}});r.saveAs=l.saveAs=l,t.exports=l})})(Wo)),Wo.exports}var _b=LP();const i0=oo("twofaccounts",{state:()=>({items:[],selectedIds:[],filter:"",backendWasNewer:!1,fetchedOn:null}),getters:{filtered(t){const e=Ne();return t.items.filter(i=>{let s=!1;return(parseInt(e.preferences.activeGroup)==-1&&i.group_id==null||parseInt(e.preferences.activeGroup)==-2&&(i.is_shared==!0||i.is_shared_with_all==!0)||parseInt(e.preferences.activeGroup)==-3&&i.is_borrowed==!0||parseInt(e.preferences.activeGroup)>0&&i.group_id==parseInt(e.preferences.activeGroup)||parseInt(e.preferences.activeGroup)==0)&&(s=!0),t.filter&&(s=s&&((i.service?i.service.toLowerCase().includes(t.filter.toLowerCase()):!1)||i.account.toLowerCase().includes(t.filter.toLowerCase()))),s})},periods(t){return t.items.filter(e=>e.otp_type=="totp").map(function(e){return{period:e.period,generated_at:e.otp?.generated_at}}).filter((e,i,s)=>i===s.findIndex(a=>a.period===e.period)).sort()},orderedIds(t){return t.items.map(e=>e.id)},isEmpty(t){return t.items.length==0},count(t){return t.items.length},filteredCount(t){return t.filtered.length},selectedCount(t){return t.selectedIds.length},hasNoneSelected(t){return t.selectedIds.length==0},hasBorrowedSelected(t){return t.items.some(e=>t.selectedIds.includes(e.id)&&e.is_borrowed)},hasOnlyBorrowedSelected(t){return t.selectedIds.length>0&&t.selectedIds.every(e=>t.items.find(s=>s.id===e)?.is_borrowed===!0)},hasSharedSelected(t){return t.items.some(e=>t.selectedIds.includes(e.id)&&(e.is_shared==!0||e.is_shared_with_all==!0))},hasOnlySharedSelected(t){return t.selectedIds.length>0&&t.selectedIds.every(e=>{const i=t.items.find(s=>s.id===e);return i?.is_shared===!0||i?.is_shared_with_all===!0})}},actions:{async fetch(t=!1){Math.floor(Date.now()-this.fetchedOn)>2e3||t?(this.fetchedOn=Date.now(),await Aa.getAll(!Ne().preferences.getOtpOnRequest).then(s=>{t&&(this.backendWasNewer=s.data.length!==this.items.length,this.items.forEach(a=>{let o=s.data.find(r=>r.id===a.id);if(o==null){this.backendWasNewer=!0;return}for(const r in a)if(r!=="otp"&&a[r]!=o[r]){this.backendWasNewer=!0;return}})),this.items=s.data})):this.backendWasNewer=!1},getById(t){return this.items.find(e=>e.id==t)},select(t){for(var e=0;et.id)},selectNone(){this.selectedIds=[]},async deleteSelected(){confirm(this.$i18n.global.t("confirmation.delete_twofaccount"))&&this.selectedIds.length>0&&await Aa.batchDelete(this.selectedIds.join()).then(t=>{let e=this.items;this.selectedIds.forEach(function(i){e=e.filter(s=>s.id!==i)}),this.items=e,this.selectNone(),Ss().success({text:this.$i18n.global.t("notification.accounts_deleted")})})},export(t="2fauth"){t=="otpauth"?Aa.export(this.selectedIds.join(),!0).then(e=>{let i=[];e.data.data.forEach(a=>{i.push(a.uri)});var s=new Blob([i.join(` +`)],{type:"text/plain;charset=utf-8"});_b.saveAs.saveAs(s,"2fauth_export_otpauth.txt")}):Aa.export(this.selectedIds.join(),!1,{responseType:"blob"}).then(e=>{var i=new Blob([e.data],{type:"application/json;charset=utf-8"});_b.saveAs.saveAs(i,"2fauth_export.json")})},saveOrder(t="free"){Aa.saveOrder(this.orderedIds).then(()=>{Ne().preferences.sortOrder=t,e0.updatePreference("sortOrder",t)})},sortDefault(){Ne().preferences.sortOrder=="asc"&&this.sortAsc(),Ne().preferences.sortOrder=="desc"&&this.sortDesc()},sortAsc(){this.items.sort(function(t,e){const i=t.service??"",s=e.service??"";return Ne().preferences.sortCaseSensitive?i.normalize("NFD").replace(/[\u0300-\u036f]/g,"")>s.normalize("NFD").replace(/[\u0300-\u036f]/g,"")?1:-1:i.localeCompare(s,Ne().preferences.lang)}),this.saveOrder("asc")},sortDesc(){this.items.sort(function(t,e){const i=t.service??"",s=e.service??"";return Ne().preferences.sortCaseSensitive?i.normalize("NFD").replace(/[\u0300-\u036f]/g,"")e.period==t).map(e=>e.id)}}}),xa=Rs("api"),zn={getAll(){return xa.get("groups")},get(t,e={}){return xa.get("/groups/"+t,{...e})},assign(t,e,i={}){return xa.post("/groups/"+e+"/assign",{ids:t},{...i})},delete(t,e={}){return xa.delete("/groups/"+t,{...e})},saveOrder(t,e={}){return xa.post("/groups/reorder",{orderedIds:t},{...e})}},UP=oo("groups",()=>{const t=Ne(),e=Ss(),i=vt([]),s=vt(null),a=st(()=>{const g=i.value.find(y=>y.id===parseInt(t.preferences.activeGroup));return g&&t.preferences.activeGroup>0?g.name:null}),o=st(()=>i.value.map(g=>g.id)),r=st(()=>i.value.filter(g=>g.id>0)),n=st(()=>i.value.find(g=>g.id==0)),l=st(()=>r.value.length==0),u=st(()=>r.value.length);function d(){i.value=[],s.value=null}function c(g){const y=i.value.findIndex(m=>m.id===parseInt(g.id));y>-1?(i.value[y]=g,e.success({text:this.$i18n.global.t("notification.group_name_saved")})):(i.value.push(g),e.success({text:this.$i18n.global.t("notification.group_successfully_created")}))}async function _(){Math.floor(Date.now()-s.value)>2e3&&(s.value=Date.now(),await zn.getAll().then(m=>{i.value=m.data}))}async function p(g){confirm(this.$i18n.global.t("confirmation.delete_group"))&&await zn.delete(g).then(y=>{i.value=i.value.filter(m=>m.id!==g),e.success({text:this.$i18n.global.t("notification.group_successfully_deleted")}),parseInt(t.preferences.activeGroup)===g&&(t.preferences.activeGroup=0)})}function v(){zn.saveOrder(o.value)}return{items:i,fetchedOn:s,current:a,orderedIds:o,withoutTheAllGroup:r,theAllGroup:n,isEmpty:l,count:u,$reset:d,addOrEdit:c,fetch:_,remove:p,saveOrder:v}}),Dn=Rs("api"),jP={getAll(t={}){return Dn.get("/settings",{...t})},update(t,e,i={}){return Dn.put("/settings/"+t,{value:e},{...i})},delete(t,e={}){return Dn.delete("/settings/"+t,{...e})}},cr=oo("appSettings",{state:()=>({lockedPreferences:window.lockedPreferences,...window.appSettings}),getters:{isSynced:t=>t.useEncryption!=null},actions:{async fetch(){jP.getAll({returnError:!0}).then(t=>{t.data.forEach(e=>{this[e.key]=e.value})}).catch(t=>{Ss().alert({text:this.$i18n.global.t("error.failed_to_retrieve_app_settings")})})}}}),Ne=oo("user",{state:()=>({id:void 0,name:void 0,email:void 0,oauth_provider:void 0,authenticated_by_proxy:void 0,preferences:window.defaultPreferences,isAdmin:!1}),getters:{isAuthenticated(){return this.name!=null}},actions:{async loginAs(t){this.$patch(t),await this.initDataStores(),this.applyUserPrefs()},async initDataStores(){const t=i0(),e=UP();this.isAuthenticated?(await t.fetch(),e.fetch()):(t.$reset(),e.$reset())},logout(t={}){const{kicked:e}=t,i=Ss(),s=Qs();if(this.$2fauth.config.proxyAuth)if(this.$2fauth.config.proxyLogoutUrl)location.assign(this.$2fauth.config.proxyLogoutUrl);else return!1;else t0.logout({returnError:!0}).then(()=>{e&&(i.clear(),i.warn({text:this.$i18n.global.t("notification.autolock_triggered_punchline"),duration:-1})),this.tossOut()}).catch(a=>{a.response.status!==401?s.show(a):this.tossOut()})},tossOut(){this.$reset(),this.initDataStores(),this.applyUserPrefs();const t=cr(),e=t.enableSso,i=t.useSsoOnly,s=t.disableRegistration;t.$reset(),t.enableSso=e,t.useSsoOnly=i,t.disableRegistration=s,bo.push({name:"login"})},applyTheme(){const t=NS({class:"dark"});t.value=this.preferences.theme=="system"?"auto":this.preferences.theme},applyLanguage(){const{isSupported:t,language:e}=Sp();let i=this.$i18n.fallbackLocale;t&&(i=this.preferences.lang=="browser"?e.value.slice(0,2):this.preferences.lang),this.$i18n.global.locale=i},applyUserPrefs(){this.applyTheme(),this.applyLanguage()},refreshPreferences(){const t=cr();e0.getPreferences({returnError:!0}).then(e=>{e.data.forEach(i=>{this.preferences[i.key]=i.value;let s=t.lockedPreferences.indexOf(i.key);i.locked==!0&&s===-1?t.lockedPreferences.push(i.key):i.locked==!1&&s>0&&t.lockedPreferences.splice(s,1)})}).catch(e=>{Ss().alert({text:this.$i18n.global.t("error.data_cannot_be_refreshed_from_server")})})}}});async function Kt({to:t,next:e,nextMiddleware:i,stores:s}){const{user:a,appSettings:o}=s;a.isAuthenticated||await t0.getCurrentUser({returnError:!0}).then(async r=>{const n=r.data;await a.loginAs({id:n.id,name:n.name,email:n.email,oauth_provider:n.oauth_provider,authenticated_by_proxy:n.authenticated_by_proxy,preferences:n.preferences,isAdmin:n.is_admin});for(const[l,u]of Object.entries(n.appSettings||{}))o[l]=u}).catch(r=>{}),a.isAuthenticated?i():e({name:"login"})}async function Ns({to:t,next:e,nextMiddleware:i,stores:s}){const{user:a}=s,{errorHandler:o}=s;if(a.isAdmin)i();else{let r=new Error("unauthorized");const n={status:403,statusText:"unauthorized"},l=new Response(null,n);r.response=l,o.show(r)}}async function Ls({to:t,next:e,nextMiddleware:i,stores:s}){const{user:a,twofaccounts:o}=s,{errorHandler:r}=s,n=o.getById(t.params.twofaccountId);if(n==null||n.is_borrowed){let l=new Error("unauthorized");const u={status:403,statusText:"unauthorized"},d=new Response(null,u);l.response=d,r.show(l)}else i()}async function MP({to:t,next:e,nextMiddleware:i,stores:s}){const{twofaccounts:a}=s;a.isEmpty?await a.fetch().then(()=>{a.isEmpty?e({name:"start"}):i()}):i()}function WP({to:t,next:e,nextMiddleware:i,stores:s}){const{errorHandler:a}=s;a.lastError==null&&!t.query.err?e({name:"accounts"}):i()}async function BP({to:t,next:e,nextMiddleware:i,stores:s}){const{appSettings:a}=s;a.disableRegistration?e({name:"notFound"}):i()}function Ee({to:t,next:e,nextMiddleware:i,stores:s}){const{user:a}=s,o=Tp(a.$2fauth.prefix+"returnTo","accounts");o.value=t.name,i()}async function Us({to:t,next:e,nextMiddleware:i,stores:s}){const{appSettings:a}=s;a.$2fauth.config.proxyAuth?e({name:"accounts"}):i()}async function Nn({to:t,next:e,nextMiddleware:i,stores:s}){const{appSettings:a}=s,{errorHandler:o}=s;if(a.enableSharing)i();else{let r=new Error("unauthorized");const n={status:403,statusText:"unauthorized"},l=new Response(null,n);r.response=l,o.show(r)}}function _e({to:t,next:e,nextMiddleware:i,stores:s}){const{appSettings:a,user:o}=s;o.isAdmin&&!a.isSynced&&a.fetch(),i()}const bo=iv({history:D3(window.appConfig.subdirectory?window.appConfig.subdirectory:"/"),routes:[{path:"/start",name:"start",component:()=>Et(()=>import("./Start-Dnu4qWlC.js"),__vite__mapDeps([0,1,2]),import.meta.url),meta:{middlewares:[Kt,_e,Ee],watchedByKicker:!0}},{path:"/capture",name:"capture",component:()=>Et(()=>import("./Capture-BG6QMHLW.js"),__vite__mapDeps([3,1,4,5,6,2,7]),import.meta.url),meta:{middlewares:[Kt,_e,Ee],watchedByKicker:!0}},{path:"/accounts",name:"accounts",component:()=>Et(()=>import("./Accounts-znshhaJC.js"),__vite__mapDeps([8,9,7,6,10,2,11,12,13,14]),import.meta.url),meta:{middlewares:[Kt,_e,MP,Ee],watchedByKicker:!0},alias:"/"},{path:"/account/create",name:"createAccount",component:()=>Et(()=>import("./CreateUpdate-tvLQ26rU.js"),__vite__mapDeps([15,1,4,5,6,16,2,7,13]),import.meta.url),meta:{middlewares:[Kt,_e,Ee],watchedByKicker:!0}},{path:"/account/import",name:"importAccounts",component:()=>Et(()=>import("./Import-C0sC5CLD.js"),__vite__mapDeps([17,1,2,7,13,6,18,14,11]),import.meta.url),meta:{middlewares:[Kt,_e,Ee],watchedByKicker:!0}},{path:"/account/:twofaccountId/edit",name:"editAccount",component:()=>Et(()=>import("./CreateUpdate-tvLQ26rU.js"),__vite__mapDeps([15,1,4,5,6,16,2,7,13]),import.meta.url),meta:{middlewares:[Kt,_e,Ls,Ee],watchedByKicker:!0},props:!0},{path:"/account/:twofaccountId/qrcode",name:"showQRcode",component:()=>Et(()=>import("./QRcode-Da_iUmWo.js"),[],import.meta.url),meta:{middlewares:[Kt,_e,Ls,Ee],watchedByKicker:!0}},{path:"/account/:twofaccountId/sharing",name:"accountSharing",component:()=>Et(()=>import("./AccountSharing-kU7yk02h.js"),__vite__mapDeps([19,9,20,7,21,22,6,12]),import.meta.url),meta:{middlewares:[Kt,Nn,Ls,Ee],watchedByKicker:!0},props:!0},{path:"/account/:twofaccountId/share",name:"shareAccount",component:()=>Et(()=>import("./Share-DkTnn1jz.js"),__vite__mapDeps([23,9,20,7,2,21,6]),import.meta.url),meta:{middlewares:[Kt,Nn,Ls],watchedByKicker:!0},props:!0},{path:"/account/:twofaccountId/transfer",name:"transferOwnership",component:()=>Et(()=>import("./TransferOwnership-BsVNwpBY.js"),__vite__mapDeps([24,1,9,20,7,21]),import.meta.url),meta:{middlewares:[Kt,Nn,Ls],watchedByKicker:!0},props:!0},{path:"/account/:twofaccountId/otp-logs",name:"otpLogs",component:()=>Et(()=>import("./OtpLogs-CAP6rwu6.js"),__vite__mapDeps([25,7,26,6,14,18,20]),import.meta.url),meta:{middlewares:[Kt,Ls],watchedByKicker:!0},props:!0},{path:"/groups",name:"groups",component:()=>Et(()=>import("./Groups-Ccrpwp-O.js"),__vite__mapDeps([27,7,2,10,6,22]),import.meta.url),meta:{middlewares:[Kt,_e,Ee],watchedByKicker:!0},props:!0},{path:"/group/create",name:"createGroup",component:()=>Et(()=>import("./CreateUpdate-CbOB1O7q.js"),__vite__mapDeps([28,1,2]),import.meta.url),meta:{middlewares:[Kt,_e],watchedByKicker:!0}},{path:"/group/:groupId/edit",name:"editGroup",component:()=>Et(()=>import("./CreateUpdate-CbOB1O7q.js"),__vite__mapDeps([28,1,2]),import.meta.url),meta:{middlewares:[Kt,_e],watchedByKicker:!0},props:!0},{path:"/settings/options",name:"settings.options",component:()=>Et(()=>import("./Options-Bun4hDR8.js"),__vite__mapDeps([29,30,16,6,31,5]),import.meta.url),meta:{middlewares:[Kt,_e],watchedByKicker:!0,showAbout:!0}},{path:"/settings/account",name:"settings.account",component:()=>Et(()=>import("./Account-CvhJGfLO.js"),__vite__mapDeps([32,30,1,31]),import.meta.url),meta:{middlewares:[Kt,_e],watchedByKicker:!0,showAbout:!0}},{path:"/settings/oauth",name:"settings.oauth.tokens",component:()=>Et(()=>import("./OAuth-aXCqlLPs.js"),__vite__mapDeps([33,30,1,7,22,6,18]),import.meta.url),meta:{middlewares:[Kt,_e],watchedByKicker:!0,showAbout:!0,props:!0}},{path:"/settings/webauthn/:credentialId/edit",name:"settings.webauthn.editCredential",component:()=>Et(()=>import("./Edit-Ba84j7PP.js"),__vite__mapDeps([34,1]),import.meta.url),meta:{middlewares:[Kt,_e],watchedByKicker:!0,showAbout:!0},props:!0},{path:"/settings/webauthn",name:"settings.webauthn.devices",component:()=>Et(()=>import("./WebAuthn-C_HU0Xj8.js"),__vite__mapDeps([35,30,36,7,22,6]),import.meta.url),meta:{middlewares:[Kt,_e],watchedByKicker:!0,showAbout:!0}},{path:"/admin/app",name:"admin.appSetup",component:()=>Et(()=>import("./AppSetup-9GPB7B-I.js"),__vite__mapDeps([37,38,39,18,6,14,40,31,5]),import.meta.url),meta:{middlewares:[Kt,Ns],watchedByKicker:!0,showAbout:!0}},{path:"/admin/auth",name:"admin.auth",component:()=>Et(()=>import("./Auth-DslSg1a9.js"),__vite__mapDeps([41,38,39]),import.meta.url),meta:{middlewares:[Kt,Ns],watchedByKicker:!0,showAbout:!0}},{path:"/admin/users",name:"admin.users",component:()=>Et(()=>import("./Users-DyNCDMUg.js"),__vite__mapDeps([42,38,7,22,6]),import.meta.url),meta:{middlewares:[Kt,_e,Ns],watchedByKicker:!0,showAbout:!0}},{path:"/admin/users/create",name:"admin.createUser",component:()=>Et(()=>import("./Create-Vv-BwDWf.js"),__vite__mapDeps([43,1]),import.meta.url),meta:{middlewares:[Kt,_e,Ns],watchedByKicker:!0,showAbout:!0}},{path:"/admin/users/:userId/manage",name:"admin.manageUser",component:()=>Et(()=>import("./Manage-B1CTWqgo.js"),__vite__mapDeps([44,40,6,45,7,26,14,18,2,31]),import.meta.url),meta:{middlewares:[Kt,_e,Ns],watchedByKicker:!0,showAbout:!0},props:!0},{path:"/admin/logs/:userId/access",name:"admin.logs.access",component:()=>Et(()=>import("./Access-BQVm4alb.js"),__vite__mapDeps([46,45,7,26,6,14,18,2]),import.meta.url),meta:{middlewares:[Kt,_e,Ns],watchedByKicker:!0,showAbout:!0},props:!0},{path:"/login",name:"login",component:()=>Et(()=>import("./Login-XfEMUKl8.js"),__vite__mapDeps([47,1,36]),import.meta.url),meta:{middlewares:[Us,Ee],showAbout:!0}},{path:"/register",name:"register",component:()=>Et(()=>import("./Register-DffuLlzx.js"),__vite__mapDeps([48,1,36,18,6]),import.meta.url),meta:{middlewares:[Us,BP,Ee],showAbout:!0}},{path:"/password/request",name:"password.request",component:()=>Et(()=>import("./RequestReset-w8-YSMaH.js"),__vite__mapDeps([49,1]),import.meta.url),meta:{middlewares:[Us,Ee],showAbout:!0}},{path:"/user/password/reset",name:"password.reset",component:()=>Et(()=>import("./Reset-RiTuOlH9.js"),__vite__mapDeps([50,1]),import.meta.url),meta:{middlewares:[Us,Ee],showAbout:!0}},{path:"/webauthn/lost",name:"webauthn.lost",component:()=>Et(()=>import("./RequestReset-w8-YSMaH.js"),__vite__mapDeps([49,1]),import.meta.url),meta:{middlewares:[Us,Ee],showAbout:!0}},{path:"/webauthn/recover",name:"webauthn.recover",component:()=>Et(()=>import("./Recover-CEob990V.js"),__vite__mapDeps([51,1]),import.meta.url),meta:{middlewares:[Us,Ee],showAbout:!0}},{path:"/about",name:"about",component:()=>Et(()=>import("./About-DlWJhNxo.js"),__vite__mapDeps([52,7,6]),import.meta.url),meta:{showAbout:!0,watchedByKicker:!0}},{path:"/error",name:"genericError",component:()=>Et(()=>import("./Error-DG0pgQA2.js"),__vite__mapDeps([53,7]),import.meta.url),meta:{middlewares:[WP],watchedByKicker:!0}},{path:"/404",name:"404",component:()=>Et(()=>import("./Error-DG0pgQA2.js"),__vite__mapDeps([53,7]),import.meta.url),meta:{watchedByKicker:!0},props:!0},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>Et(()=>import("./Error-DG0pgQA2.js"),__vite__mapDeps([53,7]),import.meta.url),meta:{watchedByKicker:!0},props:!0}]});bo.beforeEach((t,e,i)=>{const s=t.meta.middlewares,a=Ne(),o=i0(),r=cr(),n=Ss(),l=Qs(),c={to:t,from:e,next:i,nextMiddleware:{},stores:{user:a,twofaccounts:o,appSettings:r,notify:n,errorHandler:l}};if(!s)return i();s[0]({...c,nextMiddleware:Fp(c,s,1)})});const $P={class:"main-section"},HP={__name:"App",setup(t){const{t:e}=_S(),{language:i}=Sp(),s=e3(),a=Jt("userStore"),o=vt(!1),r=vt(null),n=vt(s.meta.watchedByKicker);return o.value=a.isAuthenticated,r.value=parseInt(a.preferences.kickUserAfter),Bt(()=>a.preferences.kickUserAfter,()=>{r.value=parseInt(a.preferences.kickUserAfter)}),Bt(()=>a.isAuthenticated,()=>{o.value=a.isAuthenticated}),Bt(i,()=>{a.applyLanguage()}),Bt(()=>s.name,()=>{n.value=s.meta.watchedByKicker}),bo.afterEach((l,u)=>{l.meta.title=e("title."+l.name),document.title=l.meta.title}),(l,u)=>{const d=to("notifications");return D(),W(xt,null,[rt(d,{id:"vueNotification",role:"alert",width:"100%",position:"top",duration:4e3,speed:0,max:1,classes:"notification notification-banner is-radiusless"}),V("main",$P,[rt(G(Eh))]),G(o)&&G(r)>0&&G(n)?(D(),Nt(G(sT),{key:0,kickAfter:G(r),onKicked:u[0]||(u[0]=()=>G(a).logout({kicked:!0}))},null,8,["kickAfter"])):it("",!0)],64)}}},Ki=bf(HP),s0={prefix:"2fauth_",config:window.appConfig,version:window.appVersion,isDemoApp:window.isDemoApp,isTestingApp:window.isTestingApp,langs:window.appLocales,urls:window.urls,context:"webapp"};Ki.provide("2fauth",ss(s0));Ki.use(hh);const a0=jS();a0.use(({store:t})=>{t.$2fauth=s0,t.$i18n=hh,t.$router=Pr(bo)});Ki.use(a0);Ki.use(bo);Ki.use(Xf);Ki.component("ResponsiveWidthWrapper",vp).component("Spinner",fp).component("StackLayout",aS).component("FormWrapper",qx).component("VueFooter",bS).component("Modal",qT).component("VueButton",ul).component("NavigationButton",Vh).component("FormFieldError",rs).component("FormField",Oy).component("FormPasswordField",Hy).component("FormSelect",lk).component("FormToggle",fk).component("FormCheckbox",vy).component("FormButtons",_y);const o0=Ne(),GP=cr();o0.applyUserPrefs();Ki.provide("userStore",o0);Ki.provide("appSettingsStore",GP);Ki.mount("#app");export{Ss as $,ee as A,st as B,Qs as C,Yt as D,da as E,xt as F,rf as G,We as H,Aa as I,zn as J,Ti as K,Bi as L,Jt as M,lE as N,UP as O,cr as P,si as Q,VP as R,eE as S,QP as T,of as U,Gc as V,Px as W,sE as X,tE as Y,XP as Z,iE as _,Ne as a,Ex as a0,e0 as a1,e3 as a2,JP as a3,bo as a4,ZP as a5,Dm as a6,Do as a7,Tp as a8,rE as a9,uE as aa,S_ as ab,af as ac,_S as ad,Rs as ae,YP as af,oE as ag,hu as ah,hS as ai,Ft as aj,aE as ak,jP as al,nE as am,oo as an,we as ao,NS as ap,i0 as b,Qi as c,Nt as d,vt as e,to as f,KP as g,D as h,rt as i,G as j,it as k,W as l,V as m,nt as n,Ie as o,Ot as p,Ts as q,Ps as r,ni as s,at as t,Dr as u,Bt as v,$t as w,Ll as x,Ma as y,pd as z}; diff --git a/public/build/assets/appSettingsUpdater-D1Bq_3WB.js b/public/build/assets/appSettingsUpdater-D1Bq_3WB.js new file mode 100644 index 0000000..7fef622 --- /dev/null +++ b/public/build/assets/appSettingsUpdater-D1Bq_3WB.js @@ -0,0 +1 @@ +import{al as p,C as o}from"./app-dvJP63FL.js";async function l(r,t,n=!1){let s=null,a=null;return await p.update(r,t,{returnError:!0}).then(e=>{s=t}).catch(e=>{n&&e.response.status===422?a=e.response.data.message:o().show(e)}),{data:s,error:a}}export{l as u}; diff --git a/public/build/assets/breakpoints-CyLcIEOu.js b/public/build/assets/breakpoints-CyLcIEOu.js new file mode 100644 index 0000000..2366135 --- /dev/null +++ b/public/build/assets/breakpoints-CyLcIEOu.js @@ -0,0 +1 @@ +import{am as t}from"./app-dvJP63FL.js";function a(){return{isLaptop:t({laptop:1024}).laptop}}export{a as u}; diff --git a/public/build/assets/bus-ChE1sp8V.js b/public/build/assets/bus-ChE1sp8V.js new file mode 100644 index 0000000..c9124c8 --- /dev/null +++ b/public/build/assets/bus-ChE1sp8V.js @@ -0,0 +1 @@ +import{an as e}from"./app-dvJP63FL.js";const r=e("bus",{state:()=>({migrationUri:null,decodedUri:null,inManagementMode:!1,editedGroupName:null,username:null}),actions:{}});export{r as u}; diff --git a/public/build/assets/check-CPGWPXZa.js b/public/build/assets/check-CPGWPXZa.js new file mode 100644 index 0000000..28148aa --- /dev/null +++ b/public/build/assets/check-CPGWPXZa.js @@ -0,0 +1 @@ +import{c}from"./createLucideIcon-DsaEAGzP.js";const e=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],t=c("check",e);export{t as C}; diff --git a/public/build/assets/circle-plus-BM92Iipr.js b/public/build/assets/circle-plus-BM92Iipr.js new file mode 100644 index 0000000..5fca28e --- /dev/null +++ b/public/build/assets/circle-plus-BM92Iipr.js @@ -0,0 +1 @@ +import{c}from"./createLucideIcon-DsaEAGzP.js";const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"M12 8v8",key:"napkw2"}]],r=c("circle-plus",e);export{r as C}; diff --git a/public/build/assets/circle-x-AvUNZzwX.js b/public/build/assets/circle-x-AvUNZzwX.js new file mode 100644 index 0000000..4e3d372 --- /dev/null +++ b/public/build/assets/circle-x-AvUNZzwX.js @@ -0,0 +1 @@ +import{c}from"./createLucideIcon-DsaEAGzP.js";const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],i=c("circle-alert",e);const r=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],l=c("circle-x",r);export{i as C,l as a}; diff --git a/public/build/assets/createLucideIcon-DsaEAGzP.js b/public/build/assets/createLucideIcon-DsaEAGzP.js new file mode 100644 index 0000000..794bd10 --- /dev/null +++ b/public/build/assets/createLucideIcon-DsaEAGzP.js @@ -0,0 +1 @@ +import{M as v,ao as u,B as A}from"./app-dvJP63FL.js";const h=t=>t==="";const S=(...t)=>t.filter((e,r,o)=>!!e&&e.trim()!==""&&o.indexOf(e)===r).join(" ").trim();const w=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const L=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,r,o)=>o?o.toUpperCase():r.toLowerCase());const W=t=>{const e=L(t);return e.charAt(0).toUpperCase()+e.slice(1)};var s={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const $=Symbol("lucide-icons");function j(){return v($,{})}const B=({name:t,iconNode:e,absoluteStrokeWidth:r,"absolute-stroke-width":o,strokeWidth:c,"stroke-width":k,size:i,color:C,...f},{slots:l})=>{const{size:n,color:p,strokeWidth:m=2,absoluteStrokeWidth:g=!1,class:x=""}=j(),b=A(()=>{const a=h(r)||h(o)||r===!0||o===!0||g===!0,d=c||k||m||s["stroke-width"];return a?Number(d)*24/Number(i??n??s.width):d});return u("svg",{...s,...f,width:i??n??s.width,height:i??n??s.height,stroke:C??p??s.stroke,"stroke-width":b.value,class:S("lucide",x,...t?[`lucide-${w(W(t))}-icon`,`lucide-${w(t)}`]:["lucide-icon"])},[...e.map(a=>u(...a)),...l.default?[l.default()]:[]])};const I=(t,e)=>(r,{slots:o,attrs:c})=>u(B,{...c,...r,iconNode:e,name:t},o.default?{default:o.default}:void 0);export{I as c}; diff --git a/public/build/assets/external-link-CqpXNovN.js b/public/build/assets/external-link-CqpXNovN.js new file mode 100644 index 0000000..35ec770 --- /dev/null +++ b/public/build/assets/external-link-CqpXNovN.js @@ -0,0 +1 @@ +import{c as a}from"./createLucideIcon-DsaEAGzP.js";const e=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],n=a("external-link",e);export{n as E}; diff --git a/public/build/assets/helpers-B2oe4lHy.js b/public/build/assets/helpers-B2oe4lHy.js new file mode 100644 index 0000000..094e9aa --- /dev/null +++ b/public/build/assets/helpers-B2oe4lHy.js @@ -0,0 +1 @@ +function t(r){return Array.isArray(r)?r:Array.isArray(r?.data)?r.data:[]}export{t as a}; diff --git a/public/build/assets/iconService-rm6LRV4U.js b/public/build/assets/iconService-rm6LRV4U.js new file mode 100644 index 0000000..cd59587 --- /dev/null +++ b/public/build/assets/iconService-rm6LRV4U.js @@ -0,0 +1 @@ +import{c as n}from"./createLucideIcon-DsaEAGzP.js";import{ae as r}from"./app-dvJP63FL.js";const i=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],d=n("refresh-cw",i),o=r("api"),h={getLogo(e,t,c,a={}){return o.post("/icons/default",{service:e,iconCollection:t,variant:c},{...a})},getLogoFromPack(e,t,c={}){return o.post("/icons/default",{service:e,iconPack:t},{...c})},getIconPacks(e={}){return o.get("/icons/packs",{...e})},deleteIcon(e,t={}){return o.delete("/icons/"+e,{...t})}};export{d as R,h as i}; diff --git a/public/build/assets/index-BJsmINgd.js b/public/build/assets/index-BJsmINgd.js new file mode 100644 index 0000000..b829465 --- /dev/null +++ b/public/build/assets/index-BJsmINgd.js @@ -0,0 +1 @@ +import{s,ap as a,r as n}from"./app-dvJP63FL.js";const l=s((t,{slots:o})=>{const e=a(t),r=n({mode:e,system:e.system,store:e.store});return()=>{if(o.default)return o.default(r)}},{name:"UseColorMode",props:["attribute","deep","disableTransition","emitAuto","eventFilter","flush","initOnMounted","initialValue","listenToStorageChanges","mergeDefaults","modes","onChanged","onError","selector","serializer","shallow","storage","storageKey","storageRef","window","writeDefaults"]});export{l as U}; diff --git a/public/build/assets/qr-code-eSL1bq0j.js b/public/build/assets/qr-code-eSL1bq0j.js new file mode 100644 index 0000000..bf1a100 --- /dev/null +++ b/public/build/assets/qr-code-eSL1bq0j.js @@ -0,0 +1 @@ +import{c as t}from"./createLucideIcon-DsaEAGzP.js";const e=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],a=t("qr-code",e);export{a as Q}; diff --git a/public/build/assets/shareService-BU7jlLil.js b/public/build/assets/shareService-BU7jlLil.js new file mode 100644 index 0000000..8079c3b --- /dev/null +++ b/public/build/assets/shareService-BU7jlLil.js @@ -0,0 +1 @@ +import{ae as a}from"./app-dvJP63FL.js";const s=a("api"),o={getShares(t,e={}){return s.get("/twofaccounts/"+t+"/shares",{...e})},shareWithUsers(t,e,r={}){return s.post("/twofaccounts/"+t+"/shares",{user_ids:e},{...r})},unshareWithUser(t,e,r={}){return s.delete("/twofaccounts/"+t+"/shares/"+e,{...r})},unshare(t,e={}){return s.delete("/twofaccounts/"+t+"/shares",{...e})},getRecipients(t,e="",r={}){return s.get("/twofaccounts/"+t+"/recipients"+(e?"?filter[nameOrEmail]="+e:""),{...r})},shareWithAll(t,e={}){return s.post("/twofaccounts/"+t+"/shares/all",{...e})}};export{o as s}; diff --git a/public/build/assets/tablet-DYUfDfjC.js b/public/build/assets/tablet-DYUfDfjC.js new file mode 100644 index 0000000..a498c40 --- /dev/null +++ b/public/build/assets/tablet-DYUfDfjC.js @@ -0,0 +1 @@ +import{c as e}from"./createLucideIcon-DsaEAGzP.js";const t=[["path",{d:"m14 18 4-4 4 4",key:"ftkppy"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M18 22v-8",key:"su0gjh"}],["path",{d:"M21 11.343V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h9",key:"1exg90"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M8 2v4",key:"1cmpym"}]],r=e("calendar-arrow-up",t);const a=[["path",{d:"m14 18 4 4 4-4",key:"1waygx"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M18 14v8",key:"irew45"}],["path",{d:"M21 11.354V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7.343",key:"bse4f3"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M8 2v4",key:"1cmpym"}]],d=e("calendar-arrow-down",a);const o=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]],c=e("monitor",o);const y=[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]],p=e("smartphone",y);const h=[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",ry:"2",key:"76otgf"}],["line",{x1:"12",x2:"12.01",y1:"18",y2:"18",key:"1dp563"}]],k=e("tablet",h);export{d as C,c as M,p as S,k as T,r as a}; diff --git a/public/build/assets/tabs-BVx9tg1F.js b/public/build/assets/tabs-BVx9tg1F.js new file mode 100644 index 0000000..d83e692 --- /dev/null +++ b/public/build/assets/tabs-BVx9tg1F.js @@ -0,0 +1 @@ +const e=[{name:"label.app_setup",view:"admin.appSetup",id:"lnkTabApp",icon:"Settings"},{name:"label.auth",view:"admin.auth",id:"lnkTabAuth",icon:"ShieldUser"},{name:"label.users",view:"admin.users",id:"lnkTabUsers",icon:"UsersRound"}];export{e as t}; diff --git a/public/build/assets/tabs-Btun2NN0.js b/public/build/assets/tabs-Btun2NN0.js new file mode 100644 index 0000000..1430b2a --- /dev/null +++ b/public/build/assets/tabs-Btun2NN0.js @@ -0,0 +1 @@ +const e=[{name:"label.options",view:"settings.options",id:"lnkTabOptions",icon:"SlidersHorizontal"},{name:"label.account",view:"settings.account",id:"lnkTabAccount",icon:"CircleUser"},{name:"label.oauth",view:"settings.oauth.tokens",id:"lnkTabOAuth",icon:"KeySquare"},{name:"label.webauthn",view:"settings.webauthn.devices",id:"lnkTabWebauthn",icon:"ScanFace"}];export{e as t}; diff --git a/public/build/assets/useSortable-6hRbxhTj.js b/public/build/assets/useSortable-6hRbxhTj.js new file mode 100644 index 0000000..6c330ba --- /dev/null +++ b/public/build/assets/useSortable-6hRbxhTj.js @@ -0,0 +1 @@ +import{c as be}from"./createLucideIcon-DsaEAGzP.js";import{ag as ke,ah as Re,ai as Xe,aj as se,Q as Ye,D as je}from"./app-dvJP63FL.js";const Be=[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]],_n=be("menu",Be);const He=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],Dn=be("trash-2",He);function We(o,t,n){return(t=$e(t))in o?Object.defineProperty(o,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):o[t]=n,o}function V(){return V=Object.assign?Object.assign.bind():function(o){for(var t=1;t"&&(t=t.substring(1)),o)try{if(o.matches)return o.matches(t);if(o.msMatchesSelector)return o.msMatchesSelector(t);if(o.webkitMatchesSelector)return o.webkitMatchesSelector(t)}catch{return!1}return!1}}function Ee(o){return o.host&&o!==document&&o.host.nodeType&&o.host!==o?o.host:o.parentNode}function H(o,t,n,e){if(o){n=n||document;do{if(t!=null&&(t[0]===">"?o.parentNode===n&&Xt(o,t):Xt(o,t))||e&&o===n)return o;if(o===n)break}while(o=Ee(o))}return null}var fe=/\s+/g;function k(o,t,n){if(o&&t)if(o.classList)o.classList[n?"add":"remove"](t);else{var e=(" "+o.className+" ").replace(fe," ").replace(" "+t+" "," ");o.className=(e+(n?" "+t:"")).replace(fe," ")}}function h(o,t,n){var e=o&&o.style;if(e){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(o,""):o.currentStyle&&(n=o.currentStyle),t===void 0?n:n[t];!(t in e)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),e[t]=n+(typeof n=="string"?"":"px")}}function ft(o,t){var n="";if(typeof o=="string")n=o;else do{var e=h(o,"transform");e&&e!=="none"&&(n=e+" "+n)}while(!t&&(o=o.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function _e(o,t,n){if(o){var e=o.getElementsByTagName(t),i=0,r=e.length;if(n)for(;i=r,!a)return e;if(e===G())break;e=tt(e,!1)}return!1}function dt(o,t,n,e){for(var i=0,r=0,a=o.children;r2&&arguments[2]!==void 0?arguments[2]:{},i=e.evt,r=Ge(e,en);Ot.pluginEvent.bind(p)(t,n,L({dragEl:c,parentEl:S,ghostEl:g,rootEl:_,nextEl:at,lastDownEl:Mt,cloneEl:D,cloneHidden:J,dragStarted:bt,putSortable:O,activeSortable:p.active,originalEvent:i,oldIndex:ct,oldDraggableIndex:Dt,newIndex:R,newDraggableIndex:Z,hideGhostForTarget:Pe,unhideGhostForTarget:Ne,cloneNowHidden:function(){J=!0},cloneNowShown:function(){J=!1},dispatchSortableEvent:function(l){P({sortable:n,name:l,originalEvent:i})}},r))};function P(o){tn(L({putSortable:O,cloneEl:D,targetEl:c,rootEl:_,oldIndex:ct,oldDraggableIndex:Dt,newIndex:R,newDraggableIndex:Z},o))}var c,S,g,_,at,Mt,D,J,ct,R,Dt,Z,At,O,ut=!1,Yt=!1,jt=[],it,B,zt,$t,pe,ge,bt,st,St,Tt=!1,Pt=!1,Ft,I,Ut=[],Jt=!1,Bt=[],Wt=typeof document<"u",Nt=oe,me=Ct||q?"cssFloat":"float",nn=Wt&&!ye&&!oe&&"draggable"in document.createElement("div"),Oe=(function(){if(Wt){if(q)return!1;var o=document.createElement("x");return o.style.cssText="pointer-events:auto",o.style.pointerEvents==="auto"}})(),Ie=function(t,n){var e=h(t),i=parseInt(e.width)-parseInt(e.paddingLeft)-parseInt(e.paddingRight)-parseInt(e.borderLeftWidth)-parseInt(e.borderRightWidth),r=dt(t,0,n),a=dt(t,1,n),l=r&&h(r),s=a&&h(a),u=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+C(r).width,d=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+C(a).width;if(e.display==="flex")return e.flexDirection==="column"||e.flexDirection==="column-reverse"?"vertical":"horizontal";if(e.display==="grid")return e.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(r&&l.float&&l.float!=="none"){var f=l.float==="left"?"left":"right";return a&&(s.clear==="both"||s.clear===f)?"vertical":"horizontal"}return r&&(l.display==="block"||l.display==="flex"||l.display==="table"||l.display==="grid"||u>=i&&e[me]==="none"||a&&e[me]==="none"&&u+d>i)?"vertical":"horizontal"},on=function(t,n,e){var i=e?t.left:t.top,r=e?t.right:t.bottom,a=e?t.width:t.height,l=e?n.left:n.top,s=e?n.right:n.bottom,u=e?n.width:n.height;return i===l||r===s||i+a/2===l+u/2},rn=function(t,n){var e;return jt.some(function(i){var r=i[x].options.emptyInsertThreshold;if(!(!r||ie(i))){var a=C(i),l=t>=a.left-r&&t<=a.right+r,s=n>=a.top-r&&n<=a.bottom+r;if(l&&s)return e=i}}),e},Ae=function(t){function n(r,a){return function(l,s,u,d){var f=l.options.group.name&&s.options.group.name&&l.options.group.name===s.options.group.name;if(r==null&&(a||f))return!0;if(r==null||r===!1)return!1;if(a&&r==="clone")return r;if(typeof r=="function")return n(r(l,s,u,d),a)(l,s,u,d);var v=(a?l:s).options.group.name;return r===!0||typeof r=="string"&&r===v||r.join&&r.indexOf(v)>-1}}var e={},i=t.group;(!i||Zt(i)!="object")&&(i={name:i}),e.name=i.name,e.checkPull=n(i.pull,!0),e.checkPut=n(i.put),e.revertClone=i.revertClone,t.group=e},Pe=function(){!Oe&&g&&h(g,"display","none")},Ne=function(){!Oe&&g&&h(g,"display","")};Wt&&!ye&&document.addEventListener("click",function(o){if(Yt)return o.preventDefault(),o.stopPropagation&&o.stopPropagation(),o.stopImmediatePropagation&&o.stopImmediatePropagation(),Yt=!1,!1},!0);var rt=function(t){if(c){t=t.touches?t.touches[0]:t;var n=rn(t.clientX,t.clientY);if(n){var e={};for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);e.target=e.rootEl=n,e.preventDefault=void 0,e.stopPropagation=void 0,n[x]._onDragOver(e)}}},an=function(t){c&&c.parentNode[x]._isOutsideThisEl(t.target)};function p(o,t){if(!(o&&o.nodeType&&o.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(o));this.el=o,this.options=t=V({},t),o[x]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(o.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ie(o,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(a,l){a.setData("Text",l.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:p.supportPointer!==!1&&"PointerEvent"in window&&(!Et||oe),emptyInsertThreshold:5};Ot.initializePlugins(this,o,n);for(var e in n)!(e in t)&&(t[e]=n[e]);Ae(t);for(var i in this)i.charAt(0)==="_"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this));this.nativeDraggable=t.forceFallback?!1:nn,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?w(o,"pointerdown",this._onTapStart):(w(o,"mousedown",this._onTapStart),w(o,"touchstart",this._onTapStart)),this.nativeDraggable&&(w(o,"dragover",this),w(o,"dragenter",this)),jt.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),V(this,Qe())}p.prototype={constructor:p,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(st=null)},_getDirection:function(t,n){return typeof this.options.direction=="function"?this.options.direction.call(this,t,n,c):this.options.direction},_onTapStart:function(t){if(t.cancelable){var n=this,e=this.el,i=this.options,r=i.preventOnFilter,a=t.type,l=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,s=(l||t).target,u=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||s,d=i.filter;if(pn(e),!c&&!(/mousedown|pointerdown/.test(a)&&t.button!==0||i.disabled)&&!u.isContentEditable&&!(!this.nativeDraggable&&Et&&s&&s.tagName.toUpperCase()==="SELECT")&&(s=H(s,i.draggable,e,!1),!(s&&s.animated)&&Mt!==s)){if(ct=X(s),Dt=X(s,i.draggable),typeof d=="function"){if(d.call(this,t,s,this)){P({sortable:n,rootEl:u,name:"filter",targetEl:s,toEl:e,fromEl:e}),N("filter",n,{evt:t}),r&&t.preventDefault();return}}else if(d&&(d=d.split(",").some(function(f){if(f=H(u,f.trim(),e,!1),f)return P({sortable:n,rootEl:f,name:"filter",targetEl:s,fromEl:e,toEl:e}),N("filter",n,{evt:t}),!0}),d)){r&&t.preventDefault();return}i.handle&&!H(u,i.handle,e,!1)||this._prepareDragStart(t,l,s)}}},_prepareDragStart:function(t,n,e){var i=this,r=i.el,a=i.options,l=r.ownerDocument,s;if(e&&!c&&e.parentNode===r){var u=C(e);if(_=r,c=e,S=c.parentNode,at=c.nextSibling,Mt=e,At=a.group,p.dragged=c,it={target:c,clientX:(n||t).clientX,clientY:(n||t).clientY},pe=it.clientX-u.left,ge=it.clientY-u.top,this._lastX=(n||t).clientX,this._lastY=(n||t).clientY,c.style["will-change"]="all",s=function(){if(N("delayEnded",i,{evt:t}),p.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!ce&&i.nativeDraggable&&(c.draggable=!0),i._triggerDragStart(t,n),P({sortable:i,name:"choose",originalEvent:t}),k(c,a.chosenClass,!0)},a.ignore.split(",").forEach(function(d){_e(c,d.trim(),Vt)}),w(l,"dragover",rt),w(l,"mousemove",rt),w(l,"touchmove",rt),a.supportPointer?(w(l,"pointerup",i._onDrop),!this.nativeDraggable&&w(l,"pointercancel",i._onDrop)):(w(l,"mouseup",i._onDrop),w(l,"touchend",i._onDrop),w(l,"touchcancel",i._onDrop)),ce&&this.nativeDraggable&&(this.options.touchStartThreshold=4,c.draggable=!0),N("delayStart",this,{evt:t}),a.delay&&(!a.delayOnTouchOnly||n)&&(!this.nativeDraggable||!(Ct||q))){if(p.eventCanceled){this._onDrop();return}a.supportPointer?(w(l,"pointerup",i._disableDelayedDrag),w(l,"pointercancel",i._disableDelayedDrag)):(w(l,"mouseup",i._disableDelayedDrag),w(l,"touchend",i._disableDelayedDrag),w(l,"touchcancel",i._disableDelayedDrag)),w(l,"mousemove",i._delayedDragTouchMoveHandler),w(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&w(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(s,a.delay)}else s()}},_delayedDragTouchMoveHandler:function(t){var n=t.touches?t.touches[0]:t;Math.max(Math.abs(n.clientX-this._lastX),Math.abs(n.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){c&&Vt(c),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;y(t,"mouseup",this._disableDelayedDrag),y(t,"touchend",this._disableDelayedDrag),y(t,"touchcancel",this._disableDelayedDrag),y(t,"pointerup",this._disableDelayedDrag),y(t,"pointercancel",this._disableDelayedDrag),y(t,"mousemove",this._delayedDragTouchMoveHandler),y(t,"touchmove",this._delayedDragTouchMoveHandler),y(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,n){n=n||t.pointerType=="touch"&&t,!this.nativeDraggable||n?this.options.supportPointer?w(document,"pointermove",this._onTouchMove):n?w(document,"touchmove",this._onTouchMove):w(document,"mousemove",this._onTouchMove):(w(c,"dragend",this),w(_,"dragstart",this._onDragStart));try{document.selection?kt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,n){if(ut=!1,_&&c){N("dragStarted",this,{evt:n}),this.nativeDraggable&&w(document,"dragover",an);var e=this.options;!t&&k(c,e.dragClass,!1),k(c,e.ghostClass,!0),p.active=this,t&&this._appendGhost(),P({sortable:this,name:"start",originalEvent:n})}else this._nulling()},_emulateDragOver:function(){if(B){this._lastX=B.clientX,this._lastY=B.clientY,Pe();for(var t=document.elementFromPoint(B.clientX,B.clientY),n=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(B.clientX,B.clientY),t!==n);)n=t;if(c.parentNode[x]._isOutsideThisEl(t),n)do{if(n[x]){var e=void 0;if(e=n[x]._onDragOver({clientX:B.clientX,clientY:B.clientY,target:t,rootEl:n}),e&&!this.options.dragoverBubble)break}t=n}while(n=Ee(n));Ne()}},_onTouchMove:function(t){if(it){var n=this.options,e=n.fallbackTolerance,i=n.fallbackOffset,r=t.touches?t.touches[0]:t,a=g&&ft(g,!0),l=g&&a&&a.a,s=g&&a&&a.d,u=Nt&&I&&he(I),d=(r.clientX-it.clientX+i.x)/(l||1)+(u?u[0]-Ut[0]:0)/(l||1),f=(r.clientY-it.clientY+i.y)/(s||1)+(u?u[1]-Ut[1]:0)/(s||1);if(!p.active&&!ut){if(e&&Math.max(Math.abs(r.clientX-this._lastX),Math.abs(r.clientY-this._lastY))=0&&(P({rootEl:S,name:"add",toEl:S,fromEl:_,originalEvent:t}),P({sortable:this,name:"remove",toEl:S,originalEvent:t}),P({rootEl:S,name:"sort",toEl:S,fromEl:_,originalEvent:t}),P({sortable:this,name:"sort",toEl:S,originalEvent:t})),O&&O.save()):R!==ct&&R>=0&&(P({sortable:this,name:"update",toEl:S,originalEvent:t}),P({sortable:this,name:"sort",toEl:S,originalEvent:t})),p.active&&((R==null||R===-1)&&(R=ct,Z=Dt),P({sortable:this,name:"end",toEl:S,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){N("nulling",this),_=c=S=g=at=D=Mt=J=it=B=bt=R=Z=ct=Dt=st=St=O=At=p.dragged=p.ghost=p.clone=p.active=null;var t=this.el;Bt.forEach(function(n){t.contains(n)&&(n.checked=!0)}),Bt.length=zt=$t=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":c&&(this._onDragOver(t),ln(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],n,e=this.el.children,i=0,r=e.length,a=this.options;ii.right+r||o.clientY>e.bottom&&o.clientX>e.left:o.clientY>i.bottom+r||o.clientX>e.right&&o.clientY>e.top}function fn(o,t,n,e,i,r,a,l){var s=e?o.clientY:o.clientX,u=e?n.height:n.width,d=e?n.top:n.left,f=e?n.bottom:n.right,v=!1;if(!a){if(l&&Ftd+u*r/2:sf-Ft)return-St}else if(s>d+u*(1-i)/2&&sf-u*r/2)?s>d+u/2?1:-1:0}function dn(o){return X(c){bn(t,m.oldIndex,m.newIndex,m)}},s=()=>{e?.destroy(),e=void 0},u=m=>{!m||e!==void 0||(e=new p(m,{...l,...a}))},d=()=>{const m=i?.querySelector(o);m&&u(m)},f=(m,b)=>{if(b!==void 0)e?.option(m,b);else return e?.option(m)};Re(d);const v=()=>{s()};return Xe(()=>{s()}),{stop:v,start:d,option:f}}function mn(o,t,n){const e=o.children[n];o.insertBefore(t,e)}function vn(o){o.parentNode&&o.parentNode.removeChild(o)}function bn(o,t,n,e=null){e!=null&&(vn(e.item),mn(e.from,e.item,t));const i=je(o),r=i?[...se(o)]:se(o);if(n>=0&&n{r.splice(n,0,a),i&&(o.value=r)})}}export{_n as M,Dn as T,bn as m,Sn as u}; diff --git a/public/build/assets/users-CLZI37iw.js b/public/build/assets/users-CLZI37iw.js new file mode 100644 index 0000000..679dfd6 --- /dev/null +++ b/public/build/assets/users-CLZI37iw.js @@ -0,0 +1 @@ +import{c as e}from"./createLucideIcon-DsaEAGzP.js";const c=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],r=e("users",c);export{r as U}; diff --git a/public/build/assets/webauthnService-D363et0U.js b/public/build/assets/webauthnService-D363et0U.js new file mode 100644 index 0000000..decf436 --- /dev/null +++ b/public/build/assets/webauthnService-D363et0U.js @@ -0,0 +1 @@ +import{ae as g}from"./app-dvJP63FL.js";class h{controller;createNewAbortSignal(){if(this.controller){const e=new Error("Cancelling existing WebAuthn API call for new one");e.name="AbortError",this.controller.abort(e)}const r=new AbortController;return this.controller=r,r.signal}}const c=new h;function d(n){return n==="localhost"||/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i.test(n)}function w(n,r){const{publicKey:e}=r;if(n.name==="AbortError"){if(r.signal instanceof AbortSignal)return{phrase:"error.aborted_by_user",type:"is-warning"}}else if(n.name==="ConstraintError"){if(e.authenticatorSelection?.requireResidentKey===!0)return{phrase:"error.authenticator_missing_discoverable_credential_support",type:"is-danger"};if(e.authenticatorSelection?.userVerification==="required")return{phrase:"error.authenticator_missing_user_verification_support",type:"is-danger"}}else{if(n.name==="InvalidStateError")return{phrase:"error.security_device_already_registered",type:"is-danger"};if(n.name==="NotAllowedError")return{phrase:"error.not_allowed_operation",type:"is-danger"};if(n.name==="NotSupportedError")return e.pubKeyCredParams.filter(o=>o.type==="public-key").length===0?{phrase:"error.no_entry_was_of_type_public_key",type:"is-danger"}:{phrase:"error.no_authenticator_support_specified_algorithms",type:"is-danger"};if(n.name==="SecurityError"){const t=window.location.hostname;if(d(t)){if(e.rp.id!==t)return{phrase:"error.security_error_check_rpid",type:"is-danger"}}else return{phrase:"error.2fauth_has_not_a_valid_domain",type:"is-danger"}}else if(n.name==="TypeError"){if(e.user.id.byteLength<1||e.user.id.byteLength>64)return{phrase:"error.user_id_not_between_1_64",type:"is-danger"}}else if(n.name==="UnknownError")return{phrase:"error.unknown_error",type:"is-danger"}}return{phrase:"error.unknown_error",type:"is-danger"}}function f(n,r){const{publicKey:e}=r;if(n.name==="AbortError"){if(r.signal instanceof AbortSignal)return{phrase:"error.aborted_by_user",type:"is-warning"}}else{if(n.name==="NotAllowedError")return{phrase:"error.not_allowed_operation",type:"is-danger"};if(n.name==="SecurityError"){const t=window.location.hostname;if(d(t)){if(e.rpId!==t)return{phrase:"error.security_error_check_rpid",type:"is-danger"}}else return{phrase:"error.2fauth_has_not_a_valid_domain",type:"is-danger"}}else if(n.name==="UnknownError")return{phrase:"error.unknown_error",type:"is-danger"}}return{phrase:"error.unknown_error",type:"is-danger"}}const p=g("web");class a{async register(){let r={webauthn:!0,type:"is-danger",message:""};if(!window.isSecureContext)return r.message="error.https_required",Promise.reject(r);if(!a.supportsWebAuthn)return r.message="error.browser_does_not_support_webauthn",Promise.reject(r);const e=await p.post("/webauthn/register/options").then(i=>i.data);let o={publicKey:a.parseIncomingServerOptions(e)};o.signal=c.createNewAbortSignal();let u;try{u=await navigator.credentials.create(o)}catch(i){const s=w(i,o);return Promise.reject({webauthn:!0,type:s.type,message:s.phrase})}const l=a.parseOutgoingCredentials(u);return p.post("/webauthn/register",l,{returnError:!0})}async authenticate(r){if(!window.isSecureContext)return err.message="error.https_required",Promise.reject(err);if(!a.supportsWebAuthn)return err.message="error.browser_does_not_support_webauthn",Promise.reject(err);const e=await p.post("/webauthn/login/options",{email:r}).then(i=>i.data);let o={publicKey:a.parseIncomingServerOptions(e)};o.signal=c.createNewAbortSignal();const u=await navigator.credentials.get(o).catch(i=>{const s=f(i,o);return Promise.reject({webauthn:!0,type:s.type,message:s.phrase})});let l=a.parseOutgoingCredentials(u);return l.email=r,p.post("/webauthn/login",l,{returnError:!0})}static parseIncomingServerOptions(r){return r.challenge=a.uint8Array(r.challenge),"user"in r&&(r.user={...r.user,id:a.uint8Array(r.user.id)}),["excludeCredentials","allowCredentials"].filter(e=>e in r).forEach(e=>{r[e]=r[e].map(t=>({...t,id:a.uint8Array(t.id)}))}),r}static parseOutgoingCredentials(r){let e={id:r.id,type:r.type,rawId:a.arrayToBase64String(r.rawId),response:{}};return["clientDataJSON","attestationObject","authenticatorData","signature","userHandle"].filter(t=>t in r.response).forEach(t=>e.response[t]=a.arrayToBase64String(r.response[t])),e}static uint8Array(r,e=!1){return Uint8Array.from(e?atob(r):a.base64UrlDecode(r),t=>t.charCodeAt(0))}static arrayToBase64String(r){return btoa(String.fromCharCode(...new Uint8Array(r)))}static base64UrlDecode(r){r=r.replace(/-/g,"+").replace(/_/g,"/");const e=r.length%4;if(e){if(e===1)throw new Error("InvalidLengthError: Input base64url string is the wrong length to determine padding");r+=new Array(5-e).join("=")}return atob(r)}static supportsWebAuthn(){return window?.PublicKeyCredential!==void 0&&typeof window.PublicKeyCredential=="function"}}const _=new a;export{_ as w}; diff --git a/public/build/assets/x-DQVIq0xP.js b/public/build/assets/x-DQVIq0xP.js new file mode 100644 index 0000000..e5ed929 --- /dev/null +++ b/public/build/assets/x-DQVIq0xP.js @@ -0,0 +1 @@ +import{c as o}from"./createLucideIcon-DsaEAGzP.js";const c=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],t=o("x",c);export{t as X}; diff --git a/public/build/manifest.json b/public/build/manifest.json new file mode 100644 index 0000000..bd07550 --- /dev/null +++ b/public/build/manifest.json @@ -0,0 +1,620 @@ +{ + "_AccessLogViewer-D5ke4CwJ.js": { + "file": "assets/AccessLogViewer-D5ke4CwJ.js", + "name": "AccessLogViewer", + "imports": [ + "resources/js/app.js", + "_index-BJsmINgd.js", + "_tablet-DYUfDfjC.js", + "_x-DQVIq0xP.js", + "_check-CPGWPXZa.js" + ] + }, + "_CopyButton-CgxgBp0c.js": { + "file": "assets/CopyButton-CgxgBp0c.js", + "name": "CopyButton", + "imports": [ + "resources/js/app.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_Form-ZbAUhXmz.js": { + "file": "assets/Form-ZbAUhXmz.js", + "name": "Form", + "imports": [ + "resources/js/app.js" + ] + }, + "_QrContentDisplay-DiIjf7a_.js": { + "file": "assets/QrContentDisplay-DiIjf7a_.js", + "name": "QrContentDisplay", + "imports": [ + "resources/js/app.js", + "_external-link-CqpXNovN.js" + ] + }, + "_TwofaccountMedia-DzLyeBxh.js": { + "file": "assets/TwofaccountMedia-DzLyeBxh.js", + "name": "TwofaccountMedia", + "imports": [ + "_index-BJsmINgd.js", + "resources/js/app.js" + ] + }, + "_appSettingsUpdater-D1Bq_3WB.js": { + "file": "assets/appSettingsUpdater-D1Bq_3WB.js", + "name": "appSettingsUpdater", + "imports": [ + "resources/js/app.js" + ] + }, + "_breakpoints-CyLcIEOu.js": { + "file": "assets/breakpoints-CyLcIEOu.js", + "name": "breakpoints", + "imports": [ + "resources/js/app.js" + ] + }, + "_bus-ChE1sp8V.js": { + "file": "assets/bus-ChE1sp8V.js", + "name": "bus", + "imports": [ + "resources/js/app.js" + ] + }, + "_check-CPGWPXZa.js": { + "file": "assets/check-CPGWPXZa.js", + "name": "check", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_circle-plus-BM92Iipr.js": { + "file": "assets/circle-plus-BM92Iipr.js", + "name": "circle-plus", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_circle-x-AvUNZzwX.js": { + "file": "assets/circle-x-AvUNZzwX.js", + "name": "circle-x", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_createLucideIcon-DsaEAGzP.js": { + "file": "assets/createLucideIcon-DsaEAGzP.js", + "name": "createLucideIcon", + "imports": [ + "resources/js/app.js" + ] + }, + "_external-link-CqpXNovN.js": { + "file": "assets/external-link-CqpXNovN.js", + "name": "external-link", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_helpers-B2oe4lHy.js": { + "file": "assets/helpers-B2oe4lHy.js", + "name": "helpers" + }, + "_iconService-rm6LRV4U.js": { + "file": "assets/iconService-rm6LRV4U.js", + "name": "iconService", + "imports": [ + "_createLucideIcon-DsaEAGzP.js", + "resources/js/app.js" + ] + }, + "_index-BJsmINgd.js": { + "file": "assets/index-BJsmINgd.js", + "name": "index", + "imports": [ + "resources/js/app.js" + ] + }, + "_qr-code-eSL1bq0j.js": { + "file": "assets/qr-code-eSL1bq0j.js", + "name": "qr-code", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_shareService-BU7jlLil.js": { + "file": "assets/shareService-BU7jlLil.js", + "name": "shareService", + "imports": [ + "resources/js/app.js" + ] + }, + "_tablet-DYUfDfjC.js": { + "file": "assets/tablet-DYUfDfjC.js", + "name": "tablet", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_tabs-BVx9tg1F.js": { + "file": "assets/tabs-BVx9tg1F.js", + "name": "tabs" + }, + "_tabs-Btun2NN0.js": { + "file": "assets/tabs-Btun2NN0.js", + "name": "tabs" + }, + "_useSortable-6hRbxhTj.js": { + "file": "assets/useSortable-6hRbxhTj.js", + "name": "useSortable", + "imports": [ + "_createLucideIcon-DsaEAGzP.js", + "resources/js/app.js" + ] + }, + "_users-CLZI37iw.js": { + "file": "assets/users-CLZI37iw.js", + "name": "users", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "_webauthnService-D363et0U.js": { + "file": "assets/webauthnService-D363et0U.js", + "name": "webauthnService", + "imports": [ + "resources/js/app.js" + ] + }, + "_x-DQVIq0xP.js": { + "file": "assets/x-DQVIq0xP.js", + "name": "x", + "imports": [ + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/app.js": { + "file": "assets/app-dvJP63FL.js", + "name": "app", + "src": "resources/js/app.js", + "isEntry": true, + "dynamicImports": [ + "resources/js/views/Start.vue", + "resources/js/views/twofaccounts/Capture.vue", + "resources/js/views/twofaccounts/Accounts.vue", + "resources/js/views/twofaccounts/CreateUpdate.vue", + "resources/js/views/twofaccounts/Import.vue", + "resources/js/views/twofaccounts/CreateUpdate.vue", + "resources/js/views/twofaccounts/QRcode.vue", + "resources/js/views/sharing/AccountSharing.vue", + "resources/js/views/sharing/Share.vue", + "resources/js/views/sharing/TransferOwnership.vue", + "resources/js/views/twofaccounts/OtpLogs.vue", + "resources/js/views/groups/Groups.vue", + "resources/js/views/groups/CreateUpdate.vue", + "resources/js/views/groups/CreateUpdate.vue", + "resources/js/views/settings/Options.vue", + "resources/js/views/settings/Account.vue", + "resources/js/views/settings/OAuth.vue", + "resources/js/views/settings/Credentials/Edit.vue", + "resources/js/views/settings/WebAuthn.vue", + "resources/js/views/admin/AppSetup.vue", + "resources/js/views/admin/Auth.vue", + "resources/js/views/admin/Users.vue", + "resources/js/views/admin/users/Create.vue", + "resources/js/views/admin/users/Manage.vue", + "resources/js/views/admin/logs/Access.vue", + "resources/js/views/auth/Login.vue", + "resources/js/views/auth/Register.vue", + "resources/js/views/auth/RequestReset.vue", + "resources/js/views/auth/password/Reset.vue", + "resources/js/views/auth/RequestReset.vue", + "resources/js/views/auth/webauthn/Recover.vue", + "resources/js/views/About.vue", + "resources/js/views/Error.vue", + "resources/js/views/Error.vue", + "resources/js/views/Error.vue" + ], + "css": [ + "assets/app-C6trQ8-_.css" + ] + }, + "resources/js/views/About.vue": { + "file": "assets/About-DlWJhNxo.js", + "name": "About", + "src": "resources/js/views/About.vue", + "isDynamicEntry": true, + "imports": [ + "_index-BJsmINgd.js", + "resources/js/app.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/Error.vue": { + "file": "assets/Error-DG0pgQA2.js", + "name": "Error", + "src": "resources/js/views/Error.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_index-BJsmINgd.js" + ] + }, + "resources/js/views/Start.vue": { + "file": "assets/Start-Dnu4qWlC.js", + "name": "Start", + "src": "resources/js/views/Start.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_bus-ChE1sp8V.js" + ] + }, + "resources/js/views/admin/AppSetup.vue": { + "file": "assets/AppSetup-9GPB7B-I.js", + "name": "AppSetup", + "src": "resources/js/views/admin/AppSetup.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_tabs-BVx9tg1F.js", + "_appSettingsUpdater-D1Bq_3WB.js", + "_check-CPGWPXZa.js", + "_x-DQVIq0xP.js", + "_CopyButton-CgxgBp0c.js", + "_breakpoints-CyLcIEOu.js", + "_createLucideIcon-DsaEAGzP.js", + "_external-link-CqpXNovN.js" + ] + }, + "resources/js/views/admin/Auth.vue": { + "file": "assets/Auth-DslSg1a9.js", + "name": "Auth", + "src": "resources/js/views/admin/Auth.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_tabs-BVx9tg1F.js", + "_appSettingsUpdater-D1Bq_3WB.js" + ] + }, + "resources/js/views/admin/Users.vue": { + "file": "assets/Users-DyNCDMUg.js", + "name": "Users", + "src": "resources/js/views/admin/Users.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_tabs-BVx9tg1F.js", + "_index-BJsmINgd.js", + "_circle-plus-BM92Iipr.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/admin/logs/Access.vue": { + "file": "assets/Access-BQVm4alb.js", + "name": "Access", + "src": "resources/js/views/admin/logs/Access.vue", + "isDynamicEntry": true, + "imports": [ + "_AccessLogViewer-D5ke4CwJ.js", + "resources/js/app.js", + "_bus-ChE1sp8V.js", + "_index-BJsmINgd.js", + "_tablet-DYUfDfjC.js", + "_createLucideIcon-DsaEAGzP.js", + "_x-DQVIq0xP.js", + "_check-CPGWPXZa.js" + ] + }, + "resources/js/views/admin/users/Create.vue": { + "file": "assets/Create-Vv-BwDWf.js", + "name": "Create", + "src": "resources/js/views/admin/users/Create.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js" + ] + }, + "resources/js/views/admin/users/Manage.vue": { + "file": "assets/Manage-B1CTWqgo.js", + "name": "Manage", + "src": "resources/js/views/admin/users/Manage.vue", + "isDynamicEntry": true, + "imports": [ + "_CopyButton-CgxgBp0c.js", + "_AccessLogViewer-D5ke4CwJ.js", + "resources/js/app.js", + "_index-BJsmINgd.js", + "_bus-ChE1sp8V.js", + "_breakpoints-CyLcIEOu.js", + "_createLucideIcon-DsaEAGzP.js", + "_tablet-DYUfDfjC.js", + "_x-DQVIq0xP.js", + "_check-CPGWPXZa.js" + ] + }, + "resources/js/views/auth/Login.vue": { + "file": "assets/Login-XfEMUKl8.js", + "name": "Login", + "src": "resources/js/views/auth/Login.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_webauthnService-D363et0U.js" + ] + }, + "resources/js/views/auth/Register.vue": { + "file": "assets/Register-DffuLlzx.js", + "name": "Register", + "src": "resources/js/views/auth/Register.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_webauthnService-D363et0U.js", + "_check-CPGWPXZa.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/auth/RequestReset.vue": { + "file": "assets/RequestReset-w8-YSMaH.js", + "name": "RequestReset", + "src": "resources/js/views/auth/RequestReset.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js" + ] + }, + "resources/js/views/auth/password/Reset.vue": { + "file": "assets/Reset-RiTuOlH9.js", + "name": "Reset", + "src": "resources/js/views/auth/password/Reset.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js" + ] + }, + "resources/js/views/auth/webauthn/Recover.vue": { + "file": "assets/Recover-CEob990V.js", + "name": "Recover", + "src": "resources/js/views/auth/webauthn/Recover.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js" + ] + }, + "resources/js/views/groups/CreateUpdate.vue": { + "file": "assets/CreateUpdate-CbOB1O7q.js", + "name": "CreateUpdate", + "src": "resources/js/views/groups/CreateUpdate.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_bus-ChE1sp8V.js" + ] + }, + "resources/js/views/groups/Groups.vue": { + "file": "assets/Groups-Ccrpwp-O.js", + "name": "Groups", + "src": "resources/js/views/groups/Groups.vue", + "isDynamicEntry": true, + "imports": [ + "_index-BJsmINgd.js", + "resources/js/app.js", + "_bus-ChE1sp8V.js", + "_useSortable-6hRbxhTj.js", + "_circle-plus-BM92Iipr.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/settings/Account.vue": { + "file": "assets/Account-CvhJGfLO.js", + "name": "Account", + "src": "resources/js/views/settings/Account.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_tabs-Btun2NN0.js", + "_Form-ZbAUhXmz.js", + "_breakpoints-CyLcIEOu.js" + ] + }, + "resources/js/views/settings/Credentials/Edit.vue": { + "file": "assets/Edit-Ba84j7PP.js", + "name": "Edit", + "src": "resources/js/views/settings/Credentials/Edit.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js" + ] + }, + "resources/js/views/settings/OAuth.vue": { + "file": "assets/OAuth-aXCqlLPs.js", + "name": "OAuth", + "src": "resources/js/views/settings/OAuth.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_tabs-Btun2NN0.js", + "_Form-ZbAUhXmz.js", + "_index-BJsmINgd.js", + "_circle-plus-BM92Iipr.js", + "_check-CPGWPXZa.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/settings/Options.vue": { + "file": "assets/Options-Bun4hDR8.js", + "name": "Options", + "src": "resources/js/views/settings/Options.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_tabs-Btun2NN0.js", + "_iconService-rm6LRV4U.js", + "_breakpoints-CyLcIEOu.js", + "_external-link-CqpXNovN.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/settings/WebAuthn.vue": { + "file": "assets/WebAuthn-C_HU0Xj8.js", + "name": "WebAuthn", + "src": "resources/js/views/settings/WebAuthn.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_tabs-Btun2NN0.js", + "_webauthnService-D363et0U.js", + "_index-BJsmINgd.js", + "_circle-plus-BM92Iipr.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/sharing/AccountSharing.vue": { + "file": "assets/AccountSharing-kU7yk02h.js", + "name": "AccountSharing", + "src": "resources/js/views/sharing/AccountSharing.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_shareService-BU7jlLil.js", + "_TwofaccountMedia-DzLyeBxh.js", + "_helpers-B2oe4lHy.js", + "_index-BJsmINgd.js", + "_circle-plus-BM92Iipr.js", + "_users-CLZI37iw.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/sharing/Share.vue": { + "file": "assets/Share-DkTnn1jz.js", + "name": "Share", + "src": "resources/js/views/sharing/Share.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_shareService-BU7jlLil.js", + "_TwofaccountMedia-DzLyeBxh.js", + "_bus-ChE1sp8V.js", + "_helpers-B2oe4lHy.js", + "_index-BJsmINgd.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/sharing/TransferOwnership.vue": { + "file": "assets/TransferOwnership-BsVNwpBY.js", + "name": "TransferOwnership", + "src": "resources/js/views/sharing/TransferOwnership.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_shareService-BU7jlLil.js", + "_TwofaccountMedia-DzLyeBxh.js", + "_helpers-B2oe4lHy.js", + "_index-BJsmINgd.js" + ] + }, + "resources/js/views/twofaccounts/Accounts.vue": { + "file": "assets/Accounts-znshhaJC.js", + "name": "Accounts", + "src": "resources/js/views/twofaccounts/Accounts.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_shareService-BU7jlLil.js", + "_index-BJsmINgd.js", + "_createLucideIcon-DsaEAGzP.js", + "_useSortable-6hRbxhTj.js", + "_bus-ChE1sp8V.js", + "_circle-x-AvUNZzwX.js", + "_users-CLZI37iw.js", + "_qr-code-eSL1bq0j.js", + "_x-DQVIq0xP.js" + ] + }, + "resources/js/views/twofaccounts/Capture.vue": { + "file": "assets/Capture-BG6QMHLW.js", + "name": "Capture", + "src": "resources/js/views/twofaccounts/Capture.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_QrContentDisplay-DiIjf7a_.js", + "_bus-ChE1sp8V.js", + "_index-BJsmINgd.js", + "_createLucideIcon-DsaEAGzP.js", + "_external-link-CqpXNovN.js" + ] + }, + "resources/js/views/twofaccounts/CreateUpdate.vue": { + "file": "assets/CreateUpdate-tvLQ26rU.js", + "name": "CreateUpdate", + "src": "resources/js/views/twofaccounts/CreateUpdate.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_QrContentDisplay-DiIjf7a_.js", + "_iconService-rm6LRV4U.js", + "_bus-ChE1sp8V.js", + "_index-BJsmINgd.js", + "_createLucideIcon-DsaEAGzP.js", + "_qr-code-eSL1bq0j.js", + "_external-link-CqpXNovN.js" + ] + }, + "resources/js/views/twofaccounts/Import.vue": { + "file": "assets/Import-C0sC5CLD.js", + "name": "Import", + "src": "resources/js/views/twofaccounts/Import.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js", + "_Form-ZbAUhXmz.js", + "_bus-ChE1sp8V.js", + "_index-BJsmINgd.js", + "_qr-code-eSL1bq0j.js", + "_createLucideIcon-DsaEAGzP.js", + "_check-CPGWPXZa.js", + "_x-DQVIq0xP.js", + "_circle-x-AvUNZzwX.js" + ] + }, + "resources/js/views/twofaccounts/OtpLogs.vue": { + "file": "assets/OtpLogs-CAP6rwu6.js", + "name": "OtpLogs", + "src": "resources/js/views/twofaccounts/OtpLogs.vue", + "isDynamicEntry": true, + "imports": [ + "_index-BJsmINgd.js", + "_tablet-DYUfDfjC.js", + "_x-DQVIq0xP.js", + "_check-CPGWPXZa.js", + "resources/js/app.js", + "_TwofaccountMedia-DzLyeBxh.js", + "_createLucideIcon-DsaEAGzP.js" + ] + }, + "resources/js/views/twofaccounts/QRcode.vue": { + "file": "assets/QRcode-Da_iUmWo.js", + "name": "QRcode", + "src": "resources/js/views/twofaccounts/QRcode.vue", + "isDynamicEntry": true, + "imports": [ + "resources/js/app.js" + ] + } +} \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..dece790b23c803e0a07f1379265d1b21a7071380 GIT binary patch literal 1150 zcma)4J8r^25FG?Xpb1s#l&K=i7w`rAX?%zrBZmOw6gdkZ4q*!}k(M;%J=hlwD`Qw| zJhN}!o1OibjquIqhX1R5Ow3-)>1>*NxMe4eq zLiYvUX~@7?W?A;+>re~Lc1Y)Q=wt0`JhHCWGiD#`0deAUCpU<5$SW3~=K*Up7ti}R z_FTjZ*xqC31;bBx9~N>g*8dfcoUcVe~LVFS{Xrl-u&nOHa=l t;N0zl=M`(CI%zo51MfE6@1Fgl{&~Ni|MP6N8Jm5MF6MK6v3S%_`v?B`>VGd000McNliru||Id_yh;EE&%_X0y*&{{x--mD?1AQ)&PJ002ovPDHLkV1mpYyS)Ga literal 0 HcmV?d00001 diff --git a/public/favicon_lg.png b/public/favicon_lg.png new file mode 100644 index 0000000000000000000000000000000000000000..996a696bca1ee50bd7e8dcde21dec98389bb5e2f GIT binary patch literal 2410 zcmZ{mdpz687QlmUP-5e?G%b~SZ)wqZB*pSegdke)S3Fu}QyNzz$_lM&v{Y6q8?^Om zLRM+jUiGT?-fm0RR#Q<~p%+zenv#%)wl=+c@1J+(bLRUwbLKOjIiHz1=M)Pm6{W{hM0;x!G826wI;acTu(u9o;w&_auP^H`Io&d8OsLP|OwU7$P zs=VKaaC~Dk6`yI}1aI>khoW+_RSuYV@P)R!n+7>VXzlfLm07*DUWtdetUYcxi05wDx-bcfd&=9H2tTf2=&L8c8|u<_2Wdn z7k6AzT(qrz?WCX5zbm4?sR*2sn$YgNPOe*%#)o6+w%&Z!2!iYU;=HDjgw#UvsYrcO zkyIjuJ>w&|%~o(HTCY{!L>sq_v?P;_FQxv-$=`6UYqqMl^11C-*O3Di9xd4Q@Ye|v z*q6j3lWXR@mOA}Hf=z2Im>3=3LXOvP!m&qFBF`V9Jk2G1{!f22TUiu*m+0X?_&h<0 zjXu*8J>*p63E!x;9%_D>Z_v#vf1c2Ch~d8)oA<6W8Nq$>y?61+q}6Gft09BzQ0_jd zCd_gz8<^Dux+Z7TNTWb{;jGhLI~stS<5(CiLP!qfUlothg0R%`u_%E%G4f8x7{7GL zl;#k1+61R4LojF`!g4drDS|W$TlH2GT=!x3ZmrCoXmo;FDmsgKJBzt5cRXoj69&|X zmFwY>gF(Sx-7-qk2haWzyeF4hG2vp7uls+5&Fy?t{0p8D=xwcbfXlVEgW!#u! zacCIHJ-hsy%;}--O{gLjpE0;Z;dDMYDzr>Q0AD|Liw_@JqU6F2n&FqJb&d*~w9UyGt_8*CmD1rU*yxZ}D zniZV~A%}&@?KVbkRn^t?q{!pdHV)nzx?HfghNF+h1ov7A4O?$pG!pmEFj_T_G%+F- zO$BQlKg2fhT|5>g*w<4?BoLqK8)zu60rxs>8Ze`ul&6I|7tDt2-c(!*CtH1^#Si=)>l)9B%XYOF=t}U@c)EZEPGlS}OMn zg$#1M<@;GkIXE>YN^4EMo8%jDj|aNBg^ql7iZf}m{_^Zf4RTb#?ONqAc@?RX`}TzV zu3-(-OoGb5)sCu=oFAtHqtWu4iRsO<-TJwsEeI$5rLs}Ly<%~lB`T~g4q6KP-wQl&=T<)j;Z5`{Mbc;Oc52;g^HOO6HDgO>fKb_>9$gD z4c7kYhrsc0^zMgsrBLNC2*3s6sD$_9y=6ZEyB}rRp~|#C^2hB>HMvoD``_v8?D6`+ zR&l$_!3e$dL1kzFq*3zpy3du3HZ5UU&wGLoF&K7;?S4}J@!1L~CDf^yoTUA|i&f`p zmz~(dy6*oC7}H7|i(H=3fgsnL;^9|)2+(~s(uQV7ndD9Is$xT8=!wXI;(+K^MhK82 za{;LZ1FZoonaN2A^o7ei)VisBpk>#lQrJG2=3VM zFEYVFk^K?3G8eX06;(*V#F9;@+b22=>_vQKo{uz`9{F6lOx24>&h9#SfpEMG{fbb? znD@$}d`w!1AW%Qrmh2bOjtpt7E8WlF%;A~=mF?}#d&Q1Vr0Y?UNqa~P^h$BG|_gh@`KZ9D^_1dHcTUEiX8kh?hU(`0#mx-C}e-n;QRnYmI5= z3x2D+Qsd!}lNUhzXyRdHesmiyp8j%)LjL(}3Mu5aXeTnJaCtlptDT9eJnakXo?Tz} zUs-Q8Ybh9pYYD4qMVx#ZG@@+zY|Q3!{Thx16rb~Z^Jwq8AS$5UZ|j%7vQ! zVPE#(%VuU2R9!eU2ixXTrtE^~kcUCRd4n)b27`f3AGN#9!z_yox0{b%dv^k)H_(_i zrQ1@)!yHZjTCeacPSPF(KF*a`%grAWSF}x7YoU0wBiD0xt{&ptF4VC-1ugzpD>c8gu=*S8B-j(Deh#5zn2HzknH9V@*->#wB^O5 zIW2@Z_O^efmn=~dxnj_$mPhgHfX5~BFG+qBv}IeA(Ay|TGIu6piI&{^4SUHMf6j{^ z9n(OXwy*-saEdtR#Nc4$9AndOW(rmCLlr-{9erxq-TW63wQl$sl5M+jSrgLaiFAd@ zrYqvA&ki2AD)%f954S&~fhBrDZe7vdwo03l{#m7GcMXnsIfOAAM%K1r{B@!SeKBt* zog{ruhKvrG-NyL@QSyDlzp`AfoipyNl&6pYZ<$15Qe%;u0gE^=(7b{=+Veg{e#%La zv?KUIhpq>lF;LU)mtl?YhNf9xKlF%jq$eG&!sfE%Yil>nBTM7SeN)Oa?lwRlK52Ap z)_d+wo~vNY!{1G~t3Dtj9AeWs*xTPta$Wb*uh!0=LeV&$GiZLg@Xzq`>zicFjsd-kL=ywpFul(m2~xylpR zswfq;vav@G=>AMiZfAXqWAZ2{)2I5jPc7uOCIwpC zk&ia&yPuFMYHWoM=II$~f0r8nx5SW#iT_k2e{<&}__t4&--e}%7rvBCI1fL}10Xi{ EFWnYuzyJUM literal 0 HcmV?d00001 diff --git a/public/healthcheck.css b/public/healthcheck.css new file mode 100644 index 0000000..fcc2f74 --- /dev/null +++ b/public/healthcheck.css @@ -0,0 +1,2 @@ +/* ! tailwindcss v3.4.15 | MIT License | https://tailwindcss.com */ +*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}::after,::before{--tw-content:''}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:#fff0}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#fff0;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.absolute{position:absolute}.relative{position:relative}.mx-auto{margin-left:auto;margin-right:auto}.ml-6{margin-left:1.5rem}.mt-2{margin-top:.5rem}.flex{display:flex}.inline-flex{display:inline-flex}.h-3{height:.75rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-3{width:.75rem}.w-full{width:100%}@keyframes ping{75%,100%{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.items-center{align-items:center}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity,1))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128 / var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity,1))}.from-gray-700\/50{--tw-gradient-from:rgb(55 65 81 / 0.5) var(--tw-gradient-from-position);--tw-gradient-to:rgb(55 65 81 / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), var(--tw-gradient-to)}.via-transparent{--tw-gradient-to:rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from), transparent var(--tw-gradient-via-position), var(--tw-gradient-to)}.p-6{padding:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-semibold{font-weight:600}.leading-relaxed{line-height:1.625}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity,1))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgb(0 0 0 / 0.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-gray-500\/20{--tw-shadow-color:rgb(107 114 128 / 0.2);--tw-shadow:var(--tw-shadow-colored)}.selection\:bg-red-500 *::selection{--tw-bg-opacity:1;background-color:rgb(239 68 68 / var(--tw-bg-opacity,1))}.selection\:text-white *::selection{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity,1))}.selection\:bg-red-500::selection{--tw-bg-opacity:1;background-color:rgb(239 68 68 / var(--tw-bg-opacity,1))}.selection\:text-white::selection{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity,1))}.focus\:outline:focus{outline-style:solid}.focus\:outline-2:focus{outline-width:2px}.focus\:outline-red-500:focus{outline-color:#ef4444}@media (min-width:640px){.sm\:flex{display:flex}.sm\:w-3\/4{width:75%}.sm\:items-center{align-items:center}.sm\:justify-center{justify-content:center}}@media (min-width:1280px){.xl\:w-1\/2{width:50%}}@media (prefers-color-scheme:dark){.dark\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity,1))}} \ No newline at end of file diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..56524f6 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/src/accounts.rs b/src/accounts.rs new file mode 100644 index 0000000..abf2f04 --- /dev/null +++ b/src/accounts.rs @@ -0,0 +1,1009 @@ +use crate::{ + AppState, + auth::AuthUser, + otp::{self, OtpConfig}, +}; +use axum::{ + Extension, Json, Router, + extract::{Path, Query, State}, + http::StatusCode, + response::{IntoResponse, Response}, + routing::{get, patch, post}, +}; +use serde_json::{Value, json}; +use sqlx::{Row, SqliteConnection, sqlite::SqliteRow}; +use std::collections::HashMap; + +impl From for ApiError { + fn from(e: crate::ApiError) -> Self { + Self(e.0, e.1) + } +} + +pub type ApiResult = Result; +pub struct ApiError(pub StatusCode, pub &'static str); +impl IntoResponse for ApiError { + fn into_response(self) -> Response { + if self.0 == StatusCode::FORBIDDEN + && ["Forbidden", "This action is unauthorized."].contains(&self.1) + { + ( + self.0, + Json(json!({"message":"forbidden","reason":"This action is unauthorized."})), + ) + .into_response() + } else { + (self.0, Json(json!({"message":self.1}))).into_response() + } + } +} +impl From for ApiError { + fn from(_: sqlx::Error) -> Self { + Self( + StatusCode::INTERNAL_SERVER_ERROR, + "Database operation failed", + ) + } +} +pub fn invalid() -> ApiError { + ApiError( + StatusCode::UNPROCESSABLE_ENTITY, + "The given data was invalid.", + ) +} +pub fn missing() -> ApiError { + ApiError(StatusCode::NOT_FOUND, "not found") +} +pub fn routes() -> Router { + Router::new() + .route( + "/twofaccounts", + get(index).post(create).delete(batch_delete), + ) + .route("/twofaccounts/count", get(count)) + .route("/twofaccounts/preview", post(preview)) + .route("/twofaccounts/otp", post(adhoc_otp)) + .route("/twofaccounts/reorder", post(reorder)) + .route("/twofaccounts/withdraw", patch(withdraw)) + .route("/twofaccounts/export", get(export)) + .route( + "/twofaccounts/{id}", + get(show).put(update).patch(update).delete(delete), + ) + .route("/twofaccounts/{id}/otp", get(stored_otp)) + .route("/twofaccounts/{id}/otp-logs", get(otp_logs)) +} + +fn decode(state: &AppState, value: String) -> Result { + if state.encryption_enabled() && !value.is_empty() { + state + .cipher + .as_ref() + .ok_or(ApiError( + StatusCode::INTERNAL_SERVER_ERROR, + "An encryption key is required", + ))? + .decrypt(&value) + .map_err(|_| { + ApiError( + StatusCode::INTERNAL_SERVER_ERROR, + "Encrypted account cannot be read", + ) + }) + } else { + Ok(value) + } +} +fn encode(state: &AppState, value: &str) -> Result { + if state.encryption_enabled() { + state + .cipher + .as_ref() + .ok_or(ApiError( + StatusCode::INTERNAL_SERVER_ERROR, + "An encryption key is required", + ))? + .encrypt(value) + .map_err(|_| ApiError(StatusCode::INTERNAL_SERVER_ERROR, "Encryption failed")) + } else { + Ok(value.to_string()) + } +} +pub(crate) fn config(state: &AppState, row: &SqliteRow) -> Result { + Ok(OtpConfig { + otp_type: row.try_get("otp_type")?, + account: decode( + state, + row.try_get::, _>("account")? + .unwrap_or_default(), + )?, + service: row + .try_get::, _>("service")? + .map(|x| decode(state, x)) + .transpose()?, + secret: decode(state, row.try_get("secret")?)?, + algorithm: row.try_get("algorithm")?, + digits: row.try_get::("digits")? as u32, + period: row.try_get::, _>("period")?.map(|x| x as u64), + counter: row.try_get::, _>("counter")?.map(|x| x as u64), + }) +} +fn parse(value: &Value) -> Result { + let mut c = if let Some(uri) = value.get("uri") { + if value + .as_object() + .ok_or_else(invalid)? + .keys() + .any(|k| !["uri", "custom_otp", "group_id"].contains(&k.as_str())) + { + return Err(invalid()); + } + let mut c = otp::parse_uri(uri.as_str().ok_or_else(invalid)?).map_err(|_| invalid())?; + if value.get("custom_otp").and_then(Value::as_str) == Some("steamtotp") { + c.otp_type = "steamtotp".into(); + } + c + } else { + { + if !value.get("otp_type").is_some_and(Value::is_string) { + return Err(invalid()); + } + let mut input = value.clone(); + if input.get("secret").is_none() { + use rand::RngCore; + let mut bytes = [0u8; 64]; + rand::rngs::OsRng.fill_bytes(&mut bytes); + input["secret"] = json!(data_encoding::BASE32.encode(&bytes)); + } + for (key, default) in [("digits", json!(6)), ("algorithm", json!("sha1"))] { + if input.get(key).is_some_and(Value::is_null) { + input[key] = default; + } + } + let hotp = input + .get("otp_type") + .and_then(Value::as_str) + .is_some_and(|s| s.eq_ignore_ascii_case("hotp")); + if hotp { + input["period"] = Value::Null; + if !input.get("counter").is_some_and(Value::is_number) { + input["counter"] = json!(0); + } + } else { + input["counter"] = Value::Null; + if !input.get("period").is_some_and(Value::is_number) { + input["period"] = json!(30); + } + } + serde_json::from_value::(input).map_err(|_| invalid())? + } + }; + if c.counter.is_some_and(|v| v >= i64::MAX as u64) + || c.period.is_some_and(|v| v > i64::MAX as u64) + { + return Err(invalid()); + } + c.normalize(); + c.validate().map_err(|_| invalid())?; + if c.account.is_empty() + || c.account.contains(':') + || c.service.as_deref().is_some_and(|s| s.contains(':')) + { + return Err(invalid()); + } + Ok(c) +} +fn dto(c: &OtpConfig, now: u64) -> Result { + let password = c.generate(now).map_err(|_| invalid())?; + if c.otp_type == "hotp" { + Ok(json!({"otp_type":c.otp_type,"password":password,"counter":c.counter.unwrap_or(0)+1})) + } else { + let period = c.period.unwrap_or(30); + Ok( + json!({"otp_type":c.otp_type,"password":password,"generated_at":now,"period":period,"next_password":c.generate(now.checked_add(period-now%period).and_then(|v|v.checked_add(2)).ok_or_else(invalid)?).map_err(|_|invalid())?}), + ) + } +} +fn resource( + state: &AppState, + row: &SqliteRow, + q: &HashMap, + list: bool, + user: i64, + sharing: (bool, bool), +) -> Result { + let c = config(state, row)?; + let mut v = json!({"id":row.try_get::("id")?,"group_id":row.try_get::,_>("group_id")?,"otp_type":c.otp_type,"account":c.account,"service":c.service,"icon":row.try_get::,_>("icon")?,"digits":c.digits,"algorithm":c.algorithm,"period":c.period,"counter":c.counter}); + let owner = row.try_get::, _>("user_id")? == Some(user); + if !owner { + v["is_borrowed"] = json!(true); + v["borrowed_by"] = json!(row.try_get::, _>("owner_name")?); + } else if sharing.0 && row.try_get::("has_shares")? { + if sharing.1 && row.try_get::("all_share")? { + v["is_shared_with_all"] = json!(true); + } else { + v["is_shared"] = json!(true); + } + } + if owner + && q.get("withSecret").map_or(!list, |x| { + ["true", "1", "yes", "on"].contains(&x.to_ascii_lowercase().as_str()) + }) + { + v["secret"] = json!(c.secret) + } + if q.contains_key("withOtp") && c.otp_type != "hotp" { + let at = q + .get("at") + .and_then(|v| v.parse::().ok()) + .unwrap_or_else(|| chrono::Utc::now().timestamp() as u64); + let mut d = dto(&c, at)?; + d.as_object_mut().unwrap().remove("period"); + d.as_object_mut().unwrap().remove("otp_type"); + v["otp"] = d; + } + Ok(v) +} +const SELECT: &str = "SELECT a.*,g.group_id,u.name AS owner_name,EXISTS(SELECT 1 FROM twofaccount_shares WHERE twofaccount_id=a.id AND created_by_user_id=? AND (scope!='all_users' OR ?)) AS has_shares,EXISTS(SELECT 1 FROM twofaccount_shares WHERE twofaccount_id=a.id AND scope='all_users') AS all_share FROM twofaccounts a LEFT JOIN users u ON u.id=a.user_id LEFT JOIN twofaccount_group_assignments g ON g.twofaccount_id=a.id AND g.user_id=?"; +pub const VISIBLE: &str = "(a.user_id=? OR (? AND EXISTS(SELECT 1 FROM twofaccount_shares s WHERE s.twofaccount_id=a.id AND ((s.scope='user' AND s.shared_with_user_id=?) OR (? AND s.scope='all_users')))))"; +pub async fn visible( + conn: &mut SqliteConnection, + user: i64, + id: i64, + sharing: (bool, bool), +) -> Result<(), ApiError> { + if sqlx::query_scalar::<_, i64>(&format!( + "SELECT a.id FROM twofaccounts a WHERE a.id=? AND {VISIBLE}" + )) + .bind(id) + .bind(user) + .bind(sharing.0) + .bind(user) + .bind(sharing.1) + .fetch_optional(&mut *conn) + .await? + .is_none() + { + let exists: bool = + sqlx::query_scalar("SELECT EXISTS(SELECT 1 FROM twofaccounts WHERE id=?)") + .bind(id) + .fetch_one(conn) + .await?; + return Err(if exists { + ApiError(StatusCode::FORBIDDEN, "This action is unauthorized.") + } else { + missing() + }); + } + Ok(()) +} +pub async fn list_for( + state: &AppState, + user: i64, + group: Option, + q: &HashMap, +) -> Result { + let sharing = crate::sharing::flags(&state.db).await?; + let sql = format!( + "{SELECT} LEFT JOIN twofaccount_user_orders o ON o.twofaccount_id=a.id AND o.user_id=? WHERE {VISIBLE} ORDER BY COALESCE(o.position,2147483647),a.id" + ); + let rows = sqlx::query(&sql) + .bind(user) + .bind(sharing.1) + .bind(user) + .bind(user) + .bind(user) + .bind(sharing.0) + .bind(user) + .bind(sharing.1) + .fetch_all(&state.db) + .await?; + let ids = q.get("ids").map(|s| parse_ids(s)).transpose()?; + let mut data = vec![]; + for row in rows { + let id: i64 = row.try_get("id")?; + if ids.as_ref().is_some_and(|ids| !ids.contains(&id)) { + continue; + } + if group.is_some_and(|g| { + g != 0 && row.try_get::, _>("group_id").ok().flatten() != Some(g) + }) { + continue; + } + data.push(resource(state, &row, q, true, user, sharing)?) + } + Ok(json!(data)) +} +async fn index( + State(s): State, + Extension(u): Extension, + Query(q): Query>, +) -> ApiResult { + Ok(Json(list_for(&s, u.id, None, &q).await?).into_response()) +} +async fn show( + State(s): State, + Extension(u): Extension, + Path(id): Path, + Query(q): Query>, +) -> ApiResult { + let sharing = crate::sharing::flags(&s.db).await?; + let r = sqlx::query(&format!("{SELECT} WHERE a.id=?")) + .bind(u.id) + .bind(sharing.1) + .bind(u.id) + .bind(id) + .fetch_optional(&s.db) + .await? + .ok_or_else(missing)?; + if !crate::sharing::can_access(&s.db, u.id, id).await? { + return Err(ApiError( + StatusCode::FORBIDDEN, + "This action is unauthorized.", + )); + } + Ok(Json(resource(&s, &r, &q, false, u.id, sharing)?).into_response()) +} +pub async fn owned(conn: &mut SqliteConnection, user: i64, id: i64) -> Result<(), ApiError> { + let owner: Option> = + sqlx::query_scalar("SELECT user_id FROM twofaccounts WHERE id=?") + .bind(id) + .fetch_optional(conn) + .await?; + match owner { + None => Err(missing()), + Some(Some(owner)) if owner == user => Ok(()), + _ => Err(ApiError( + StatusCode::FORBIDDEN, + "This action is unauthorized.", + )), + } +} +pub async fn assign( + conn: &mut SqliteConnection, + user: i64, + id: i64, + group: Option, +) -> Result<(), ApiError> { + if let Some(g) = group.filter(|g| *g > 0) { + if sqlx::query_scalar::<_, i64>("SELECT id FROM groups WHERE id=? AND user_id=?") + .bind(g) + .bind(user) + .fetch_optional(&mut *conn) + .await? + .is_none() + { + return Err(missing()); + } + sqlx::query("INSERT INTO twofaccount_group_assignments(twofaccount_id,user_id,group_id,created_at,updated_at) VALUES(?,?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP) ON CONFLICT(twofaccount_id,user_id) DO UPDATE SET group_id=excluded.group_id,updated_at=CURRENT_TIMESTAMP").bind(id).bind(user).bind(g).execute(conn).await?; + } else { + sqlx::query( + "DELETE FROM twofaccount_group_assignments WHERE twofaccount_id=? AND user_id=?", + ) + .bind(id) + .bind(user) + .execute(conn) + .await?; + } + Ok(()) +} +async fn save(s: &AppState, user: i64, id: Option, v: Value) -> Result { + let c = parse(&v)?; + let group = v + .get("group_id") + .filter(|x| !x.is_null()) + .map(|x| x.as_i64().filter(|g| *g >= 0).ok_or_else(invalid)) + .transpose()?; + let account = encode(s, &c.account)?; + let service = c.service.as_ref().map(|x| encode(s, x)).transpose()?; + let secret = encode(s, &c.secret)?; + let legacy_uri = encode( + s, + v.get("uri") + .and_then(Value::as_str) + .unwrap_or(&c.to_uri().map_err(|_| invalid())?), + )?; + // Resolve icons before taking a connection for the write transaction. + let previous_icon = if let Some(id) = id { + sqlx::query_scalar::<_, Option>( + "SELECT icon FROM twofaccounts WHERE id=? AND user_id=?", + ) + .bind(id) + .bind(user) + .fetch_optional(&s.db) + .await? + .ok_or_else(missing)? + } else { + None + }; + let mut icon = v + .get("icon") + .and_then(Value::as_str) + .filter(|s| !s.is_empty()) + .map(str::to_string); + let mut generated = false; + if let Some(uri) = v.get("uri").and_then(Value::as_str) + && let Ok(uri) = url::Url::parse(uri) + && let Some((_, image)) = uri.query_pairs().find(|(key, _)| key == "image") + { + icon = crate::icons::build_from_remote(s, &image).await; + generated = icon.is_some(); + } + let skip_fetch = + id.is_some() && previous_icon.is_some() && v.get("icon").is_some_and(Value::is_null); + if icon.is_none() && !skip_fetch { + icon = crate::icons::build_from_service(s, user, c.service.as_deref()).await; + generated = icon.is_some(); + } + let saved=async { + let mut tx = s.db.begin().await?; + if let Some(id) = id { + owned(&mut tx, user, id).await?; + } + let id = if let Some(id) = id { + sqlx::query("UPDATE twofaccounts SET account=?,service=?,secret=?,otp_type=?,algorithm=?,digits=?,period=?,counter=?,icon=?,updated_at=CURRENT_TIMESTAMP WHERE id=? AND user_id=?").bind(account).bind(service).bind(secret).bind(c.otp_type).bind(c.algorithm).bind(c.digits as i64).bind(c.period.map(|x|x as i64)).bind(c.counter.map(|x|x as i64)).bind(icon.as_deref()).bind(id).bind(user).execute(&mut *tx).await?; + id + } else { + sqlx::query("INSERT INTO twofaccounts(account,service,secret,otp_type,algorithm,digits,period,counter,icon,user_id,legacy_uri,created_at,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)").bind(account).bind(service).bind(secret).bind(c.otp_type).bind(c.algorithm).bind(c.digits as i64).bind(c.period.map(|x|x as i64)).bind(c.counter.map(|x|x as i64)).bind(icon.as_deref()).bind(user).bind(legacy_uri).execute(&mut *tx).await?.last_insert_rowid() + }; + assign(&mut tx, user, id, group).await?; + tx.commit().await?; + Ok::(id) + }.await; + if saved.is_ok() { + if let Some(previous) = + previous_icon.filter(|previous| Some(previous.as_str()) != icon.as_deref()) + { + let _ = crate::icons::cleanup_orphan(s, &previous).await; + } + } else if generated && let Some(icon) = icon.as_deref() { + let _ = crate::icons::cleanup_orphan(s, icon).await; + } + saved +} +fn required_fields(v: &Value) -> Option { + let keys = if v.get("uri").is_some() { + vec!["uri"] + } else { + vec!["account", "otp_type"] + }; + let mut errors = serde_json::Map::new(); + for key in keys { + if v.get(key) + .is_none_or(|v| v.is_null() || v.as_str().is_some_and(|v| v.trim().is_empty())) + { + errors.insert( + key.into(), + json!([format!("The {} field is required.", key.replace('_', " "))]), + ); + } + } + if errors.is_empty() { + return None; + } + let first = errors.values().next().unwrap()[0].as_str().unwrap(); + let message = if errors.len() == 1 { + first.to_owned() + } else { + format!( + "{first} (and {} more error{})", + errors.len() - 1, + if errors.len() == 2 { "" } else { "s" } + ) + }; + Some( + ( + StatusCode::UNPROCESSABLE_ENTITY, + Json(json!({"message":message,"errors":errors})), + ) + .into_response(), + ) +} +async fn create( + State(s): State, + Extension(u): Extension, + Json(v): Json, +) -> ApiResult { + if let Some(response) = required_fields(&v) { + return Ok(response); + } + let id = save(&s, u.id, None, v).await?; + let sharing = crate::sharing::flags(&s.db).await?; + let r = sqlx::query(&format!("{SELECT} WHERE a.id=? AND a.user_id=?")) + .bind(u.id) + .bind(sharing.1) + .bind(u.id) + .bind(id) + .bind(u.id) + .fetch_one(&s.db) + .await?; + Ok(( + StatusCode::CREATED, + Json(resource(&s, &r, &HashMap::new(), false, u.id, sharing)?), + ) + .into_response()) +} +async fn update( + State(s): State, + Extension(u): Extension, + Path(id): Path, + Json(v): Json, +) -> ApiResult { + if [ + "service", + "icon", + "account", + "otp_type", + "secret", + "digits", + "algorithm", + ] + .iter() + .any(|k| v.get(*k).is_none()) + { + return Err(invalid()); + } + save(&s, u.id, Some(id), v).await?; + show(State(s), Extension(u), Path(id), Query(HashMap::new())).await +} +async fn delete( + State(s): State, + Extension(u): Extension, + Path(id): Path, +) -> ApiResult { + let mut tx = s.db.begin().await?; + owned(&mut tx, u.id, id).await?; + let icon: Option = sqlx::query_scalar("SELECT icon FROM twofaccounts WHERE id=?") + .bind(id) + .fetch_one(&mut *tx) + .await?; + sqlx::query("DELETE FROM twofaccounts WHERE id=? AND user_id=?") + .bind(id) + .bind(u.id) + .execute(&mut *tx) + .await?; + tx.commit().await?; + if let Some(icon) = icon { + let _ = crate::icons::cleanup_orphan(&s, &icon).await; + } + Ok(StatusCode::NO_CONTENT.into_response()) +} +async fn count(State(s): State, Extension(u): Extension) -> ApiResult { + let n: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM twofaccounts WHERE user_id=?") + .bind(u.id) + .fetch_one(&s.db) + .await?; + let sharing = crate::sharing::flags(&s.db).await?; + let total: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM twofaccounts a WHERE {VISIBLE}" + )) + .bind(u.id) + .bind(sharing.0) + .bind(u.id) + .bind(sharing.1) + .fetch_one(&s.db) + .await?; + Ok(Json(json!({"owned":n,"shared":total-n,"total":total})).into_response()) +} +async fn preview(Json(v): Json) -> ApiResult { + if let Some(response) = required_fields(&v) { + return Ok(response); + } + let c = parse(&v)?; + Ok(Json(json!({"otp_type":c.otp_type,"account":c.account,"service":c.service,"icon":null,"secret":c.secret,"digits":c.digits,"algorithm":c.algorithm,"period":c.period,"counter":c.counter})).into_response()) +} +async fn adhoc_otp(Json(v): Json) -> ApiResult { + if let Some(response) = required_fields(&v) { + return Ok(response); + } + Ok(Json(dto(&parse(&v)?, chrono::Utc::now().timestamp() as u64)?).into_response()) +} +async fn stored_otp( + State(s): State, + Extension(u): Extension, + Path(id): Path, + peer: Option>>, +) -> ApiResult { + let sharing = crate::sharing::flags(&s.db).await?; + let mut tx = s.db.begin().await?; + // Acquire the write lock before reading, serializing HOTP generation across connections. + sqlx::query(&format!( + "UPDATE twofaccounts AS a SET counter=counter WHERE id=? AND {VISIBLE}" + )) + .bind(id) + .bind(u.id) + .bind(sharing.0) + .bind(u.id) + .bind(sharing.1) + .execute(&mut *tx) + .await?; + visible(&mut tx, u.id, id, sharing).await?; + let row = sqlx::query("SELECT * FROM twofaccounts WHERE id=?") + .bind(id) + .fetch_optional(&mut *tx) + .await? + .ok_or_else(missing)?; + let c = config(&s, &row)?; + if c.counter.is_some_and(|n| n >= i64::MAX as u64) { + return Err(ApiError(StatusCode::CONFLICT, "HOTP counter exhausted")); + } + let value = dto(&c, chrono::Utc::now().timestamp() as u64)?; + if c.otp_type == "hotp" { + sqlx::query( + "UPDATE twofaccounts SET counter=counter+1,updated_at=CURRENT_TIMESTAMP WHERE id=?", + ) + .bind(id) + .execute(&mut *tx) + .await?; + } + let ip = peer + .map(|Extension(axum::extract::ConnectInfo(peer))| peer.ip().to_string()) + .unwrap_or_else(|| "127.0.0.1".into()); + sqlx::query("INSERT INTO otp_logs(requester_id,requester_name,requester_email,owner_id,owner_name,owner_email,twofaccount_id,ip_address,otp_type,counter,generated_at) SELECT requester.id,requester.name,requester.email,owner.id,owner.name,owner.email,?,?,?,?,CURRENT_TIMESTAMP FROM users requester JOIN users owner ON owner.id=? WHERE requester.id=?") + .bind(id).bind(ip).bind(&c.otp_type).bind(if c.otp_type=="hotp" {c.counter.map(|n|n as i64+1)} else {None}).bind(row.try_get::("user_id")?).bind(u.id).execute(&mut *tx).await?; + tx.commit().await?; + Ok(Json(value).into_response()) +} +async fn otp_logs( + State(s): State, + Extension(u): Extension, + Path(id): Path, + Query(q): Query>, +) -> ApiResult { + let mut conn = s.db.acquire().await?; + owned(&mut conn, u.id, id).await?; + let period = q + .get("period") + .map(|v| v.parse::().map_err(|_| invalid())) + .transpose()?; + let limit = q + .get("limit") + .map(|v| v.parse::().map_err(|_| invalid())) + .transpose()?; + if period.is_some_and(|n| !n.is_finite() || n < 0. || n > 120000.) + || limit.is_some_and(|n| !n.is_finite() || n < 0. || n > i32::MAX as f64) + { + return Err(invalid()); + } + let retention = std::env::var("OTP_LOG_RETENTION") + .ok() + .and_then(|v| v.parse::().ok()) + .unwrap_or(365); + let cutoff = chrono::Utc::now() + .checked_sub_signed(chrono::Duration::days(retention.clamp(-1000000, 1000000))) + .ok_or_else(invalid)? + .format("%Y-%m-%d %H:%M:%S") + .to_string(); + sqlx::query("DELETE FROM otp_logs WHERE generated_at < ?") + .bind(cutoff) + .execute(&mut *conn) + .await?; + let from = period + .map(|months| { + chrono::Utc::now() + .checked_sub_months(chrono::Months::new(months as u32)) + .ok_or_else(invalid) + }) + .transpose()? + .map(|date| date.format("%Y-%m-%d %H:%M:%S").to_string()); + let rows=sqlx::query("SELECT requester_name,requester_email,owner_name,owner_email,ip_address,generated_at,otp_type,counter FROM otp_logs WHERE twofaccount_id=? AND (? IS NULL OR generated_at>=?) ORDER BY id LIMIT ?") + .bind(id).bind(&from).bind(&from).bind(limit.map(|n|n as i64).unwrap_or(-1)).fetch_all(&mut *conn).await?; + let mut values = vec![]; + for row in rows { + let otp_type: String = row.try_get("otp_type")?; + let date: String = row.try_get("generated_at")?; + let date = chrono::NaiveDateTime::parse_from_str(&date, "%Y-%m-%d %H:%M:%S") + .map(|d| { + d.and_utc() + .to_rfc3339_opts(chrono::SecondsFormat::Micros, true) + }) + .unwrap_or(date); + let mut v = json!({"requester_name":row.try_get::("requester_name")?,"requester_email":row.try_get::("requester_email")?,"owner_name":row.try_get::("owner_name")?,"owner_email":row.try_get::("owner_email")?,"ip_address":row.try_get::("ip_address")?,"generated_at":date,"otp_type":otp_type}); + if otp_type == "hotp" { + v["counter"] = json!(row.try_get::, _>("counter")?); + } + values.push(v); + } + Ok(Json(json!(values)).into_response()) +} +pub fn parse_ids(s: &str) -> Result, ApiError> { + if !s.bytes().all(|b| b.is_ascii_digit() || b == b',') { + return Err(invalid()); + } + let ids = s + .split(',') + .map(|x| x.parse::().map_err(|_| invalid())) + .collect::, _>>()?; + if ids.is_empty() || ids.len() > 99 || ids.iter().any(|i| *i < 1) { + return Err(invalid()); + } + Ok(ids) +} +fn body_ids(v: &Value) -> Result, ApiError> { + parse_ids(v.get("ids").and_then(Value::as_str).ok_or_else(invalid)?) +} +async fn batch_delete( + State(s): State, + Extension(u): Extension, + Json(v): Json, +) -> ApiResult { + let ids = body_ids(&v)?; + let mut tx = s.db.begin().await?; + for id in &ids { + owned(&mut tx, u.id, *id).await? + } + let mut icons = Vec::new(); + for id in ids { + let icon: Option = sqlx::query_scalar("SELECT icon FROM twofaccounts WHERE id=?") + .bind(id) + .fetch_one(&mut *tx) + .await?; + if let Some(icon) = icon { + icons.push(icon); + } + sqlx::query("DELETE FROM twofaccounts WHERE id=? AND user_id=?") + .bind(id) + .bind(u.id) + .execute(&mut *tx) + .await?; + } + tx.commit().await?; + for icon in icons { + let _ = crate::icons::cleanup_orphan(&s, &icon).await; + } + Ok(StatusCode::NO_CONTENT.into_response()) +} +async fn withdraw( + State(s): State, + Extension(u): Extension, + Json(v): Json, +) -> ApiResult { + let ids = body_ids(&v)?; + let sharing = crate::sharing::flags(&s.db).await?; + let mut tx = s.db.begin().await?; + for id in &ids { + visible(&mut tx, u.id, *id, sharing).await? + } + for id in ids { + assign(&mut tx, u.id, id, None).await? + } + tx.commit().await?; + Ok(Json(json!({"message":"accounts withdrawn"})).into_response()) +} +pub fn ordered_ids(v: &Value) -> Result, ApiError> { + let ids = v + .get("orderedIds") + .and_then(Value::as_array) + .ok_or_else(invalid)? + .iter() + .map(|x| x.as_i64().filter(|n| *n > 0).ok_or_else(invalid)) + .collect::, _>>()?; + let mut sorted = ids.clone(); + sorted.sort(); + sorted.dedup(); + if sorted.len() != ids.len() { + return Err(invalid()); + } + Ok(ids) +} +async fn reorder( + State(s): State, + Extension(u): Extension, + Json(v): Json, +) -> ApiResult { + let ids = ordered_ids(&v)?; + let sharing = crate::sharing::flags(&s.db).await?; + let mut tx = s.db.begin().await?; + for id in &ids { + visible(&mut tx, u.id, *id, sharing).await? + } + for (i, id) in ids.iter().enumerate() { + sqlx::query("INSERT INTO twofaccount_user_orders(user_id,twofaccount_id,position,created_at,updated_at) VALUES(?,?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP) ON CONFLICT(user_id,twofaccount_id) DO UPDATE SET position=excluded.position,updated_at=CURRENT_TIMESTAMP").bind(u.id).bind(id).bind(i as i64+1).execute(&mut *tx).await?; + } + let ordered:Vec=sqlx::query_scalar(&format!("SELECT a.id FROM twofaccounts a LEFT JOIN twofaccount_user_orders o ON o.twofaccount_id=a.id AND o.user_id=? WHERE {VISIBLE} ORDER BY COALESCE(o.position,2147483647),a.id")).bind(u.id).bind(u.id).bind(sharing.0).bind(u.id).bind(sharing.1).fetch_all(&mut *tx).await?; + tx.commit().await?; + Ok(Json(json!({"message":"order saved","orderedIds":ordered})).into_response()) +} +async fn export( + State(s): State, + Extension(u): Extension, + Query(q): Query>, +) -> ApiResult { + let ids = parse_ids(q.get("ids").ok_or_else(invalid)?)?; + let uri_only = q + .get("otpauth") + .is_some_and(|v| ["1", "true", "on", "yes"].contains(&v.to_ascii_lowercase().as_str())); + let mut values = vec![]; + for id in ids { + let Some(r) = sqlx::query("SELECT * FROM twofaccounts WHERE id=?") + .bind(id) + .fetch_optional(&s.db) + .await? + else { + continue; + }; + if r.try_get::, _>("user_id")? != Some(u.id) { + return Err(ApiError(StatusCode::FORBIDDEN, "Forbidden")); + } + let c = config(&s, &r)?; + if uri_only { + values.push(json!({"uri":otp::php_urldecode(&c.to_uri().map_err(|_|invalid())?)})); + } else { + use base64::Engine; + let icon: Option = r.try_get("icon")?; + let image = if let Some(name) = icon.as_deref() { + crate::icons::read_icon(&s, name) + .await + .map_err(|e| ApiError(e.0, e.1))? + } else { + None + }; + let (mime, file) = match image { + Some((mime, bytes)) => ( + Some(mime), + Some(base64::engine::general_purpose::STANDARD.encode(bytes)), + ), + None => (None, None), + }; + values.push(json!({"otp_type":c.otp_type,"account":c.account,"service":c.service,"icon":icon,"icon_mime":mime,"icon_file":file,"secret":c.secret,"digits":c.digits,"algorithm":c.algorithm,"period":c.period,"counter":c.counter,"legacy_uri":r.try_get::,_>("legacy_uri")?.map(|v|decode(&s,v)).transpose()?})); + } + } + let mut result = + json!({"app":"2fauth_v8.0.3","datetime":chrono::Utc::now().to_rfc3339(),"data":values}); + if !uri_only { + result["schema"] = json!(1); + } + Ok(Json(result).into_response()) +} + +#[cfg(test)] +mod tests { + use super::*; + use axum::{ + body::{Body, to_bytes}, + http::Request, + }; + use tower::ServiceExt; + async fn setup() -> (AppState, Router) { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + crate::db::init(&db).await.unwrap(); + sqlx::query("INSERT INTO users(id,name,email,password) VALUES(1,'Alice','a@example.com','unused'),(2,'Bob','b@example.com','unused')").execute(&db).await.unwrap(); + let state = AppState { + db, + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let app = routes() + .merge(crate::groups::routes()) + .layer(Extension(AuthUser { + id: 1, + is_admin: false, + })) + .with_state(state.clone()); + (state, app) + } + async fn req(app: Router, method: &str, url: &str, body: Value) -> (StatusCode, Value) { + let response = app + .oneshot( + Request::builder() + .method(method) + .uri(url) + .header("content-type", "application/json") + .body(Body::from(body.to_string())) + .unwrap(), + ) + .await + .unwrap(); + let status = response.status(); + let body = to_bytes(response.into_body(), 1024 * 1024).await.unwrap(); + (status, serde_json::from_slice(&body).unwrap_or(Value::Null)) + } + fn payload() -> Value { + json!({"otp_type":"hotp","account":"alice","service":null,"icon":null,"secret":"GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ","digits":6,"algorithm":"sha1","counter":0}) + } + #[tokio::test] + async fn crud_hides_list_secrets_and_hotp_advances() { + let (s, app) = setup().await; + let (status, v) = req(app.clone(), "POST", "/twofaccounts", payload()).await; + assert_eq!(status, StatusCode::CREATED); + assert_eq!(v["id"], 1); + let (_, list) = req(app.clone(), "GET", "/twofaccounts", Value::Null).await; + assert!(list[0].get("secret").is_none()); + let (_, a) = req(app.clone(), "GET", "/twofaccounts/1/otp", Value::Null).await; + assert_eq!(a["password"], "755224"); + assert_eq!(a["counter"], 1); + assert_eq!(a["otp_type"], "hotp"); + let (_, b) = req(app.clone(), "GET", "/twofaccounts/1/otp", Value::Null).await; + assert_eq!(b["password"], "287082"); + let n: i64 = sqlx::query_scalar("SELECT counter FROM twofaccounts WHERE id=1") + .fetch_one(&s.db) + .await + .unwrap(); + assert_eq!(n, 2); + } + #[tokio::test] + async fn cross_user_and_batch_mutations_are_atomic() { + let (s, app) = setup().await; + req(app.clone(), "POST", "/twofaccounts", payload()).await; + sqlx::query("INSERT INTO twofaccounts(user_id,account,otp_type,secret,algorithm,digits,counter) VALUES(2,'bob','hotp','MY','sha1',6,0)").execute(&s.db).await.unwrap(); + let (status, _) = req(app.clone(), "GET", "/twofaccounts/2", Value::Null).await; + assert_eq!(status, StatusCode::FORBIDDEN); + let (status, _) = req(app.clone(), "DELETE", "/twofaccounts", json!({"ids":"1,2"})).await; + assert_eq!(status, StatusCode::FORBIDDEN); + let n: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM twofaccounts") + .fetch_one(&s.db) + .await + .unwrap(); + assert_eq!(n, 2); + let (_, g) = req(app.clone(), "POST", "/groups", json!({"name":"Work"})).await; + let id = g["id"].as_i64().unwrap(); + let (status, _) = req( + app.clone(), + "POST", + &format!("/groups/{id}/assign"), + json!({"ids":[1,2]}), + ) + .await; + assert_eq!(status, StatusCode::FORBIDDEN); + let n: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM twofaccount_group_assignments") + .fetch_one(&s.db) + .await + .unwrap(); + assert_eq!(n, 0); + let (_, assigned) = req( + app.clone(), + "POST", + &format!("/groups/{id}/assign"), + json!({"ids":[1]}), + ) + .await; + assert_eq!(assigned["twofaccounts_count"], 1); + let (_, shown) = req(app.clone(), "GET", &format!("/groups/{id}"), Value::Null).await; + assert_eq!(shown["twofaccounts_count"], 0); + let (_, groups) = req(app.clone(), "GET", "/groups", Value::Null).await; + assert_eq!(groups[1]["twofaccounts_count"], 1); + let (_, list) = req( + app, + "GET", + &format!("/groups/{id}/twofaccounts"), + Value::Null, + ) + .await; + assert_eq!(list.as_array().unwrap().len(), 1); + assert!(list[0].get("secret").is_none()); + } + #[tokio::test] + async fn encrypted_storage_roundtrips_without_list_leakage() { + let (mut state, _) = setup().await; + state.cipher = Some(std::sync::Arc::new( + crate::crypto::LaravelCipher::from_app_key( + "base64:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + ) + .unwrap(), + )); + state + .encrypt_db + .store(true, std::sync::atomic::Ordering::SeqCst); + let app = routes() + .layer(Extension(AuthUser { + id: 1, + is_admin: false, + })) + .with_state(state.clone()); + let (status, _) = req(app.clone(), "POST", "/twofaccounts", payload()).await; + assert_eq!(status, StatusCode::CREATED); + let stored: String = sqlx::query_scalar("SELECT secret FROM twofaccounts") + .fetch_one(&state.db) + .await + .unwrap(); + assert_ne!(stored, payload()["secret"].as_str().unwrap()); + let (_, v) = req(app.clone(), "GET", "/twofaccounts/1", Value::Null).await; + assert_eq!(v["secret"], payload()["secret"]); + let (_, v) = req(app, "GET", "/twofaccounts", Value::Null).await; + assert!(v[0].get("secret").is_none()); + } +} diff --git a/src/api_limits.rs b/src/api_limits.rs new file mode 100644 index 0000000..3d854ba --- /dev/null +++ b/src/api_limits.rs @@ -0,0 +1,616 @@ +//! Laravel's shared per-IP API limiter with first-request-relative expiry. +use crate::{ + AppState, + proxy_auth::{self, ProxyConfig}, +}; +use axum::{ + Json, + extract::{ConnectInfo, Request, State}, + http::{HeaderMap, Method, StatusCode}, + middleware::Next, + response::{IntoResponse, Response}, +}; +use serde_json::json; +use sha2::{Digest, Sha256}; +use sqlx::{Row, SqlitePool}; +use std::{ + net::{IpAddr, SocketAddr}, + time::{SystemTime, UNIX_EPOCH}, +}; + +pub async fn init(db: &SqlitePool) -> Result<(), sqlx::Error> { + sqlx::raw_sql("CREATE TABLE IF NOT EXISTS rust_api_limits(key TEXT PRIMARY KEY,attempts INTEGER NOT NULL,expires_at INTEGER NOT NULL); CREATE INDEX IF NOT EXISTS rust_api_limits_expiry ON rust_api_limits(expires_at);").execute(db).await?; + Ok(()) +} +#[derive(Clone)] +struct Limits { + normal: i64, + import: i64, + proxy: ProxyConfig, +} +impl Limits { + fn from_env() -> Self { + Self { + normal: std::env::var("THROTTLE_API") + .map(|v| php_int(&v)) + .unwrap_or(60), + import: std::env::var("THROTTLE_API_DURING_IMPORT") + .map(|v| php_int(&v)) + .unwrap_or(1000), + proxy: ProxyConfig::from_env(), + } + } + fn for_request(&self, request: &Request) -> Option { + if self.normal == 0 { + return None; + } + let import = request.method() == Method::POST + && matches!( + request.uri().path(), + "/twofaccounts" | "/api/v1/twofaccounts" + ) + && request + .headers() + .get("referer") + .and_then(|v| v.to_str().ok()) + .is_some_and(|s| s.ends_with("account/import")); + let maximum = if import { + if self.import == 0 { + return None; + } + self.normal.saturating_add(self.import) + } else { + self.normal + }; + (maximum > 0).then_some(maximum) + } +} +fn php_int(value: &str) -> i64 { + let value = value.trim_start(); + let (negative, value) = if let Some(s) = value.strip_prefix('-') { + (true, s) + } else { + (false, value.strip_prefix('+').unwrap_or(value)) + }; + let mut result = 0i64; + for byte in value.bytes().take_while(u8::is_ascii_digit) { + result = result + .saturating_mul(10) + .saturating_add(i64::from(byte - b'0')); + } + if negative { -result } else { result } +} +fn normalize(ip: IpAddr) -> IpAddr { + match ip { + IpAddr::V6(ip) => ip + .to_ipv4_mapped() + .map(IpAddr::V4) + .unwrap_or(IpAddr::V6(ip)), + ip => ip, + } +} +fn client_ip(headers: &HeaderMap, peer: Option, config: &ProxyConfig) -> String { + let direct = peer + .map(|p| normalize(p.ip()).to_string()) + .unwrap_or_else(|| "unknown-peer".into()); + if !proxy_auth::trusted_peer(config, peer) { + return direct; + } + let mut values = headers.get_all("x-forwarded-for").iter(); + let Some(value) = values.next() else { + return direct; + }; + if values.next().is_some() { + return direct; + } + let Ok(value) = value.to_str() else { + return direct; + }; + // Reject the entire header if any component is invalid or the chain is excessive. + let chain: Option> = value + .split(',') + .map(|s| s.trim().parse::().ok().map(normalize)) + .collect(); + let Some(chain) = chain.filter(|ips| !ips.is_empty() && ips.len() <= 64) else { + return direct; + }; + for ip in chain.iter().rev() { + if !proxy_auth::trusted_peer(config, Some(SocketAddr::new(*ip, 0))) { + return ip.to_string(); + } + } + chain[0].to_string() +} +fn now() -> i64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() + .min(i64::MAX as u64) as i64 +} +pub async fn handle(State(state): State, request: Request, next: Next) -> Response { + apply(state, request, next, &Limits::from_env(), now()).await +} +/// Passport's unnamed `throttle` middleware has its own fixed 60/minute +/// bucket, independent of the application's named API/import quotas. +pub async fn handle_oauth(State(state): State, request: Request, next: Next) -> Response { + let limits = Limits { + normal: 60, + import: 0, + proxy: ProxyConfig::from_env(), + }; + let mut response = apply_named(state, request, next, &limits, now(), "oauth:").await; + response + .headers_mut() + .entry(axum::http::header::CACHE_CONTROL) + .or_insert(axum::http::HeaderValue::from_static("no-cache, private")); + response +} +async fn apply( + state: AppState, + request: Request, + next: Next, + limits: &Limits, + timestamp: i64, +) -> Response { + apply_named(state, request, next, limits, timestamp, "").await +} +async fn apply_named( + state: AppState, + request: Request, + next: Next, + limits: &Limits, + timestamp: i64, + namespace: &str, +) -> Response { + let Some(maximum) = limits.for_request(&request) else { + return next.run(request).await; + }; + let peer = request + .extensions() + .get::>() + .map(|p| p.0); + let ip = client_ip(request.headers(), peer, &limits.proxy); + let key = format!("{namespace}{:x}", Sha256::digest(ip.as_bytes())); + let outcome = hit(&state.db, &key, maximum, timestamp).await; + let (accepted, attempts, expires) = match outcome { + Ok(value) => value, + Err(error) => { + tracing::error!(kind=?std::mem::discriminant(&error),"API throttle storage failed"); + return ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(json!({"message":"Server Error"})), + ) + .into_response(); + } + }; + let mut response = if accepted { + next.run(request).await + } else { + ( + StatusCode::TOO_MANY_REQUESTS, + Json(json!({"message":"Too Many Attempts."})), + ) + .into_response() + }; + let remaining = if accepted { + maximum.saturating_sub(attempts).max(0) + } else { + 0 + }; + // Preserve a stricter downstream limiter's headers, as Laravel does. + if response + .headers() + .get("x-ratelimit-remaining") + .and_then(|v| v.to_str().ok()) + .and_then(|s| s.parse::().ok()) + .is_none_or(|n| n > remaining) + { + response.headers_mut().insert( + "x-ratelimit-limit", + maximum.to_string().parse().expect("integer header"), + ); + response.headers_mut().insert( + "x-ratelimit-remaining", + remaining.to_string().parse().expect("integer header"), + ); + if !accepted { + response.headers_mut().insert( + "retry-after", + expires + .saturating_sub(timestamp) + .max(0) + .to_string() + .parse() + .expect("integer header"), + ); + response.headers_mut().insert( + "x-ratelimit-reset", + expires.to_string().parse().expect("integer header"), + ); + } + } + response +} +async fn hit( + db: &SqlitePool, + key: &str, + maximum: i64, + timestamp: i64, +) -> Result<(bool, i64, i64), sqlx::Error> { + let mut tx = db.begin().await?; + // Cache expiry also bounds the sidecar: old peers disappear on the next limited request. + sqlx::query("DELETE FROM rust_api_limits WHERE expires_at<=? AND key!=?") + .bind(timestamp) + .bind(key) + .execute(&mut *tx) + .await?; + let row=sqlx::query("INSERT INTO rust_api_limits(key,attempts,expires_at) VALUES(?,1,?) ON CONFLICT(key) DO UPDATE SET attempts=CASE WHEN expires_at<=? THEN 1 ELSE attempts+1 END,expires_at=CASE WHEN expires_at<=? THEN ? ELSE expires_at END WHERE expires_at<=? OR attempts ProxyConfig { + ProxyConfig { + enabled: false, + trusted_proxies: trusted.into(), + user_header: "REMOTE_USER".into(), + email_header: None, + } + } + async fn fixture( + normal: i64, + import: i64, + trusted: &str, + ) -> (SqlitePool, Router, Arc) { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + init(&db).await.unwrap(); + let state = AppState { + db: db.clone(), + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let limits = Limits { + normal, + import, + proxy: proxy(trusted), + }; + let clock = Arc::new(AtomicI64::new(59)); + let time = clock.clone(); + let app = Router::new() + .route("/one", get(|| async { "ok" })) + .route("/twofaccounts", post(|| async { "created" })) + .route_layer(axum::middleware::from_fn( + move |request: Request, next: Next| { + let state = state.clone(); + let limits = limits.clone(); + let timestamp = time.load(Ordering::Relaxed); + async move { apply(state, request, next, &limits, timestamp).await } + }, + )); + (db, app, clock) + } + async fn request( + app: &Router, + path: &str, + referer: Option<&str>, + forwarded: Option<&str>, + ) -> Response { + let mut builder = axum::http::Request::builder() + .method(if path == "/twofaccounts" { + "POST" + } else { + "GET" + }) + .uri(path) + .extension(ConnectInfo( + "127.0.0.1:50000".parse::().unwrap(), + )); + if let Some(referer) = referer { + builder = builder.header("referer", referer); + } + if let Some(forwarded) = forwarded { + builder = builder.header("x-forwarded-for", forwarded); + } + app.clone() + .oneshot(builder.body(Body::empty()).unwrap()) + .await + .unwrap() + } + #[tokio::test] + async fn passport_quota_is_fixed_and_separate_from_the_api_bucket() { + let (db, api, clock) = fixture(1, 0, "").await; + clock.store(now(), Ordering::Relaxed); + let state = AppState { + db, + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let oauth = Router::new() + .route("/one", get(|| async { "ok" })) + .route_layer(axum::middleware::from_fn_with_state(state, handle_oauth)); + assert_eq!( + request(&api, "/one", None, None).await.status(), + StatusCode::OK + ); + assert_eq!( + request(&api, "/one", None, None).await.status(), + StatusCode::TOO_MANY_REQUESTS + ); + for index in 0..60 { + let response = request(&oauth, "/one", None, None).await; + assert_eq!(response.status(), StatusCode::OK); + assert_eq!(response.headers()["x-ratelimit-limit"], "60"); + assert_eq!( + response.headers()["x-ratelimit-remaining"], + (59 - index).to_string() + ); + } + let rejected = request(&oauth, "/one", None, None).await; + assert_eq!(rejected.status(), StatusCode::TOO_MANY_REQUESTS); + assert_eq!(rejected.headers()["x-ratelimit-remaining"], "0"); + assert!(rejected.headers().contains_key("retry-after")); + assert_eq!( + request(&api, "/one", None, None).await.status(), + StatusCode::TOO_MANY_REQUESTS + ); + } + #[tokio::test] + async fn first_request_starts_the_window_and_rejections_do_not_extend_it() { + let (db, app, clock) = fixture(2, 3, "").await; + let first = request(&app, "/one", None, None).await; + assert_eq!(first.status(), StatusCode::OK); + assert_eq!(first.headers()["x-ratelimit-limit"], "2"); + assert_eq!(first.headers()["x-ratelimit-remaining"], "1"); + assert!(!first.headers().contains_key("x-ratelimit-reset")); + clock.store(60, Ordering::Relaxed); + assert_eq!( + request(&app, "/one", None, None).await.headers()["x-ratelimit-remaining"], + "0" + ); + clock.store(118, Ordering::Relaxed); + let blocked = request(&app, "/one", None, None).await; + assert_eq!(blocked.status(), StatusCode::TOO_MANY_REQUESTS); + assert_eq!(blocked.headers()["retry-after"], "1"); + assert_eq!(blocked.headers()["x-ratelimit-reset"], "119"); + assert_eq!(blocked.headers()["x-ratelimit-remaining"], "0"); + let body: serde_json::Value = + serde_json::from_slice(&to_bytes(blocked.into_body(), 1024).await.unwrap()).unwrap(); + assert_eq!(body, json!({"message":"Too Many Attempts."})); + assert_eq!( + sqlx::query_scalar::<_, i64>("SELECT attempts FROM rust_api_limits") + .fetch_one(&db) + .await + .unwrap(), + 2 + ); + clock.store(119, Ordering::Relaxed); + let reset = request(&app, "/one", None, None).await; + assert_eq!(reset.status(), StatusCode::OK); + assert_eq!(reset.headers()["x-ratelimit-remaining"], "1"); + assert_eq!( + sqlx::query_scalar::<_, i64>("SELECT expires_at FROM rust_api_limits") + .fetch_one(&db) + .await + .unwrap(), + 179 + ); + } + #[tokio::test] + async fn import_extends_the_same_ip_counter_and_only_for_exact_route_and_referer() { + let (_, app, _) = fixture(2, 3, "").await; + assert_eq!( + request(&app, "/one", None, None).await.status(), + StatusCode::OK + ); + assert_eq!( + request(&app, "/one", None, None).await.status(), + StatusCode::OK + ); + assert_eq!( + request( + &app, + "/twofaccounts", + Some("https://example.com/account/import?x=1"), + None + ) + .await + .status(), + StatusCode::TOO_MANY_REQUESTS + ); + assert_eq!( + request( + &app, + "/one", + Some("https://example.com/account/import"), + None + ) + .await + .status(), + StatusCode::TOO_MANY_REQUESTS + ); + for remaining in [2, 1, 0] { + let response = request( + &app, + "/twofaccounts", + Some("https://example.com/account/import"), + None, + ) + .await; + assert_eq!(response.status(), StatusCode::OK); + assert_eq!(response.headers()["x-ratelimit-limit"], "5"); + assert_eq!( + response.headers()["x-ratelimit-remaining"], + remaining.to_string() + ); + } + assert_eq!( + request(&app, "/one", None, None).await.status(), + StatusCode::TOO_MANY_REQUESTS + ); + assert_eq!( + request( + &app, + "/twofaccounts", + Some("https://example.com/account/import"), + None + ) + .await + .status(), + StatusCode::TOO_MANY_REQUESTS + ); + } + #[tokio::test] + async fn unlimited_limits_do_not_consume_a_counter() { + let (db, app, _) = fixture(0, 3, "").await; + for _ in 0..5 { + let response = request(&app, "/one", None, None).await; + assert_eq!(response.status(), StatusCode::OK); + assert!(!response.headers().contains_key("x-ratelimit-limit")); + } + assert_eq!( + sqlx::query_scalar::<_, i64>("SELECT COUNT(*) FROM rust_api_limits") + .fetch_one(&db) + .await + .unwrap(), + 0 + ); + let (db, app, _) = fixture(1, 0, "").await; + for _ in 0..5 { + let response = request( + &app, + "/twofaccounts", + Some("https://example.com/account/import"), + None, + ) + .await; + assert_eq!(response.status(), StatusCode::OK); + assert!(!response.headers().contains_key("x-ratelimit-limit")); + } + assert_eq!( + sqlx::query_scalar::<_, i64>("SELECT COUNT(*) FROM rust_api_limits") + .fetch_one(&db) + .await + .unwrap(), + 0 + ); + assert_eq!( + request(&app, "/one", None, None).await.status(), + StatusCode::OK + ); + assert_eq!( + request(&app, "/one", None, None).await.status(), + StatusCode::TOO_MANY_REQUESTS + ); + } + #[tokio::test] + async fn spoofed_forwarding_cannot_reset_a_direct_peers_quota() { + let (_, app, _) = fixture(1, 0, "").await; + assert_eq!( + request(&app, "/one", None, Some("198.51.100.1")) + .await + .status(), + StatusCode::OK + ); + assert_eq!( + request(&app, "/one", None, Some("198.51.100.2")) + .await + .status(), + StatusCode::TOO_MANY_REQUESTS + ); + let (_, app, _) = fixture(1, 0, "127.0.0.1").await; + assert_eq!( + request(&app, "/one", None, Some("198.51.100.1")) + .await + .status(), + StatusCode::OK + ); + assert_eq!( + request(&app, "/one", None, Some("198.51.100.2")) + .await + .status(), + StatusCode::OK + ); + // The untrusted proxy nearest the server determines the client, not attacker-supplied left entries. + assert_eq!( + request(&app, "/one", None, Some("203.0.113.99, 198.51.100.2")) + .await + .status(), + StatusCode::TOO_MANY_REQUESTS + ); + let mut headers = HeaderMap::new(); + headers.insert( + "x-forwarded-for", + "malformed, 198.51.100.3".parse().unwrap(), + ); + assert_eq!( + client_ip( + &headers, + Some("127.0.0.1:1".parse().unwrap()), + &proxy("127.0.0.1") + ), + "127.0.0.1" + ); + headers.insert("x-forwarded-for", "198.51.100.1".parse().unwrap()); + headers.append("x-forwarded-for", "198.51.100.2".parse().unwrap()); + assert_eq!( + client_ip( + &headers, + Some("127.0.0.1:1".parse().unwrap()), + &proxy("127.0.0.1") + ), + "127.0.0.1" + ); + } + #[tokio::test] + async fn parallel_requests_cannot_exceed_the_limit() { + let (_, app, _) = fixture(3, 0, "").await; + let mut tasks = Vec::new(); + for _ in 0..12 { + let app = app.clone(); + tasks.push(tokio::spawn(async move { + request(&app, "/one", None, None).await.status() + })); + } + let mut accepted = 0; + for task in tasks { + if task.await.unwrap() == StatusCode::OK { + accepted += 1; + } + } + assert_eq!(accepted, 3); + } + #[test] + fn php_integer_configuration_rules() { + assert_eq!(php_int(" +60requests"), 60); + assert_eq!(php_int("disabled"), 0); + assert_eq!(php_int("-1"), -1); + } +} diff --git a/src/auth.rs b/src/auth.rs new file mode 100644 index 0000000..c550be1 --- /dev/null +++ b/src/auth.rs @@ -0,0 +1,1574 @@ +//! Browser/native sessions, legacy Laravel import and Passport authentication. +use crate::AppState; +use axum::{ + Json, Router, + body::to_bytes, + extract::{ConnectInfo, Request, State}, + http::{HeaderMap, HeaderValue, Method, StatusCode, header}, + middleware::Next, + response::{IntoResponse, Response}, + routing::{get, post}, +}; +use rand::{RngCore, rngs::OsRng}; +use serde::Deserialize; +use serde_json::json; +use sha2::{Digest, Sha256}; +use sqlx::{Row, SqlitePool}; +use std::{ + net::SocketAddr, + time::{SystemTime, UNIX_EPOCH}, +}; +use subtle::ConstantTimeEq; + +const COOKIE: &str = "rust_2fauth_session"; +pub(crate) const TTL: i64 = 90 * 24 * 3600; +fn csrf_status() -> StatusCode { + StatusCode::from_u16(419).expect("valid Laravel CSRF status") +} +#[derive(Clone, Debug)] +pub struct AuthUser { + pub id: i64, + pub is_admin: bool, +} + +pub async fn init(db: &SqlitePool) -> Result<(), sqlx::Error> { + sqlx::raw_sql("CREATE TABLE IF NOT EXISTS rust_sessions (token_hash TEXT PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, csrf_hash TEXT NOT NULL, expires_at INTEGER NOT NULL); CREATE INDEX IF NOT EXISTS rust_sessions_expiry ON rust_sessions(expires_at); CREATE TABLE IF NOT EXISTS rust_login_attempts (key TEXT PRIMARY KEY, window INTEGER NOT NULL, attempts INTEGER NOT NULL);").execute(db).await?; + crate::api_limits::init(db).await?; + Ok(()) +} +pub fn routes() -> Router { + Router::new() + .route("/refresh-csrf", get(refresh_csrf)) + .route("/user/login", post(login)) + .route("/user/logout", get(logout).post(logout)) +} +pub(crate) fn now() -> i64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64 +} +pub(crate) fn random() -> String { + let mut bytes = [0u8; 32]; + OsRng.fill_bytes(&mut bytes); + bytes.iter().map(|b| format!("{b:02x}")).collect() +} +pub(crate) fn digest(s: &str) -> String { + format!("{:x}", Sha256::digest(s.as_bytes())) +} +fn token(headers: &HeaderMap) -> Option { + // Reject ambiguity rather than accepting one of multiple session cookies. + let mut found = None; + for cookie in headers.get_all(header::COOKIE) { + for part in cookie.to_str().ok()?.split(';') { + if let Some((key, value)) = part.trim().split_once('=') + && key == COOKIE + { + if found.is_some() + || value.len() != 64 + || !value.bytes().all(|x| x.is_ascii_hexdigit()) + { + return None; + } + found = Some(value.to_owned()); + } + } + } + found +} +fn secure() -> bool { + std::env::var("RUST_COOKIE_SECURE").as_deref() != Ok("false") +} +pub(crate) fn cookies(response: &mut Response, session: &str, csrf: &str, age: i64) { + let suffix = if secure() { "; Secure" } else { "" }; + for cookie in [ + format!("{COOKIE}={session}; Path=/; HttpOnly; SameSite=Strict; Max-Age={age}{suffix}"), + format!("XSRF-TOKEN={csrf}; Path=/; SameSite=Strict; Max-Age={age}{suffix}"), + ] { + if let Ok(v) = HeaderValue::from_str(&cookie) { + response.headers_mut().append(header::SET_COOKIE, v); + } + } + response + .headers_mut() + .insert(header::CACHE_CONTROL, HeaderValue::from_static("no-store")); +} +pub(crate) fn clear_legacy_cookie(response: &mut Response) { + let suffix = if secure() { "; Secure" } else { "" }; + if let Ok(value) = HeaderValue::from_str(&format!( + "laravel_token=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0{suffix}" + )) { + response.headers_mut().append(header::SET_COOKIE, value); + } +} +fn error(status: StatusCode, message: &str) -> Response { + (status, Json(json!({"message":message}))).into_response() +} +pub(crate) fn csrf_valid(headers: &HeaderMap, expected: &str) -> bool { + headers + .get("x-csrf-token") + .or_else(|| headers.get("x-xsrf-token")) + .and_then(|v| v.to_str().ok()) + .filter(|v| v.len() == 64) + .is_some_and(|v| bool::from(digest(v).as_bytes().ct_eq(expected.as_bytes()))) +} +pub(crate) async fn session( + db: &SqlitePool, + headers: &HeaderMap, +) -> Result, sqlx::Error> { + let Some(value) = token(headers) else { + return Ok(None); + }; + sqlx::query("SELECT s.token_hash,s.csrf_hash,s.user_id,u.is_admin FROM rust_sessions s LEFT JOIN users u ON u.id=s.user_id WHERE s.token_hash=? AND s.expires_at>?") + .bind(digest(&value)).bind(now()).fetch_optional(db).await +} +/// Browser guards never authenticate an Authorization bearer token. +pub(crate) async fn browser_user( + state: &AppState, + headers: &HeaderMap, +) -> Result, crate::ApiError> { + if let Some(row) = session(&state.db, headers).await? + && let (Some(id), Some(is_admin)) = ( + row.try_get::, _>("user_id")?, + row.try_get::, _>("is_admin")?, + ) + { + return Ok(Some(AuthUser { id, is_admin })); + } + if let Some(legacy) = crate::laravel_sessions::authenticate(state, headers).await? { + return Ok(legacy.user); + } + Ok(None) +} +fn named_cookie(headers: &HeaderMap, name: &str) -> Option { + let mut found = None; + for h in headers.get_all(header::COOKIE) { + for part in h.to_str().ok()?.split(';') { + if let Some((key, value)) = part.trim().split_once('=') + && key == name + { + if found.is_some() { + return None; + } + found = Some(value.to_owned()); + } + } + } + found +} +pub(crate) async fn browser_csrf_token( + state: &AppState, + headers: &HeaderMap, +) -> Result, crate::ApiError> { + if let Some(row) = session(&state.db, headers).await? + && let Some(token) = named_cookie(headers, "XSRF-TOKEN") + { + let value = percent_encoding::percent_decode_str(&token) + .decode_utf8() + .ok() + .map(|v| v.into_owned()); + if let Some(value) = value + && bool::from( + digest(&value) + .as_bytes() + .ct_eq(row.get::("csrf_hash").as_bytes()), + ) + { + return Ok(Some(value)); + } + } + Ok(crate::laravel_sessions::authenticate(state, headers) + .await? + .map(|v| v.csrf)) +} +pub(crate) async fn browser_session_id( + state: &AppState, + headers: &HeaderMap, +) -> Result, crate::ApiError> { + if let Some(row) = session(&state.db, headers).await? { + return Ok(Some(row.try_get("token_hash")?)); + } + if let Some(legacy) = crate::laravel_sessions::authenticate(state, headers).await? + && let Some(id) = legacy.id + { + return Ok(Some(digest(&format!("laravel-session:{id}")))); + } + // A recaller identifies an account, not a unique browser session. + // The normal HTML bootstrap must first import it into a fresh native SID. + Ok(None) +} +pub(crate) async fn invalidate_browser( + state: &AppState, + headers: &HeaderMap, +) -> Result<(), crate::ApiError> { + let mut users = std::collections::BTreeSet::new(); + if let Some(row) = session(&state.db, headers).await? { + if let Some(user) = row.try_get::, _>("user_id")? { + users.insert(user); + } + sqlx::query("DELETE FROM rust_sessions WHERE token_hash=?") + .bind(row.try_get::("token_hash")?) + .execute(&state.db) + .await?; + } + if let Some(legacy) = crate::laravel_sessions::authenticate(state, headers).await? { + if let Some(user) = legacy.user.as_ref() { + users.insert(user.id); + } + crate::laravel_sessions::destroy(state, &legacy).await?; + } + for user in users { + crate::laravel_sessions::revoke_remember(state, user).await?; + } + Ok(()) +} +pub(crate) fn clear_laravel_session_cookies(response: &mut Response) { + let Ok(names) = crate::laravel_sessions::cookie_names() else { + return; + }; + let path = std::env::var("SESSION_PATH").unwrap_or_else(|_| "/".into()); + let domain = std::env::var("SESSION_DOMAIN") + .ok() + .filter(|v| !v.is_empty() && v != "null"); + for name in names { + let value = format!( + "{name}=; Path={path}; HttpOnly; SameSite=Lax; Max-Age=0{}{}", + domain + .as_ref() + .map(|d| format!("; Domain={d}")) + .unwrap_or_default(), + if secure() { "; Secure" } else { "" } + ); + if let Ok(value) = HeaderValue::from_str(&value) { + response.headers_mut().append(header::SET_COOKIE, value); + } + } +} +/// Consent/client administration uses browser state, never an API bearer. +pub(crate) async fn require_web_auth( + State(state): State, + mut request: Request, + next: Next, +) -> Response { + let mutation = !matches!( + *request.method(), + Method::GET | Method::HEAD | Method::OPTIONS + ); + if mutation { + let valid = match session(&state.db, request.headers()).await { + Ok(Some(row)) => csrf_valid(request.headers(), row.get("csrf_hash")), + Ok(None) => { + match crate::laravel_sessions::authenticate(&state, request.headers()).await { + Ok(Some(legacy)) => { + crate::laravel_sessions::csrf_valid(&state, request.headers(), &legacy) + } + _ => false, + } + } + Err(_) => false, + }; + if !valid { + let expected = match browser_csrf_token(&state, request.headers()).await { + Ok(v) => v, + Err(e) => return e.into_response(), + }; + let (parts, body) = request.into_parts(); + let bytes = match to_bytes(body, 64 * 1024).await { + Ok(bytes) => bytes, + Err(_) => return error(StatusCode::PAYLOAD_TOO_LARGE, "Request body too large"), + }; + let supplied = if parts + .headers + .get(header::CONTENT_TYPE) + .and_then(|h| h.to_str().ok()) + .is_some_and(|h| h.starts_with("application/x-www-form-urlencoded")) + { + serde_urlencoded::from_bytes::>(&bytes) + .ok() + .and_then(|mut v| v.remove("_token")) + } else { + serde_json::from_slice::(&bytes) + .ok() + .and_then(|v| v.get("_token").and_then(|v| v.as_str()).map(str::to_owned)) + }; + let token_valid = if let Some(supplied) = supplied { + if let Some(expected) = expected { + bool::from(expected.as_bytes().ct_eq(supplied.as_bytes())) + } else { + match session(&state.db, &parts.headers).await { + Ok(Some(row)) => bool::from( + digest(&supplied) + .as_bytes() + .ct_eq(row.get::("csrf_hash").as_bytes()), + ), + _ => false, + } + } + } else { + false + }; + if !token_valid { + return error(csrf_status(), "CSRF token mismatch."); + } + request = Request::from_parts(parts, axum::body::Body::from(bytes)); + } + } + let user = match browser_user(&state, request.headers()).await { + Ok(Some(user)) => user, + Ok(None) => return error(StatusCode::UNAUTHORIZED, "Unauthenticated."), + Err(e) => return e.into_response(), + }; + match active(&state, user.id).await { + Ok(true) => (), + Ok(false) => return error(StatusCode::IM_A_TEAPOT, "inactivity detected"), + Err(e) => return e.into_response(), + } + if let Ok(Some(legacy)) = crate::laravel_sessions::authenticate(&state, request.headers()).await + && let Err(e) = crate::laravel_sessions::touch(&state, &legacy).await + { + return e.into_response(); + } + request.extensions_mut().insert(user); + next.run(request).await +} + +pub async fn require_auth( + State(state): State, + mut request: Request, + next: Next, +) -> Response { + if crate::proxy_auth::enabled() { + if crate::proxy_auth::blocked(request.method(), request.uri().path()) { + return crate::proxy_auth::blocked_error().into_response(); + } + let peer = request + .extensions() + .get::>() + .map(|p| p.0); + match crate::proxy_auth::authenticate(&state, request.headers(), peer).await { + Ok(Some(user)) => { + request.extensions_mut().insert(user); + return next.run(request).await; + } + Ok(None) => return error(StatusCode::UNAUTHORIZED, "Unauthenticated."), + Err(e) => return e.into_response(), + } + } + if request.headers().contains_key(header::AUTHORIZATION) { + match crate::passport::authenticate(&state.db, request.headers()).await { + Ok(Some(identity)) => { + request.extensions_mut().insert(identity.user.clone()); + request.extensions_mut().insert(identity); + return next.run(request).await; + } + Ok(None) => return error(StatusCode::UNAUTHORIZED, "Unauthenticated."), + Err(e) => return e.into_response(), + } + } + let original = request + .extensions() + .get::() + .map(|v| v.0.path()) + .unwrap_or(request.uri().path()); + let api = original.contains("/api/v1/") || original.ends_with("/api/v1"); + if !api + && session(&state.db, request.headers()) + .await + .ok() + .flatten() + .and_then(|r| r.get::, _>("user_id")) + .is_none() + { + match crate::laravel_sessions::authenticate(&state, request.headers()).await { + Ok(Some(legacy)) if legacy.user.is_some() => { + if !matches!( + *request.method(), + Method::GET | Method::HEAD | Method::OPTIONS + ) && !crate::laravel_sessions::csrf_valid(&state, request.headers(), &legacy) + { + return error(csrf_status(), "CSRF token mismatch"); + } + let user = legacy.user.clone().unwrap(); + match active(&state, user.id).await { + Ok(true) => (), + Ok(false) => { + let _ = crate::laravel_sessions::destroy(&state, &legacy).await; + return error(StatusCode::IM_A_TEAPOT, "inactivity detected"); + } + Err(e) => return e.into_response(), + } + if let Err(e) = crate::laravel_sessions::touch(&state, &legacy).await { + return e.into_response(); + } + request.extensions_mut().insert(user); + return next.run(request).await; + } + Ok(_) => (), + Err(e) => return e.into_response(), + } + } + let native = match session(&state.db, request.headers()).await { + Ok(value) => value, + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + }; + // Once imported, the native browser session is authoritative. A fresh + // Passport cookie must not force CSRF headers onto read-only native calls. + if native + .as_ref() + .is_none_or(|row| row.get::, _>("user_id").is_none()) + { + match crate::passport::cookie_authenticate(&state, request.headers()).await { + Ok(Some(user)) => { + match active(&state, user.id).await { + Ok(true) => (), + Ok(false) => return error(StatusCode::IM_A_TEAPOT, "inactivity detected"), + Err(e) => return e.into_response(), + } + request.extensions_mut().insert(user); + return next.run(request).await; + } + Ok(None) => (), + Err(e) => return e.into_response(), + } + } + let Some(row) = native else { + return error(StatusCode::UNAUTHORIZED, "Unauthenticated."); + }; + let Some(id) = row.get::, _>("user_id") else { + return error(StatusCode::UNAUTHORIZED, "Unauthenticated."); + }; + let Some(admin) = row.get::, _>("is_admin") else { + return error(StatusCode::UNAUTHORIZED, "Unauthenticated."); + }; + if !matches!( + *request.method(), + Method::GET | Method::HEAD | Method::OPTIONS + ) && !csrf_valid(request.headers(), row.get("csrf_hash")) + { + return error(csrf_status(), "CSRF token mismatch"); + } + match active(&state, id).await { + Ok(true) => (), + Ok(false) => { + let _ = sqlx::query("DELETE FROM rust_sessions WHERE token_hash=?") + .bind(row.get::("token_hash")) + .execute(&state.db) + .await; + return error(StatusCode::IM_A_TEAPOT, "inactivity detected"); + } + Err(e) => return e.into_response(), + } + if sqlx::query("UPDATE rust_sessions SET expires_at=? WHERE token_hash=?") + .bind(now() + TTL) + .bind(row.get::("token_hash")) + .execute(&state.db) + .await + .is_err() + { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + request.extensions_mut().insert(AuthUser { + id, + is_admin: admin, + }); + let mut response = next.run(request).await; + response + .headers_mut() + .insert(header::CACHE_CONTROL, HeaderValue::from_static("no-store")); + response +} +async fn active(state: &AppState, id: i64) -> Result { + let row = sqlx::query("SELECT preferences,last_seen_at FROM users WHERE id=?") + .bind(id) + .fetch_one(&state.db) + .await?; + let raw: Option = row.try_get("preferences")?; + let prefs = crate::settings::preferences_from(raw.as_deref()); + let minutes = prefs["kickUserAfter"] + .as_i64() + .or_else(|| prefs["kickUserAfter"].as_str().and_then(|v| v.parse().ok())) + .unwrap_or(0); + let last: Option = row.try_get("last_seen_at")?; + let inactive = last + .as_deref() + .and_then(|v| { + chrono::NaiveDateTime::parse_from_str(v, "%Y-%m-%d %H:%M:%S%.f") + .ok() + .map(|v| v.and_utc().timestamp()) + .or_else(|| { + chrono::DateTime::parse_from_rfc3339(v) + .ok() + .map(|v| v.timestamp()) + }) + }) + .is_some_and(|last| minutes > 0 && (now() - last).abs() > minutes.saturating_mul(60)); + sqlx::query("UPDATE users SET last_seen_at=CURRENT_TIMESTAMP WHERE id=?") + .bind(id) + .execute(&state.db) + .await?; + Ok(!inactive) +} +pub async fn refresh_csrf(State(state): State, headers: HeaderMap) -> Response { + // Bound anonymous bootstrap traffic and discard expired experimental records. + match throttle_limit(&state.db, "csrf-bootstrap-global".into(), 120).await { + Ok(true) => (), + Ok(false) => return error(StatusCode::TOO_MANY_REQUESTS, "Too many session requests"), + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + } + if sqlx::query("DELETE FROM rust_sessions WHERE expires_at<=?") + .bind(now()) + .execute(&state.db) + .await + .is_err() + || sqlx::query("DELETE FROM rust_login_attempts WHERE window v, + Err(e) => return e.into_response(), + }; + let legacy_user = legacy_session + .as_ref() + .and_then(|v| v.user.as_ref()) + .map(|u| u.id) + .or( + crate::passport::cookie_authenticate(&state, &legacy_headers) + .await + .ok() + .flatten() + .map(|u| u.id), + ); + let csrf = random(); + let old = match session(&state.db, &headers).await { + Ok(v) => v, + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + }; + let (sid, result) = if let Some(ref row) = old + && row.get::, _>("user_id").is_none() + && legacy_user.is_some() + { + // Import is an authentication transition. Never promote an existing + // anonymous SID that could have been planted in another browser. + let sid = random(); + let result = async { + let mut tx = state.db.begin().await?; + let deleted = sqlx::query("DELETE FROM rust_sessions WHERE token_hash=? AND user_id IS NULL AND expires_at>?") + .bind(row.get::("token_hash")).bind(now()).execute(&mut *tx).await?; + if deleted.rows_affected() != 1 {return Err(sqlx::Error::RowNotFound);} + let inserted = sqlx::query("INSERT INTO rust_sessions(token_hash,user_id,csrf_hash,expires_at) VALUES(?,?,?,?)") + .bind(digest(&sid)).bind(legacy_user).bind(digest(&csrf)).bind(now()+TTL).execute(&mut *tx).await?; + tx.commit().await?; + Ok(inserted) + }.await; + (sid, result) + } else if let Some(row) = old { + let sid = token(&headers).unwrap(); + let result = + sqlx::query("UPDATE rust_sessions SET csrf_hash=?,user_id=COALESCE(user_id,?) WHERE token_hash=? AND expires_at>?") + .bind(digest(&csrf)) + .bind(legacy_user) + .bind(row.get::("token_hash")) + .bind(now()) + .execute(&state.db) + .await; + (sid, result) + } else { + let sid = random(); + let result = sqlx::query( + "INSERT INTO rust_sessions(token_hash,user_id,csrf_hash,expires_at) VALUES (?,?,?,?)", + ) + .bind(digest(&sid)) + .bind(legacy_user) + .bind(digest(&csrf)) + .bind(now() + TTL) + .execute(&state.db) + .await; + (sid, result) + }; + if result.is_err() { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + let mut response = csrf.clone().into_response(); + response.headers_mut().insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=UTF-8"), + ); + cookies(&mut response, &sid, &csrf, TTL); + if legacy_user.is_some() { + if let Some(legacy) = legacy_session.as_ref() + && let Err(e) = crate::laravel_sessions::destroy(&state, legacy).await + { + return e.into_response(); + } + clear_legacy_cookie(&mut response); + clear_laravel_session_cookies(&mut response); + } + response +} +#[derive(Deserialize)] +struct Credentials { + email: String, + password: String, +} +async fn throttle(db: &SqlitePool, key: String) -> Result { + throttle_limit(db, key, 10).await +} +pub(crate) async fn throttle_limit( + db: &SqlitePool, + key: String, + limit: i64, +) -> Result { + let count:i64=sqlx::query_scalar("INSERT INTO rust_login_attempts(key,window,attempts) VALUES (?,?,1) ON CONFLICT(key) DO UPDATE SET attempts=CASE WHEN window=excluded.window THEN attempts+1 ELSE 1 END, window=excluded.window RETURNING attempts") + .bind(digest(&key)).bind(now()/60).fetch_one(db).await?; + Ok(count <= limit) +} +pub(crate) fn verify(password: String, hash: String) -> bool { + if hash.starts_with("$2") { + bcrypt::verify(password, &hash).unwrap_or(false) + } else { + use argon2::{PasswordHash, PasswordVerifier}; + PasswordHash::new(&hash).ok().is_some_and(|parsed| { + argon2::Argon2::default() + .verify_password(password.as_bytes(), &parsed) + .is_ok() + }) + } +} +async fn login(State(state): State, request: Request) -> Response { + let (parts, body) = request.into_parts(); + let audit_context = crate::auth_audit::Context::from_parts(&parts); + let row = match session(&state.db, &parts.headers).await { + Ok(Some(row)) => row, + Ok(None) => return error(csrf_status(), "Fetch /refresh-csrf first"), + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + }; + if !csrf_valid(&parts.headers, row.get("csrf_hash")) { + return error(csrf_status(), "CSRF token mismatch"); + } + // ConnectInfo is the direct socket peer. Forwarded and X-Forwarded-For are never trusted. + let ip = parts + .extensions + .get::>() + .map(|p| p.0.ip().to_string()) + .unwrap_or_else(|| "unknown-peer".into()); + match throttle(&state.db, format!("peer:{ip}")).await { + Ok(true) => (), + Ok(false) => return error(StatusCode::TOO_MANY_REQUESTS, "Too many login attempts"), + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + } + let bytes = match to_bytes(body, 16 * 1024).await { + Ok(v) => v, + Err(_) => return error(StatusCode::PAYLOAD_TOO_LARGE, "Invalid login body"), + }; + let content = parts + .headers + .get(header::CONTENT_TYPE) + .and_then(|v| v.to_str().ok()) + .unwrap_or(""); + let credentials: Credentials = match if content.starts_with("application/json") { + serde_json::from_slice(&bytes).map_err(|_| ()) + } else if content.starts_with("application/x-www-form-urlencoded") { + serde_urlencoded::from_bytes(&bytes).map_err(|_| ()) + } else { + Err(()) + } { + Ok(v) => v, + Err(_) => { + return error( + StatusCode::UNPROCESSABLE_ENTITY, + "Email and password are required", + ); + } + }; + if credentials.email.len() > 254 + || credentials.password.len() > 4096 + || credentials.password.is_empty() + { + return error(StatusCode::UNPROCESSABLE_ENTITY, "Invalid credentials"); + } + match throttle( + &state.db, + format!("email:{}", credentials.email.to_lowercase()), + ) + .await + { + Ok(true) => (), + Ok(false) => return error(StatusCode::TOO_MANY_REQUESTS, "Too many login attempts"), + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + } + let user=match sqlx::query("SELECT id,name,email,password,is_admin,preferences,oauth_provider FROM users WHERE email=?").bind(credentials.email.to_lowercase()).fetch_optional(&state.db).await { Ok(v)=>v,Err(_)=>return error(StatusCode::SERVICE_UNAVAILABLE,"Authentication unavailable") }; + // A valid dummy hash ensures unknown accounts still perform password work off the async executor. + let hash = user + .as_ref() + .map(|u| u.get::("password")) + .unwrap_or_else(|| { + "$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6Ttxj9I7gX7dc5BLyO2NLzO5h3Wmi".to_owned() + }); + static HASH_SLOTS: std::sync::OnceLock> = + std::sync::OnceLock::new(); + let slots = HASH_SLOTS + .get_or_init(|| std::sync::Arc::new(tokio::sync::Semaphore::new(4))) + .clone(); + let permit = match slots.try_acquire_owned() { + Ok(p) => p, + Err(_) => return error(StatusCode::TOO_MANY_REQUESTS, "Authentication busy"), + }; + let valid = tokio::task::spawn_blocking(move || { + let _permit = permit; + verify(credentials.password, hash) + }) + .await + .unwrap_or(false); + if !valid + && let Some(user) = user.as_ref() + && crate::auth_audit::failed(&state, user.get("id"), &audit_context, Some("password")) + .await + .is_err() + { + tracing::error!("Failed-login audit persistence failed"); + } + let Some(user) = user.filter(|_| valid) else { + return error( + StatusCode::UNAUTHORIZED, + "These credentials do not match our records", + ); + }; + let admin: bool = user.get("is_admin"); + let raw_preferences = user.get::, _>("preferences"); + let preferences = crate::settings::preferences_from(raw_preferences.as_deref()); + if preferences["useWebauthnOnly"].as_bool() == Some(true) { + return error( + StatusCode::UNAUTHORIZED, + "These credentials do not match our records", + ); + } + let app_settings = match crate::settings::regular_settings(&state.db).await { + Ok(v) => v, + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + }; + if app_settings["useSsoOnly"].as_bool() == Some(true) && !admin { + return error(StatusCode::FORBIDDEN, "Password login is disabled"); + } + let sid = random(); + let csrf = random(); + let mut tx = match state.db.begin().await { + Ok(v) => v, + Err(_) => { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + }; + // Delete the old session atomically; concurrent requests using it cannot both log in. + let deleted = sqlx::query("DELETE FROM rust_sessions WHERE token_hash=? AND expires_at>?") + .bind(row.get::("token_hash")) + .bind(now()) + .execute(&mut *tx) + .await; + if !matches!(deleted,Ok(ref v) if v.rows_affected()==1) { + return error(csrf_status(), "Session expired"); + } + if sqlx::query("UPDATE users SET last_seen_at=CURRENT_TIMESTAMP WHERE id=?") + .bind(user.get::("id")) + .execute(&mut *tx) + .await + .is_err() + { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + if sqlx::query( + "INSERT INTO rust_sessions(token_hash,user_id,csrf_hash,expires_at) VALUES (?,?,?,?)", + ) + .bind(digest(&sid)) + .bind(user.get::("id")) + .bind(digest(&csrf)) + .bind(now() + TTL) + .execute(&mut *tx) + .await + .is_err() + || tx.commit().await.is_err() + { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + // The request still carries the old cookies, so the newly issued SID is + // unaffected while stale PHP sessions and recallers are revoked. + if let Err(e) = invalidate_browser(&state, &parts.headers).await { + return e.into_response(); + } + if crate::auth_audit::login(&state, user.get("id"), &audit_context, Some("password")) + .await + .is_err() + { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + let mut response=Json(json!({"message":"authenticated","id":user.get::("id"),"name":user.get::("name"),"email":user.get::("email"),"is_admin":admin,"preferences":preferences,"oauth_provider":user.get::,_>("oauth_provider"),"appSettings":app_settings})).into_response(); + cookies(&mut response, &sid, &csrf, TTL); + clear_legacy_cookie(&mut response); + clear_laravel_session_cookies(&mut response); + response +} +async fn logout(State(state): State, request: Request) -> Response { + let context = crate::auth_audit::Context::from_request(&request); + let headers = request.headers(); + let user = match browser_user(&state, headers).await { + Ok(Some(user)) => user, + Ok(None) => return error(StatusCode::UNAUTHORIZED, "Unauthenticated."), + Err(e) => return e.into_response(), + }; + let csrf = match session(&state.db, headers).await { + Ok(Some(row)) => csrf_valid(headers, row.get("csrf_hash")), + Ok(None) => match crate::laravel_sessions::authenticate(&state, headers).await { + Ok(Some(v)) => crate::laravel_sessions::csrf_valid(&state, headers, &v), + _ => false, + }, + Err(_) => false, + }; + if !csrf { + return error(csrf_status(), "CSRF token mismatch"); + } + if let Err(e) = invalidate_browser(&state, headers).await { + return e.into_response(); + } + if crate::auth_audit::logout(&state, user.id, &context, None) + .await + .is_err() + { + return error( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ); + } + let mut response = Json(json!({"message":"signed out"})).into_response(); + cookies(&mut response, "", "", 0); + clear_legacy_cookie(&mut response); + clear_laravel_session_cookies(&mut response); + response +} + +#[cfg(test)] +mod tests { + // Password handlers deliberately reject overload; keep integration logins + // deterministic instead of competing for the process-wide hash semaphore. + static LOGIN_TEST_LOCK: tokio::sync::Mutex<()> = tokio::sync::Mutex::const_new(()); + use super::*; + #[test] + fn session_cookie_parsing() { + let mut h = HeaderMap::new(); + h.insert( + header::COOKIE, + HeaderValue::from_str(&format!("{COOKIE}={}", "a".repeat(64))).unwrap(), + ); + assert_eq!(token(&h), Some("a".repeat(64))); + h.append( + header::COOKIE, + HeaderValue::from_str(&format!("{COOKIE}={}", "b".repeat(64))).unwrap(), + ); + assert!(token(&h).is_none()); + } + #[test] + fn csrf_is_bound_to_session() { + let mut h = HeaderMap::new(); + h.insert( + "x-csrf-token", + HeaderValue::from_static( + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + ), + ); + assert!(csrf_valid(&h, &digest(&"a".repeat(64)))); + assert!(!csrf_valid(&h, &digest(&"b".repeat(64)))); + } + #[tokio::test] + async fn throttling_is_atomic_and_persistent() { + let db = SqlitePool::connect("sqlite::memory:").await.unwrap(); + init(&db).await.unwrap(); + for _ in 0..10 { + assert!(throttle(&db, "test".into()).await.unwrap()); + } + assert!(!throttle(&db, "test".into()).await.unwrap()); + } + #[test] + fn verifies_laravel_bcrypt() { + let hash = bcrypt::hash("correct", 4) + .unwrap() + .replacen("$2b$", "$2y$", 1); + assert!(verify("correct".into(), hash.clone())); + assert!(!verify("incorrect".into(), hash)); + } + #[test] + fn verifies_argon2() { + use argon2::{ + PasswordHasher, + password_hash::{SaltString, rand_core::OsRng}, + }; + let salt = SaltString::generate(&mut OsRng); + let hash = argon2::Argon2::default() + .hash_password(b"correct", &salt) + .unwrap() + .to_string(); + assert!(verify("correct".into(), hash.clone())); + assert!(!verify("incorrect".into(), hash)); + } + async fn setup() -> (AppState, Router) { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + crate::db::init(&db).await.unwrap(); + init(&db).await.unwrap(); + let hash = bcrypt::hash("correct", 4).unwrap(); + sqlx::query( + "INSERT INTO users(id,name,email,password) VALUES(1,'Alice','alice@example.com',?)", + ) + .bind(hash) + .execute(&db) + .await + .unwrap(); + let state = AppState { + db, + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let app = crate::router(state.clone()); + (state, app) + } + #[tokio::test] + async fn legacy_import_rotates_anonymous_session_instead_of_promoting_it() { + let (mut state, app) = setup().await; + let (anonymous, _) = bootstrap(app).await; + state.cipher = Some( + crate::crypto::LaravelCipher::from_app_key("0123456789abcdef0123456789abcdef") + .unwrap() + .into(), + ); + sqlx::query("UPDATE users SET remember_token='remember-fixture' WHERE id=1") + .execute(&state.db) + .await + .unwrap(); + let name = crate::laravel_sessions::recaller_name(); + let recaller = state + .cipher + .as_ref() + .unwrap() + .encrypt_cookie(&name, "1|remember-fixture|unused") + .unwrap(); + let mut headers = HeaderMap::new(); + headers.insert( + header::COOKIE, + HeaderValue::from_str(&format!("{anonymous}; {name}={recaller}")).unwrap(), + ); + let response = refresh_csrf(State(state.clone()), headers.clone()).await; + assert_eq!(response.status(), StatusCode::OK); + let imported = cookie(&response); + assert_ne!(imported, anonymous); + assert!(session(&state.db, &headers).await.unwrap().is_none()); + headers.insert(header::COOKIE, HeaderValue::from_str(&imported).unwrap()); + assert_eq!( + session(&state.db, &headers) + .await + .unwrap() + .unwrap() + .get::, _>("user_id"), + Some(1) + ); + } + #[tokio::test] + async fn invalidation_revokes_native_and_stale_recaller_users() { + let (mut state, _) = setup().await; + state.cipher = Some( + crate::crypto::LaravelCipher::from_app_key("0123456789abcdef0123456789abcdef") + .unwrap() + .into(), + ); + sqlx::query("UPDATE users SET remember_token='native-remember' WHERE id=1") + .execute(&state.db) + .await + .unwrap(); + sqlx::query("INSERT INTO users(id,name,email,password,remember_token) VALUES(2,'Bob','bob@example.com','unused','legacy-remember')").execute(&state.db).await.unwrap(); + let sid = random(); + sqlx::query( + "INSERT INTO rust_sessions(token_hash,user_id,csrf_hash,expires_at) VALUES(?,1,?,?)", + ) + .bind(digest(&sid)) + .bind(digest("csrf")) + .bind(now() + TTL) + .execute(&state.db) + .await + .unwrap(); + let name = crate::laravel_sessions::recaller_name(); + let recaller = state + .cipher + .as_ref() + .unwrap() + .encrypt_cookie(&name, "2|legacy-remember|unused") + .unwrap(); + let mut headers = HeaderMap::new(); + headers.insert( + header::COOKIE, + HeaderValue::from_str(&format!("{COOKIE}={sid}; {name}={recaller}")).unwrap(), + ); + invalidate_browser(&state, &headers).await.unwrap(); + assert!(session(&state.db, &headers).await.unwrap().is_none()); + assert!( + crate::laravel_sessions::authenticate(&state, &headers) + .await + .unwrap() + .is_none() + ); + let tokens: Vec = + sqlx::query_scalar("SELECT remember_token FROM users ORDER BY id") + .fetch_all(&state.db) + .await + .unwrap(); + assert_ne!(tokens[0], "native-remember"); + assert_ne!(tokens[1], "legacy-remember"); + } + async fn request( + app: Router, + method: &str, + path: &str, + cookie: Option<&str>, + csrf: Option<&str>, + body: serde_json::Value, + ) -> Response { + use tower::ServiceExt; + let mut builder = axum::http::Request::builder() + .method(method) + .uri(path) + .header("content-type", "application/json"); + if let Some(cookie) = cookie { + builder = builder.header("cookie", cookie); + } + if let Some(csrf) = csrf { + builder = builder.header("x-csrf-token", csrf); + } + app.oneshot( + builder + .body(axum::body::Body::from(body.to_string())) + .unwrap(), + ) + .await + .unwrap() + } + fn cookie(response: &Response) -> String { + response + .headers() + .get_all(header::SET_COOKIE) + .iter() + .filter_map(|v| v.to_str().ok()) + .find(|v| v.starts_with(COOKIE)) + .unwrap() + .split(';') + .next() + .unwrap() + .to_owned() + } + async fn bootstrap(app: Router) -> (String, String) { + let response = request(app, "GET", "/refresh-csrf", None, None, json!(null)).await; + assert_eq!(response.status(), StatusCode::OK); + let c = cookie(&response); + assert!( + response + .headers() + .get(header::SET_COOKIE) + .unwrap() + .to_str() + .unwrap() + .contains("HttpOnly") + ); + let csrf = String::from_utf8(to_bytes(response.into_body(), 1024).await.unwrap().to_vec()) + .unwrap(); + (c, csrf) + } + async fn login_as(app: Router, email: &str, password: &str) -> Response { + let (c, csrf) = bootstrap(app.clone()).await; + request( + app, + "POST", + "/user/login", + Some(&c), + Some(&csrf), + json!({"email":email,"password":password}), + ) + .await + } + #[tokio::test] + async fn public_login_failure_success_and_logout_write_audit_history() { + use tower::ServiceExt; + let _test_guard = LOGIN_TEST_LOCK.lock().await; + let (state, app) = setup().await; + let (anonymous, csrf) = bootstrap(app.clone()).await; + let send = + |method: &str, path: &str, cookie: &str, csrf: &str, payload: serde_json::Value| { + let request = axum::http::Request::builder() + .method(method) + .uri(path) + .header("content-type", "application/json") + .header("cookie", cookie) + .header("x-csrf-token", csrf) + .header("user-agent", "Public audit fixture/1.0") + .header("x-forwarded-for", "198.51.100.123") + .extension(ConnectInfo( + "127.0.0.1:43210".parse::().unwrap(), + )) + .body(axum::body::Body::from(payload.to_string())) + .unwrap(); + app.clone().oneshot(request) + }; + let failed = send( + "POST", + "/user/login", + &anonymous, + &csrf, + json!({"email":"alice@example.com","password":"wrong"}), + ) + .await + .unwrap(); + assert_eq!(failed.status(), StatusCode::UNAUTHORIZED); + let login = send( + "POST", + "/user/login", + &anonymous, + &csrf, + json!({"email":"alice@example.com","password":"correct"}), + ) + .await + .unwrap(); + assert_eq!(login.status(), StatusCode::OK); + let authenticated = cookie(&login); + let new_csrf = login + .headers() + .get_all(header::SET_COOKIE) + .iter() + .filter_map(|h| h.to_str().ok()) + .find_map(|h| { + h.strip_prefix("XSRF-TOKEN=") + .and_then(|h| h.split(';').next()) + }) + .unwrap() + .to_owned(); + assert_eq!( + send("POST", "/user/logout", &authenticated, &new_csrf, json!({})) + .await + .unwrap() + .status(), + StatusCode::OK + ); + let rows = sqlx::query("SELECT * FROM auth_logs WHERE authenticatable_id=1 ORDER BY id") + .fetch_all(&state.db) + .await + .unwrap(); + assert_eq!(rows.len(), 2); + assert!(!rows[0].get::("login_successful")); + assert!(rows[1].get::("login_successful")); + assert!(rows[1].get::, _>("logout_at").is_some()); + for row in rows { + assert_eq!(row.get::("ip_address"), "127.0.0.1"); + assert_eq!( + row.get::("user_agent"), + "Public audit fixture/1.0" + ); + assert_eq!(row.get::("guard"), "web-guard"); + assert_eq!(row.get::("login_method"), "password"); + } + } + #[tokio::test] + async fn cookie_login_rotation_crud_csrf_logout_and_expiration() { + let _test_guard = LOGIN_TEST_LOCK.lock().await; + let (state, app) = setup().await; + assert_eq!( + request( + app.clone(), + "GET", + "/api/v1/twofaccounts", + None, + None, + json!(null) + ) + .await + .status(), + StatusCode::UNAUTHORIZED + ); + assert_eq!( + request( + app.clone(), + "POST", + "/user/login", + None, + None, + json!({"email":"alice@example.com","password":"correct"}) + ) + .await + .status(), + csrf_status() + ); + let (anonymous, csrf) = bootstrap(app.clone()).await; + let response = request( + app.clone(), + "POST", + "/user/login", + Some(&anonymous), + Some(&csrf), + json!({"email":"ALICE@example.com","password":"correct"}), + ) + .await; + assert_eq!(response.status(), StatusCode::OK); + let session = cookie(&response); + let new_csrf = response + .headers() + .get_all(header::SET_COOKIE) + .iter() + .filter_map(|h| h.to_str().ok()) + .find_map(|h| { + h.strip_prefix("XSRF-TOKEN=") + .and_then(|h| h.split(';').next()) + }) + .unwrap() + .to_owned(); + assert_ne!(session, anonymous); + let payload: serde_json::Value = + serde_json::from_slice(&to_bytes(response.into_body(), 64 * 1024).await.unwrap()) + .unwrap(); + assert!(payload.get("csrf_token").is_none()); + assert_ne!(new_csrf, csrf); + assert_eq!( + request( + app.clone(), + "GET", + "/api/v1/twofaccounts", + Some(&anonymous), + None, + json!(null) + ) + .await + .status(), + StatusCode::UNAUTHORIZED + ); + assert_eq!( + request( + app.clone(), + "GET", + "/api/v1/twofaccounts", + Some(&session), + None, + json!(null) + ) + .await + .status(), + StatusCode::OK + ); + let account = json!({"otp_type":"totp","account":"alice","secret":"GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ","digits":6,"algorithm":"sha1","period":30}); + assert_eq!( + request( + app.clone(), + "POST", + "/api/v1/twofaccounts", + Some(&session), + None, + account.clone() + ) + .await + .status(), + csrf_status() + ); + assert_eq!( + request( + app.clone(), + "POST", + "/api/v1/twofaccounts", + Some(&session), + Some(&csrf), + account.clone() + ) + .await + .status(), + csrf_status() + ); + assert_eq!( + request( + app.clone(), + "POST", + "/api/v1/twofaccounts", + Some(&session), + Some(&new_csrf), + account + ) + .await + .status(), + StatusCode::CREATED + ); + let plain = session.split_once('=').unwrap().1; + let stored: String = + sqlx::query_scalar("SELECT token_hash FROM rust_sessions WHERE user_id=1") + .fetch_one(&state.db) + .await + .unwrap(); + assert_eq!(stored, digest(plain)); + assert_ne!(stored, plain); + assert_eq!( + request( + app.clone(), + "POST", + "/user/logout", + Some(&session), + None, + json!(null) + ) + .await + .status(), + csrf_status() + ); + assert_eq!( + request( + app.clone(), + "GET", + "/user/logout", + Some(&session), + None, + json!(null) + ) + .await + .status(), + csrf_status() + ); + assert_eq!( + request( + app.clone(), + "GET", + "/user/logout", + Some(&session), + Some(&new_csrf), + json!(null) + ) + .await + .status(), + StatusCode::OK + ); + assert_eq!( + request( + app.clone(), + "GET", + "/api/v1/twofaccounts", + Some(&session), + None, + json!(null) + ) + .await + .status(), + StatusCode::UNAUTHORIZED + ); + let response = login_as(app.clone(), "alice@example.com", "correct").await; + assert_eq!(response.status(), StatusCode::OK); + let expired = cookie(&response); + sqlx::query("UPDATE rust_sessions SET expires_at=0") + .execute(&state.db) + .await + .unwrap(); + assert_eq!( + request( + app, + "GET", + "/api/v1/twofaccounts", + Some(&expired), + None, + json!(null) + ) + .await + .status(), + StatusCode::UNAUTHORIZED + ); + } + #[tokio::test] + async fn respects_existing_sso_and_webauthn_only_accounts() { + let _test_guard = LOGIN_TEST_LOCK.lock().await; + let (state, app) = setup().await; + sqlx::query("INSERT INTO options(key,value) VALUES('useSsoOnly','{{1}}')") + .execute(&state.db) + .await + .unwrap(); + assert_eq!( + login_as(app.clone(), "alice@example.com", "correct") + .await + .status(), + StatusCode::FORBIDDEN + ); + sqlx::query("UPDATE users SET is_admin=1") + .execute(&state.db) + .await + .unwrap(); + assert_eq!( + login_as(app.clone(), "alice@example.com", "correct") + .await + .status(), + StatusCode::OK + ); + sqlx::query("UPDATE users SET preferences='{\"useWebauthnOnly\":true}'") + .execute(&state.db) + .await + .unwrap(); + assert_eq!( + login_as(app, "alice@example.com", "correct").await.status(), + StatusCode::UNAUTHORIZED + ); + } + #[tokio::test] + async fn password_login_is_throttled_without_proxy_trust() { + let _test_guard = LOGIN_TEST_LOCK.lock().await; + let (_state, app) = setup().await; + let (c, csrf) = bootstrap(app.clone()).await; + for _ in 0..10 { + assert_eq!( + request( + app.clone(), + "POST", + "/user/login", + Some(&c), + Some(&csrf), + json!({"email":"alice@example.com","password":"wrong"}) + ) + .await + .status(), + StatusCode::UNAUTHORIZED + ); + } + assert_eq!( + request( + app, + "POST", + "/user/login", + Some(&c), + Some(&csrf), + json!({"email":"alice@example.com","password":"correct"}) + ) + .await + .status(), + StatusCode::TOO_MANY_REQUESTS + ); + } + + #[tokio::test] + async fn accepts_frontend_xsrf_header_and_urlencoded_credentials() { + let _test_guard = LOGIN_TEST_LOCK.lock().await; + use tower::ServiceExt; + let (state, app) = setup().await; + let (c, csrf) = bootstrap(app.clone()).await; + let req = axum::http::Request::builder() + .method("POST") + .uri("/user/login") + .header("cookie", c) + .header("x-xsrf-token", csrf) + .header("content-type", "application/x-www-form-urlencoded") + .body(axum::body::Body::from( + "email=alice%40example.com&password=correct", + )) + .unwrap(); + let response = app.oneshot(req).await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let seen: Option = sqlx::query_scalar("SELECT last_seen_at FROM users WHERE id=1") + .fetch_one(&state.db) + .await + .unwrap(); + assert!(seen.is_some()); + } + #[tokio::test] + async fn spoofing_forwarded_headers_does_not_reset_peer_throttle() { + let _test_guard = LOGIN_TEST_LOCK.lock().await; + use tower::ServiceExt; + let (_state, app) = setup().await; + let (c, csrf) = bootstrap(app.clone()).await; + for i in 1..=11 { + let req = axum::http::Request::builder() + .method("POST") + .uri("/user/login") + .header("cookie", &c) + .header("x-csrf-token", &csrf) + .header("x-forwarded-for", format!("203.0.113.{i}")) + .header("forwarded", format!("for=203.0.113.{i}")) + .header("content-type", "application/json") + .body(axum::body::Body::from( + json!({"email":"alice@example.com","password":"incorrect"}).to_string(), + )) + .unwrap(); + let response = app.clone().oneshot(req).await.unwrap(); + assert_eq!( + response.status(), + if i <= 10 { + StatusCode::UNAUTHORIZED + } else { + StatusCode::TOO_MANY_REQUESTS + } + ); + } + } +} diff --git a/src/auth_audit.rs b/src/auth_audit.rs new file mode 100644 index 0000000..3c7da82 --- /dev/null +++ b/src/auth_audit.rs @@ -0,0 +1,214 @@ +//! Authentication event persistence and preference-controlled notifications. +use crate::{AppState, mail, settings, users}; +use axum::{ + extract::{ConnectInfo, Request}, + http::{HeaderMap, request::Parts}, +}; +use chrono::{DateTime, NaiveDateTime, Utc}; +use serde_json::Value; +use sqlx::Row; +use std::net::SocketAddr; + +#[derive(Clone, Debug)] +pub struct Context { + pub ip: Option, + pub user_agent: Option, + pub locale: String, + pub guard: String, +} +impl Context { + pub fn from_headers(headers: &HeaderMap, peer: Option) -> Self { + let locale = headers + .get("accept-language") + .and_then(|h| h.to_str().ok()) + .and_then(|h| h.split(',').next()) + .and_then(|h| h.split(';').next()) + .unwrap_or("en") + .trim() + .to_owned(); + Self { + ip: peer.map(|p| p.ip().to_string()), + user_agent: headers + .get("user-agent") + .and_then(|h| h.to_str().ok()) + .map(str::to_owned), + locale, + guard: "web-guard".into(), + } + } + pub fn from_parts(parts: &Parts) -> Self { + Self::from_headers( + &parts.headers, + parts + .extensions + .get::>() + .map(|p| p.0), + ) + } + pub fn from_request(request: &Request) -> Self { + Self::from_headers( + request.headers(), + request + .extensions() + .get::>() + .map(|p| p.0), + ) + } +} +fn notification_enabled(success: bool, known: bool, new_user: bool, prefs: &Value) -> bool { + if success { + !known && !new_user && settings::php_bool(&prefs["notifyOnNewAuthDevice"]) + } else { + settings::php_bool(&prefs["notifyOnFailedLogin"]) + } +} +fn parse_date(raw: &str) -> Option> { + DateTime::parse_from_rfc3339(raw) + .ok() + .map(|d| d.with_timezone(&Utc)) + .or_else(|| { + NaiveDateTime::parse_from_str(raw, "%Y-%m-%d %H:%M:%S%.f") + .ok() + .map(|d| d.and_utc()) + }) +} +async fn access( + s: &AppState, + id: i64, + ctx: &Context, + method: Option<&str>, + successful: bool, +) -> Result<(), sqlx::Error> { + let mut tx = s.db.begin().await?; + // Serialize the known-device check with insertion so concurrent logins send one alert. + sqlx::query("UPDATE users SET last_seen_at=last_seen_at WHERE id=?") + .bind(id) + .execute(&mut *tx) + .await?; + let user = sqlx::query("SELECT name,email,preferences,created_at FROM users WHERE id=?") + .bind(id) + .fetch_one(&mut *tx) + .await?; + let known:bool=sqlx::query_scalar("SELECT EXISTS(SELECT 1 FROM auth_logs WHERE authenticatable_id=? AND authenticatable_type='App\\Models\\User' AND ip_address IS ? AND user_agent IS ? AND guard=? AND login_successful=1)").bind(id).bind(&ctx.ip).bind(&ctx.user_agent).bind(&ctx.guard).fetch_one(&mut *tx).await?; + let raw: Option = user.try_get("preferences")?; + let prefs = settings::preferences_from(raw.as_deref()); + let created: Option = user.try_get("created_at")?; + let new_user = created + .as_deref() + .and_then(parse_date) + .is_none_or(|d| (Utc::now() - d).num_seconds().unsigned_abs() < 60); + sqlx::query("INSERT INTO auth_logs(authenticatable_type,authenticatable_id,ip_address,user_agent,login_at,login_successful,guard,login_method) VALUES('App\\Models\\User',?,?,?,CURRENT_TIMESTAMP,?,?,?)").bind(id).bind(&ctx.ip).bind(&ctx.user_agent).bind(successful).bind(&ctx.guard).bind(method).execute(&mut *tx).await?; + tx.commit().await?; + if notification_enabled(successful, known, new_user, &prefs) { + let locale = prefs["lang"] + .as_str() + .filter(|s| *s != "browser") + .unwrap_or(&ctx.locale); + let kind = if successful { + "new_device" + } else { + "failed_login" + }; + let tr = |suffix: &str| { + mail::translate( + locale, + &format!("message.notifications.{kind}.{suffix}"), + &[], + ) + }; + let name: String = user.try_get("name")?; + let email: String = user.try_get("email")?; + let hello = mail::translate( + locale, + "message.notifications.hello_user", + &[("username", &name)], + ); + let (browser, platform, _) = users::agent(ctx.user_agent.as_deref().unwrap_or("")); + let device = mail::translate( + locale, + "message.browser_on_platform", + &[ + ("browser", browser.as_str().unwrap_or("")), + ("platform", platform.as_str().unwrap_or("")), + ], + ); + let now = Utc::now().format("%A, %d-%b-%Y %H:%M:%S UTC").to_string(); + let body = format!( + "{hello}\n\n{}\n{}:\n\n{}: {now}\n{}: {}\n{}: {device}\n\n{}\n\n{},\n{}", + tr("resume"), + tr("connection_details"), + mail::translate(locale, "label.time", &[]), + mail::translate(locale, "label.ip_address", &[]), + ctx.ip.as_deref().unwrap_or(""), + mail::translate(locale, "label.device", &[]), + tr("recommandations"), + mail::translate(locale, "message.notifications.regards", &[]), + std::env::var("APP_NAME").unwrap_or_else(|_| "2FAuth".into()) + ); + if mail::notify(&email, &tr("subject"), &body).await.is_err() { + tracing::warn!("Authentication notification delivery failed"); + } + } + Ok(()) +} +pub async fn login( + s: &AppState, + id: i64, + ctx: &Context, + method: Option<&str>, +) -> Result<(), sqlx::Error> { + access(s, id, ctx, method, true).await +} +pub async fn failed( + s: &AppState, + id: i64, + ctx: &Context, + method: Option<&str>, +) -> Result<(), sqlx::Error> { + access(s, id, ctx, method, false).await +} +pub async fn logout( + s: &AppState, + id: i64, + ctx: &Context, + method: Option<&str>, +) -> Result<(), sqlx::Error> { + let mut tx = s.db.begin().await?; + let row:Option=sqlx::query_scalar("SELECT id FROM auth_logs WHERE authenticatable_id=? AND authenticatable_type='App\\Models\\User' AND ip_address IS ? AND user_agent IS ? AND guard=? ORDER BY login_at DESC,id DESC LIMIT 1").bind(id).bind(&ctx.ip).bind(&ctx.user_agent).bind(&ctx.guard).fetch_optional(&mut *tx).await?; + if let Some(log_id) = row { + sqlx::query("UPDATE auth_logs SET logout_at=CURRENT_TIMESTAMP WHERE id=?") + .bind(log_id) + .execute(&mut *tx) + .await?; + } else { + sqlx::query("INSERT INTO auth_logs(authenticatable_type,authenticatable_id,ip_address,user_agent,logout_at,guard,login_method) VALUES('App\\Models\\User',?,?,?,CURRENT_TIMESTAMP,?,?)").bind(id).bind(&ctx.ip).bind(&ctx.user_agent).bind(&ctx.guard).bind(method).execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + #[test] + fn notification_gates_match_upstream() { + let prefs = json!({"notifyOnNewAuthDevice":true,"notifyOnFailedLogin":true}); + assert!(notification_enabled(true, false, false, &prefs)); + assert!(!notification_enabled(true, true, false, &prefs)); + assert!(!notification_enabled(true, false, true, &prefs)); + assert!(notification_enabled(false, true, true, &prefs)); + assert!(!notification_enabled(false, false, false, &json!({}))); + assert!(!notification_enabled(true, false, false, &json!({}))); + } + #[test] + fn request_metadata_uses_only_direct_socket_peer() { + let mut headers = HeaderMap::new(); + headers.insert("x-forwarded-for", "198.51.100.1".parse().unwrap()); + headers.insert("user-agent", "Public fixture agent".parse().unwrap()); + let ctx = Context::from_headers(&headers, Some("127.0.0.1:1234".parse().unwrap())); + assert_eq!(ctx.ip.as_deref(), Some("127.0.0.1")); + assert_eq!(ctx.user_agent.as_deref(), Some("Public fixture agent")); + assert!(Context::from_headers(&headers, None).ip.is_none()); + } +} diff --git a/src/cors.rs b/src/cors.rs new file mode 100644 index 0000000..24d3325 --- /dev/null +++ b/src/cors.rs @@ -0,0 +1,139 @@ +//! The pinned application's default CORS policy: public API origins, no credentials. +use axum::{ + extract::Request, + http::{HeaderValue, Method, StatusCode, header}, + middleware::Next, + response::{IntoResponse, Response}, +}; +pub async fn handle(request: Request, next: Next) -> Response { + let path = request.uri().path(); + let applies = path.starts_with("/api/") || path == "/sanctum/csrf-cookie"; + if !applies { + return next.run(request).await; + } + let method = request + .headers() + .get(header::ACCESS_CONTROL_REQUEST_METHOD) + .cloned(); + let requested = request + .headers() + .get(header::ACCESS_CONTROL_REQUEST_HEADERS) + .cloned(); + let preflight = request.method() == Method::OPTIONS && method.is_some(); + let mut response = if preflight { + StatusCode::NO_CONTENT.into_response() + } else { + next.run(request).await + }; + response.headers_mut().insert( + header::ACCESS_CONTROL_ALLOW_ORIGIN, + HeaderValue::from_static("*"), + ); + if preflight { + response.headers_mut().insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/html; charset=UTF-8"), + ); + response.headers_mut().insert( + header::ACCESS_CONTROL_ALLOW_METHODS, + HeaderValue::from_bytes(&method.unwrap().as_bytes().to_ascii_uppercase()) + .expect("validated request header"), + ); + response.headers_mut().insert( + header::ACCESS_CONTROL_ALLOW_HEADERS, + requested.unwrap_or(HeaderValue::from_static("")), + ); + response.headers_mut().insert( + header::ACCESS_CONTROL_MAX_AGE, + HeaderValue::from_static("0"), + ); + response.headers_mut().append( + header::VARY, + HeaderValue::from_static( + "Access-Control-Request-Method, Access-Control-Request-Headers", + ), + ); + } + response +} +#[cfg(test)] +mod tests { + use super::*; + use axum::{Router, body::Body, http::Request, middleware, routing::get}; + use tower::ServiceExt; + #[tokio::test] + async fn preflight_bypasses_handlers_and_never_enables_credentials() { + let app = Router::new() + .route("/api/v1/probe", get(|| async { StatusCode::UNAUTHORIZED })) + .route("/user", get(|| async { StatusCode::UNAUTHORIZED })) + .layer(middleware::from_fn(handle)); + let response = app + .clone() + .oneshot( + Request::builder() + .method("OPTIONS") + .uri("/api/v1/probe") + .header("origin", "https://example.invalid") + .header("access-control-request-method", "POST") + .header( + "access-control-request-headers", + "Authorization,Content-Type", + ) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_eq!( + response.headers()["content-type"], + "text/html; charset=UTF-8" + ); + assert_eq!(response.headers()["access-control-allow-origin"], "*"); + assert_eq!(response.headers()["access-control-allow-methods"], "POST"); + assert!( + !response + .headers() + .contains_key("access-control-allow-credentials") + ); + let response = app + .clone() + .oneshot( + Request::builder() + .uri("/api/v1/probe") + .header("origin", "https://example.invalid") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + assert_eq!(response.headers()["access-control-allow-origin"], "*"); + let without_origin = app + .clone() + .oneshot( + Request::builder() + .uri("/api/v1/probe") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(without_origin.headers()["access-control-allow-origin"], "*"); + let response = app + .oneshot( + Request::builder() + .uri("/user") + .header("origin", "https://example.invalid") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert!( + !response + .headers() + .contains_key("access-control-allow-origin") + ); + } +} diff --git a/src/crypto.rs b/src/crypto.rs new file mode 100644 index 0000000..7b9d9a7 --- /dev/null +++ b/src/crypto.rs @@ -0,0 +1,308 @@ +//! Laravel encryptString/decryptString envelope compatibility for AES CBC. +//! Also implements Laravel cookie-name authentication; no PHP object deserialization. +use aes::cipher::{BlockDecryptMut, BlockEncryptMut, KeyIvInit, block_padding::Pkcs7}; +use anyhow::{Result, anyhow, bail}; +use base64::{Engine, engine::general_purpose::STANDARD}; +use hmac::{Hmac, Mac}; +use rand::RngCore; +use serde::{Deserialize, Serialize}; +use sha2::Sha256; +use zeroize::Zeroizing; + +#[derive(Clone)] +pub struct LaravelCipher { + key: Zeroizing>, + previous_keys: Vec>>, +} + +#[derive(Serialize, Deserialize)] +struct Envelope { + iv: String, + value: String, + mac: String, + #[serde(default)] + tag: String, +} + +impl LaravelCipher { + pub fn from_app_key(app_key: &str) -> Result { + Self::from_keys(app_key, &[]) + } + + /// Encrypt with the primary key; previous keys are used only after MAC verification. + pub fn from_keys(app_key: &str, previous_keys: &[String]) -> Result { + fn decode(app_key: &str) -> Result>> { + let key = Zeroizing::new(if let Some(encoded) = app_key.strip_prefix("base64:") { + STANDARD + .decode(encoded) + .map_err(|_| anyhow!("APP_KEY contains invalid base64"))? + } else { + app_key.as_bytes().to_vec() + }); + if !matches!(key.len(), 16 | 32) { + bail!("APP_KEY must decode to 16 or 32 bytes for AES CBC"); + } + Ok(key) + } + let key = decode(app_key)?; + let previous_keys = previous_keys + .iter() + .map(|key| decode(key)) + .collect::>>()?; + if previous_keys + .iter() + .any(|previous| previous.len() != key.len()) + { + bail!("previous keys must match the primary cipher key length"); + } + Ok(Self { key, previous_keys }) + } + + pub fn encrypt(&self, plaintext: &str) -> Result { + let mut iv = [0u8; 16]; + rand::thread_rng().fill_bytes(&mut iv); + self.encrypt_with_iv(plaintext, &iv) + } + + /// Encrypt an un-serialized Laravel middleware cookie value. CookieValuePrefix + /// authenticates the cookie name independently of the AES envelope MAC. + pub fn encrypt_cookie(&self, name: &str, value: &str) -> Result { + let prefix = Self::cookie_prefix(name, &self.key)?; + self.encrypt(&format!("{prefix}{value}")) + } + + /// Accept the percent-encoded wire value, validate its envelope and name + /// prefix against current/previous keys, and return only the cookie value. + pub fn decrypt_cookie(&self, name: &str, wire: &str) -> Result { + use subtle::ConstantTimeEq; + if wire.len() > 128 * 1024 { + bail!("encrypted cookie is too large"); + } + let decoded = percent_encoding::percent_decode_str(wire) + .decode_utf8() + .map_err(|_| anyhow!("invalid encrypted cookie encoding"))?; + let plain = self.decrypt(&decoded)?; + let Some((prefix, value)) = plain.split_once('|') else { + bail!("cookie name authentication failed"); + }; + if prefix.len() != 40 { + bail!("cookie name authentication failed"); + } + for key in std::iter::once(&self.key).chain(self.previous_keys.iter()) { + let expected = Self::cookie_prefix(name, key)?; + if bool::from(prefix.as_bytes().ct_eq(&expected.as_bytes()[..40])) { + return Ok(value.to_owned()); + } + } + bail!("cookie name authentication failed") + } + fn cookie_prefix(name: &str, key: &[u8]) -> Result { + let mut mac = as Mac>::new_from_slice(key) + .map_err(|_| anyhow!("invalid cookie key"))?; + mac.update(name.as_bytes()); + mac.update(b"v2"); + Ok(format!("{}|", hex::encode(mac.finalize().into_bytes()))) + } + + fn encrypt_with_iv(&self, plaintext: &str, iv: &[u8; 16]) -> Result { + let ciphertext = match self.key.len() { + 16 => cbc::Encryptor::::new_from_slices(&self.key, iv) + .map_err(|_| anyhow!("invalid cipher key"))? + .encrypt_padded_vec_mut::(plaintext.as_bytes()), + 32 => cbc::Encryptor::::new_from_slices(&self.key, iv) + .map_err(|_| anyhow!("invalid cipher key"))? + .encrypt_padded_vec_mut::(plaintext.as_bytes()), + _ => bail!("invalid cipher key"), + }; + let iv = STANDARD.encode(iv); + let value = STANDARD.encode(ciphertext); + let mac = hex::encode(self.mac(&iv, &value)?.finalize().into_bytes()); + Ok(STANDARD.encode(serde_json::to_vec(&Envelope { + iv, + value, + mac, + tag: String::new(), + })?)) + } + + pub fn decrypt(&self, encrypted: &str) -> Result { + let payload = STANDARD + .decode(encrypted) + .map_err(|_| anyhow!("invalid encrypted envelope"))?; + let envelope: Envelope = + serde_json::from_slice(&payload).map_err(|_| anyhow!("invalid encrypted envelope"))?; + if !envelope.tag.is_empty() { + bail!("GCM envelopes are not supported"); + } + let mac = hex::decode(&envelope.mac) + .map_err(|_| anyhow!("invalid message authentication code"))?; + let mut authenticated_key = None; + for key in std::iter::once(&self.key).chain(self.previous_keys.iter()) { + if Self::mac_with_key(key, &envelope.iv, &envelope.value)? + .verify_slice(&mac) + .is_ok() + { + authenticated_key = Some(key); + break; + } + } + let key = authenticated_key.ok_or_else(|| anyhow!("message authentication failed"))?; + let iv = STANDARD + .decode(&envelope.iv) + .map_err(|_| anyhow!("invalid initialization vector"))?; + if iv.len() != 16 { + bail!("invalid initialization vector"); + } + let ciphertext = STANDARD + .decode(&envelope.value) + .map_err(|_| anyhow!("invalid ciphertext"))?; + let plaintext = match key.len() { + 16 => cbc::Decryptor::::new_from_slices(key, &iv) + .map_err(|_| anyhow!("invalid cipher key"))? + .decrypt_padded_vec_mut::(&ciphertext), + 32 => cbc::Decryptor::::new_from_slices(key, &iv) + .map_err(|_| anyhow!("invalid cipher key"))? + .decrypt_padded_vec_mut::(&ciphertext), + _ => bail!("invalid cipher key"), + } + .map_err(|_| anyhow!("invalid ciphertext padding"))?; + String::from_utf8(plaintext).map_err(|_| anyhow!("decrypted string is not UTF-8")) + } + + fn mac(&self, iv: &str, value: &str) -> Result> { + Self::mac_with_key(&self.key, iv, value) + } + + fn mac_with_key(key: &[u8], iv: &str, value: &str) -> Result> { + let mut mac = + as Mac>::new_from_slice(key).map_err(|_| anyhow!("invalid MAC key"))?; + mac.update(iv.as_bytes()); + mac.update(value.as_bytes()); + Ok(mac) + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn cookies_bind_the_name_accept_rotation_and_encoded_wire_values() { + let old = LaravelCipher::from_app_key("0123456789abcdef0123456789abcdef").unwrap(); + let rotated = LaravelCipher::from_keys( + "abcdef0123456789abcdef0123456789", + &["0123456789abcdef0123456789abcdef".into()], + ) + .unwrap(); + let wire = old.encrypt_cookie("laravel_session", "session-id").unwrap(); + assert_eq!( + rotated.decrypt_cookie("laravel_session", &wire).unwrap(), + "session-id" + ); + assert!(rotated.decrypt_cookie("XSRF-TOKEN", &wire).is_err()); + assert!( + rotated + .decrypt_cookie("laravel_session", &old.encrypt("not-prefixed").unwrap()) + .is_err() + ); + let escaped = + percent_encoding::utf8_percent_encode(&wire, percent_encoding::NON_ALPHANUMERIC) + .to_string(); + assert_eq!( + rotated.decrypt_cookie("laravel_session", &escaped).unwrap(), + "session-id" + ); + assert!( + old.decrypt_cookie( + "laravel_session", + &rotated.encrypt_cookie("laravel_session", "new-id").unwrap() + ) + .is_err() + ); + } + #[test] + fn independent_python_fixtures() { + let rows: Vec = + serde_json::from_str(include_str!("../tests/fixtures/laravel_cbc.json")).unwrap(); + for row in rows { + let cipher = LaravelCipher::from_app_key(row["app_key"].as_str().unwrap()).unwrap(); + let plaintext = row["plaintext"].as_str().unwrap(); + let envelope = row["envelope"].as_str().unwrap(); + assert_eq!(cipher.decrypt(envelope).unwrap(), plaintext); + assert_eq!( + cipher + .encrypt_with_iv( + plaintext, + &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + ) + .unwrap(), + envelope + ); + } + } + #[test] + fn roundtrip_and_randomized_iv() { + let c = LaravelCipher::from_app_key("base64:MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=") + .unwrap(); + for plain in ["", "secret", "Unicode 🔐 and a block-sized message"] { + let a = c.encrypt(plain).unwrap(); + assert_eq!(c.decrypt(&a).unwrap(), plain); + assert_ne!(a, c.encrypt(plain).unwrap()); + } + } + #[test] + fn rejects_modified_envelope_and_wrong_key() { + let c = LaravelCipher::from_app_key("0123456789abcdef0123456789abcdef").unwrap(); + let encrypted = c.encrypt("secret").unwrap(); + assert!( + LaravelCipher::from_app_key("abcdef0123456789abcdef0123456789") + .unwrap() + .decrypt(&encrypted) + .is_err() + ); + let mut e: Envelope = serde_json::from_slice(&STANDARD.decode(encrypted).unwrap()).unwrap(); + e.value = STANDARD.encode([0u8; 16]); + assert!( + c.decrypt(&STANDARD.encode(serde_json::to_vec(&e).unwrap())) + .is_err() + ); + } + #[test] + fn key_rotation_reads_old_and_writes_primary() { + let old_key = "0123456789abcdef0123456789abcdef"; + let new_key = "abcdef0123456789abcdef0123456789"; + let old = LaravelCipher::from_app_key(old_key).unwrap(); + let new = LaravelCipher::from_app_key(new_key).unwrap(); + let rotated = LaravelCipher::from_keys(new_key, &[old_key.into()]).unwrap(); + assert_eq!( + rotated + .decrypt(&old.encrypt("old secret").unwrap()) + .unwrap(), + "old secret" + ); + let written = rotated.encrypt("new secret").unwrap(); + assert_eq!(new.decrypt(&written).unwrap(), "new secret"); + assert!(old.decrypt(&written).is_err()); + let unrelated = LaravelCipher::from_app_key("00000000000000000000000000000000").unwrap(); + assert!( + rotated + .decrypt(&unrelated.encrypt("wrong key").unwrap()) + .is_err() + ); + assert!(LaravelCipher::from_keys(new_key, &["invalid".into()]).is_err()); + assert!(LaravelCipher::from_keys(new_key, &["0123456789abcdef".into()]).is_err()); + let cloned = rotated.clone(); + assert_eq!( + cloned + .decrypt(&old.encrypt("cloned keys").unwrap()) + .unwrap(), + "cloned keys" + ); + } + #[test] + fn supports_aes128_and_rejects_invalid_keys() { + let c = LaravelCipher::from_app_key("0123456789abcdef").unwrap(); + assert_eq!(c.decrypt(&c.encrypt("test").unwrap()).unwrap(), "test"); + assert!(LaravelCipher::from_app_key("").is_err()); + assert!(LaravelCipher::from_app_key("base64:!").is_err()); + } +} diff --git a/src/db.rs b/src/db.rs new file mode 100644 index 0000000..cfb77c0 --- /dev/null +++ b/src/db.rs @@ -0,0 +1,47 @@ +//! Explicit initialization of a NEW development database, never automatic production migration. +use sqlx::SqlitePool; + +pub async fn init(pool: &SqlitePool) -> Result<(), sqlx::Error> { + sqlx::raw_sql(SCHEMA).execute(pool).await?; + crate::icons::init(pool).await?; + crate::users::init(pool).await?; + crate::passport::init(pool).await?; + crate::oauth_server::init(pool).await?; + crate::oauth_management::init(pool).await?; + crate::oauth_device::init(pool).await?; + crate::sso::init(pool).await?; + crate::webauthn::init(pool).await?; + Ok(()) +} + +const SCHEMA: &str = r#" +CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL UNIQUE,email TEXT NOT NULL UNIQUE,email_verified_at TEXT,password TEXT NOT NULL,is_admin INTEGER NOT NULL DEFAULT 0,preferences TEXT,remember_token TEXT,oauth_provider TEXT,oauth_id TEXT,last_seen_at TEXT,created_at TEXT,updated_at TEXT); +CREATE TABLE IF NOT EXISTS options (id INTEGER PRIMARY KEY AUTOINCREMENT,key TEXT NOT NULL UNIQUE,value TEXT); +CREATE TABLE IF NOT EXISTS sessions (id TEXT NOT NULL PRIMARY KEY,user_id INTEGER,ip_address TEXT,user_agent TEXT,payload TEXT NOT NULL,last_activity INTEGER NOT NULL); +CREATE INDEX IF NOT EXISTS sessions_last_activity_index ON sessions(last_activity); +CREATE INDEX IF NOT EXISTS sessions_user_id_index ON sessions(user_id); +CREATE TABLE IF NOT EXISTS twofaccounts (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,service TEXT,account TEXT,icon TEXT,legacy_uri TEXT,otp_type TEXT NOT NULL,secret TEXT NOT NULL,algorithm TEXT NOT NULL,digits INTEGER NOT NULL,period INTEGER,counter INTEGER,created_at TEXT,updated_at TEXT); +CREATE TABLE IF NOT EXISTS groups (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,name TEXT NOT NULL,order_column INTEGER,show_in_chips INTEGER NOT NULL DEFAULT 0,created_at TEXT,updated_at TEXT); +CREATE TABLE IF NOT EXISTS twofaccount_group_assignments (id INTEGER PRIMARY KEY AUTOINCREMENT,twofaccount_id INTEGER NOT NULL REFERENCES twofaccounts(id) ON DELETE CASCADE,user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,group_id INTEGER NOT NULL REFERENCES groups(id) ON DELETE CASCADE,created_at TEXT,updated_at TEXT,UNIQUE(twofaccount_id,user_id)); +CREATE TABLE IF NOT EXISTS twofaccount_user_orders (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,twofaccount_id INTEGER NOT NULL REFERENCES twofaccounts(id) ON DELETE CASCADE,position INTEGER NOT NULL,created_at TEXT,updated_at TEXT,UNIQUE(user_id,twofaccount_id)); +CREATE TABLE IF NOT EXISTS twofaccount_shares (id INTEGER PRIMARY KEY AUTOINCREMENT,twofaccount_id INTEGER NOT NULL REFERENCES twofaccounts(id) ON DELETE CASCADE,shared_with_user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,scope TEXT NOT NULL,created_by_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,created_at TEXT,updated_at TEXT,UNIQUE(twofaccount_id,scope,shared_with_user_id)); +CREATE TABLE IF NOT EXISTS otp_logs (id INTEGER PRIMARY KEY AUTOINCREMENT,requester_id INTEGER REFERENCES users(id) ON DELETE SET NULL,requester_name TEXT NOT NULL,requester_email TEXT NOT NULL,owner_id INTEGER REFERENCES users(id) ON DELETE SET NULL,owner_name TEXT NOT NULL,owner_email TEXT NOT NULL,twofaccount_id INTEGER NOT NULL REFERENCES twofaccounts(id) ON DELETE CASCADE,ip_address TEXT NOT NULL,otp_type TEXT NOT NULL,counter INTEGER,generated_at TEXT NOT NULL); +"#; + +/// Check the columns used by this implementation without changing Laravel tables. +/// Run on an offline copy of a database migrated by the pinned PHP application. +pub async fn validate_existing(pool: &SqlitePool) -> anyhow::Result<()> { + crate::schema_validation::validate_existing(pool).await +} + +#[cfg(test)] +mod tests { + #[tokio::test] + async fn development_schema_satisfies_startup_with_database_sessions() { + let db = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap(); + super::init(&db).await.unwrap(); + crate::schema_validation::validate_existing_with_sessions(&db, true) + .await + .unwrap(); + } +} diff --git a/src/frontend.rs b/src/frontend.rs new file mode 100644 index 0000000..82b1a4d --- /dev/null +++ b/src/frontend.rs @@ -0,0 +1,550 @@ +//! Pinned upstream Vue build with native-session bootstrap. This preserves the +//! UI assets; it does not establish parity for the backend features they expose. +use crate::{AppState, auth, settings}; +use axum::{ + Extension, Json, Router, + body::to_bytes, + extract::State, + http::{HeaderMap, HeaderValue, StatusCode, header}, + response::{Html, IntoResponse, Response}, + routing::get, +}; +use rand::{RngCore, rngs::OsRng}; +use serde_json::{Map, Value, json}; +use std::path::PathBuf; +use tower_http::services::{ServeDir, ServeFile}; + +const MANIFEST: &str = include_str!("../public/build/manifest.json"); +const LOCALES: &[&str] = &[ + "bg", "zh-CN", "zh-TW", "da", "nl", "en", "fr", "de", "hi", "it", "ja", "ko", "pt-BR", "ru", + "es-ES", "tr", +]; +const SPA_PATHS: &[&str] = &[ + "/", + "/start", + "/capture", + "/accounts", + "/account/create", + "/account/import", + "/account/{twofaccountId}/edit", + "/account/{twofaccountId}/qrcode", + "/account/{twofaccountId}/sharing", + "/account/{twofaccountId}/share", + "/account/{twofaccountId}/transfer", + "/account/{twofaccountId}/otp-logs", + "/groups", + "/group/create", + "/group/{groupId}/edit", + "/settings/options", + "/settings/account", + "/settings/oauth", + "/settings/webauthn", + "/settings/webauthn/{credentialId}/edit", + "/admin/app", + "/admin/auth", + "/admin/users", + "/admin/users/create", + "/admin/users/{userId}/manage", + "/admin/logs/{userId}/access", + "/login", + "/register", + "/password/request", + "/user/password/reset", + "/webauthn/lost", + "/webauthn/recover", + "/about", + "/error", + "/404", +]; + +fn public_directory() -> PathBuf { + if let Some(path) = std::env::var_os("RUST_PUBLIC_DIR") { + return PathBuf::from(path); + } + if let Ok(exe) = std::env::current_exe() { + for ancestor in exe.ancestors().skip(1).take(4) { + let public = ancestor.join("public"); + if public.join("build/manifest.json").is_file() { + return public; + } + } + } + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("public") +} +pub fn routes() -> Router { + let public = public_directory(); + let mut router = Router::new().nest_service("/build", ServeDir::new(public.join("build"))); + // Never expose a filesystem root or PHP entrypoint as a fallback. + for file in [ + "favicon.ico", + "favicon.png", + "favicon_lg.png", + "logo.svg", + "healthcheck.css", + "robots.txt", + ] { + router = router.route_service(&format!("/{file}"), ServeFile::new(public.join(file))); + } + for path in SPA_PATHS { + router = router.route(path, get(landing)); + } + router.route("/manifest.json", get(manifest)) +} +fn enabled(name: &str, default: bool) -> bool { + std::env::var(name) + .ok() + .filter(|s| !s.is_empty()) + .map(|s| matches!(s.as_str(), "true" | "1" | "(true)")) + .unwrap_or(default) +} +fn html_escape(value: &str) -> String { + value + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('"', """) + .replace('\'', "'") +} +fn script_json(value: &Value) -> String { + // JSON escaping alone leaves able to terminate an HTML script. + value + .to_string() + .replace('&', "\\u0026") + .replace('<', "\\u003c") + .replace('>', "\\u003e") + .replace('\u{2028}', "\\u2028") + .replace('\u{2029}', "\\u2029") +} +fn nonce() -> String { + let mut bytes = [0u8; 24]; + OsRng.fill_bytes(&mut bytes); + hex::encode(bytes) +} +fn locked_preferences() -> Vec { + let names: Map = + serde_json::from_str(include_str!("preference_env.json")).expect("built-in preference map"); + names + .into_iter() + .filter_map(|(key, name)| { + if [ + "activeGroup", + "defaultGroup", + "useWebauthnOnly", + "sortOrder", + ] + .contains(&key.as_str()) + { + return None; + } + let env = name + .as_str()? + .replacen("USERPREF_DEFAULT__", "USERPREF_LOCKED__", 1); + enabled(&env, false).then_some(key) + }) + .collect() +} +#[cfg(test)] +fn bootstrap(all: &Value) -> Value { + bootstrap_at(all, "") +} +fn configured_secret(name: &str) -> bool { + std::env::var(name).is_ok_and(|value| { + !matches!( + value.as_str(), + "" | "0" | "null" | "(null)" | "false" | "(false)" + ) + }) +} +fn bootstrap_at(all: &Value, prefix: &str) -> Value { + let mut visitor: Map = all + .as_object() + .into_iter() + .flat_map(|m| m.keys().map(|key| (key.clone(), Value::Null))) + .collect(); + for key in ["disableRegistration", "enableSso", "useSsoOnly"] { + visitor.insert(key.into(), all[key].clone()); + } + json!({ + "appSettings": visitor, + "appConfig": { + "proxyAuth":crate::proxy_auth::enabled(), + "proxyLogoutUrl":std::env::var("PROXY_LOGOUT_URL").ok().filter(|v|!v.is_empty()&&v!="0"&&v!="null").map(Value::String).unwrap_or(json!(false)), + "sso": {"openid":configured_secret("OPENID_CLIENT_SECRET"),"github":configured_secret("GITHUB_CLIENT_SECRET")}, + "subdirectory":prefix + }, + "urls": {"installDocUrl":"https://docs.2fauth.app/getting-started/installation/self-hosted-server/", "ssoDocUrl":"https://docs.2fauth.app/security/authentication/sso/", "exportSchemaUrl":"https://docs.2fauth.app/usage/migration/#export-schema"}, + "defaultPreferences": settings::preferences_from(None), + "lockedPreferences": locked_preferences(), + "appVersion": "8.0.3", + "isDemoApp": enabled("IS_DEMO_APP", false), + "isTestingApp": enabled("IS_TESTING_APP", false), + "appLocales": LOCALES + }) +} +fn render(all: &Value, csrf: &str, csp_nonce: &str, prefix: &str) -> String { + let globals = bootstrap_at(all, prefix); + let base = html_escape(prefix); + let manifest: Value = serde_json::from_str(MANIFEST).expect("pinned Vite manifest"); + let entry = &manifest["resources/js/app.js"]; + let title = html_escape(&std::env::var("APP_NAME").unwrap_or_else(|_| "2FAuth".into())); + let theme = html_escape( + globals["defaultPreferences"]["theme"] + .as_str() + .unwrap_or("system"), + ); + let mut scripts = String::new(); + for key in [ + "appSettings", + "appConfig", + "urls", + "defaultPreferences", + "lockedPreferences", + "appVersion", + "isDemoApp", + "isTestingApp", + "appLocales", + ] { + scripts.push_str(&format!("var {key} = {};\n", script_json(&globals[key]))); + } + let css = entry["css"] + .as_array() + .into_iter() + .flatten() + .filter_map(Value::as_str) + .map(|file| { + format!( + "", + html_escape(file) + ) + }) + .collect::(); + let js = html_escape(entry["file"].as_str().expect("pinned JS entry")); + format!( + r#" + + + +{title}{css} +
+ +"#, + html_escape(csrf) + ) +} +pub(crate) async fn landing( + State(state): State, + headers: HeaderMap, + method: axum::http::Method, + mount: Option>, +) -> Response { + if !matches!(method, axum::http::Method::GET | axum::http::Method::HEAD) { + return StatusCode::METHOD_NOT_ALLOWED.into_response(); + } + let prefix = mount + .as_ref() + .map(|Extension(path)| path.0.as_str()) + .unwrap_or(""); + let all = match settings::all(&state.db).await { + Ok(value) => value, + Err(_) => { + return ( + StatusCode::SERVICE_UNAVAILABLE, + "Frontend configuration unavailable", + ) + .into_response(); + } + }; + let session_response = auth::refresh_csrf(State(state), headers).await; + if !session_response.status().is_success() { + return session_response; + } + let (parts, body) = session_response.into_parts(); + let bytes = match to_bytes(body, 1024).await { + Ok(value) => value, + Err(_) => return StatusCode::INTERNAL_SERVER_ERROR.into_response(), + }; + let csrf = match std::str::from_utf8(&bytes) { + Ok(value) if value.len() == 64 && value.bytes().all(|b| b.is_ascii_hexdigit()) => value, + _ => return StatusCode::INTERNAL_SERVER_ERROR.into_response(), + }; + let nonce = nonce(); + let mut response = Html(render(&all, csrf, &nonce, prefix)).into_response(); + for cookie in parts.headers.get_all(header::SET_COOKIE) { + response + .headers_mut() + .append(header::SET_COOKIE, cookie.clone()); + } + response + .headers_mut() + .insert(header::CACHE_CONTROL, HeaderValue::from_static("no-store")); + response.headers_mut().insert( + header::X_CONTENT_TYPE_OPTIONS, + HeaderValue::from_static("nosniff"), + ); + if enabled("CONTENT_SECURITY_POLICY", true) { + let policy = format!( + "default-src 'self'; script-src 'nonce-{nonce}' 'strict-dynamic' 'wasm-unsafe-eval'; style-src 'self' https://fastly.jsdelivr.net:* 'unsafe-inline'; connect-src 'self' https://fastly.jsdelivr.net:*; img-src 'self' data: https://fastly.jsdelivr.net:*; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'" + ); + response.headers_mut().insert( + header::CONTENT_SECURITY_POLICY, + HeaderValue::from_str(&policy).expect("generated CSP"), + ); + } + response +} +fn public_base(headers: &HeaderMap, prefix: &str) -> String { + let configured = std::env::var("APP_URL") + .ok() + .filter(|x| !x.is_empty()) + .unwrap_or_else(|| { + format!( + "http://{}", + headers + .get(header::HOST) + .and_then(|h| h.to_str().ok()) + .unwrap_or("localhost") + ) + }); + if let Ok(mut url) = url::Url::parse(&configured) { + url.set_path(prefix); + url.set_query(None); + url.set_fragment(None); + url.to_string().trim_end_matches('/').into() + } else { + prefix.into() + } +} +async fn manifest( + headers: HeaderMap, + mount: Option>, +) -> Json { + let prefix = mount + .as_ref() + .map(|Extension(path)| path.0.as_str()) + .unwrap_or(""); + let base = public_base(&headers, prefix); + Json( + json!({"short_name":std::env::var("APP_NAME").unwrap_or_else(|_|"2FAuth".into()),"name":std::env::var("APP_NAME").unwrap_or_else(|_|"2FAuth".into()),"start_url":base,"scope":format!("{prefix}/"),"display":"standalone","theme_color":"#242424","icons":[{"src":"favicon_lg.png","type":"image/png","sizes":"180x180"}],"shortcuts":[{"name":"New 2FA","url":format!("{prefix}/start"),"description":"Add a new 2FA account by flashing a QR code or filling out a form"},{"name":"Import 2FAs","url":format!("{prefix}/account/import"),"description":"Import 2FA accounts previously exported from another 2FA app"},{"name":"Settings","url":format!("{prefix}/settings/options"),"description":"Manage your 2FAuth user settings"}]}), + ) +} + +/// Same health view as the pinned PHP application. The elapsed render time is +/// fixed at zero because PHP's process start clock has no Rust equivalent. +pub async fn health( + headers: HeaderMap, + mount: Option>, +) -> Html { + let name = std::env::var("APP_NAME").unwrap_or_else(|_| "2FAuth".into()); + let prefix = mount + .as_ref() + .map(|Extension(path)| path.0.as_str()) + .unwrap_or(""); + let base = public_base(&headers, prefix); + Html( + include_str!("health.html") + .replace("{APP_NAME}", &html_escape(&name)) + .replace("{BASE_URL}", &html_escape(&base)), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use axum::body::Body; + use tower::ServiceExt; + #[tokio::test] + async fn complete_application_works_under_a_subdirectory() { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + crate::db::init(&db).await.unwrap(); + auth::init(&db).await.unwrap(); + let state = AppState { + db, + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let app = crate::router_at(state, "/tools/2fa"); + let response = app + .clone() + .oneshot( + axum::http::Request::builder() + .uri("/tools/2fa/login") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + assert!( + response + .headers() + .get_all(header::SET_COOKIE) + .iter() + .all(|cookie| cookie.to_str().unwrap().contains("Path=/tools/2fa;")) + ); + let html = String::from_utf8( + to_bytes(response.into_body(), 1024 * 1024) + .await + .unwrap() + .to_vec(), + ) + .unwrap(); + assert!(html.contains("\"subdirectory\":\"/tools/2fa\"")); + assert!(html.contains("href=\"/tools/2fa/favicon.ico\"")); + assert!(html.contains("src=\"/tools/2fa/build/assets/app-dvJP63FL.js\"")); + assert!(html.contains("href=\"/tools/2fa/build/assets/")); + assert!(!html.contains("href=\"/build/")); + for path in [ + "/tools/2fa/build/assets/app-dvJP63FL.js", + "/tools/2fa/api/v1/user/name", + "/tools/2fa/refresh-csrf", + "/tools/2fa/up", + ] { + let response = app + .clone() + .oneshot( + axum::http::Request::builder() + .uri(path) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK, "{path}"); + } + let response = app + .clone() + .oneshot( + axum::http::Request::builder() + .uri("/tools/2fa/manifest.json") + .header("host", "example.test") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let manifest: Value = + serde_json::from_slice(&to_bytes(response.into_body(), 1024 * 1024).await.unwrap()) + .unwrap(); + assert_eq!(manifest["scope"], "/tools/2fa/"); + assert!( + manifest["start_url"] + .as_str() + .unwrap() + .ends_with("/tools/2fa") + ); + assert_eq!(manifest["shortcuts"][0]["url"], "/tools/2fa/start"); + let response = app + .oneshot( + axum::http::Request::builder() + .uri("/login") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::NOT_FOUND); + } + #[test] + fn untrusted_bootstrap_values_cannot_terminate_script() { + let attack = "&\u{2028}\u{2029}"; + let encoded = script_json(&json!({"value":attack})); + assert!(!encoded.contains('<')); + assert!(!encoded.contains('&')); + assert_eq!( + serde_json::from_str::(&encoded).unwrap()["value"], + attack + ); + assert_eq!(html_escape("\"<>&'"), ""<>&'"); + } + #[test] + fn visitor_bootstrap_redacts_nonpublic_settings() { + let value = bootstrap( + &json!({"restrictList":"private@example.invalid","disableRegistration":true,"enableSso":false,"useSsoOnly":false}), + ); + assert!(value["appSettings"]["restrictList"].is_null()); + assert_eq!(value["appSettings"]["disableRegistration"], true); + } + #[tokio::test] + async fn real_session_bootstrap_and_asset_serving() { + let db = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap(); + sqlx::raw_sql("CREATE TABLE users(id INTEGER PRIMARY KEY,is_admin INTEGER); CREATE TABLE options(key TEXT,value TEXT);").execute(&db).await.unwrap(); + auth::init(&db).await.unwrap(); + let state = AppState { + db: db.clone(), + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let router = routes().with_state(state); + let response = router + .clone() + .oneshot( + axum::http::Request::builder() + .uri("/login") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + assert_eq!( + response + .headers() + .get_all(header::SET_COOKIE) + .iter() + .count(), + 2 + ); + assert!( + response + .headers() + .contains_key(header::CONTENT_SECURITY_POLICY) + ); + let html = String::from_utf8( + to_bytes(response.into_body(), 1024 * 1024) + .await + .unwrap() + .to_vec(), + ) + .unwrap(); + assert!(html.contains("assets/app-dvJP63FL.js")); + assert!(html.contains("var defaultPreferences =")); + let count: i64 = + sqlx::query_scalar("SELECT COUNT(*) FROM rust_sessions WHERE user_id IS NULL") + .fetch_one(&db) + .await + .unwrap(); + assert_eq!(count, 1); + let asset = router + .clone() + .oneshot( + axum::http::Request::builder() + .uri("/build/assets/app-dvJP63FL.js") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(asset.status(), StatusCode::OK); + assert!( + asset.headers()[header::CONTENT_TYPE] + .to_str() + .unwrap() + .contains("javascript") + ); + let php = router + .oneshot( + axum::http::Request::builder() + .uri("/index.php") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(php.status(), StatusCode::NOT_FOUND); + } +} diff --git a/src/groups.rs b/src/groups.rs new file mode 100644 index 0000000..c7cc867 --- /dev/null +++ b/src/groups.rs @@ -0,0 +1,227 @@ +use crate::{ + AppState, + accounts::{self, ApiError, ApiResult, invalid, missing}, + auth::AuthUser, +}; +use axum::{ + Extension, Json, Router, + extract::{Path, Query, State}, + http::StatusCode, + response::IntoResponse, + routing::{get, post}, +}; +use serde_json::{Value, json}; +use sqlx::{Row, SqliteConnection}; +use std::collections::HashMap; +pub fn routes() -> Router { + Router::new() + .route("/groups", get(index).post(create)) + .route("/groups/reorder", post(reorder)) + .route( + "/groups/{id}", + get(show).put(update).patch(update).delete(delete), + ) + .route("/groups/{id}/twofaccounts", get(accounts)) + .route("/groups/{id}/assign", post(assign)) +} +async fn check(conn: &mut SqliteConnection, user: i64, id: i64) -> Result<(), ApiError> { + if id <= 0 + || sqlx::query_scalar::<_, i64>("SELECT id FROM groups WHERE id=? AND user_id=?") + .bind(id) + .bind(user) + .fetch_optional(conn) + .await? + .is_none() + { + return Err(missing()); + } + Ok(()) +} +async fn value(s: &AppState, user: i64, id: i64) -> Result { + if id == 0 { + let sharing = crate::sharing::flags(&s.db).await?; + let count: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM twofaccounts a WHERE {}", + accounts::VISIBLE + )) + .bind(user) + .bind(sharing.0) + .bind(user) + .bind(sharing.1) + .fetch_one(&s.db) + .await?; + return Ok(json!({"id":0,"name":"All","show_in_chips":null,"twofaccounts_count":count})); + } + let sharing = crate::sharing::flags(&s.db).await?; + let r=sqlx::query(&format!("SELECT g.*, (SELECT COUNT(*) FROM twofaccount_group_assignments x JOIN twofaccounts a ON a.id=x.twofaccount_id WHERE x.group_id=g.id AND x.user_id=? AND {}) AS n FROM groups g WHERE g.id=? AND g.user_id=?",accounts::VISIBLE)).bind(user).bind(user).bind(sharing.0).bind(user).bind(sharing.1).bind(id).bind(user).fetch_optional(&s.db).await?.ok_or_else(missing)?; + Ok( + json!({"id":id,"name":r.try_get::("name")?,"show_in_chips":r.try_get::("show_in_chips")?,"twofaccounts_count":r.try_get::("n")?}), + ) +} +async fn index(State(s): State, Extension(u): Extension) -> ApiResult { + let ids: Vec = + sqlx::query_scalar("SELECT id FROM groups WHERE user_id=? ORDER BY order_column,id") + .bind(u.id) + .fetch_all(&s.db) + .await?; + let mut groups = vec![value(&s, u.id, 0).await?]; + for id in ids { + groups.push(value(&s, u.id, id).await?) + } + Ok(Json(json!(groups)).into_response()) +} +async fn show( + State(s): State, + Extension(u): Extension, + Path(id): Path, +) -> ApiResult { + let mut resource = value(&s, u.id, id).await?; + // Laravel's show/update resources do not loadCount for physical groups. + if id != 0 { + resource["twofaccounts_count"] = json!(0); + } + Ok(Json(resource).into_response()) +} +fn fields(v: &Value) -> Result<(&str, Option), ApiError> { + let name = v.get("name").and_then(Value::as_str).ok_or_else(invalid)?; + if name.trim().is_empty() + || name.chars().count() > 32 + || name == "All" + || !name + .chars() + .all(|c| c.is_alphanumeric() || c.is_whitespace() || "_- '".contains(c)) + { + return Err(invalid()); + } + let chips = v + .get("show_in_chips") + .map(|x| { + x.as_bool() + .or_else(|| x.as_i64().filter(|n| *n == 0 || *n == 1).map(|n| n == 1)) + .ok_or_else(invalid) + }) + .transpose()?; + Ok((name, chips)) +} +async fn save(s: &AppState, user: i64, id: Option, v: Value) -> Result { + let (name, chips) = fields(&v)?; + let mut tx = s.db.begin().await?; + if let Some(id) = id { + check(&mut tx, user, id).await?; + } + let duplicate: i64 = + sqlx::query_scalar("SELECT COUNT(*) FROM groups WHERE user_id=? AND name=? AND id!=?") + .bind(user) + .bind(name) + .bind(id.unwrap_or(-1)) + .fetch_one(&mut *tx) + .await?; + if duplicate > 0 { + return Err(invalid()); + } + let id = if let Some(id) = id { + sqlx::query("UPDATE groups SET name=?,show_in_chips=COALESCE(?,show_in_chips),updated_at=CURRENT_TIMESTAMP WHERE id=? AND user_id=?").bind(name).bind(chips).bind(id).bind(user).execute(&mut *tx).await?; + id + } else { + sqlx::query("INSERT INTO groups(user_id,name,show_in_chips,order_column,created_at,updated_at) VALUES(?,?,?,(SELECT COALESCE(MAX(order_column),0)+1 FROM groups WHERE user_id=?),CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)").bind(user).bind(name).bind(chips.unwrap_or(false)).bind(user).execute(&mut *tx).await?.last_insert_rowid() + }; + tx.commit().await?; + Ok(id) +} +async fn create( + State(s): State, + Extension(u): Extension, + Json(v): Json, +) -> ApiResult { + let chips_missing = v.get("show_in_chips").is_none(); + let id = save(&s, u.id, None, v).await?; + let mut resource = value(&s, u.id, id).await?; + if chips_missing { + resource["show_in_chips"] = Value::Null; + } + Ok((StatusCode::CREATED, Json(resource)).into_response()) +} +async fn update( + State(s): State, + Extension(u): Extension, + Path(id): Path, + Json(v): Json, +) -> ApiResult { + save(&s, u.id, Some(id), v).await?; + show(State(s), Extension(u), Path(id)).await +} +async fn delete( + State(s): State, + Extension(u): Extension, + Path(id): Path, +) -> ApiResult { + let mut tx = s.db.begin().await?; + check(&mut tx, u.id, id).await?; + sqlx::query("DELETE FROM groups WHERE id=? AND user_id=?") + .bind(id) + .bind(u.id) + .execute(&mut *tx) + .await?; + tx.commit().await?; + Ok(StatusCode::NO_CONTENT.into_response()) +} +async fn accounts( + State(s): State, + Extension(u): Extension, + Path(id): Path, + Query(q): Query>, +) -> ApiResult { + value(&s, u.id, id).await?; + Ok(Json(accounts::list_for(&s, u.id, Some(id), &q).await?).into_response()) +} +async fn assign( + State(s): State, + Extension(u): Extension, + Path(id): Path, + Json(v): Json, +) -> ApiResult { + let ids = v + .get("ids") + .and_then(Value::as_array) + .ok_or_else(invalid)? + .iter() + .map(|x| x.as_i64().filter(|n| *n > 0).ok_or_else(invalid)) + .collect::, _>>()?; + let sharing = crate::sharing::flags(&s.db).await?; + let mut tx = s.db.begin().await?; + check(&mut tx, u.id, id).await?; + for account in &ids { + accounts::visible(&mut tx, u.id, *account, sharing).await? + } + for account in ids { + accounts::assign(&mut tx, u.id, account, Some(id)).await? + } + tx.commit().await?; + Ok(Json(value(&s, u.id, id).await?).into_response()) +} +async fn reorder( + State(s): State, + Extension(u): Extension, + Json(v): Json, +) -> ApiResult { + let ids = accounts::ordered_ids(&v)?; + let mut tx = s.db.begin().await?; + for id in &ids { + check(&mut tx, u.id, *id).await? + } + for (i, id) in ids.iter().enumerate() { + sqlx::query("UPDATE groups SET order_column=? WHERE id=? AND user_id=?") + .bind(i as i64 + 1) + .bind(id) + .bind(u.id) + .execute(&mut *tx) + .await?; + } + let ids: Vec = + sqlx::query_scalar("SELECT id FROM groups WHERE user_id=? ORDER BY order_column,id") + .bind(u.id) + .fetch_all(&mut *tx) + .await?; + tx.commit().await?; + Ok(Json(json!({"message":"order saved","orderedIds":ids})).into_response()) +} diff --git a/src/health.html b/src/health.html new file mode 100644 index 0000000..dbe1c3f --- /dev/null +++ b/src/health.html @@ -0,0 +1,32 @@ + + + + + + {APP_NAME} + + + + +
+
+
+
+ + +
+ +
+

{APP_NAME} up

+ +

+ HTTP request received. + + Response successfully rendered in 0ms. +

+
+
+
+
+ + diff --git a/src/icons.rs b/src/icons.rs new file mode 100644 index 0000000..a4d1332 --- /dev/null +++ b/src/icons.rs @@ -0,0 +1,1261 @@ +//! Icon storage, logo sources and QR image endpoints. +use crate::{ApiError, AppState, auth::AuthUser}; +use axum::{ + Extension, Json, Router, + extract::{Multipart, Path, State}, + http::{StatusCode, header}, + response::{IntoResponse, Response}, + routing::{get, post}, +}; +use base64::{Engine, engine::general_purpose::STANDARD}; +use serde_json::{Value, json}; +use sqlx::{Row, SqlitePool}; +use std::path::{Path as FsPath, PathBuf}; +const MAX_IMAGE: usize = 8 * 1024 * 1024; +type ApiResult = Result; +fn invalid() -> ApiError { + ApiError( + StatusCode::UNPROCESSABLE_ENTITY, + "The given data was invalid.", + ) +} +fn failure() -> ApiError { + ApiError( + StatusCode::INTERNAL_SERVER_ERROR, + "The file could not be uploaded.", + ) +} +pub fn storage_root() -> PathBuf { + std::env::var_os("STORAGE_PATH") + .map(PathBuf::from) + .unwrap_or_else(|| PathBuf::from("storage")) +} +fn icons_root() -> PathBuf { + storage_root().join("app/public/icons") +} +fn safe_name(s: &str) -> bool { + !s.is_empty() + && !s.starts_with('.') + && s.bytes() + .all(|b| b.is_ascii_alphanumeric() || b"._-".contains(&b)) +} +pub async fn init(db: &SqlitePool) -> Result<(), sqlx::Error> { + sqlx::query("CREATE TABLE IF NOT EXISTS icons(name TEXT PRIMARY KEY,content TEXT,created_at TEXT,updated_at TEXT)").execute(db).await?; + Ok(()) +} +pub async fn cleanup_orphan(s: &AppState, name: &str) -> Result<(), ApiError> { + if !safe_name(name) { + return Ok(()); + } + let used: bool = sqlx::query_scalar("SELECT EXISTS(SELECT 1 FROM twofaccounts WHERE icon=?)") + .bind(name) + .fetch_one(&s.db) + .await?; + if !used { + match tokio::fs::remove_file(icons_root().join(name)).await { + Ok(()) => (), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => (), + Err(_) => return Err(failure()), + }; + sqlx::query("DELETE FROM icons WHERE name=?") + .bind(name) + .execute(&s.db) + .await?; + } + Ok(()) +} +/// Mirror the active store before changing its setting, using the caller's transaction. +pub async fn replicate_to_database( + conn: &mut sqlx::SqliteConnection, + s: &AppState, + enabled: bool, +) -> Result<(), ApiError> { + tokio::fs::create_dir_all(icons_root()) + .await + .map_err(|_| failure())?; + if enabled { + let names: Vec = + sqlx::query_scalar("SELECT DISTINCT icon FROM twofaccounts WHERE icon IS NOT NULL") + .fetch_all(&mut *conn) + .await?; + sqlx::query("DELETE FROM icons").execute(&mut *conn).await?; + for name in names { + if !safe_name(&name) { + continue; + } + let bytes = match tokio::fs::read(icons_root().join(&name)).await { + Ok(bytes) => bytes, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => continue, + Err(_) => return Err(failure()), + }; + let mut content = STANDARD.encode(bytes); + if s.encryption_enabled() { + content = s + .cipher + .as_ref() + .ok_or_else(failure)? + .encrypt(&content) + .map_err(|_| failure())?; + } + sqlx::query("INSERT INTO icons(name,content,created_at,updated_at) VALUES(?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)").bind(name).bind(content).execute(&mut *conn).await?; + } + } else { + for row in sqlx::query("SELECT name,content FROM icons") + .fetch_all(&mut *conn) + .await? + { + let name: String = row.try_get("name")?; + if !safe_name(&name) { + return Err(failure()); + } + let mut content: String = row.try_get("content")?; + if s.encryption_enabled() { + content = s + .cipher + .as_ref() + .ok_or_else(failure)? + .decrypt(&content) + .map_err(|_| failure())?; + } + let bytes = STANDARD.decode(content).map_err(|_| failure())?; + tokio::fs::write(icons_root().join(name), bytes) + .await + .map_err(|_| failure())?; + } + sqlx::query("DELETE FROM icons").execute(&mut *conn).await?; + } + Ok(()) +} +pub fn routes() -> Router { + Router::new() + .route("/icons", post(upload)) + .route("/icons/packs", get(packs)) + .route("/icons/default", post(fetch)) + .route("/icons/{icon}", axum::routing::delete(delete)) + .route("/qrcode/decode", post(decode_qr)) + .route("/twofaccounts/{id}/qrcode", get(show_qr)) +} +pub fn public_routes() -> Router { + Router::new().route("/storage/icons/{icon}", get(serve)) +} +fn escaped(value: &str) -> String { + value + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('"', """) +} +/// Rebuild SVG from an inert graphics vocabulary: no scripts, event handlers, +/// stylesheets, foreign objects, external references or entity expansion. +fn sanitize_svg(bytes: &[u8]) -> Result, ApiError> { + let text = std::str::from_utf8(bytes).map_err(|_| invalid())?; + // Ignore DTD declarations without resolving external or custom entities. + let mut source = text.to_string(); + while let Some(start) = source.find(" quote = Some(c), + '[' => brackets += 1, + ']' => brackets = brackets.saturating_sub(1), + _ => {} + } + if c == '>' && brackets == 0 { + end = Some(start + offset + 1); + break; + } + } + let end = end.ok_or_else(invalid)?; + source.replace_range(start..end, ""); + } + let doc = roxmltree::Document::parse(&source).map_err(|_| invalid())?; + if doc.root_element().tag_name().name() != "svg" { + return Err(invalid()); + } + fn node(n: roxmltree::Node<'_, '_>, out: &mut String) { + if n.is_text() { + out.push_str(&escaped(n.text().unwrap_or_default())); + return; + } + if !n.is_element() { + return; + } + let tag = n.tag_name().name(); + if ![ + "svg", + "g", + "path", + "rect", + "circle", + "ellipse", + "line", + "polyline", + "polygon", + "defs", + "linearGradient", + "radialGradient", + "stop", + "clipPath", + "mask", + "title", + "desc", + "text", + "tspan", + "use", + "symbol", + ] + .contains(&tag) + { + return; + } + out.push('<'); + out.push_str(tag); + if tag == "svg" { + out.push_str(" xmlns=\"http://www.w3.org/2000/svg\""); + } + static LOCAL_URL: std::sync::LazyLock = std::sync::LazyLock::new(|| { + regex::Regex::new(r"url\(\s*#[A-Za-z_][A-Za-z0-9_.:-]*\s*\)").expect("fixed regex") + }); + for a in n.attributes() { + let key = a.name(); + let value = a.value(); + if ![ + "id", + "viewBox", + "width", + "height", + "x", + "y", + "x1", + "x2", + "y1", + "y2", + "cx", + "cy", + "r", + "rx", + "ry", + "d", + "points", + "fill", + "fill-rule", + "fill-opacity", + "stroke", + "stroke-width", + "stroke-linecap", + "stroke-linejoin", + "stroke-opacity", + "opacity", + "transform", + "offset", + "stop-color", + "stop-opacity", + "gradientUnits", + "gradientTransform", + "clip-path", + "mask", + "preserveAspectRatio", + "font-size", + "font-family", + "text-anchor", + "href", + "style", + ] + .contains(&key) + { + continue; + } + if key == "style" + && value.split(';').filter(|d| !d.trim().is_empty()).any(|d| { + d.split_once(':').is_none_or(|(property, _)| { + ![ + "fill", + "fill-rule", + "fill-opacity", + "stroke", + "stroke-width", + "stroke-linecap", + "stroke-linejoin", + "stroke-opacity", + "opacity", + "stop-color", + "stop-opacity", + "font-size", + "font-family", + "text-anchor", + ] + .contains(&property.trim()) + }) + }) + { + continue; + } + let low = value.to_ascii_lowercase(); + let stripped_urls = LOCAL_URL.replace_all(&low, ""); + if (key == "href" && !value.starts_with('#')) + || low.contains("javascript:") + || low.contains("data:") + || low.contains("http:") + || low.contains("https:") + || low.contains('\\') + || low.contains("expression(") + || stripped_urls.contains("url(") + { + continue; + } + out.push(' '); + out.push_str(key); + out.push_str("=\""); + out.push_str(&escaped(value)); + out.push('"'); + } + out.push('>'); + for child in n.children() { + node(child, out); + } + out.push_str("'); + } + let mut out = if text.trim_start().starts_with("") + } else { + String::new() + }; + node(doc.root_element(), &mut out); + Ok(out.into_bytes()) +} +fn image_content(bytes: &[u8], allow_svg: bool) -> Result<(&'static str, Vec), ApiError> { + if bytes.is_empty() || bytes.len() > MAX_IMAGE { + return Err(invalid()); + } + if allow_svg && std::str::from_utf8(bytes).is_ok_and(|s| s.trim_start().starts_with('<')) { + return Ok(("svg", sanitize_svg(bytes)?)); + } + let format = image::guess_format(bytes).map_err(|_| invalid())?; + let ext = match format { + image::ImageFormat::Png => "png", + image::ImageFormat::Jpeg => "jpg", + image::ImageFormat::Gif => "gif", + image::ImageFormat::Bmp => "bmp", + image::ImageFormat::WebP => "webp", + image::ImageFormat::Ico => "ico", + _ => return Err(invalid()), + }; + let mut reader = image::ImageReader::with_format(std::io::Cursor::new(bytes), format); + let mut limits = image::Limits::default(); + limits.max_image_width = Some(8192); + limits.max_image_height = Some(8192); + limits.max_alloc = Some(128 * 1024 * 1024); + reader.limits(limits); + reader.decode().map_err(|_| invalid())?; + Ok((ext, bytes.to_vec())) +} +fn mime(name: &str) -> &'static str { + match name.rsplit('.').next().unwrap_or("") { + "svg" => "image/svg+xml", + "png" => "image/png", + "jpg" | "jpeg" => "image/jpeg", + "gif" => "image/gif", + "webp" => "image/webp", + "bmp" => "image/bmp", + "ico" => "image/x-icon", + _ => "application/octet-stream", + } +} +async fn persist(s: &AppState, bytes: &[u8]) -> Result { + let (ext, bytes) = image_content(bytes, true)?; + let name = format!("{}.{}", hex::encode(rand::random::<[u8; 20]>()), ext); + tokio::fs::create_dir_all(icons_root()) + .await + .map_err(|_| failure())?; + tokio::fs::write(icons_root().join(&name), &bytes) + .await + .map_err(|_| failure())?; + if crate::settings::all(&s.db).await?["storeIconsInDatabase"] + .as_bool() + .unwrap_or(false) + { + let mut content = STANDARD.encode(&bytes); + if s.encryption_enabled() { + content = s + .cipher + .as_ref() + .ok_or_else(failure)? + .encrypt(&content) + .map_err(|_| failure())?; + } + sqlx::query("INSERT INTO icons(name,content,created_at,updated_at) VALUES(?,?,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP) ON CONFLICT(name) DO UPDATE SET content=excluded.content,updated_at=CURRENT_TIMESTAMP").bind(&name).bind(content).execute(&s.db).await?; + } + Ok(name) +} +pub async fn persist_embedded( + s: &AppState, + _mime: &str, + content: &str, +) -> Result { + persist(s, &STANDARD.decode(content).map_err(|_| invalid())?).await +} +pub async fn read_icon(s: &AppState, name: &str) -> Result)>, ApiError> { + if !safe_name(name) { + return Ok(None); + } + let database = crate::settings::all(&s.db).await?["storeIconsInDatabase"] + .as_bool() + .unwrap_or(false); + if !database && let Ok(bytes) = tokio::fs::read(icons_root().join(name)).await { + return Ok(Some((mime(name).into(), bytes))); + } + if let Some(mut content) = + sqlx::query_scalar::<_, String>("SELECT content FROM icons WHERE name=?") + .bind(name) + .fetch_optional(&s.db) + .await? + { + if s.encryption_enabled() { + content = s + .cipher + .as_ref() + .ok_or_else(failure)? + .decrypt(&content) + .map_err(|_| failure())?; + } + let bytes = STANDARD.decode(content).map_err(|_| failure())?; + return Ok(Some((mime(name).into(), bytes))); + } + if let Ok(bytes) = tokio::fs::read(icons_root().join(name)).await { + return Ok(Some((mime(name).into(), bytes))); + } + Ok(None) +} +async fn serve(State(s): State, Path(name): Path) -> ApiResult { + let (mime, bytes) = read_icon(&s, &name) + .await? + .ok_or(ApiError(StatusCode::NOT_FOUND, "not found"))?; + Ok(( + [ + (header::CONTENT_TYPE, mime), + ( + header::CONTENT_SECURITY_POLICY, + "default-src 'none'; style-src 'unsafe-inline'; sandbox".into(), + ), + (header::X_CONTENT_TYPE_OPTIONS, "nosniff".into()), + ], + bytes, + ) + .into_response()) +} +async fn multipart_file(mut data: Multipart, key: &str) -> Result, ApiError> { + while let Some(field) = data.next_field().await.map_err(|_| invalid())? { + if field.name() == Some(key) { + let data = field.bytes().await.map_err(|_| invalid())?; + if data.len() > MAX_IMAGE { + return Err(invalid()); + } + return Ok(data.to_vec()); + } + } + Err(invalid()) +} +async fn upload( + State(s): State, + multipart: Result, +) -> ApiResult { + let bytes = multipart_file(multipart.map_err(|_| invalid())?, "icon").await?; + Ok(( + StatusCode::CREATED, + Json(json!({"filename":persist(&s,&bytes).await?})), + ) + .into_response()) +} +async fn delete( + State(s): State, + Extension(u): Extension, + Path(name): Path, +) -> ApiResult { + if !safe_name(&name) { + return Err(invalid()); + } + let used: bool = + sqlx::query_scalar("SELECT EXISTS(SELECT 1 FROM twofaccounts WHERE icon=? AND user_id<>?)") + .bind(&name) + .bind(u.id) + .fetch_one(&s.db) + .await?; + if used { + return Err(ApiError(StatusCode::FORBIDDEN, "unauthorized")); + } + match tokio::fs::remove_file(icons_root().join(&name)).await { + Ok(()) => (), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => (), + Err(_) => return Err(failure()), + }; + sqlx::query("DELETE FROM icons WHERE name=?") + .bind(name) + .execute(&s.db) + .await?; + Ok(StatusCode::NO_CONTENT.into_response()) +} +fn pack_dirs(root: &FsPath, prefix: &str, out: &mut Vec) { + let Ok(entries) = std::fs::read_dir(root) else { + return; + }; + for entry in entries.flatten() { + let name = entry.file_name().to_string_lossy().into_owned(); + if name.starts_with('.') || !entry.file_type().is_ok_and(|t| t.is_dir()) { + continue; + } + let relative = if prefix.is_empty() { + name + } else { + format!("{prefix}/{name}") + }; + if std::fs::read_dir(entry.path()).is_ok_and(|files| { + files + .flatten() + .any(|f| std::fs::read(f.path()).is_ok_and(|b| image_content(&b, true).is_ok())) + }) { + out.push(json!({"name":relative})); + } + pack_dirs(&entry.path(), &relative, out); + } +} +async fn packs() -> Json { + let mut values = vec![]; + pack_dirs(&storage_root().join("app/iconPacks"), "", &mut values); + values.sort_by(|a, b| a["name"].as_str().cmp(&b["name"].as_str())); + Json(json!(values)) +} +fn slug(s: &str) -> String { + let mut out = String::new(); + let mut separator = false; + for c in s.to_lowercase().chars() { + if c.is_ascii_alphanumeric() { + out.push(c); + separator = false; + } else if !separator { + out.push('-'); + separator = true; + } + } + out +} +async fn download(url: &str) -> Option> { + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(15)) + .redirect(reqwest::redirect::Policy::limited(3)) + .build() + .ok()?; + let mut response = client.get(url).send().await.ok()?.error_for_status().ok()?; + if response + .content_length() + .is_some_and(|l| l > MAX_IMAGE as u64) + { + return None; + } + let mut bytes = Vec::new(); + while let Some(chunk) = response.chunk().await.ok()? { + if bytes.len() + chunk.len() > MAX_IMAGE { + return None; + } + bytes.extend_from_slice(&chunk); + } + Some(bytes) +} +async fn fetch( + State(s): State, + Extension(u): Extension, + Json(v): Json, +) -> ApiResult { + match fetch_icon(&s, u.id, &v).await? { + Some(name) => Ok((StatusCode::CREATED, Json(json!({"filename":name}))).into_response()), + None => Ok(StatusCode::NO_CONTENT.into_response()), + } +} +async fn fetch_icon(s: &AppState, user: i64, v: &Value) -> Result, ApiError> { + let service = v.get("service").and_then(Value::as_str).unwrap_or(""); + if let Some(pack) = v.get("iconPack") { + let pack = pack.as_str().ok_or_else(invalid)?; + if pack.is_empty() + || FsPath::new(pack) + .components() + .any(|c| !matches!(c, std::path::Component::Normal(_))) + || v.get("variant").is_some() + { + return Err(invalid()); + } + let dir = storage_root().join("app/iconPacks").join(pack); + if !dir.is_dir() { + return Err(invalid()); + } + let reference = slug(service); + for entry in std::fs::read_dir(dir).map_err(|_| invalid())?.flatten() { + let name = entry.file_name().to_string_lossy().into_owned(); + if name + .rsplit_once('.') + .is_some_and(|(base, _)| base.eq_ignore_ascii_case(&reference)) + && let Ok(bytes) = tokio::fs::read(entry.path()).await + { + return Ok(Some(persist(s, &bytes).await?)); + } + } + return Ok(None); + } + let raw: Option = sqlx::query_scalar("SELECT preferences FROM users WHERE id=?") + .bind(user) + .fetch_one(&s.db) + .await?; + let prefs = crate::settings::preferences_from(raw.as_deref()); + let collection = v + .get("iconCollection") + .and_then(Value::as_str) + .or_else(|| prefs["iconCollection"].as_str()) + .unwrap_or("selfh"); + let variant = v + .get("variant") + .and_then(Value::as_str) + .unwrap_or("regular"); + if !["tfa", "selfh", "dashboardicons"].contains(&collection) + || !["regular", "light", "dark"].contains(&variant) + || (collection == "tfa" && variant != "regular") + { + return Err(invalid()); + } + let reference = slug(service); + if reference.is_empty() { + return Ok(None); + } + let mut variants = vec![variant]; + if variant != "regular" && !prefs["iconVariantStrictFetch"].as_bool().unwrap_or(false) { + variants.push("regular"); + } + let cache = storage_root().join("app/logos"); + let _ = tokio::fs::create_dir_all(&cache).await; + let tfa_ref = if collection == "tfa" { + let file = cache.join("tfa.json"); + let mut data = tokio::fs::read(&file).await.ok(); + let stale = tokio::fs::metadata(&file) + .await + .ok() + .and_then(|m| m.modified().ok()) + .and_then(|time| time.elapsed().ok()) + .is_none_or(|age| age.as_secs() > 86400); + if (data.is_none() || stale) + && let Some(bytes) = download("https://2fa.directory/api/v3/tfa.json").await + { + let _ = tokio::fs::write(&file, &bytes).await; + data = Some(bytes); + } + let data: Value = data + .and_then(|b| serde_json::from_slice(&b).ok()) + .unwrap_or(Value::Null); + let key = service.to_lowercase().replace('+', "plus"); + data.get(&key) + .and_then(Value::as_str) + .map(str::to_string) + .or_else(|| { + data.as_array()?.iter().find_map(|item| { + if item[0].as_str().is_some_and(|n| n.to_lowercase() == key) { + item[1]["domain"].as_str().map(str::to_string) + } else { + None + } + }) + }) + } else { + None + }; + for variant in variants { + for ext in ["svg", "png"] { + let suffix = match variant { + "dark" => "-dark", + "light" => "-light", + _ => "", + }; + let (filename, url) = match collection { + "selfh" => ( + format!("selfh_{reference}{suffix}.{ext}"), + format!( + "https://cdn.jsdelivr.net/gh/selfhst/icons/{ext}/{reference}{suffix}.{ext}" + ), + ), + "dashboardicons" => ( + format!("dashboardicons_{reference}{suffix}.{ext}"), + format!( + "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/{ext}/{reference}{suffix}.{ext}" + ), + ), + _ => { + let Some(domain) = tfa_ref.as_deref().filter(|s| safe_name(s)) else { + continue; + }; + ( + format!("{domain}.{ext}"), + format!( + "https://raw.githubusercontent.com/2factorauth/twofactorauth/master/img/{}/{domain}.{ext}", + domain.chars().next().unwrap() + ), + ) + } + }; + let path = cache.join(filename); + let bytes = match tokio::fs::read(&path).await { + Ok(b) => Some(b), + Err(_) => download(&url).await, + }; + if let Some(bytes) = bytes + && image_content(&bytes, true).is_ok() + { + let _ = tokio::fs::write(path, &bytes).await; + return Ok(Some(persist(s, &bytes).await?)); + } + } + } + Ok(None) +} +/// Fetch the selected collection using the user's preferred variant, as model filling does. +pub async fn build_from_service(s: &AppState, user: i64, service: Option<&str>) -> Option { + let service = service.filter(|s| !s.is_empty())?; + let raw: Option = sqlx::query_scalar("SELECT preferences FROM users WHERE id=?") + .bind(user) + .fetch_one(&s.db) + .await + .ok()?; + let preferences = crate::settings::preferences_from(raw.as_deref()); + if !preferences["getOfficialIcons"].as_bool().unwrap_or(false) { + return None; + } + let collection = preferences["iconCollection"].as_str().unwrap_or("selfh"); + let variant = if collection == "tfa" { + "regular" + } else { + preferences["iconVariant"].as_str().unwrap_or("regular") + }; + fetch_icon( + s, + user, + &json!({"service":service,"iconCollection":collection,"variant":variant}), + ) + .await + .ok() + .flatten() +} +fn public_image_ip(ip: std::net::IpAddr) -> bool { + use std::net::IpAddr; + match ip { + IpAddr::V4(ip) => { + let [a, b, c, _] = ip.octets(); + !matches!(a, 0 | 10 | 127 | 224..=255) + && !(a == 169 && b == 254) + && !(a == 172 && (16..=31).contains(&b)) + && !(a == 192 && b == 168) + && !(a == 100 && (64..=127).contains(&b)) + && !(a == 192 && b == 0 && (c == 0 || c == 2)) + && !(a == 198 && (b == 18 || b == 19 || (b == 51 && c == 100))) + && !(a == 203 && b == 0 && c == 113) + } + IpAddr::V6(ip) => { + if ip.to_ipv4_mapped().is_some() { + return false; + } + let bytes = ip.octets(); + if bytes[..12] == [0x00, 0x64, 0xff, 0x9b, 0, 0, 0, 0, 0, 0, 0, 0] + || bytes[..6] == [0x00, 0x64, 0xff, 0x9b, 0, 1] + { + return public_image_ip(IpAddr::V4(std::net::Ipv4Addr::new( + bytes[12], bytes[13], bytes[14], bytes[15], + ))); + } + (bytes[0] & 0xe0) == 0x20 + && !(bytes[0] == 0x20 && bytes[1] == 0x02) + && !(bytes[0] == 0x20 && bytes[1] == 0x01 && bytes[2] <= 1) + && !(bytes[0] == 0x20 && bytes[1] == 0x01 && bytes[2] == 0x0d && bytes[3] == 0xb8) + } + } +} +/// Untrusted otpauth image URLs use pinned public DNS, no redirects, and bounded bodies. +/// A proxy could resolve the target again, so this path fails closed when one is configured. +pub async fn build_from_remote(s: &AppState, address: &str) -> Option { + let blocked = std::env::var("BLOCK_OPTAUTH_IMAGELINK_FETCHING") + .ok() + .filter(|s| !s.is_empty() && s != "null" && s != "(null)") + .is_none_or(|s| matches!(s.as_str(), "true" | "1" | "(true)")); + if blocked + || std::env::var("PROXY_FOR_OUTGOING_REQUESTS").is_ok_and(|s| !s.is_empty() && s != "null") + { + return None; + } + let url = url::Url::parse(address).ok()?; + if !matches!(url.scheme(), "http" | "https") + || !url.username().is_empty() + || url.password().is_some() + { + return None; + } + let extension = url.path().rsplit('.').next()?.to_ascii_lowercase(); + if !["png", "jpg", "jpeg", "bmp", "webp", "svg"].contains(&extension.as_str()) { + return None; + } + let host = url.host_str()?.trim_matches(['[', ']']); + let port = url.port_or_known_default()?; + let addresses = tokio::time::timeout( + std::time::Duration::from_secs(5), + tokio::net::lookup_host((host, port)), + ) + .await + .ok()? + .ok()? + .collect::>(); + if addresses.is_empty() + || addresses.len() > 64 + || addresses + .iter() + .any(|address| !public_image_ip(address.ip())) + { + return None; + } + let client = reqwest::Client::builder() + .no_proxy() + .resolve_to_addrs(host, &addresses) + .redirect(reqwest::redirect::Policy::none()) + .connect_timeout(std::time::Duration::from_secs(5)) + .timeout(std::time::Duration::from_secs(10)) + .build() + .ok()?; + for attempt in 0..3 { + if let Ok(response) = client.get(url.clone()).send().await { + if response.status().is_redirection() { + return None; + } + if let Ok(mut response) = response.error_for_status() { + if response + .content_length() + .is_some_and(|len| len > MAX_IMAGE as u64) + { + return None; + } + let mut bytes = Vec::new(); + while let Some(chunk) = response.chunk().await.ok()? { + if bytes.len() + chunk.len() > MAX_IMAGE { + return None; + } + bytes.extend_from_slice(&chunk); + } + let (actual, _) = image_content(&bytes, true).ok()?; + if actual != extension && !(actual == "jpg" && extension == "jpeg") { + return None; + } + return persist(s, &bytes).await.ok(); + } + } + if attempt < 2 { + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + } + } + None +} +fn qr_svg(uri: &str) -> Result { + let code = qrcode::QrCode::new(uri.as_bytes()).map_err(|_| invalid())?; + let svg = code + .render::() + .min_dimensions(256, 256) + .build(); + Ok(format!( + "data:image/svg+xml;base64,{}", + STANDARD.encode(svg) + )) +} +async fn show_qr( + State(s): State, + Extension(u): Extension, + Path(id): Path, +) -> ApiResult { + let row = sqlx::query("SELECT * FROM twofaccounts WHERE id=?") + .bind(id) + .fetch_optional(&s.db) + .await? + .ok_or(ApiError(StatusCode::NOT_FOUND, "not found"))?; + if row.try_get::, _>("user_id")? != Some(u.id) { + return Err(ApiError( + StatusCode::FORBIDDEN, + "This action is unauthorized.", + )); + } + let config = crate::accounts::config(&s, &row).map_err(|e| ApiError(e.0, e.1))?; + Ok(Json(json!({"qrcode":qr_svg(&config.to_uri().map_err(|_|invalid())?)?})).into_response()) +} +pub fn decode_image(bytes: &[u8]) -> Result { + image_content(bytes, false)?; + let image = image::load_from_memory(bytes) + .map_err(|_| invalid())? + .to_luma8(); + let mut prepared = rqrr::PreparedImage::prepare(image); + let grids = prepared.detect_grids(); + for grid in grids { + if let Ok((_, data)) = grid.decode() { + return Ok(if data.starts_with("otpauth-migration://") { + data + } else { + percent_encoding::percent_decode_str(&data.replace('+', " ")) + .decode_utf8_lossy() + .into_owned() + }); + } + } + Err(ApiError( + StatusCode::BAD_REQUEST, + "Cannot detect a QR code in the image.", + )) +} +async fn decode_qr( + multipart: Result, +) -> ApiResult { + let missing = || { + (StatusCode::UNPROCESSABLE_ENTITY,Json(json!({"message":"The qrcode field is required.","errors":{"qrcode":["The qrcode field is required."]}}))).into_response() + }; + let multipart = match multipart { + Ok(multipart) => multipart, + Err(_) => return Ok(missing()), + }; + let bytes = match multipart_file(multipart, "qrcode").await { + Ok(bytes) => bytes, + Err(_) => return Ok(missing()), + }; + let decoded = decode_image(&bytes)?; + let data = if decoded.starts_with("otpauth-migration://") { + decoded + } else { + crate::otp::php_urldecode(&decoded) + }; + Ok(Json(json!({"data":data})).into_response()) +} +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn svg_drops_executable_and_remote_content() { + let bytes=sanitize_svg(br##""##).unwrap(); + let result = String::from_utf8(bytes).unwrap(); + assert!(!result.contains("script")); + assert!(!result.contains("onload")); + assert!(!result.contains("https://evil")); + assert!(result.contains("href=\"#local\"")); + } + #[test] + fn sanitizes_svg_with_external_dtd() { + let bytes=sanitize_svg(br#""#).unwrap(); + let result = String::from_utf8(bytes).unwrap(); + assert!(!result.contains("DOCTYPE")); + assert!(!result.contains("script")); + assert!(result.contains("style=\"fill:#fff\"")); + } + #[test] + fn qr_encoding_is_data_image() { + assert!( + qr_svg("otpauth://totp/A?secret=MY") + .unwrap() + .starts_with("data:image/svg+xml;base64,") + ); + } + #[test] + fn qr_roundtrip() { + let text = "otpauth://totp/Example%3Aalice?secret=JBSWY3DPEHPK3PXP"; + let code = qrcode::QrCode::new(text).unwrap(); + let width = code.width(); + let side = (width + 8) * 8; + let mut img = image::GrayImage::from_pixel(side as u32, side as u32, image::Luma([255])); + for y in 0..width { + for x in 0..width { + if code[(x, y)] == qrcode::Color::Dark { + for dy in 0..8 { + for dx in 0..8 { + img.put_pixel( + ((x + 4) * 8 + dx) as u32, + ((y + 4) * 8 + dy) as u32, + image::Luma([0]), + ); + } + } + } + } + } + let mut out = std::io::Cursor::new(Vec::new()); + img.write_to(&mut out, image::ImageFormat::Png).unwrap(); + assert_eq!( + decode_image(out.get_ref()).unwrap(), + text.replace("%3A", ":") + ); + } + #[test] + fn rejects_nonimages_and_traversal() { + assert!(image_content(b"not an image", true).is_err()); + assert!(!safe_name("../secret")); + assert!(!safe_name(".hidden")); + } +} + +#[cfg(test)] +mod integration_tests { + use super::*; + use axum::{ + body::{Body, to_bytes}, + http::Request, + }; + use tower::ServiceExt; + #[tokio::test] + async fn upload_serve_replicate_and_cross_user_delete() { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + crate::db::init(&db).await.unwrap(); + init(&db).await.unwrap(); + sqlx::query("INSERT INTO users(id,name,email,password) VALUES(1,'A','a@test.invalid','unused'),(2,'B','b@test.invalid','unused')").execute(&db).await.unwrap(); + let state = AppState { + db, + cipher: None, + encrypt_db: std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)), + }; + let app = routes() + .merge(public_routes()) + .layer(Extension(AuthUser { + id: 1, + is_admin: false, + })) + .with_state(state.clone()); + let body = "--boundary\r\nContent-Disposition: form-data; name=\"icon\"; filename=\"logo.svg\"\r\nContent-Type: image/svg+xml\r\n\r\n\r\n--boundary--\r\n"; + let response = app + .clone() + .oneshot( + Request::builder() + .method("POST") + .uri("/icons") + .header("content-type", "multipart/form-data; boundary=boundary") + .body(Body::from(body)) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::CREATED); + let result: Value = + serde_json::from_slice(&to_bytes(response.into_body(), 1024 * 1024).await.unwrap()) + .unwrap(); + let name = result["filename"].as_str().unwrap(); + let response = app + .clone() + .oneshot( + Request::builder() + .uri(format!("/storage/icons/{name}")) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + assert_eq!(response.headers()[header::CONTENT_TYPE], "image/svg+xml"); + let content = to_bytes(response.into_body(), 1024 * 1024).await.unwrap(); + assert!(!String::from_utf8_lossy(&content).contains("onload")); + sqlx::query("INSERT INTO twofaccounts(user_id,account,otp_type,secret,algorithm,digits,icon) VALUES(2,'B','totp','MY','sha1',6,?)").bind(name).execute(&state.db).await.unwrap(); + let response = app + .clone() + .oneshot( + Request::builder() + .method("DELETE") + .uri(format!("/icons/{name}")) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::FORBIDDEN); + let mut tx = state.db.begin().await.unwrap(); + replicate_to_database(&mut tx, &state, true).await.unwrap(); + tx.commit().await.unwrap(); + let count: i64 = sqlx::query_scalar("SELECT count(*) FROM icons WHERE name=?") + .bind(name) + .fetch_one(&state.db) + .await + .unwrap(); + assert_eq!(count, 1); + tokio::fs::remove_file(icons_root().join(name)) + .await + .unwrap(); + assert!(read_icon(&state, name).await.unwrap().is_some()); + let mut tx = state.db.begin().await.unwrap(); + replicate_to_database(&mut tx, &state, false).await.unwrap(); + tx.commit().await.unwrap(); + assert!(icons_root().join(name).is_file()); + let response = app + .clone() + .oneshot( + Request::builder() + .uri("/twofaccounts/1/qrcode") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::FORBIDDEN); + let response = app + .clone() + .oneshot( + Request::builder() + .uri("/twofaccounts/999/qrcode") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::NOT_FOUND); + for path in ["/icons", "/qrcode/decode"] { + let response = app + .clone() + .oneshot( + Request::builder() + .method("POST") + .uri(path) + .header("content-type", "application/json") + .body(Body::from("{}")) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + } + sqlx::query("DELETE FROM twofaccounts") + .execute(&state.db) + .await + .unwrap(); + cleanup_orphan(&state, name).await.unwrap(); + assert!(read_icon(&state, name).await.unwrap().is_none()); + } +} + +#[cfg(test)] +mod automatic_tests { + use super::*; + use axum::{ + body::{Body, to_bytes}, + http::Request, + }; + use tower::ServiceExt; + async fn request(app: Router, method: &str, path: &str, body: Value) -> (StatusCode, Value) { + let response = app + .oneshot( + Request::builder() + .method(method) + .uri(path) + .header("content-type", "application/json") + .body(Body::from(body.to_string())) + .unwrap(), + ) + .await + .unwrap(); + let status = response.status(); + let bytes = to_bytes(response.into_body(), 1024 * 1024).await.unwrap(); + ( + status, + serde_json::from_slice(&bytes).unwrap_or(Value::Null), + ) + } + #[test] + fn remote_ip_policy_blocks_local_mapped_metadata_and_nat64() { + for ip in [ + "127.0.0.1", + "10.0.0.1", + "169.254.169.254", + "100.64.0.1", + "224.0.0.1", + "::1", + "::ffff:8.8.8.8", + "64:ff9b::a9fe:a9fe", + "64:ff9b:1::a9fe:a9fe", + ] { + assert!(!public_image_ip(ip.parse().unwrap()), "{ip}"); + } + assert!(public_image_ip("8.8.8.8".parse().unwrap())); + assert!(public_image_ip("2606:4700:4700::1111".parse().unwrap())); + } + #[tokio::test] + async fn cached_official_logo_and_cleanup_work_with_single_connection() { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + crate::db::init(&db).await.unwrap(); + sqlx::query( + "INSERT INTO users(id,name,email,password) VALUES(1,'A','a@test.invalid','unused')", + ) + .execute(&db) + .await + .unwrap(); + let state = AppState { + db, + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let app = crate::accounts::routes() + .layer(Extension(AuthUser { + id: 1, + is_admin: false, + })) + .with_state(state.clone()); + let service = format!("autologo{}", hex::encode(rand::random::<[u8; 8]>())); + let cache = storage_root().join("app/logos"); + tokio::fs::create_dir_all(&cache).await.unwrap(); + let cached = cache.join(format!("selfh_{service}.svg")); + tokio::fs::write( + &cached, + b"", + ) + .await + .unwrap(); + let payload = json!({"otp_type":"totp","account":"alice","service":service,"icon":null,"secret":"MY","digits":6,"algorithm":"sha1","period":30}); + let (status, result) = tokio::time::timeout( + std::time::Duration::from_secs(5), + request(app.clone(), "POST", "/twofaccounts", payload.clone()), + ) + .await + .unwrap(); + assert_eq!(status, StatusCode::CREATED); + let name = result["icon"].as_str().unwrap().to_string(); + let id = result["id"].as_i64().unwrap(); + assert!(read_icon(&state, &name).await.unwrap().is_some()); + let (status, result) = request( + app.clone(), + "PUT", + &format!("/twofaccounts/{id}"), + payload.clone(), + ) + .await; + assert_eq!(status, StatusCode::OK); + assert!(result["icon"].is_null()); + assert!(read_icon(&state, &name).await.unwrap().is_none()); + let (_, result) = request(app.clone(), "POST", "/twofaccounts", payload).await; + let name = result["icon"].as_str().unwrap().to_string(); + let id = result["id"].as_i64().unwrap(); + let (status, _) = request( + app.clone(), + "DELETE", + "/twofaccounts", + json!({"ids":id.to_string()}), + ) + .await; + assert_eq!(status, StatusCode::NO_CONTENT); + assert!(read_icon(&state, &name).await.unwrap().is_none()); + let (status,result)=request(app,"POST","/twofaccounts",json!({"uri":"otpauth://totp/alice?secret=MY&image=http%3A%2F%2F127.0.0.1%2Fsecret.png"})).await; + assert_eq!(status, StatusCode::CREATED); + assert!(result["icon"].is_null()); + tokio::fs::remove_file(cached).await.unwrap(); + } +} diff --git a/src/imports.rs b/src/imports.rs new file mode 100644 index 0000000..d34d5b8 --- /dev/null +++ b/src/imports.rs @@ -0,0 +1,567 @@ +//! Migration previews for the export formats accepted by 2FAuth. +use crate::{ + AppState, + accounts::{ApiError, ApiResult, invalid}, + otp::{self, OtpConfig}, +}; +use axum::{ + Json, Router, + extract::{FromRequest, Multipart, Request, State}, + http::StatusCode, + response::IntoResponse, + routing::post, +}; +use base64::{ + Engine, + engine::general_purpose::{STANDARD, STANDARD_NO_PAD}, +}; +use serde_json::{Value, json}; + +pub fn routes() -> Router { + Router::new().route("/twofaccounts/migration", post(migrate)) +} +fn bad(message: &'static str) -> ApiError { + ApiError(StatusCode::BAD_REQUEST, message) +} + +fn missing_fields() -> axum::response::Response { + ( + StatusCode::UNPROCESSABLE_ENTITY, + Json(json!({ + "message": "The payload field is required when file is not present. (and 1 more error)", + "errors": { + "payload": ["The payload field is required when file is not present."], + "file": ["The file field is required when payload is not present."] + } + })), + ) + .into_response() +} + +async fn migrate(State(state): State, request: Request) -> ApiResult { + let content_type = request + .headers() + .get("content-type") + .and_then(|x| x.to_str().ok()) + .unwrap_or("") + .to_owned(); + let query: Value = serde_urlencoded::from_str::>( + request.uri().query().unwrap_or(""), + ) + .map(|v| json!(v)) + .unwrap_or(json!({})); + let mut with_secret = truthy(&query["withSecret"]); + + let payload = if content_type.starts_with("multipart/form-data") { + let mut multipart = Multipart::from_request(request, &state) + .await + .map_err(|_| invalid())?; + let mut text = None; + let mut file = None; + while let Some(field) = multipart.next_field().await.map_err(|_| invalid())? { + let name = field.name().unwrap_or("").to_owned(); + if name == "file" { + let filename = field.file_name().unwrap_or("").to_ascii_lowercase(); + if ![".txt", ".json", ".csv"] + .iter() + .any(|ext| filename.ends_with(ext)) + { + return Err(invalid()); + } + file = Some(field.text().await.map_err(|_| invalid())?); + } else if name == "payload" { + text = Some(field.text().await.map_err(|_| invalid())?); + } else if name == "withSecret" { + with_secret = truthy(&json!(field.text().await.map_err(|_| invalid())?)); + } + } + let Some(content) = file.or(text).filter(|s| !s.trim().is_empty()) else { + return Ok(missing_fields()); + }; + content + } else { + let bytes = axum::body::to_bytes(request.into_body(), 2 * 1024 * 1024) + .await + .map_err(|_| invalid())?; + let body: Value = if content_type.starts_with("application/x-www-form-urlencoded") { + json!( + serde_urlencoded::from_bytes::>(&bytes) + .map_err(|_| invalid())? + ) + } else { + serde_json::from_slice(&bytes).map_err(|_| invalid())? + }; + if body.get("withSecret").is_some() { + with_secret = truthy(&body["withSecret"]); + } + if body + .get("payload") + .is_none_or(|v| v.is_null() || v.as_str().is_some_and(|s| s.trim().is_empty())) + { + return Ok(missing_fields()); + } + body["payload"] + .as_str() + .filter(|s| !s.is_empty()) + .ok_or_else(invalid)? + .to_owned() + }; + let mut values = parse_payload(&payload)?; + // Import icons alongside their preview rows, as upstream does before account storage. + if let Ok(source) = serde_json::from_str::(&payload) { + let entries = source["db"]["entries"] + .as_array() + .or_else(|| source["data"].as_array()); + if let Some(entries) = entries { + for (row, source) in values.iter_mut().zip(entries) { + if row["id"] == -2 { + continue; + } + let encoded = source + .get("icon_file") + .or_else(|| source.get("icon")) + .and_then(Value::as_str); + if let (Some(mime), Some(encoded)) = (source["icon_mime"].as_str(), encoded) + && let Ok(name) = crate::icons::persist_embedded(&state, mime, encoded).await + { + row["icon"] = json!(name); + } + } + } + } + if !with_secret { + for value in &mut values { + value.as_object_mut().unwrap().remove("secret"); + } + } + Ok(Json(values).into_response()) +} +fn truthy(v: &Value) -> bool { + v == true + || v == 1 + || v.as_str() + .is_some_and(|s| ["1", "true", "on", "yes"].contains(&s.to_ascii_lowercase().as_str())) +} +fn resource(mut c: OtpConfig) -> anyhow::Result { + c.normalize(); + c.validate()?; + if c.otp_type == "hotp" { + c.period = None; + c.counter = Some(c.counter.unwrap_or(0)); + } else { + c.counter = None; + c.period = Some(c.period.unwrap_or(30)); + } + if c.counter.is_some_and(|n| n >= i64::MAX as u64) + || c.period.is_some_and(|n| n > i64::MAX as u64) + { + anyhow::bail!("invalid counter or period"); + } + let mut v = serde_json::to_value(c)?; + v["id"] = json!(0); + v["group_id"] = Value::Null; + v["icon"] = Value::Null; + Ok(v) +} +fn config(v: Value) -> anyhow::Result { + let mut v = v; + for (name, default) in [ + ("algorithm", json!("sha1")), + ("digits", json!(6)), + ("period", json!(30)), + ] { + if v.get(name).is_none_or(Value::is_null) { + v[name] = default; + } + } + resource(serde_json::from_value(v)?) +} +fn failure(item: &Value, reason: &str) -> Value { + json!({"id":-2,"group_id":null,"otp_type":item.get("otp_type").or_else(||item.get("type")).and_then(Value::as_str).unwrap_or("totp"),"account":item.get("account").or_else(||item.get("name")).and_then(Value::as_str).unwrap_or("Invalid account"),"service":item.get("service").or_else(||item.get("issuer")).and_then(Value::as_str).unwrap_or("Invalid service"),"icon":null,"secret":reason,"digits":0,"algorithm":null,"period":null,"counter":null}) +} +fn item_result(item: &Value, result: anyhow::Result) -> Value { + result.unwrap_or_else(|_| { + failure( + item, + "The imported account contains invalid OTP parameters.", + ) + }) +} + +pub fn parse_payload(payload: &str) -> Result, ApiError> { + let payload = payload.trim_start_matches('\u{feff}').trim(); + if payload.starts_with("otpauth-migration://offline?data=") { + return google(payload).map_err(|_| bad("Invalid Google Authenticator migration data.")); + } + if let Ok(v) = serde_json::from_str::(payload) { + if v.get("db").is_some() { + if v["db"].is_string() && v["header"]["slots"].is_array() { + return Err(bad("Encrypted migration data cannot be imported.")); + } + let entries = v["db"]["entries"] + .as_array() + .ok_or_else(|| bad("Invalid Aegis migration data."))?; + return Ok(entries.iter().map(|item| { + let p = json!({"otp_type":item["type"],"account":item.get("name").filter(|v|!v.is_null()).unwrap_or(&item["issuer"]),"service":item["issuer"],"secret":item["info"]["secret"],"algorithm":item["info"]["algo"],"digits":item["info"]["digits"],"period":item["info"]["period"],"counter":item["info"]["counter"]}); + item_result(item,config(p)) + }).collect()); + } + if v.get("schemaVersion").is_some() { + if v.get("servicesEncrypted").is_some() { + return Err(bad("Encrypted migration data cannot be imported.")); + } + let entries = v["services"] + .as_array() + .ok_or_else(|| bad("Invalid 2FAS migration data."))?; + return Ok(entries.iter().map(|item| { + let p = json!({"otp_type":item["otp"]["tokenType"],"account":item["otp"].get("account").filter(|v|!v.is_null()).unwrap_or(&item["name"]),"service":item["name"],"secret":item["secret"],"algorithm":item["otp"]["algorithm"],"digits":item["otp"]["digits"],"period":item["otp"]["period"],"counter":item["otp"]["counter"]}); + item_result(item,config(p)) + }).collect()); + } + if v.get("schema").is_some() && v["app"].as_str().is_some_and(|s| s.starts_with("2fauth_")) + { + let entries = v["data"] + .as_array() + .ok_or_else(|| bad("Invalid 2FAuth migration data."))?; + return Ok(entries + .iter() + .map(|item| item_result(item, config(item.clone()))) + .collect()); + } + if v.get("encrypted").is_some() && v.get("items").is_some() { + if truthy(&v["encrypted"]) { + return Err(bad("Encrypted migration data cannot be imported.")); + } + let entries = v["items"] + .as_array() + .ok_or_else(|| bad("Invalid Bitwarden migration data."))?; + return Ok(entries + .iter() + .map(|item| { + let parsed = (|| { + let uri = item["login"]["totp"] + .as_str() + .ok_or_else(|| anyhow::anyhow!("missing URI"))?; + let mut c = if let Some(secret) = uri.strip_prefix("steam://") { + OtpConfig { + otp_type: "steamtotp".into(), + secret: secret.into(), + ..Default::default() + } + } else { + otp::parse_uri(uri)? + }; + c.service = item["name"].as_str().map(str::to_owned); + c.account = item["login"]["username"] + .as_str() + .or(item["name"].as_str()) + .unwrap_or("") + .into(); + resource(c) + })(); + item_result(item, parsed) + }) + .collect()); + } + return Err(bad("Unsupported migration format.")); + } + let lines: Vec<_> = payload + .lines() + .map(str::trim) + .filter(|s| !s.is_empty()) + .collect(); + if lines.is_empty() + || lines.iter().any(|s| { + !["otpauth://totp/", "otpauth://hotp/", "otpauth://steam/"] + .iter() + .any(|prefix| s.to_ascii_lowercase().starts_with(prefix)) + }) + { + return Err(bad("Unsupported migration format.")); + } + Ok(lines + .into_iter() + .map(|uri| item_result(&json!({}), otp::parse_uri(uri).and_then(resource))) + .collect()) +} + +// Bounded protobuf wire decoder; unknown fields are skipped for forward compatibility. +fn varint(bytes: &[u8], pos: &mut usize) -> anyhow::Result { + let mut n = 0u64; + for shift in (0..70).step_by(7) { + let b = *bytes + .get(*pos) + .ok_or_else(|| anyhow::anyhow!("truncated protobuf"))?; + *pos += 1; + if shift == 63 && b > 1 { + anyhow::bail!("varint overflow"); + } + n |= u64::from(b & 127) << shift; + if b & 128 == 0 { + return Ok(n); + } + } + anyhow::bail!("invalid varint") +} +enum Wire<'a> { + Int(u64), + Bytes(&'a [u8]), + Other, +} +fn fields(bytes: &[u8]) -> anyhow::Result)>> { + let mut pos = 0; + let mut out = Vec::new(); + while pos < bytes.len() { + let key = varint(bytes, &mut pos)?; + if key >> 3 == 0 { + anyhow::bail!("invalid field"); + } + let val = match key & 7 { + 0 => Wire::Int(varint(bytes, &mut pos)?), + 1 | 5 => { + let n = if key & 7 == 1 { 8 } else { 4 }; + pos = pos + .checked_add(n) + .filter(|p| *p <= bytes.len()) + .ok_or_else(|| anyhow::anyhow!("truncated field"))?; + Wire::Other + } + 2 => { + let n = usize::try_from(varint(bytes, &mut pos)?)?; + let end = pos + .checked_add(n) + .filter(|p| *p <= bytes.len()) + .ok_or_else(|| anyhow::anyhow!("truncated field"))?; + let b = &bytes[pos..end]; + pos = end; + Wire::Bytes(b) + } + _ => anyhow::bail!("invalid wire type"), + }; + out.push((key >> 3, val)); + } + Ok(out) +} +fn google(payload: &str) -> anyhow::Result> { + let url = url::Url::parse(payload)?; + let data = url + .query_pairs() + .find(|(k, _)| k == "data") + .ok_or_else(|| anyhow::anyhow!("missing data"))? + .1 + .replace(' ', "+"); + let bytes = STANDARD + .decode(&data) + .or_else(|_| STANDARD_NO_PAD.decode(&data))?; + let mut out = Vec::new(); + for (number, wire) in fields(&bytes)? { + if number != 1 { + continue; + } + let Wire::Bytes(bytes) = wire else { + anyhow::bail!("invalid OTP field"); + }; + let mut item = json!({"otp_type":"totp","account":"","service":null,"secret":"","algorithm":"sha1","digits":6,"period":30,"counter":null}); + let mut invalid_enum = false; + for (number, wire) in fields(bytes)? { + match (number, wire) { + (1, Wire::Bytes(v)) => { + item["secret"] = json!(data_encoding::BASE32_NOPAD.encode(v)) + } + (2, Wire::Bytes(v)) => item["account"] = json!(std::str::from_utf8(v)?), + (3, Wire::Bytes(v)) => item["service"] = json!(std::str::from_utf8(v)?), + (4, Wire::Int(v)) => { + item["algorithm"] = json!(match v { + 0 | 1 => "sha1", + 2 => "sha256", + 3 => "sha512", + 4 => "md5", + _ => { + invalid_enum = true; + "invalid" + } + }) + } + (5, Wire::Int(v)) => { + item["digits"] = json!(match v { + 0 | 1 => 6, + 2 => 8, + _ => { + invalid_enum = true; + 0 + } + }) + } + (6, Wire::Int(v)) => { + item["otp_type"] = json!(match v { + 1 => "hotp", + 0 | 2 => "totp", + _ => { + invalid_enum = true; + "invalid" + } + }) + } + (7, Wire::Int(v)) => item["counter"] = json!(v), + (8, Wire::Int(v)) if v > 0 => item["period"] = json!(v), + _ => {} + } + } + if let (Some(service), Some(account)) = (item["service"].as_str(), item["account"].as_str()) + && !service.is_empty() + { + item["account"] = json!(account.replace(&format!("{service}:"), "")); + } + let result = if invalid_enum { + Err(anyhow::anyhow!("invalid enum")) + } else { + config(item.clone()) + }; + out.push(item_result(&item, result)); + } + Ok(out) +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn previews_each_supported_json_format() { + let exports = [ + json!({"schema":1,"app":"2fauth_v8.0.3","data":[{"otp_type":"totp","account":"alice","service":"Example","secret":"MY","digits":6,"algorithm":"sha1","period":30,"counter":null}]}), + json!({"db":{"entries":[{"type":"totp","name":"alice","issuer":"Example","info":{"secret":"MY","algo":"SHA1","digits":6,"period":30}}]}}), + json!({"schemaVersion":2,"services":[{"name":"Example","secret":"MY","otp":{"account":"alice","tokenType":"TOTP","algorithm":"SHA1","digits":6,"period":30}}]}), + json!({"encrypted":false,"items":[{"name":"Example","login":{"username":"alice","totp":"otpauth://totp/Old:old?issuer=Old&secret=MY"}}]}), + ]; + for export in exports { + let result = + parse_payload(&export.to_string()).unwrap_or_else(|_| panic!("format failed")); + assert_eq!(result[0]["id"], 0); + assert_eq!(result[0]["account"], "alice"); + assert_eq!(result[0]["service"], "Example"); + assert_eq!(result[0]["secret"], "MY======"); + } + } + #[test] + fn plaintext_keeps_invalid_rows_and_steam() { + let result = parse_payload("otpauth://totp/alice?secret=MY\notpauth://totp/bad?secret=INVALID1\notpauth://steam/user?secret=MY").unwrap_or_else(|_|panic!("plaintext")); + assert_eq!(result.len(), 3); + assert_eq!(result[1]["id"], -2); + assert_eq!(result[2]["otp_type"], "steamtotp"); + } + #[test] + fn rejects_encrypted_and_unrecognized_payloads() { + for v in [ + json!({"db":"encrypted","header":{"slots":[]}}), + json!({"schemaVersion":2,"servicesEncrypted":"encrypted"}), + json!({"encrypted":true,"items":[]}), + ] { + assert_eq!( + parse_payload(&v.to_string()).err().unwrap().0, + StatusCode::BAD_REQUEST + ); + } + assert!(parse_payload("random text").is_err()); + } + #[test] + fn google_protobuf_and_bounds() { + // OTP: secret=f, name=Example:alice, issuer=Example, SHA1, six digits, TOTP. + let entry = b"\x0a\x01f\x12\x0dExample:alice\x1a\x07Example\x20\x01\x28\x01\x30\x02"; + let mut payload = vec![10, entry.len() as u8]; + payload.extend_from_slice(entry); + let result = google(&format!( + "otpauth-migration://offline?data={}", + STANDARD.encode(payload) + )) + .unwrap(); + assert_eq!(result[0]["account"], "alice"); + assert_eq!(result[0]["secret"], "MY======"); + assert!(fields(&[10, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2]).is_err()); + assert!(fields(&[10, 25, 1]).is_err()); + } +} + +#[cfg(test)] +mod http_tests { + use super::*; + use axum::{body::Body, http::Request}; + use http_body_util::BodyExt; + use tower::ServiceExt; + #[tokio::test] + async fn migration_hides_secrets_by_default_and_accepts_uploads() { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + let state = AppState { + db, + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + }; + let app = routes().with_state(state); + let missing = app + .clone() + .oneshot( + Request::builder() + .method("POST") + .uri("/twofaccounts/migration") + .header("content-type", "application/json") + .body(Body::from("{}")) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(missing.status(), StatusCode::UNPROCESSABLE_ENTITY); + let errors: Value = + serde_json::from_slice(&missing.into_body().collect().await.unwrap().to_bytes()) + .unwrap(); + assert_eq!( + errors, + json!({ + "message": "The payload field is required when file is not present. (and 1 more error)", + "errors": { + "payload": ["The payload field is required when file is not present."], + "file": ["The file field is required when payload is not present."] + } + }) + ); + let payload = "otpauth://totp/alice?secret=MY"; + let response = app + .clone() + .oneshot( + Request::builder() + .method("POST") + .uri("/twofaccounts/migration") + .header("content-type", "application/json") + .body(Body::from(json!({"payload":payload}).to_string())) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body: Value = + serde_json::from_slice(&response.into_body().collect().await.unwrap().to_bytes()) + .unwrap(); + assert!(body[0].get("secret").is_none()); + let content = format!( + "--boundary\r\nContent-Disposition: form-data; name=\"file\"; filename=\"export.txt\"\r\nContent-Type: text/plain\r\n\r\n{payload}\r\n--boundary\r\nContent-Disposition: form-data; name=\"withSecret\"\r\n\r\ntrue\r\n--boundary--\r\n" + ); + let response = app + .oneshot( + Request::builder() + .method("POST") + .uri("/twofaccounts/migration") + .header("content-type", "multipart/form-data; boundary=boundary") + .body(Body::from(content)) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body: Value = + serde_json::from_slice(&response.into_body().collect().await.unwrap().to_bytes()) + .unwrap(); + assert_eq!(body[0]["secret"], "MY======"); + } +} diff --git a/src/laravel_sessions.rs b/src/laravel_sessions.rs new file mode 100644 index 0000000..f4a79d8 --- /dev/null +++ b/src/laravel_sessions.rs @@ -0,0 +1,838 @@ +//! Laravel session storage and SessionGuard recaller compatibility. +//! +//! Only scalar/array PHP serialization is accepted: no PHP code, objects, +//! references or custom serializers are ever evaluated. +use crate::{ApiError, AppState, auth::AuthUser}; +use axum::http::{HeaderMap, StatusCode, header}; +use base64::{Engine, engine::general_purpose::STANDARD}; +use serde_json::{Map, Value}; +use sha1::{Digest, Sha1}; +use sqlx::Row; +use std::path::PathBuf; +use subtle::ConstantTimeEq; +use tokio::io::AsyncReadExt; + +const MAX_SESSION: usize = 1024 * 1024; +const LIFETIME: i64 = 90 * 24 * 3600; // pinned config/session.php +const GUARD: &str = "web-guard"; + +#[derive(Clone, Debug)] +struct Config { + driver: String, + files: PathBuf, + table: String, + cookie: String, + encrypt: bool, +} +impl Config { + fn environment() -> Result { + let table = std::env::var("SESSION_TABLE").unwrap_or_else(|_| "sessions".into()); + if table.is_empty() + || !table + .bytes() + .all(|b| b.is_ascii_alphanumeric() || b == b'_') + { + return Err(unavailable()); + } + let name = std::env::var("APP_NAME").unwrap_or_else(|_| "laravel".into()); + let mut slug = String::new(); + for c in name.to_lowercase().replace('@', " at ").chars() { + if c.is_ascii_alphanumeric() { + slug.push(c); + } else if (c.is_whitespace() || c == '-' || c == '_') + && !slug.ends_with('_') + && !slug.is_empty() + { + slug.push('_'); + } + } + let slug = slug.trim_end_matches('_'); + Ok(Self { + driver: std::env::var("SESSION_DRIVER").unwrap_or_else(|_| "file".into()), + files: PathBuf::from( + std::env::var("STORAGE_PATH").unwrap_or_else(|_| "storage".into()), + ) + .join("framework/sessions"), + table, + cookie: std::env::var("SESSION_COOKIE").unwrap_or_else(|_| format!("{slug}_session")), + encrypt: std::env::var("SESSION_ENCRYPT") + .is_ok_and(|v| matches!(v.as_str(), "true" | "1" | "(true)")), + }) + } +} + +#[derive(Clone, Debug)] +pub struct LegacySession { + pub id: Option, + pub user: Option, + pub csrf: String, + pub remembered: bool, + config: Config, + data: Value, + php: bool, +} +fn unavailable() -> ApiError { + ApiError( + StatusCode::SERVICE_UNAVAILABLE, + "Authentication unavailable", + ) +} +fn guard_key(prefix: &str) -> String { + format!( + "{prefix}_{GUARD}_{:x}", + Sha1::digest(b"Illuminate\\Auth\\SessionGuard") + ) +} +pub fn login_key() -> String { + guard_key("login") +} +pub fn recaller_name() -> String { + guard_key("remember") +} +pub fn cookie_names() -> Result, ApiError> { + Ok(vec![Config::environment()?.cookie, recaller_name()]) +} + +fn cookie(headers: &HeaderMap, name: &str) -> Result, ()> { + let mut found = None; + for h in headers.get_all(header::COOKIE) { + for part in h.to_str().map_err(|_| ())?.split(';') { + if let Some((n, value)) = part.trim().split_once('=') + && n == name + { + if found.is_some() || value.len() > MAX_SESSION { + return Err(()); + } + found = Some(value.to_owned()); + } + } + } + Ok(found) +} +fn valid_id(id: &str) -> bool { + id.len() == 40 && id.bytes().all(|b| b.is_ascii_alphanumeric()) +} + +pub async fn authenticate( + state: &AppState, + headers: &HeaderMap, +) -> Result, ApiError> { + authenticate_with(state, headers, Config::environment()?).await +} +async fn authenticate_with( + state: &AppState, + headers: &HeaderMap, + config: Config, +) -> Result, ApiError> { + let Some(cipher) = state.cipher.as_ref() else { + return Ok(None); + }; + let encrypted = match cookie(headers, &config.cookie) { + Ok(v) => v, + Err(()) => return Ok(None), + }; + let mut session = None; + if let Some(encrypted) = encrypted + && let Ok(id) = cipher.decrypt_cookie(&config.cookie, &encrypted) + && valid_id(&id) + && let Some(payload) = read(state, &config, &id).await? + { + // EncryptedStore uses Encrypter::encrypt (serialize=true), + // unlike encrypted cookies' encryptString protocol. + let plaintext = if config.encrypt { + cipher + .decrypt(&payload) + .ok() + .and_then(|v| php_value(&v)) + .and_then(|v| v.as_str().map(str::to_owned)) + } else { + Some(payload) + }; + if let Some(plaintext) = plaintext + && let Some((data, php)) = decode(&plaintext) + && let Some(csrf) = data + .get("_token") + .and_then(Value::as_str) + .filter(|s| !s.is_empty() && s.len() <= 256) + { + let mut found = LegacySession { + id: Some(id), + user: None, + csrf: csrf.to_owned(), + remembered: false, + config: config.clone(), + data, + php, + }; + if let Some(id) = found.data.get(login_key()).and_then(user_id) { + found.user = user(state, id).await?; + } + session = Some(found); + } + } + if session.as_ref().is_some_and(|s| s.user.is_some()) { + return Ok(session); + } + // SessionGuard falls back to the recaller when its session has no identity. + let recaller = recaller_name(); + let encrypted = match cookie(headers, &recaller) { + Ok(v) => v, + Err(()) => return Ok(None), + }; + if let Some(plain) = encrypted.and_then(|v| cipher.decrypt_cookie(&recaller, &v).ok()) { + let plain = php_value(&plain) + .and_then(|v| v.as_str().map(str::to_owned)) + .unwrap_or(plain); + let parts: Vec<_> = plain.split('|').collect(); + if parts.len() >= 3 + && !parts[0].trim().is_empty() + && !parts[1].trim().is_empty() + && let Ok(id) = parts[0].parse::() + { + let row = sqlx::query("SELECT id,is_admin,remember_token FROM users WHERE id=?") + .bind(id) + .fetch_optional(&state.db) + .await?; + if let Some(row) = row { + let token: Option = row.try_get("remember_token")?; + if token.as_ref().is_some_and(|t| { + !t.is_empty() && bool::from(t.as_bytes().ct_eq(parts[1].as_bytes())) + }) { + let mut found = session.unwrap_or_else(|| LegacySession { + id: None, + user: None, + csrf: crate::auth::random(), + remembered: true, + config, + data: Value::Object(Map::new()), + php: false, + }); + found.user = Some(AuthUser { + id, + is_admin: row.try_get("is_admin")?, + }); + found.remembered = true; + return Ok(Some(found)); + } + } + } + } + Ok(session) +} +fn user_id(v: &Value) -> Option { + v.as_i64().or_else(|| v.as_str()?.parse().ok()) +} +async fn user(state: &AppState, id: i64) -> Result, ApiError> { + Ok(sqlx::query("SELECT id,is_admin FROM users WHERE id=?") + .bind(id) + .fetch_optional(&state.db) + .await? + .map(|r| AuthUser { + id: r.get("id"), + is_admin: r.get("is_admin"), + })) +} +async fn read(state: &AppState, config: &Config, id: &str) -> Result, ApiError> { + match config.driver.as_str() { + "file" => { + let path = config.files.join(id); + let metadata = match tokio::fs::symlink_metadata(&path).await { + Ok(m) => m, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => return Ok(None), + Err(_) => return Err(unavailable()), + }; + if !metadata.is_file() + || metadata.len() > MAX_SESSION as u64 + || metadata + .modified() + .ok() + .and_then(|t| t.elapsed().ok()) + .is_none_or(|age| age.as_secs() > LIFETIME as u64) + { + return Ok(None); + } + let mut bytes = Vec::new(); + tokio::fs::File::open(&path) + .await + .map_err(|_| unavailable())? + .take(MAX_SESSION as u64 + 1) + .read_to_end(&mut bytes) + .await + .map_err(|_| unavailable())?; + Ok(if bytes.len() <= MAX_SESSION { + String::from_utf8(bytes).ok() + } else { + None + }) + } + "database" => { + let query = format!( + "SELECT payload FROM \"{}\" WHERE id=? AND last_activity>=?", + config.table + ); + let payload: Option = sqlx::query_scalar(&query) + .bind(id) + .bind(crate::auth::now() - LIFETIME) + .fetch_optional(&state.db) + .await?; + Ok(payload.and_then(|v| { + if v.len() > MAX_SESSION * 2 { + None + } else { + STANDARD + .decode(v) + .ok() + .filter(|v| v.len() <= MAX_SESSION) + .and_then(|v| String::from_utf8(v).ok()) + } + })) + } + // Unsupported stores are never confused with the experimental Rust store. + _ => Ok(None), + } +} + +/// Update the original store on an authenticated request, preserving attributes. +pub async fn touch(state: &AppState, session: &LegacySession) -> Result<(), ApiError> { + let Some(id) = session.id.as_ref() else { + return Ok(()); + }; + let payload = if session.php { + encode_php(&session.data) + } else { + serde_json::to_string(&session.data).map_err(|_| unavailable())? + }; + let payload = if session.config.encrypt { + state + .cipher + .as_ref() + .ok_or_else(unavailable)? + .encrypt(&encode_php(&Value::String(payload))) + .map_err(|_| unavailable())? + } else { + payload + }; + match session.config.driver.as_str() { + "file" => tokio::fs::write(session.config.files.join(id), payload) + .await + .map_err(|_| unavailable())?, + "database" => { + sqlx::query(&format!( + "UPDATE \"{}\" SET payload=?,last_activity=? WHERE id=?", + session.config.table + )) + .bind(STANDARD.encode(payload)) + .bind(crate::auth::now()) + .bind(id) + .execute(&state.db) + .await?; + } + _ => (), + } + Ok(()) +} +pub async fn destroy(state: &AppState, session: &LegacySession) -> Result<(), ApiError> { + let Some(id) = session.id.as_ref() else { + return Ok(()); + }; + match session.config.driver.as_str() { + "file" => match tokio::fs::remove_file(session.config.files.join(id)).await { + Ok(()) => (), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => (), + Err(_) => return Err(unavailable()), + }, + "database" => { + sqlx::query(&format!( + "DELETE FROM \"{}\" WHERE id=?", + session.config.table + )) + .bind(id) + .execute(&state.db) + .await?; + } + _ => (), + } + Ok(()) +} +pub async fn revoke_remember(state: &AppState, id: i64) -> Result<(), ApiError> { + sqlx::query("UPDATE users SET remember_token=? WHERE id=?") + .bind(crate::auth::random()) + .bind(id) + .execute(&state.db) + .await?; + Ok(()) +} +pub fn csrf_valid(state: &AppState, headers: &HeaderMap, session: &LegacySession) -> bool { + let token = headers + .get("x-csrf-token") + .and_then(|v| v.to_str().ok()) + .map(str::to_owned) + .or_else(|| { + let encrypted = headers.get("x-xsrf-token")?.to_str().ok()?; + state + .cipher + .as_ref()? + .decrypt_cookie("XSRF-TOKEN", encrypted) + .ok() + }); + token.is_some_and(|t| bool::from(t.as_bytes().ct_eq(session.csrf.as_bytes()))) +} + +fn decode(input: &str) -> Option<(Value, bool)> { + if input.len() > MAX_SESSION { + return None; + } + if let Ok(v @ Value::Object(_)) = serde_json::from_str::(input) { + return Some((v, false)); + } + let value = php_value(input)?; + if value.is_object() { + Some((value, true)) + } else { + None + } +} +fn php_value(input: &str) -> Option { + if input.len() > MAX_SESSION { + return None; + } + let mut parser = Php { + bytes: input.as_bytes(), + pos: 0, + nodes: 0, + }; + let value = parser.value(0)?; + if parser.pos == input.len() { + Some(value) + } else { + None + } +} +struct Php<'a> { + bytes: &'a [u8], + pos: usize, + nodes: usize, +} +impl Php<'_> { + fn expect(&mut self, b: &[u8]) -> Option<()> { + if self.bytes.get(self.pos..self.pos.checked_add(b.len())?)? != b { + return None; + } + self.pos += b.len(); + Some(()) + } + fn until(&mut self, end: u8) -> Option<&[u8]> { + let start = self.pos; + let offset = self.bytes.get(start..)?.iter().position(|b| *b == end)?; + self.pos += offset + 1; + self.bytes.get(start..start + offset) + } + fn number(&mut self, end: u8) -> Option { + std::str::from_utf8(self.until(end)?).ok()?.parse().ok() + } + fn value(&mut self, depth: usize) -> Option { + self.nodes += 1; + if depth > 32 || self.nodes > 10000 { + return None; + } + let kind = *self.bytes.get(self.pos)?; + self.pos += 1; + match kind { + b'N' => { + self.expect(b";")?; + Some(Value::Null) + } + b'b' => { + self.expect(b":")?; + let b = self.until(b';')?; + Some(Value::Bool(match b { + b"1" => true, + b"0" => false, + _ => return None, + })) + } + b'i' => { + self.expect(b":")?; + let n: i64 = std::str::from_utf8(self.until(b';')?).ok()?.parse().ok()?; + Some(n.into()) + } + b'd' => { + self.expect(b":")?; + let n: f64 = std::str::from_utf8(self.until(b';')?).ok()?.parse().ok()?; + serde_json::Number::from_f64(n).map(Value::Number) + } + b's' => { + self.expect(b":")?; + let len = self.number(b':')?; + self.expect(b"\"")?; + let end = self.pos.checked_add(len)?; + let s = std::str::from_utf8(self.bytes.get(self.pos..end)?) + .ok()? + .to_owned(); + self.pos = end; + self.expect(b"\";")?; + Some(Value::String(s)) + } + b'a' => { + self.expect(b":")?; + let len = self.number(b':')?; + if len > 10000 { + return None; + } + self.expect(b"{")?; + let mut map = Map::new(); + for _ in 0..len { + let key = match self.value(depth + 1)? { + Value::String(s) => s, + Value::Number(n) if n.is_i64() => n.to_string(), + _ => return None, + }; + let value = self.value(depth + 1)?; + if map.insert(key, value).is_some() { + return None; + } + } + self.expect(b"}")?; + Some(Value::Object(map)) + } + _ => None, // objects, references and resources are deliberately rejected + } + } +} +fn encode_php(value: &Value) -> String { + match value { + Value::Null => "N;".into(), + Value::Bool(v) => format!("b:{};", u8::from(*v)), + Value::Number(v) => format!("{}:{v};", if v.is_i64() || v.is_u64() { "i" } else { "d" }), + Value::String(v) => format!("s:{}:\"{v}\";", v.len()), + Value::Object(v) => format!( + "a:{}:{{{}}}", + v.len(), + v.iter() + .map(|(k, v)| format!("{}{}", encode_php(&Value::String(k.clone())), encode_php(v))) + .collect::() + ), + Value::Array(v) => format!( + "a:{}:{{{}}}", + v.len(), + v.iter() + .enumerate() + .map(|(i, v)| format!("i:{i};{}", encode_php(v))) + .collect::() + ), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::{Arc, atomic::AtomicBool}; + const KEY: &str = "0123456789abcdef0123456789abcdef"; + async fn setup(driver: &str) -> (AppState, tempfile::TempDir, Config) { + let db = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap(); + sqlx::raw_sql("CREATE TABLE users(id INTEGER PRIMARY KEY,is_admin INTEGER,remember_token TEXT); INSERT INTO users VALUES(7,1,'remember-fixture'); CREATE TABLE sessions(id TEXT PRIMARY KEY,user_id INTEGER,ip_address TEXT,user_agent TEXT,payload TEXT,last_activity INTEGER);") .execute(&db).await.unwrap(); + let dir = tempfile::tempdir().unwrap(); + let config = Config { + driver: driver.into(), + files: dir.path().to_owned(), + cookie: "2fauth_session".into(), + table: "sessions".into(), + encrypt: false, + }; + let state = AppState { + db, + cipher: Some(Arc::new( + crate::crypto::LaravelCipher::from_app_key(KEY).unwrap(), + )), + encrypt_db: Arc::new(AtomicBool::new(false)), + }; + (state, dir, config) + } + fn headers(state: &AppState, name: &str, value: &str) -> HeaderMap { + let encrypted = state + .cipher + .as_ref() + .unwrap() + .encrypt_cookie(name, value) + .unwrap(); + let mut headers = HeaderMap::new(); + headers.insert( + header::COOKIE, + format!("{name}={encrypted}").parse().unwrap(), + ); + headers + } + #[test] + fn scalar_parser_is_bounded_and_never_accepts_objects_or_references() { + for value in [ + "O:8:\"stdClass\":0:{}", + "a:1:{s:1:\"x\";O:8:\"stdClass\":0:{}}", + "a:1:{s:1:\"x\";R:1;}", + "a:999999999:{}", + "a:1:{s:99999999:\"x\";N;}", + "a:0:{}trailing", + "a:2:{s:1:\"x\";i:1;s:1:\"x\";i:2;}", + ] { + assert!(decode(value).is_none(), "{value}"); + } + let value = serde_json::json!({"_token":"Unicode 🔐", "null":null, "nested":{"yes":true,"number":-42}}); + assert_eq!(decode(&encode_php(&value)).unwrap().0, value); + } + #[tokio::test] + async fn database_session_csrf_touch_expiration_and_destroy() { + let (state, _dir, config) = setup("database").await; + let id = "a".repeat(40); + let data = serde_json::json!({login_key():7,"_token":"php-csrf-token","_flash":{"old":[],"new":[]}}); + sqlx::query("INSERT INTO sessions(id,payload,last_activity) VALUES(?,?,?)") + .bind(&id) + .bind(STANDARD.encode(data.to_string())) + .bind(crate::auth::now()) + .execute(&state.db) + .await + .unwrap(); + let mut h = headers(&state, &config.cookie, &id); + let session = authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .unwrap(); + assert_eq!(session.user.as_ref().unwrap().id, 7); + assert!(!csrf_valid(&state, &h, &session)); + h.insert("x-csrf-token", "php-csrf-token".parse().unwrap()); + assert!(csrf_valid(&state, &h, &session)); + h.remove("x-csrf-token"); + h.insert( + "x-xsrf-token", + state + .cipher + .as_ref() + .unwrap() + .encrypt_cookie("XSRF-TOKEN", "php-csrf-token") + .unwrap() + .parse() + .unwrap(), + ); + assert!(csrf_valid(&state, &h, &session)); + sqlx::query("UPDATE sessions SET last_activity=0") + .execute(&state.db) + .await + .unwrap(); + assert!( + authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .is_none() + ); + touch(&state, &session).await.unwrap(); + assert!( + authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .is_some() + ); + destroy(&state, &session).await.unwrap(); + assert!( + authenticate_with(&state, &h, config) + .await + .unwrap() + .is_none() + ); + } + #[tokio::test] + async fn file_php_and_encrypted_sessions_preserve_attributes() { + let (state, _dir, mut config) = setup("file").await; + let id = "B".repeat(40); + let data = + serde_json::json!({login_key():"7","_token":"fixture-csrf","other":{"example":"🔐"}}); + for encrypt in [false, true] { + config.encrypt = encrypt; + let php = encode_php(&data); + let payload = if encrypt { + state + .cipher + .as_ref() + .unwrap() + .encrypt(&encode_php(&Value::String(php))) + .unwrap() + } else { + php + }; + tokio::fs::write(config.files.join(&id), payload) + .await + .unwrap(); + let h = headers(&state, &config.cookie, &id); + let session = authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .unwrap(); + assert_eq!(session.user.as_ref().unwrap().id, 7); + touch(&state, &session).await.unwrap(); + let written = tokio::fs::read_to_string(config.files.join(&id)) + .await + .unwrap(); + let written = if encrypt { + php_value(&state.cipher.as_ref().unwrap().decrypt(&written).unwrap()) + .unwrap() + .as_str() + .unwrap() + .to_owned() + } else { + written + }; + assert_eq!(decode(&written).unwrap().0, data); + std::fs::File::options() + .write(true) + .open(config.files.join(&id)) + .unwrap() + .set_times(std::fs::FileTimes::new().set_modified(std::time::UNIX_EPOCH)) + .unwrap(); + assert!( + authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .is_none() + ); + destroy(&state, &session).await.unwrap(); + } + let h = headers(&state, &config.cookie, "../not-a-session"); + assert!( + authenticate_with(&state, &h, config) + .await + .unwrap() + .is_none() + ); + } + #[tokio::test] + async fn recaller_requires_exact_token_and_logout_rotation_revokes_it() { + let (state, _dir, config) = setup("file").await; + for value in [ + "7|wrong|hash", + "7||hash", + "7|remember-fixture", + "8|remember-fixture|hash", + ] { + let h = headers(&state, &recaller_name(), value); + assert!( + authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .is_none() + ); + } + let h = headers(&state, &recaller_name(), "7|remember-fixture|password-hash"); + let session = authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .unwrap(); + assert_eq!(session.user.as_ref().unwrap().id, 7); + assert!(session.remembered); + assert!(session.id.is_none()); + let mut duplicate = h.clone(); + duplicate.append(header::COOKIE, h[header::COOKIE].clone()); + assert!( + authenticate_with(&state, &duplicate, config.clone()) + .await + .unwrap() + .is_none() + ); + revoke_remember(&state, 7).await.unwrap(); + assert!( + authenticate_with(&state, &h, config) + .await + .unwrap() + .is_none() + ); + } + #[tokio::test] + async fn pinned_php_generated_fixtures_work_for_both_session_stores() { + let fixtures: Vec = + serde_json::from_str(include_str!("../tests/fixtures/laravel_sessions.json")).unwrap(); + for fixture in fixtures { + assert_eq!(fixture["login_key"], login_key()); + assert_eq!(fixture["recaller_name"], recaller_name()); + for driver in ["file", "database"] { + let (state, _dir, mut config) = setup(driver).await; + config.encrypt = fixture["encrypted"].as_bool().unwrap(); + let id = fixture["session_id"].as_str().unwrap(); + if driver == "file" { + tokio::fs::write(config.files.join(id), fixture["payload"].as_str().unwrap()) + .await + .unwrap(); + } else { + sqlx::query("INSERT INTO sessions(id,payload,last_activity) VALUES(?,?,?)") + .bind(id) + .bind(fixture["database_payload"].as_str().unwrap()) + .bind(crate::auth::now()) + .execute(&state.db) + .await + .unwrap(); + } + let mut h = HeaderMap::new(); + h.insert( + header::COOKIE, + format!( + "2fauth_session={}", + fixture["session_cookie"].as_str().unwrap() + ) + .parse() + .unwrap(), + ); + h.insert( + "x-xsrf-token", + fixture["csrf_cookie"].as_str().unwrap().parse().unwrap(), + ); + let session = authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .unwrap(); + assert_eq!(session.user.as_ref().unwrap().id, 7); + assert_eq!(session.csrf, fixture["csrf"].as_str().unwrap()); + assert!(csrf_valid(&state, &h, &session)); + assert_eq!(session.data["preferences"]["language"], "fr"); + if fixture["serialization"] == "php" { + let original = fixture["payload"].as_str().unwrap(); + let original = if config.encrypt { + php_value(&state.cipher.as_ref().unwrap().decrypt(original).unwrap()) + .unwrap() + .as_str() + .unwrap() + .to_owned() + } else { + original.to_owned() + }; + // Exact equality with PHP serialize() output verifies that + // Laravel can read the Rust writer, including byte lengths. + assert_eq!(encode_php(&session.data), original); + } + touch(&state, &session).await.unwrap(); + let reread = authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .unwrap(); + assert_eq!(reread.data, session.data); + destroy(&state, &session).await.unwrap(); + assert!( + authenticate_with(&state, &h, config.clone()) + .await + .unwrap() + .is_none() + ); + h.insert( + header::COOKIE, + format!( + "{}={}", + recaller_name(), + fixture["recaller_cookie"].as_str().unwrap() + ) + .parse() + .unwrap(), + ); + let remembered = authenticate_with(&state, &h, config) + .await + .unwrap() + .unwrap(); + assert!(remembered.remembered); + assert_eq!(remembered.user.unwrap().id, 7); + } + } + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..589dc60 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,198 @@ +pub mod accounts; +pub mod api_limits; +pub mod auth; +pub mod auth_audit; +pub mod cors; +pub mod crypto; +pub mod db; +pub mod frontend; +pub mod groups; +pub mod icons; +pub mod imports; +pub mod laravel_sessions; +pub mod mail; +pub mod oauth_device; +pub mod oauth_management; +pub mod oauth_server; +pub mod otp; +pub mod passport; +pub mod profile; +pub mod proxy_auth; +pub mod schema_validation; +pub mod settings; +pub mod sharing; +pub mod sso; +pub mod subdirectory; +pub mod system; +pub mod users; +pub mod webauthn; + +use axum::{ + Json, Router, + http::{ + StatusCode, + header::{CACHE_CONTROL, HeaderValue}, + }, + middleware, + response::{IntoResponse, Response}, + routing::get, +}; +use serde_json::json; +use sqlx::SqlitePool; +use std::sync::Arc; + +#[derive(Clone)] +pub struct AppState { + pub db: SqlitePool, + pub cipher: Option>, + pub encrypt_db: Arc, +} + +impl AppState { + pub fn encryption_enabled(&self) -> bool { + self.encrypt_db.load(std::sync::atomic::Ordering::SeqCst) + } +} + +#[derive(Debug)] +pub struct ApiError(pub StatusCode, pub &'static str); +impl IntoResponse for ApiError { + fn into_response(self) -> Response { + if self.0 == StatusCode::FORBIDDEN + && ["Forbidden", "This action is unauthorized."].contains(&self.1) + { + ( + self.0, + Json(json!({"message":"forbidden","reason":"This action is unauthorized."})), + ) + .into_response() + } else { + (self.0, Json(json!({"message": self.1}))).into_response() + } + } +} +impl From for ApiError { + fn from(error: sqlx::Error) -> Self { + // Never expose SQL values, hashes, secrets or encryption keys in HTTP responses/logs. + tracing::error!(kind = ?std::mem::discriminant(&error), "database operation failed"); + Self(StatusCode::INTERNAL_SERVER_ERROR, "Server Error") + } +} + +pub fn router(state: AppState) -> Router { + router_at(state, &subdirectory::configured_prefix()) +} +pub(crate) fn router_at(state: AppState, prefix: &str) -> Router { + // Keep account reads/writes and encryption transitions mutually exclusive. + // Each router owns one gate, shared by all clones used by axum. + let gate = Arc::new(tokio::sync::RwLock::new(())); + let protected = accounts::routes() + .merge(groups::routes()) + .merge(imports::routes()) + .merge(sharing::routes()) + .merge(users::routes()) + .merge(icons::routes()) + .merge(settings::routes()) + .route_layer(middleware::from_fn_with_state( + state.clone(), + auth::require_auth, + )) + .layer(middleware::from_fn( + move |request: axum::extract::Request, next: middleware::Next| { + let gate = gate.clone(); + async move { + if (request.uri().path().starts_with("/settings") + || request.uri().path().starts_with("/api/v1/settings")) + && !matches!( + *request.method(), + axum::http::Method::GET | axum::http::Method::HEAD + ) + { + let _guard = gate.write().await; + next.run(request).await + } else { + let _guard = gate.read().await; + next.run(request).await + } + } + }, + )); + let app = Router::new() + .nest( + "/api/v1", + protected + .route( + "/user/name", + get(|| async { + ( + [("deprecation", "Tue, 21 Mar 2023 00:00:00 GMT")], + Json(json!({"deprecation":true})), + ) + }), + ) + .fallback(|| async { + ( + StatusCode::NOT_FOUND, + Json(json!({"message":"unknowkn endpoint"})), + ) + }) + .layer(middleware::from_fn_with_state( + state.clone(), + api_limits::handle, + )), + ) + .merge(auth::routes()) + .merge(profile::routes(state.clone())) + .merge(passport::routes(state.clone())) + .merge(oauth_server::routes(state.clone())) + .merge(oauth_management::routes(state.clone())) + .merge(oauth_device::routes(state.clone())) + .merge(mail::routes(state.clone())) + .merge(sso::routes()) + .merge(webauthn::routes(state.clone())) + .merge(system::routes().route_layer(middleware::from_fn_with_state( + state.clone(), + auth::require_auth, + ))) + .route("/up", get(frontend::health)) + .merge(frontend::routes()) + .merge(icons::public_routes()) + .fallback(frontend::landing) + .layer(axum::extract::DefaultBodyLimit::max(2 * 1024 * 1024)) + .layer(middleware::from_fn(cache_policy)) + .layer(middleware::from_fn(cors::handle)) + .with_state(state); + subdirectory::mount(app, prefix) +} + +async fn cache_policy( + request: axum::extract::Request, + next: middleware::Next, +) -> axum::response::Response { + let oauth = request.uri().path().starts_with("/oauth/"); + let mut response = next.run(request).await; + if oauth { + match response + .headers() + .get(CACHE_CONTROL) + .and_then(|value| value.to_str().ok()) + { + None => { + response + .headers_mut() + .insert(CACHE_CONTROL, HeaderValue::from_static("no-cache, private")); + } + Some("no-store") => { + response + .headers_mut() + .insert(CACHE_CONTROL, HeaderValue::from_static("no-store, private")); + } + _ => (), + } + } else { + response + .headers_mut() + .insert(CACHE_CONTROL, HeaderValue::from_static("no-store")); + } + response +} diff --git a/src/mail.rs b/src/mail.rs new file mode 100644 index 0000000..61a1f56 --- /dev/null +++ b/src/mail.rs @@ -0,0 +1,493 @@ +//! Notification mail transport. Configuration and transport errors never echo credentials. +use crate::{AppState, auth::AuthUser}; +use axum::{ + Extension, Json, Router, + extract::State, + http::StatusCode, + response::{IntoResponse, Response}, + routing::post, +}; +use lettre::{ + AsyncSendmailTransport, AsyncSmtpTransport, AsyncTransport, Message, Tokio1Executor, + message::{Mailbox, header::ContentType}, + transport::smtp::{ + authentication::Credentials, + client::{Tls, TlsParameters}, + extension::ClientId, + }, +}; +use serde_json::json; +use std::time::Duration; + +#[derive(Debug, thiserror::Error)] +pub enum MailError { + #[error("Invalid mail configuration: {0}")] + Configuration(&'static str), + #[error("The mail server did not accept the message.")] + Delivery, +} +#[derive(Clone)] +struct Config { + driver: String, + from: String, + from_name: String, + host: String, + port: u16, + encryption: String, + username: Option, + password: Option, + verify_peer: bool, + ehlo: Option, + sendmail: String, +} +impl Config { + fn from_env() -> Result { + Self::read(|name| std::env::var(name).ok()) + } + fn read(get: impl Fn(&str) -> Option) -> Result { + let value = |key, default: &str| get(key).unwrap_or_else(|| default.to_owned()); + let mut config = Self { + driver: get("MAIL_MAILER") + .or_else(|| get("MAIL_DRIVER")) + .unwrap_or_else(|| "smtp".into()), + from: value("MAIL_FROM_ADDRESS", "hello@example.com"), + from_name: get("MAIL_FROM_NAME") + .or_else(|| get("APP_NAME")) + .unwrap_or_else(|| "Laravel".into()), + host: value("MAIL_HOST", "smtp.mailgun.org"), + port: value("MAIL_PORT", "587").parse().unwrap_or(0), + encryption: value("MAIL_ENCRYPTION", "tls"), + username: get("MAIL_USERNAME").filter(|s| !s.is_empty() && s != "null"), + password: get("MAIL_PASSWORD"), + verify_peer: !matches!( + value("MAIL_VERIFY_SSL_PEER", "true").as_str(), + "false" | "0" | "(false)" + ), + ehlo: get("MAIL_EHLO_DOMAIN"), + sendmail: value("MAIL_SENDMAIL_PATH", "/usr/sbin/sendmail -bs -i"), + }; + if let Some(raw) = get("MAIL_URL").filter(|s| config.driver == "smtp" && !s.is_empty()) { + let url = url::Url::parse(&raw) + .map_err(|_| MailError::Configuration("MAIL_URL is invalid"))?; + config.host = url + .host_str() + .ok_or(MailError::Configuration("MAIL_URL requires a host"))? + .into(); + config.encryption = match url.scheme() { + "smtps" => "ssl", + "smtp" => config.encryption.as_str(), + _ => return Err(MailError::Configuration("MAIL_URL must use smtp or smtps")), + } + .into(); + config.port = url + .port() + .unwrap_or(if url.scheme() == "smtps" { 465 } else { 587 }); + if !url.username().is_empty() { + config.username = Some( + percent_encoding::percent_decode_str(url.username()) + .decode_utf8() + .map_err(|_| MailError::Configuration("MAIL_URL user is invalid"))? + .into_owned(), + ); + } + if let Some(password) = url.password() { + config.password = Some( + percent_encoding::percent_decode_str(password) + .decode_utf8() + .map_err(|_| MailError::Configuration("MAIL_URL password is invalid"))? + .into_owned(), + ); + } + for (key, value) in url.query_pairs() { + match key.as_ref() { + "encryption" => config.encryption = value.into_owned(), + "verify_peer" => config.verify_peer = !matches!(value.as_ref(), "false" | "0"), + _ => (), + } + } + } + if config.ehlo.is_none() { + config.ehlo = get("APP_URL") + .and_then(|s| url::Url::parse(&s).ok()) + .and_then(|u| u.host_str().map(str::to_owned)); + } + if config.driver == "smtp" { + if config.host.is_empty() || config.host.contains(['\r', '\n']) || config.port == 0 { + return Err(MailError::Configuration("SMTP host or port is invalid")); + } + if !matches!( + config.encryption.as_str(), + "tls" | "starttls" | "ssl" | "smtps" | "" | "null" | "none" + ) { + return Err(MailError::Configuration( + "MAIL_ENCRYPTION must be tls, ssl or null", + )); + } + if config + .ehlo + .as_ref() + .is_some_and(|s| s.is_empty() || s.contains(['\r', '\n'])) + { + return Err(MailError::Configuration("MAIL_EHLO_DOMAIN is invalid")); + } + } + if !matches!(config.driver.as_str(), "smtp" | "sendmail" | "log") { + return Err(MailError::Configuration( + "The configured mail transport is not supported", + )); + } + Ok(config) + } + fn message(&self, to: &str, subject: &str, body: &str) -> Result { + let from = Mailbox::new( + Some(self.from_name.clone()), + self.from + .parse() + .map_err(|_| MailError::Configuration("MAIL_FROM_ADDRESS is invalid"))?, + ); + let recipient: Mailbox = to + .parse() + .map_err(|_| MailError::Configuration("The recipient email address is invalid"))?; + Message::builder() + .from(from) + .to(recipient) + .subject(subject) + .header(ContentType::TEXT_PLAIN) + .body(body.to_owned()) + .map_err(|_| MailError::Configuration("The notification message is invalid")) + } + fn smtp(&self) -> Result, MailError> { + let mut builder = AsyncSmtpTransport::::builder_dangerous(&self.host) + .port(self.port) + .timeout(Some(Duration::from_secs(30))); + let tls = match self.encryption.as_str() { + "tls" | "starttls" | "ssl" | "smtps" => { + let params = TlsParameters::builder(self.host.clone()) + .dangerous_accept_invalid_certs(!self.verify_peer) + .build() + .map_err(|_| MailError::Configuration("SMTP TLS parameters are invalid"))?; + if matches!(self.encryption.as_str(), "ssl" | "smtps") { + Tls::Wrapper(params) + } else { + Tls::Required(params) + } + } + _ => Tls::None, + }; + builder = builder.tls(tls); + if let Some(name) = &self.ehlo { + builder = builder.hello_name(ClientId::Domain(name.clone())); + } + if let Some(username) = &self.username { + builder = builder.credentials(Credentials::new( + username.clone(), + self.password.clone().unwrap_or_default(), + )); + } + Ok(builder.build()) + } + async fn send(&self, to: &str, subject: &str, body: &str) -> Result<(), MailError> { + let message = self.message(to, subject, body)?; + match self.driver.as_str() { + "smtp" => { + self.smtp()? + .send(message) + .await + .map_err(|_| MailError::Delivery)?; + } + "sendmail" => { + // Never invoke a shell. Laravel's usual -bs/-i flags select modes; + // lettre supplies its own safe submission arguments and envelope. + let mut words = self.sendmail.split_ascii_whitespace(); + let binary = + words + .next() + .filter(|s| s.starts_with('/')) + .ok_or(MailError::Configuration( + "MAIL_SENDMAIL_PATH must name an absolute executable", + ))?; + if words.any(|s| !matches!(s, "-bs" | "-i" | "-t" | "-oi")) { + return Err(MailError::Configuration( + "MAIL_SENDMAIL_PATH contains unsupported arguments", + )); + } + let transport = AsyncSendmailTransport::::new_with_command(binary); + tokio::time::timeout(Duration::from_secs(30), transport.send(message)) + .await + .map_err(|_| MailError::Delivery)? + .map_err(|_| MailError::Delivery)?; + } + "log" => { + tracing::info!(recipient=%to,subject=%subject,body=%body,"Mail notification (explicit log transport)"); + } + _ => { + return Err(MailError::Configuration( + "The configured mail transport is not supported", + )); + } + } + Ok(()) + } +} +pub async fn password_reset(email: &str, url: &str) -> Result<(), MailError> { + Config::from_env()?.send(email,"2FAuth Password Reset",&format!("You are receiving this email because you requested a password reset for your 2FAuth account.\n\nReset password: {url}\n\nThis password reset link will expire in 60 minutes.\nIf you did not request a password reset, no further action is required.")).await +} +pub async fn webauthn_recovery(email: &str, url: &str) -> Result<(), MailError> { + Config::from_env()?.send(email, "Account Recovery Notification", &format!("You are receiving this email because we received an account recovery request for your account.\n\nRecover Account: {url}\n\nThis recovery link will expire in 60 minutes.\nIf you did not request an account recovery, no further action is required.")).await +} +/// Root web route protected by the normal authenticated/CSRF middleware. +pub fn routes(state: AppState) -> Router { + Router::new() + .route("/system/test-email", post(test_email)) + .route_layer(axum::middleware::from_fn_with_state( + state, + crate::auth::require_auth, + )) +} +async fn test_email(State(s): State, Extension(u): Extension) -> Response { + if !u.is_admin { + return ( + StatusCode::FORBIDDEN, + Json(json!({"message":"This action is unauthorized."})), + ) + .into_response(); + } + let email = match sqlx::query_scalar::<_, String>("SELECT email FROM users WHERE id=?") + .bind(u.id) + .fetch_one(&s.db) + .await + { + Ok(email) => email, + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(json!({"message":"Server Error"})), + ) + .into_response(); + } + }; + let result=match Config::from_env(){Ok(config)=>config.send(&email,"2FAuth test email","Hello!\n\nYou are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.\n\nGood news, it works :)").await,Err(e)=>Err(e)}; + match result { + Ok(()) => Json(json!({"message":"Ok"})).into_response(), + Err(e) => ( + StatusCode::FAILED_DEPENDENCY, + Json(json!({"message":"Email sending failed","details":e.to_string()})), + ) + .into_response(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use tokio::{ + io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, + net::TcpListener, + }; + fn config(entries: &[(&str, &str)]) -> Result { + Config::read(|key| { + entries + .iter() + .find(|(k, _)| *k == key) + .map(|(_, v)| v.to_string()) + }) + } + async fn smtp_fixture(reject: bool) -> (u16, tokio::task::JoinHandle) { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let port = listener.local_addr().unwrap().port(); + let task = tokio::spawn(async move { + let (stream, _) = listener.accept().await.unwrap(); + let mut stream = BufReader::new(stream); + stream + .get_mut() + .write_all(b"220 localhost ESMTP fixture\r\n") + .await + .unwrap(); + let mut captured = String::new(); + let mut data = false; + loop { + let mut line = String::new(); + if stream.read_line(&mut line).await.unwrap() == 0 { + break; + } + if data { + if line == ".\r\n" { + data = false; + stream.get_mut().write_all(b"250 queued\r\n").await.unwrap(); + } else { + captured.push_str(&line); + } + continue; + } + let reply = if line.starts_with("EHLO") { + "250-localhost\r\n250 8BITMIME\r\n" + } else if line.starts_with("MAIL FROM") && reject { + "550 rejected\r\n" + } else if line.starts_with("DATA") { + data = true; + "354 Send message\r\n" + } else if line.starts_with("QUIT") { + stream.get_mut().write_all(b"221 bye\r\n").await.unwrap(); + break; + } else { + "250 OK\r\n" + }; + stream.get_mut().write_all(reply.as_bytes()).await.unwrap(); + } + captured + }); + (port, task) + } + #[tokio::test] + async fn local_smtp_delivers_message_and_reset_link() { + let (port, server) = smtp_fixture(false).await; + let c = config(&[ + ("MAIL_HOST", "127.0.0.1"), + ("MAIL_PORT", &port.to_string()), + ("MAIL_ENCRYPTION", "null"), + ]) + .unwrap(); + c.send( + "user@example.com", + "Reset test", + "Reset: https://example.com/user/password/reset?token=test-token", + ) + .await + .unwrap(); + let message = tokio::time::timeout(Duration::from_secs(5), server) + .await + .unwrap() + .unwrap(); + assert!(message.contains("To: user@example.com")); + assert!(message.contains("Subject: Reset test")); + assert!(message.contains("token=test-token")); + } + #[tokio::test] + async fn rejected_smtp_is_an_error_without_echoing_server_or_secrets() { + let (port, server) = smtp_fixture(true).await; + let c = config(&[ + ("MAIL_HOST", "127.0.0.1"), + ("MAIL_PORT", &port.to_string()), + ("MAIL_ENCRYPTION", "null"), + ]) + .unwrap(); + let err = c + .send("user@example.com", "Reset test", "secret-token") + .await + .unwrap_err(); + assert_eq!( + err.to_string(), + "The mail server did not accept the message." + ); + server.abort(); + } + #[tokio::test] + async fn starttls_requirement_cannot_silently_downgrade() { + let (port, server) = smtp_fixture(false).await; + let c = config(&[ + ("MAIL_HOST", "127.0.0.1"), + ("MAIL_PORT", &port.to_string()), + ("MAIL_ENCRYPTION", "tls"), + ]) + .unwrap(); + assert!(c.send("user@example.com", "Test", "secret").await.is_err()); + server.abort(); + } + #[test] + fn configuration_validates_tls_and_url_credentials() { + assert!(config(&[("MAIL_ENCRYPTION", "invalid")]).is_err()); + assert!(config(&[("MAIL_PORT", "zero")]).is_err()); + assert!(config(&[("MAIL_MAILER", "array")]).is_err()); + let c = config(&[( + "MAIL_URL", + "smtps://user:p%40ss@localhost:2465?verify_peer=false", + )]) + .unwrap(); + assert_eq!(c.port, 2465); + assert_eq!(c.encryption, "ssl"); + assert_eq!(c.password.as_deref(), Some("p@ss")); + assert!(!c.verify_peer); + assert!(c.smtp().is_ok()); + } + #[tokio::test] + async fn sendmail_failure_is_reported_and_shell_arguments_are_rejected() { + let c = config(&[ + ("MAIL_MAILER", "sendmail"), + ("MAIL_SENDMAIL_PATH", "/nonexistent/sendmail -bs -i"), + ]) + .unwrap(); + assert!(c.send("user@example.com", "Test", "message").await.is_err()); + let c = config(&[ + ("MAIL_MAILER", "sendmail"), + ( + "MAIL_SENDMAIL_PATH", + "/usr/sbin/sendmail ; touch /tmp/unwanted", + ), + ]) + .unwrap(); + assert!(matches!( + c.send("user@example.com", "Test", "message").await, + Err(MailError::Configuration(_)) + )); + } +} + +/// Send a notification through the configured transport without exposing transport internals. +pub async fn notify(email: &str, subject: &str, body: &str) -> Result<(), MailError> { + Config::from_env()?.send(email, subject, body).await +} +/// Source translation strings with English fallback and Laravel-style named replacements. +pub fn translate(locale: &str, key: &str, replacements: &[(&str, &str)]) -> String { + static MESSAGES: std::sync::LazyLock = std::sync::LazyLock::new(|| { + serde_json::from_str(include_str!("mail_messages.json")).expect("bundled mail translations") + }); + let normalized = locale.replace('_', "-"); + let language = normalized.split('-').next().unwrap_or("en"); + let locale_messages = MESSAGES.get(&normalized).or_else(|| { + MESSAGES.as_object().and_then(|messages| { + messages + .iter() + .find(|(name, _)| name.eq_ignore_ascii_case(&normalized)) + .map(|(_, messages)| messages) + }) + }); + let mut message = locale_messages + .and_then(|m| m.get(key)) + .or_else(|| MESSAGES.get(language).and_then(|m| m.get(key))) + .or_else(|| MESSAGES["en"].get(key)) + .and_then(serde_json::Value::as_str) + .unwrap_or(key) + .to_owned(); + for (name, value) in replacements { + message = message.replace(&format!(":{name}"), value); + } + message +} + +#[cfg(test)] +mod translation_tests { + use super::*; + #[test] + fn region_locales_and_named_values_use_source_translations() { + let source: serde_json::Value = + serde_json::from_str(include_str!("mail_messages.json")).unwrap(); + assert_eq!( + translate("pt_BR", "message.notifications.failed_login.subject", &[]), + source["pt-BR"]["message.notifications.failed_login.subject"] + .as_str() + .unwrap() + ); + assert!( + translate( + "fr", + "message.notifications.hello_user", + &[("username", "Alice")] + ) + .contains("Alice") + ); + assert_eq!( + translate("unknown", "message.notifications.failed_login.subject", &[]), + "Failed login to 2FAuth" + ); + } +} diff --git a/src/mail_messages.json b/src/mail_messages.json new file mode 100644 index 0000000..f24d203 --- /dev/null +++ b/src/mail_messages.json @@ -0,0 +1,794 @@ +{ + "pl": { + "label.device": "Device", + "label.ip_address": "IP Address", + "label.time": "Time", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "Jeśli to Ty, możesz zignorować ten alert. Jeśli kolejne próby nie powiodą się, powinieneś skontaktować się z administratorem 2FA w celu sprawdzenia ustawień zabezpieczeń i podjęcia działań przeciwko temu atakującemu.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Witaj", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "it": { + "label.device": "Dispositivo", + "label.ip_address": "Indirizzo IP", + "label.time": "Tempo", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hello", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "Stai ricevendo questa email perché hai richiesto una email di prova per convalidare le impostazioni di posta elettronica della tua istanza 2FAuth.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "zh-TW": { + "label.device": "設備", + "label.ip_address": "IP 位址", + "label.time": "時間", + "link.go_to_2fauth_host": "轉到 2FAuth", + "message.browser_on_platform": ":platform 上的 :browser", + "message.notifications.failed_login.connection_details": "這是本次事件的相關資訊", + "message.notifications.failed_login.recommandations": "如果這是您觸發的,您可以忽略此告警。但如果不是您,且持續有登入失敗的警告的話,您應立即通知 2FAuth 的管理員去檢查相關的安全設定,並對此攻擊者採取措施。", + "message.notifications.failed_login.resume": "您的 2FAuth 帳號觸發了一次登入失敗警告。", + "message.notifications.failed_login.subject": "2FAuth 登入失敗", + "message.notifications.hello_user": "你好,:username,", + "message.notifications.hello": "您好", + "message.notifications.new_device.connection_details": "這是本次事件的相關資訊", + "message.notifications.new_device.recommandations": "如果是您操作的,您可以忽略此告警。如果您懷疑自己的帳號有任何可疑活動,請立即更改您的密碼。", + "message.notifications.new_device.resume": "您的 2FAuth 帳號有來自新設備的登入。", + "message.notifications.new_device.subject": "來自新設備的訪問", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "此致", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "您之所以會收到這封郵件,是因為您要求發送一封測試郵件,來驗證您 2FAuth 的上郵件發送功能是否能正常工作。", + "message.notifications.test_email_settings.subject": "2FAuth 測試郵件", + "message.notifications.test_email_settings.success": "恭喜您,功能正常 :)" + }, + "ar": { + "label.device": "Device", + "label.ip_address": "IP Address", + "label.time": "Time", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hello", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "pt-PT": { + "label.device": "Device", + "label.ip_address": "IP Address", + "label.time": "Time", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hello", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "zh-CN": { + "label.device": "设备", + "label.ip_address": "IP 地址", + "label.time": "时间", + "link.go_to_2fauth_host": "转到 2FAuth", + "message.browser_on_platform": ":platform 上的 :browser", + "message.notifications.failed_login.connection_details": "这是本次事件的相关信息", + "message.notifications.failed_login.recommandations": "如果这是您的操作,那么请忽略此告警。但如果不是您的操作,且持续有登录失败的警告,那么您应立即通知 2FAuth 的管理员去检查相关的安全设置,并对此攻击者采取措施。", + "message.notifications.failed_login.resume": "您的 2FAuth 账户触发了一次登录失败警告。", + "message.notifications.failed_login.subject": "2FAuth 登录失败", + "message.notifications.hello_user": "你好,:username,", + "message.notifications.hello": "您好", + "message.notifications.new_device.connection_details": "这是本次事件的相关信息", + "message.notifications.new_device.recommandations": "如果是您操作的,您可以忽略此告警。如果您怀疑自己的账户有任何可疑活动,请立即更改您的密码。", + "message.notifications.new_device.resume": "您的 2FAuth 账户有来自新设备的登录。", + "message.notifications.new_device.subject": "来自新设备的访问", + "message.notifications.twofaccount_ownership_transferred.check_shares": "此账号可能已被分享给其他用户,在转让之前,建议您先检查 (并适当调整) 分享设置。", + "message.notifications.twofaccount_ownership_transferred.resume": "温馨提示::actor 已将 :twofaccount 的所有权转移给了您。您现在是此 2FA 账号的新所有者,拥有完全控制权限。", + "message.notifications.twofaccount_ownership_transferred.subject": "2FA 账号所有权转移", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "您无权再查看此 2FA 账号或获取验证码。", + "message.notifications.twofaccount_share_revoked.resume_all_users": "温馨提示::actor 已停止分享 :twofaccount 给所有用户。", + "message.notifications.twofaccount_share_revoked.resume_user": "温馨提示::actor 已停止分享 :twofaccount 给您。", + "message.notifications.twofaccount_share_revoked.subject": "此 2FA 账号已停止共享", + "message.notifications.twofaccount_shared.resume_all_users": "温馨提示::actor 与所有用户分享了 :twofaccount 。", + "message.notifications.twofaccount_shared.resume_user": "温馨提示::actor 与您分享了 :twofaccount 。", + "message.notifications.twofaccount_shared.subject": "您有一个新分享的 2FA 账号", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "您现在可以查看此 2FA 账号,并获取验证码。若此账号的所有者停止了分享,您将失去访问权限。", + "message.notifications.regards": "此致", + "message.notifications.reset_password.subject": "重置 2FAuth 密码", + "message.notifications.reset_password.reason": "您之所以会收到此邮件,是因为您曾经申请过重置 2FAuth 账户的密码。", + "message.notifications.reset_password.expire_in_x_minutes": "此密码重置链接将在 :count 分钟后过期。", + "message.notifications.reset_password.no_action_required": "如果您没有申请过重置密码,请忽略此消息。", + "message.notifications.test_email_settings.reason": "您之所以会收到这封邮件,是因为您要求发送一封测试邮件,来验证您 2FAuth 的上邮件发送功能是否能正常工作。", + "message.notifications.test_email_settings.subject": "2FAuth 测试邮件", + "message.notifications.test_email_settings.success": "恭喜您,功能正常 :)" + }, + "tr": { + "label.device": "Cihaz", + "label.ip_address": "IP Adresi", + "label.time": "Zaman", + "link.go_to_2fauth_host": "2FAuth'a git", + "message.browser_on_platform": ":platform üzerinde :browser", + "message.notifications.failed_login.connection_details": "Bu giriş denemesinin detayları şöyle", + "message.notifications.failed_login.recommandations": "Eğer bu sizseniz, bu uyarıyı göz ardı edebilirsiniz. Eğer daha fazla başarısız giriş denemesi görürseniz, güvenlik ayarlarını gözden geçirmek ve bu saldırgana karşı işlem yapmak için 2FAuth yöneticisiyle iletişime geçmelisiniz.", + "message.notifications.failed_login.resume": "2FAuth hesabınıza başarısız bir giriş denemesi yapıldı.", + "message.notifications.failed_login.subject": "2FAuth uygulamasına başarısız giriş", + "message.notifications.hello_user": "Merhaba :username,", + "message.notifications.hello": "Merhaba", + "message.notifications.new_device.connection_details": "Bu bağlantının detayları", + "message.notifications.new_device.recommandations": "Eğer bu sizseniz, bu uyarı gözardı edebilirsiniz. Eğer hesabınızda şüpheli bir hareket olduğunu düşünüyorsanız, lütfen parolanızı değiştirin.", + "message.notifications.new_device.resume": "2FAuth hesabınıza yeni bir cihaz bağlandı.", + "message.notifications.new_device.subject": "2FAuth'a yeni bir cihazdan erişim", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Saygılar", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "Bir parola sıfırlama talebinde bulunmadıysanız, başka bir işlem yapmanıza gerek yoktur.", + "message.notifications.test_email_settings.reason": "Bu ePostayı, ePosta yapılandırmanızın doğruluğunu test etmek amacıyla bir deneme ePostası istediğiniz için aldınız.", + "message.notifications.test_email_settings.subject": "2FAuth deneme ePostası", + "message.notifications.test_email_settings.success": "Haberler iyi, çalışıyor :)" + }, + "fr": { + "label.device": "Appareil", + "label.ip_address": "Adresse IP", + "label.time": "Heure", + "link.go_to_2fauth_host": "Visiter 2FAuth", + "message.browser_on_platform": ":browser sur :platform", + "message.notifications.failed_login.connection_details": "Voici les détails de cette tentative de connexion", + "message.notifications.failed_login.recommandations": "S'il s'agit de vous, vous pouvez ignorer cette alerte. Si d'autres tentatives infructueuses se produisent, vous devriez contacter l'administrateur de 2FAuth pour examiner les paramètres de sécurité et prendre des mesures contre cet attaquant.", + "message.notifications.failed_login.resume": "Une tentative de connexion à votre compte 2FAuth a eu lieu mais a été rejetée.", + "message.notifications.failed_login.subject": "Échec de connexion à 2FAuth", + "message.notifications.hello_user": "Bonjour :username,", + "message.notifications.hello": "Bonjour", + "message.notifications.new_device.connection_details": "Voici les détails de cette connexion", + "message.notifications.new_device.recommandations": "S'il s'agit de vous, vous pouvez ignorer cette alerte. Dans le cas contraire, et si vous soupçonnez une activité suspecte sur votre compte, changez votre mot de passe sans attendre.", + "message.notifications.new_device.resume": "Un nouvel appareil vient de se connecter à votre compte 2FAuth.", + "message.notifications.new_device.subject": "Connexion à 2FAuth depuis un nouvel appareil", + "message.notifications.twofaccount_ownership_transferred.check_shares": "Ce compte 2FA peut avoir été partagé avec d'autres utilisateurs avant que vous en récupériez la propriété, vous devriez consulter les paramètres de partage du compte pour vous assurer qu'ils sont toujours appropriés.", + "message.notifications.twofaccount_ownership_transferred.resume": "Nous voulions vous informer que :actor vous a transféré la propriété du compte 2FA :twofaccount. Vous en êtes maintenant le propriétaire et avez un contrôle total sur celui-ci.", + "message.notifications.twofaccount_ownership_transferred.subject": "Transfert de propriété sur un compte 2FA", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "Vous ne pouvez plus voir ce compte 2FA ou l'utiliser pour générer des codes OTP.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "Nous voulions vous informer que :actor a révoqué le partage du compte 2FA :twofaccount pour tous les utilisateurs.", + "message.notifications.twofaccount_share_revoked.resume_user": "Nous voulions vous informer que :actor ne partage plus le compte 2FA :twofaccount avec vous.", + "message.notifications.twofaccount_share_revoked.subject": "Partage du compte 2FA révoqué", + "message.notifications.twofaccount_shared.resume_all_users": "Nous voulions vous informer que :actor a partagé le compte 2FA :twofaccount avec tous les utilisateurs.", + "message.notifications.twofaccount_shared.resume_user": "Nous voulions vous informer que :actor a partagé le compte 2FA :twofaccount avec vous.", + "message.notifications.twofaccount_shared.subject": "Un compte 2FA a été partagé avec vous", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "Vous pouvez maintenant voir ce compte 2FA et l'utiliser pour générer des codes OTP tant que le partage est actif.", + "message.notifications.regards": "Cordialement", + "message.notifications.reset_password.subject": "Réinitialisation de mot de passe 2FAuth", + "message.notifications.reset_password.reason": "Vous recevez cet e-mail parce que vous avez demandé une réinitialisation du mot de passe de votre compte 2FAuth.", + "message.notifications.reset_password.expire_in_x_minutes": "Ce lien de réinitialisation du mot de passe expirera dans :count minutes.", + "message.notifications.reset_password.no_action_required": "Si vous n'avez pas demandé de réinitialisation de mot de passe, vous pouvez ignorer ce message.", + "message.notifications.test_email_settings.reason": "Vous recevez cet email car vous avez demandé à vérifier le bon fonctionnement de l'envoi des emails sur votre instance 2FAuth.", + "message.notifications.test_email_settings.subject": "Email de test 2FAuth", + "message.notifications.test_email_settings.success": "Bonne nouvelle, ça fonctionne :)" + }, + "uk": { + "label.device": "Пристрій", + "label.ip_address": "IP-адреса", + "label.time": "Час", + "link.go_to_2fauth_host": "Перейти до 2FAuth", + "message.browser_on_platform": ":browser на :platform", + "message.notifications.failed_login.connection_details": "Подробиці про цю спробу підключення", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Не вдалося увійти до 2FAuth", + "message.notifications.hello_user": "Привіт, :username,", + "message.notifications.hello": "Привіт", + "message.notifications.new_device.connection_details": "Інформація про це підключення", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "Новий пристрій щойно приєднано до вашого облікового запису 2FAuth.", + "message.notifications.new_device.subject": "Підключення до 2FAuth з нового пристрою", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "З найкращими побажаннями", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "Тестовий лист 2FAuth", + "message.notifications.test_email_settings.success": "Гарна новина, все працює :)" + }, + "da": { + "label.device": "Enhed", + "label.ip_address": "IP-adresse", + "label.time": "Tid", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hello", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "en": { + "label.device": "Device", + "label.ip_address": "IP Address", + "label.time": "Time", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hello", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "hi": { + "label.device": "उपकरण (डिवाइस)", + "label.ip_address": "आई पी अड्रेस", + "label.time": "समय", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "इस कनेक्शन की कोषसीसह का ब्योरा इस प्रकार है", + "message.notifications.failed_login.recommandations": "यदि यह आप थे तो इस अलर्ट को नजरंदाज कर दें। यदि और कोशिश नाकाम होती है तो सुरक्षा सेटिंग के बारे में अपने 2FAuth ऐड्मिन से संपर्क करें और इस आक्रमणकारी के विरुद्ध कार्यवाही करें।", + "message.notifications.failed_login.resume": "आपके 2FAuth अकाउंट में एक नाकाम लॉगिन की कोशिश की गई", + "message.notifications.failed_login.subject": "2FAuth में नाकाम लॉगिन", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "नमस्कार", + "message.notifications.new_device.connection_details": "इस कनेक्शन का ब्योरा इस प्रकार है", + "message.notifications.new_device.recommandations": "यदि यह आप थे तो इस अलर्ट को नजरंदाज कर दें। यदि अपने अकाउंट पर कोई संदिग्ध ऐक्टिविटी लगती है तो अपना पासवर्ड तुरंत बदलें।", + "message.notifications.new_device.resume": "एक नया उपकरण आपके 2 Fauth अकाउंट से अभी कनेक्ट हुआ है", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "सम्मान सहित", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "आपको यह ईमेल इसलिए प्राप्त हुआ है क्योंकि आपने अपने 2FAuth इंस्टेंस की ईमेल सेटिंग्स को मान्य करने के लिए एक परीक्षण ईमेल का अनुरोध किया था।", + "message.notifications.test_email_settings.subject": "2FAuth की टेस्ट ईमेल", + "message.notifications.test_email_settings.success": "बधाई हो! यह काम करता है :)" + }, + "ru": { + "label.device": "Устройство", + "label.ip_address": "IP Адрес", + "label.time": "Время", + "link.go_to_2fauth_host": "Перейти к 2FAuth", + "message.browser_on_platform": ":browser на :platform", + "message.notifications.failed_login.connection_details": "Подробности об этой попытке подключения", + "message.notifications.failed_login.recommandations": "Если это были вы, можете проигнорировать это предупреждение. Если дальнейшие попытки не удались, свяжитесь с администратором 2FAuth для проверки настроек безопасности и принятия мер против этого атакующего.", + "message.notifications.failed_login.resume": "Произошла неудачная попытка входа в ваш профиль 2FAuth.", + "message.notifications.failed_login.subject": "Не удалось войти в 2FAuth", + "message.notifications.hello_user": "Привет, :username,", + "message.notifications.hello": "Привет", + "message.notifications.new_device.connection_details": "Информация об этом подключении", + "message.notifications.new_device.recommandations": "Если это вы, то вы можете проигнорировать это уведомление. Если вы подозреваете, что это подозрительное действие с вашей учётной записью, измените ваш пароль.", + "message.notifications.new_device.resume": "Новое устройство только что подключилось к вашему профилю 2FAuth.", + "message.notifications.new_device.subject": "Подключение к 2FAuth с нового устройства", + "message.notifications.twofaccount_ownership_transferred.check_shares": "Если эта учётная запись 2FA была доступна другим пользователям до передачи права собственности, проверьте настройки общего доступа — возможно, их нужно обновить.", + "message.notifications.twofaccount_ownership_transferred.resume": "Мы хотели сообщить, что :actor передал вам право собственности на учётную запись 2FA :twofaccount. Теперь вы являетесь владельцем этой учётной записи 2FA и имеете полный контроль над ней.", + "message.notifications.twofaccount_ownership_transferred.subject": "Передача прав собственности на учётную запись 2FA", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "Вы больше не можете просматривать эту учётную запись 2FA или использовать её для создания одноразовых кодов.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "Мы хотели сообщить, что :actor отозвал общий доступ к учётной записи 2FA :twofaccount для всех пользователей.", + "message.notifications.twofaccount_share_revoked.resume_user": "Мы хотели сообщить, что :actor отозвал общий доступ к учётной записи 2FA :twofaccount для вас.", + "message.notifications.twofaccount_share_revoked.subject": "Общий доступ к учётной записи 2FA отозван", + "message.notifications.twofaccount_shared.resume_all_users": "Мы хотели сообщить, что :actor предоставил общий доступ к учётной записи 2FA :twofaccount для всех пользователей.", + "message.notifications.twofaccount_shared.resume_user": "Мы хотели сообщить, что :actor предоставил общий доступ к учётной записи 2FA :twofaccount для вас.", + "message.notifications.twofaccount_shared.subject": "Вам предоставлен доступ к учётной записи 2FA", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "Теперь вы можете просматривать эту учётную запись 2FA и использовать её для генерации одноразовых кодов, пока общий доступ к ней активен.", + "message.notifications.regards": "С наилучшими пожеланиями", + "message.notifications.reset_password.subject": "Сброс пароля 2FAuth", + "message.notifications.reset_password.reason": "Вы получили это письмо, потому что вы запросили сброс пароля для вашего профиля 2FAuth.", + "message.notifications.reset_password.expire_in_x_minutes": "Срок действия ссылки для сброса пароля истекает через :count минут.", + "message.notifications.reset_password.no_action_required": "Если вы не запрашивали сброс пароля, то никаких дальнейших действий не требуется.", + "message.notifications.test_email_settings.reason": "Вы получили это письмо, потому что вы запросили тестовое письмо, чтобы проверить настройки электронной почты вашего экземпляра 2FAuth.", + "message.notifications.test_email_settings.subject": "Тестовое письмо 2FAuth", + "message.notifications.test_email_settings.success": "Хорошие новости! Всё работает! :-)" + }, + "ja": { + "label.device": "端末", + "label.ip_address": "IPアドレス", + "label.time": "時刻", + "link.go_to_2fauth_host": "2FAuthへ移動", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "具体的な情報は以下の通りです", + "message.notifications.failed_login.recommandations": "心当たりがある場合は、この通知を無視しても構いません。今後も行為が続く場合は、2FAuth の管理者に相談し、セキュリティ設定の見直しや攻撃者への対処を検討してください。", + "message.notifications.failed_login.resume": "あなたの 2FAuth アカウントへのログイン失敗が発生しました。", + "message.notifications.failed_login.subject": "2FAuth へのログイン失敗発生", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "こんにちは", + "message.notifications.new_device.connection_details": "この接続の詳細は以下の通りです", + "message.notifications.new_device.recommandations": "心当たりがある場合は、この通知を無視しても構いません。アカウントへの不審な行為が疑われる場合は、パスワードをご変更ください。", + "message.notifications.new_device.resume": "新しいデバイスがあなたの2FAuthアカウントに接続されました。", + "message.notifications.new_device.subject": "新しいデバイスから 2FAuth に接続しました", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "よろしくお願いします", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "このメールはあなたの要望に応じて送信された、2FAuth インスタンスのメール設定検証用のテストメールです。", + "message.notifications.test_email_settings.subject": "2FAuth テストメール", + "message.notifications.test_email_settings.success": "届いているようですね!" + }, + "ca": { + "label.device": "Dispositiu", + "label.ip_address": "Adreça IP", + "label.time": "Temps", + "link.go_to_2fauth_host": "Anar a 2FAuth", + "message.browser_on_platform": ":browser a :platform", + "message.notifications.failed_login.connection_details": "Aquí teniu els detalls d'aquest intent de connexió", + "message.notifications.failed_login.recommandations": "Si heu estat vosaltres, podeu ignorar aquesta alerta. Si fallen més intents, hauríeu de contactar amb l'administrador de 2FAuth per revisar la configuració de seguretat i prendre mesures contra aquest atacant.", + "message.notifications.failed_login.resume": "Hi ha hagut un intent d'inici de sessió fallit al vostre compte de 2FAuth.", + "message.notifications.failed_login.subject": "Inici de sessió fallit a 2FAuth", + "message.notifications.hello_user": "Hola :username,", + "message.notifications.hello": "Hola", + "message.notifications.new_device.connection_details": "Aquí teniu els detalls d'aquesta connexió", + "message.notifications.new_device.recommandations": "Si heu estat vosaltres, podeu ignorar aquesta alerta. Si sospiteu de qualsevol activitat sospitosa al vostre compte, si us plau canvieu la vostra contrasenya.", + "message.notifications.new_device.resume": "Un nou dispositiu s'acaba de connectar al vostre compte de 2FAuth.", + "message.notifications.new_device.subject": "Connexió a 2FAuth des d'un nou dispositiu", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Salutacions", + "message.notifications.reset_password.subject": "Reseteja contrasenya 2Fauth", + "message.notifications.reset_password.reason": "Reps aquest correu perquè has demanat restablir la contrasenya del compte de 2Fauth.", + "message.notifications.reset_password.expire_in_x_minutes": "El link de restabliment de contrasenya expira en :count minutes.", + "message.notifications.reset_password.no_action_required": "Si no has demanat el restabliment de contrasenya omet aquest correu.", + "message.notifications.test_email_settings.reason": "Estàs rebent aquest correu perquè s'ha enviat una prova per validar les opcions de correu a la instància de 2fauth.", + "message.notifications.test_email_settings.subject": "Correu de prova de 2fAuth", + "message.notifications.test_email_settings.success": "Bones notícies, funciona :)" + }, + "ko": { + "label.device": "장치", + "label.ip_address": "IP 주소", + "label.time": "시간", + "link.go_to_2fauth_host": "2FAuth 이동", + "message.browser_on_platform": ":platform 플랫폼의 :browser 브라우저", + "message.notifications.failed_login.connection_details": "이 로그인 시도에 대한 자세한 내용은 다음과 같습니다.", + "message.notifications.failed_login.recommandations": "사용자 본인이라면 이 경고를 무시해도 됩니다. 추가 시도가 실패하면 2FAuth 관리자에게 연락하여 보안 설정을 검토하고 이 공격자에 대한 조치를 취해야 합니다.", + "message.notifications.failed_login.resume": "사용자의 2FAuth 계정에서의 로그인 시도가 실패했습니다.", + "message.notifications.failed_login.subject": "2FAuth 로그인 실패", + "message.notifications.hello_user": "안녕하세요 :username,", + "message.notifications.hello": "안녕하세요", + "message.notifications.new_device.connection_details": "이 연결에 대한 자세한 내용은 다음과 같습니다.", + "message.notifications.new_device.recommandations": "이 경우 이 알림을 무시해도 됩니다. 계정에서 의심스러운 활동이 의심되는 경우 비밀번호를 변경하시기 바랍니다.", + "message.notifications.new_device.resume": "새 장치가 방금 2FAuth 계정에 연결되었습니다.", + "message.notifications.new_device.subject": "새로운 기기에서 2fAuth에 연결했습니다.", + "message.notifications.twofaccount_ownership_transferred.check_shares": "이 2FA 계정은 소유권을 이전하기 전에 다른 사용자에게 공유되었을 수 있으므로, 계정 공유 설정이 지금도 적절한지 검토해야 합니다.", + "message.notifications.twofaccount_ownership_transferred.resume": ":actor이(가) 2FA 계정 :twofaccount의 소유권을 당신에게 이전했습니다. 이제 당신은 이 2FA 계정의 소유자이며 완전히 통제할 수 있습니다.", + "message.notifications.twofaccount_ownership_transferred.subject": "2FA 계정 소유권 이전", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "더 이상 이 2FA 계정을 열람하거나 OTP를 생성하는 데에 사용할 수 없습니다.", + "message.notifications.twofaccount_share_revoked.resume_all_users": ":actor이(가) 2FA 계정 :twofaccount의 전체 사용자 공유를 철회했습니다.", + "message.notifications.twofaccount_share_revoked.resume_user": ":actor이(가) 2FA 계정 :twofaccount의 당신에 대한 공유를 철회했습니다.", + "message.notifications.twofaccount_share_revoked.subject": "2FA 계정 공유 철회됨", + "message.notifications.twofaccount_shared.resume_all_users": ":actor이(가) 2FA 계정 :twofaccount을(를) 전체 사용자에게 공유했습니다.", + "message.notifications.twofaccount_shared.resume_user": ":actor이(가) 2FA 계정 :twofaccount을(를) 당신에게 공유했습니다.", + "message.notifications.twofaccount_shared.subject": "2FA 계정이 당신에게 공유되었습니다", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "이제 공유가 활성화되어 있는 한 이 2FA 계정을 열람하고 OTP를 생성할 수 있습니다.", + "message.notifications.regards": "만나서 반갑습니다", + "message.notifications.reset_password.subject": "2FAuth 비밀번호 초기화", + "message.notifications.reset_password.reason": "귀하께서 2FAuth 계정의 비밀번호 초기화를 요청했기 때문에 이 메일을 수신하였습니다.", + "message.notifications.reset_password.expire_in_x_minutes": "이 비밀번호 초기화 링크는 :count 분 후에 만료됩니다.", + "message.notifications.reset_password.no_action_required": "비밀번호 초기화를 요청하지 않은 경우, 추가 조치는 필요하지 않습니다.", + "message.notifications.test_email_settings.reason": "2FAuth 인스턴스의 이메일 설정을 확인하기 위해 테스트 이메일을 요청했으므로 이 이메일이 전송되었습니다.", + "message.notifications.test_email_settings.subject": "2FAuth 테스트 이메일", + "message.notifications.test_email_settings.success": "좋은 소식이네요, 잘 작동합니다 :)" + }, + "id": { + "label.device": "Device", + "label.ip_address": "IP Address", + "label.time": "Time", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hello", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "bg": { + "label.device": "Device", + "label.ip_address": "IP Address", + "label.time": "Time", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Here are the details of this connection attempt", + "message.notifications.failed_login.recommandations": "If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.", + "message.notifications.failed_login.resume": "There has been a failed login attempt to your 2FAuth account.", + "message.notifications.failed_login.subject": "Failed login to 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hello", + "message.notifications.new_device.connection_details": "Here are the details of this connection", + "message.notifications.new_device.recommandations": "If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.", + "message.notifications.new_device.resume": "A new device has just connected to your 2FAuth account.", + "message.notifications.new_device.subject": "Connection to 2FAuth from a new device", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Regards", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.", + "message.notifications.test_email_settings.subject": "2FAuth test email", + "message.notifications.test_email_settings.success": "Good news, it works :)" + }, + "nl": { + "label.device": "Apparaat", + "label.ip_address": "IP-adres", + "label.time": "Tijd", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Hier zijn de details van deze verbindingspoging", + "message.notifications.failed_login.recommandations": "Als jij dit was, kan je deze melding negeren. Als verdere pogingen mislukken, moet u contact opnemen met de 2FAuth beheerder om de beveiligingsinstellingen te bekijken en actie ondernemen tegen deze aanvaller.", + "message.notifications.failed_login.resume": "Er is een mislukte inlog poging gedaan voor je 2FAuth account.", + "message.notifications.failed_login.subject": "Mislukte login naar 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Hallo", + "message.notifications.new_device.connection_details": "Hier zijn de details van deze verbinding", + "message.notifications.new_device.recommandations": "Als u dit was, kunt u deze waarschuwing negeren. Als u vermoedt dat er sprake is van een verdachte activiteit op uw account, wijzig dan uw wachtwoord.", + "message.notifications.new_device.resume": "Een nieuw apparaat heeft zojuist verbinding gemaakt met je 2FAuth account.", + "message.notifications.new_device.subject": "Verbinding met 2FAuth vanaf een nieuw apparaat", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Groeten", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "Je ontvangt deze e-mail omdat je een test e-mail hebt aangevraagd om de e-mailinstellingen van je 2FAuth installatie te valideren.", + "message.notifications.test_email_settings.subject": "2FAuth test e-mail", + "message.notifications.test_email_settings.success": "Goed nieuws, het werkt :)" + }, + "es-ES": { + "label.device": "Dispositivo", + "label.ip_address": "Dirección IP", + "label.time": "Hora", + "link.go_to_2fauth_host": "Ir a 2FAuth", + "message.browser_on_platform": ":browser en :platform", + "message.notifications.failed_login.connection_details": "Aquí están los detalles de este intento de conexión", + "message.notifications.failed_login.recommandations": "Si ha sido usted, puede ignorar esta alerta. Si continúa recibiendo esta notificación, póngase en contacto con el administrador para revisar la configuración de seguridad y tomar medidas contra este ataque.", + "message.notifications.failed_login.resume": "Ha habido un intento de inicio de sesión fallido en su cuenta de 2FAuth.", + "message.notifications.failed_login.subject": "Error al iniciar sesión en 2FAuth", + "message.notifications.hello_user": "Hola :username,", + "message.notifications.hello": "Hola", + "message.notifications.new_device.connection_details": "Aquí tienes los detalles de esta conexión", + "message.notifications.new_device.recommandations": "Si ha sido usted, puede ignorar esta alerta. Si observa alguna actividad sospechosa en su cuenta, por favor cambie su contraseña.", + "message.notifications.new_device.resume": "Un nuevo dispositivo acaba de conectarse a tu cuenta de 2FAuth.", + "message.notifications.new_device.subject": "Conexión a 2FAuth desde un nuevo dispositivo", + "message.notifications.twofaccount_ownership_transferred.check_shares": "Esta cuenta 2FA podría haber sido compartida con otros usuarios antes de la transferencia de propiedad. Revisa la configuración de uso compartido para asegurarte de que los permisos siguen siendo los adecuados.", + "message.notifications.twofaccount_ownership_transferred.resume": "Queremos informarte de que :actor te ha transferido la propiedad de la cuenta 2FA :twofaccount. Ahora eres el propietario de esta cuenta 2FA y tienes control total sobre ella.", + "message.notifications.twofaccount_ownership_transferred.subject": "Transferencia de propiedad de una cuenta 2FA", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "Ya no puedes ver esta cuenta 2FA ni utilizarla para generar códigos de un solo uso.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "Queremos informarte de que :actor ha revocado el uso compartido de la cuenta 2FA :twofaccount para todos los usuarios.", + "message.notifications.twofaccount_share_revoked.resume_user": "Te informamos de que :actor ha revocado tu acceso a la cuenta 2FA :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "Se ha revocado el uso compartido de la cuenta 2FA", + "message.notifications.twofaccount_shared.resume_all_users": "Te informamos de que :actor ha compartido la cuenta 2FA :twofaccount con todos los usuarios.", + "message.notifications.twofaccount_shared.resume_user": "Te informamos de que :actor ha compartido contigo la cuenta 2FA :twofaccount.", + "message.notifications.twofaccount_shared.subject": "Se ha compartido una cuenta 2FA contigo", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "Ahora puedes ver esta cuenta 2FA y utilizarla para generar códigos OTP mientras el uso compartido esté activo.", + "message.notifications.regards": "Saludos", + "message.notifications.reset_password.subject": "Restablecimiento de contraseña de 2FAuth", + "message.notifications.reset_password.reason": "Estás recibiendo este correo porque has solicitado restablecer la contraseña de tu cuenta de 2FAuth.", + "message.notifications.reset_password.expire_in_x_minutes": "Este enlace para restablecer la contraseña caducará en :count minutos.", + "message.notifications.reset_password.no_action_required": "Si no has solicitado restablecer la contraseña, no es necesario realizar ninguna otra acción.", + "message.notifications.test_email_settings.reason": "Estás recibiendo este correo electrónico porque has solicitado un correo de prueba para validar la configuración de tu instancia de 2FAuth.", + "message.notifications.test_email_settings.subject": "Correo de prueba 2FAuth", + "message.notifications.test_email_settings.success": "Buenas noticias, funciona correctamente :)" + }, + "de": { + "label.device": "Gerät", + "label.ip_address": "IP-Adresse", + "label.time": "Zeit", + "link.go_to_2fauth_host": "Zu 2FAuth gehen", + "message.browser_on_platform": ":browser auf :platform", + "message.notifications.failed_login.connection_details": "Hier sind die Details zu diesem Verbindungsversuch", + "message.notifications.failed_login.recommandations": "Wenn Sie dies waren, können Sie diese Warnung ignorieren. Falls weitere Versuche fehlschlagen, sollten Sie den 2FAuth-Administrator kontaktieren, um die Sicherheitseinstellungen zu überprüfen und Maßnahmen gegen diesen Angreifer zu ergreifen.", + "message.notifications.failed_login.resume": "Es gab einen fehlgeschlagenen Anmeldeversuch auf Ihr 2FAuth Konto.", + "message.notifications.failed_login.subject": "Anmeldung bei 2FAuth fehlgeschlagen", + "message.notifications.hello_user": "Hallo :username,", + "message.notifications.hello": "Hallo", + "message.notifications.new_device.connection_details": "Hier sind die Details dieser Verbindung", + "message.notifications.new_device.recommandations": "Wenn dies auf Sie zutrifft, können Sie diese Meldung ignorieren. Wenn Sie eine verdächtige Aktivität in Ihrem Konto vermuten, ändern Sie bitte Ihr Passwort.", + "message.notifications.new_device.resume": "Ein neues Gerät hat sich gerade mit Ihrem 2FAuth-Konto verbunden.", + "message.notifications.new_device.subject": "Verbindung zu 2FAuth von einem neuen Gerät", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Mit freundlichen Grüßen", + "message.notifications.reset_password.subject": "2FAuth-Passwort zurücksetzen", + "message.notifications.reset_password.reason": "Sie erhalten diese E-Mail, weil Sie ein Passwort für Ihr 2FAuth-Konto angefordert haben.", + "message.notifications.reset_password.expire_in_x_minutes": "Dieser Link zum Zurücksetzen des Passworts läuft in :count Minuten ab.", + "message.notifications.reset_password.no_action_required": "Falls Sie keine Anfrage zum Passwort zurücksetzen gestellt haben, müssen Sie nichts weiter machen.", + "message.notifications.test_email_settings.reason": "Sie erhalten diese E-Mail, weil Sie eine Test-E-Mail angefordert haben, um die E-Mail-Einstellungen Ihrer 2FAuth Instanz zu überprüfen.", + "message.notifications.test_email_settings.subject": "2FAuth-Test-E-Mail", + "message.notifications.test_email_settings.success": "Gute Nachricht, es funktioniert :)" + }, + "pt-BR": { + "label.device": "Dispositivo", + "label.ip_address": "Endereço IP", + "label.time": "Hora", + "link.go_to_2fauth_host": "Go to 2FAuth", + "message.browser_on_platform": ":browser on :platform", + "message.notifications.failed_login.connection_details": "Aqui estão os detalhes desta tentativa de conexão", + "message.notifications.failed_login.recommandations": "Se foi você, pode ignorar este alerta. Se outras tentativas falharem, você deve entrar em contato com o administrador do 2FAuth para rever as configurações de segurança e tomar ações contra este atacante.", + "message.notifications.failed_login.resume": "Houve uma tentativa de login falhada em sua conta 2FAuth.", + "message.notifications.failed_login.subject": "Falha no login para 2FAuth", + "message.notifications.hello_user": "Hello :username,", + "message.notifications.hello": "Olá", + "message.notifications.new_device.connection_details": "Aqui estão os detalhes desta conexão", + "message.notifications.new_device.recommandations": "Se foi você, você pode ignorar este alerta. Se suspeitar de qualquer atividade suspeita em sua conta, altere sua senha imediatamente.", + "message.notifications.new_device.resume": "Um novo dispositivo acabou de se conectar à sua conta 2FAuth.", + "message.notifications.new_device.subject": "Conexão com o 2FAuth de um novo dispositivo", + "message.notifications.twofaccount_ownership_transferred.check_shares": "As this 2FA account may have been shared with other users before this ownership transfer, you should review the account's sharing settings to ensure they are still appropriate.", + "message.notifications.twofaccount_ownership_transferred.resume": "We wanted to let you know that :actor transferred ownership of 2FA account :twofaccount to you. You are now the owner of this 2FA account and have full control over it.", + "message.notifications.twofaccount_ownership_transferred.subject": "Ownership transfer on a 2FA account", + "message.notifications.twofaccount_share_revoked.cannot_use_it_to_generate_otp": "You can no longer view this 2FA account or use it to generate One-Time Passwords.", + "message.notifications.twofaccount_share_revoked.resume_all_users": "We wanted to let you know that :actor has revoked sharing of 2FA account :twofaccount for all users.", + "message.notifications.twofaccount_share_revoked.resume_user": "We wanted to let you know that :actor has revoked your access to 2FA account :twofaccount.", + "message.notifications.twofaccount_share_revoked.subject": "2FA account sharing revoked", + "message.notifications.twofaccount_shared.resume_all_users": "We wanted to let you know that :actor shared 2FA account :twofaccount with all users.", + "message.notifications.twofaccount_shared.resume_user": "We wanted to let you know that :actor shared 2FA account :twofaccount with you.", + "message.notifications.twofaccount_shared.subject": "A 2FA account has been shared with you", + "message.notifications.twofaccount_shared.use_it_to_generate_otp": "You can now view this 2FA account and use it to generate One-Time Passwords as long as the share is active.", + "message.notifications.regards": "Atenciosamente", + "message.notifications.reset_password.subject": "2FAuth Password Reset", + "message.notifications.reset_password.reason": "You are receiving this email because you requested a password reset for your 2FAuth account.", + "message.notifications.reset_password.expire_in_x_minutes": "This password reset link will expire in :count minutes.", + "message.notifications.reset_password.no_action_required": "If you did not request a password reset, no further action is required.", + "message.notifications.test_email_settings.reason": "Você está recebendo este e-mail porque você solicitou um e-mail de teste para validar as configurações de e-mail da sua instância 2FAuth.", + "message.notifications.test_email_settings.subject": "E-mail de teste 2FAuth", + "message.notifications.test_email_settings.success": "Boas notícias, funcionou :)" + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..59c17cf --- /dev/null +++ b/src/main.rs @@ -0,0 +1,163 @@ +use clap::{Parser, Subcommand}; +use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions}; +use std::{path::PathBuf, str::FromStr, sync::Arc}; +use twofauth_rs::{AppState, crypto::LaravelCipher}; + +#[derive(Parser)] +#[command(about = "Experimental 2FAuth Rust backend; not a production replacement")] +struct Cli { + #[arg(long, env = "DATABASE_URL")] + database_url: Option, + #[command(subcommand)] + command: Command, +} +#[derive(Subcommand)] +enum Command { + /// Create an empty development database; refuses existing user tables. + Init, + /// Validate an existing pinned Laravel SQLite schema and add Rust session tables. + PrepareSqlite, + /// Start the experimental API on a loopback interface by default. + Serve { + #[arg(long, env = "LISTEN_ADDR", default_value = "127.0.0.1:8080")] + listen: String, + }, + /// Offline password provisioning for a NEW local test user. Reads password from file. + CreateUser { + #[arg(long)] + name: String, + #[arg(long)] + email: String, + #[arg(long)] + password_file: PathBuf, + }, +} +#[tokio::main] +async fn main() -> anyhow::Result<()> { + dotenvy::dotenv().ok(); + tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .init(); + let cli = Cli::parse(); + let init = matches!(cli.command, Command::Init); + let database_url = cli.database_url.unwrap_or_else(|| { + std::env::var("DB_DATABASE") + .map(|p| format!("sqlite://{p}")) + .unwrap_or_else(|_| "sqlite://data/2fauth.sqlite".into()) + }); + anyhow::ensure!( + std::env::var("DB_CONNECTION").map_or(true, |v| v == "sqlite"), + "This build supports SQLite; other database drivers have not been implemented" + ); + let options = SqliteConnectOptions::from_str(&database_url)? + .create_if_missing(init) + .foreign_keys(true) + .journal_mode(SqliteJournalMode::Wal) + .busy_timeout(std::time::Duration::from_secs(10)); + let db = SqlitePoolOptions::new() + .max_connections(5) + .connect_with(options) + .await?; + if init { + let exists: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='users'", + ) + .fetch_one(&db) + .await?; + anyhow::ensure!( + exists == 0, + "refusing to initialize an existing 2FAuth database" + ); + twofauth_rs::db::init(&db).await?; + twofauth_rs::auth::init(&db).await?; + println!("Development database initialized; no production compatibility is implied."); + return Ok(()); + } + if matches!(cli.command, Command::PrepareSqlite) { + twofauth_rs::db::validate_existing(&db).await?; + twofauth_rs::auth::init(&db).await?; + twofauth_rs::sso::init(&db).await?; + twofauth_rs::webauthn::init(&db).await?; + println!( + "Schema validated and Rust session tables prepared. Existing application tables were preserved." + ); + return Ok(()); + } + if let Command::CreateUser { + name, + email, + password_file, + } = cli.command + { + let password = std::fs::read_to_string(password_file)?; + let password = password.trim_end_matches(['\n', '\r']).to_owned(); + anyhow::ensure!( + password.len() >= 12 && password.len() <= 72, + "test password must contain 12..72 bytes" + ); + let hash = + tokio::task::spawn_blocking(move || bcrypt::hash(password, bcrypt::DEFAULT_COST)) + .await??; + sqlx::query("INSERT INTO users(name,email,password,is_admin,preferences,created_at,updated_at) VALUES(?,?,?,0,'{}',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)") + .bind(name).bind(email.to_lowercase()).bind(hash).execute(&db).await?; + println!("Non-administrator test user created."); + return Ok(()); + } + let encrypt_db = twofauth_rs::settings::all(&db) + .await? + .get("useEncryption") + .map(twofauth_rs::settings::php_bool) + .unwrap_or(false); + let previous_keys: Vec = std::env::var("APP_PREVIOUS_KEYS") + .unwrap_or_default() + .split(',') + .map(str::trim) + .filter(|key| !key.is_empty()) + .map(str::to_owned) + .collect(); + let cipher = std::env::var("APP_KEY") + .ok() + .map(|k| LaravelCipher::from_keys(&k, &previous_keys)) + .transpose()? + .map(Arc::new); + anyhow::ensure!( + !encrypt_db || cipher.is_some(), + "encrypted database requires original APP_KEY" + ); + let Command::Serve { listen } = cli.command else { + unreachable!() + }; + // Existing application data is never recreated. Only private Rust session/ + // ceremony metadata is added after checking the application's table shape. + if sqlx::query("SELECT token_hash FROM rust_sessions LIMIT 0") + .execute(&db) + .await + .is_err() + { + twofauth_rs::db::validate_existing(&db).await?; + twofauth_rs::auth::init(&db).await?; + } + twofauth_rs::oauth_server::init(&db).await?; + twofauth_rs::oauth_management::init(&db).await?; + twofauth_rs::oauth_device::init(&db).await?; + twofauth_rs::api_limits::init(&db).await?; + twofauth_rs::sso::init(&db).await?; + twofauth_rs::webauthn::init(&db).await?; + let app = twofauth_rs::router(AppState { + db, + cipher, + encrypt_db: std::sync::atomic::AtomicBool::new(encrypt_db).into(), + }); + tracing::warn!("Experimental backend: do not switch production traffic to this implementation"); + let listener = tokio::net::TcpListener::bind(&listen).await?; + tracing::info!(address=%listener.local_addr()?, "listening"); + axum::serve( + listener, + app.into_make_service_with_connect_info::(), + ) + .with_graceful_shutdown(async { + let _ = tokio::signal::ctrl_c().await; + }) + .await?; + Ok(()) +} diff --git a/src/oauth_device.rs b/src/oauth_device.rs new file mode 100644 index 0000000..6fe3f08 --- /dev/null +++ b/src/oauth_device.rs @@ -0,0 +1,488 @@ +//! Passport 13 / League device grant, using the original device-code table. +//! The pinned application's device browser views are unbound by default. Polling +//! nevertheless works with approvals persisted by its PHP device controller. +use crate::{ + AppState, + oauth_server::{self, OAuthError, Parameters}, +}; +use axum::{ + Json, Router, + extract::{Request, State}, + http::{HeaderMap, StatusCode, header}, + response::{IntoResponse, Response}, + routing::{get, post}, +}; +use chrono::Utc; +use rand::{Rng, rngs::OsRng}; +use serde_json::json; +use sqlx::{Row, SqlitePool, sqlite::SqliteRow}; + +pub const GRANT: &str = "urn:ietf:params:oauth:grant-type:device_code"; +const CONSONANTS: &[u8] = b"BCDFGHJKLMNPQRSTVWXZ"; +const PENDING: &str = "The authorization request is still pending as the end user hasn't yet completed the user interaction steps. The client SHOULD repeat the Access Token Request to the token endpoint"; +const SLOW_DOWN: &str = "The authorization request is still pending and polling should continue, but the interval MUST be increased by 5 seconds for this and all subsequent requests."; + +pub async fn init(db: &SqlitePool) -> Result<(), sqlx::Error> { + sqlx::raw_sql("CREATE TABLE IF NOT EXISTS oauth_device_codes(id TEXT PRIMARY KEY,user_id INTEGER,client_id TEXT NOT NULL,user_code TEXT NOT NULL UNIQUE,scopes TEXT NOT NULL,revoked INTEGER NOT NULL DEFAULT 0,user_approved_at TEXT,last_polled_at TEXT,expires_at TEXT); CREATE INDEX IF NOT EXISTS oauth_device_codes_user_id_index ON oauth_device_codes(user_id); CREATE INDEX IF NOT EXISTS oauth_device_codes_client_id_index ON oauth_device_codes(client_id);").execute(db).await?; + crate::api_limits::init(db).await?; + Ok(()) +} +pub fn routes(state: AppState) -> Router { + let issuer = Router::new() + .route("/oauth/device/code", post(issue)) + .route_layer(axum::middleware::from_fn_with_state( + state.clone(), + crate::api_limits::handle_oauth, + )); + let protected = Router::new() + .route( + "/oauth/device/authorize", + get(broken_view) + .post(missing_auth_token) + .delete(missing_auth_token), + ) + .route_layer(axum::middleware::from_fn_with_state( + state, + crate::auth::require_web_auth, + )); + issuer + .merge(protected) + .route("/oauth/device", get(broken_view)) +} +async fn broken_view() -> Response { + ( + StatusCode::INTERNAL_SERVER_ERROR, + [(header::CACHE_CONTROL, "no-cache, private")], + Json(json!({"message":"Server Error"})), + ) + .into_response() +} +async fn missing_auth_token() -> Response { + (StatusCode::FORBIDDEN, [(header::CACHE_CONTROL,"no-cache, private")], Json(json!({"message":"forbidden","reason":"The provided auth token for the request is different from the session auth token."}))).into_response() +} +struct Client { + id: String, + grants: Vec, +} +async fn client( + db: &SqlitePool, + headers: &HeaderMap, + input: &Parameters, + authenticate: bool, +) -> Result { + let basic = oauth_server::basic_credentials(headers); + let id = oauth_server::parameter(input, "client_id")? + .or_else(|| { + basic + .as_ref() + .map(|value| oauth_server::php_trim(&value.0).to_owned()) + .filter(|value| !value.is_empty()) + }) + .ok_or_else(|| oauth_server::invalid_request("client_id"))?; + // Device authorization issuance intentionally does not authenticate the secret. + // Polling uses the normal confidential-client validation order instead. + let supplied = if authenticate { + oauth_server::parameter(input, "client_secret")?.or_else(|| { + basic + .as_ref() + .map(|value| oauth_server::php_trim(&value.1).to_owned()) + .filter(|value| !value.is_empty()) + }) + } else { + None + }; + let row = sqlx::query( + "SELECT secret,grant_types FROM oauth_clients WHERE CAST(id AS TEXT)=? AND revoked=0", + ) + .bind(&id) + .fetch_optional(db) + .await? + .ok_or_else(|| oauth_server::invalid_client(headers))?; + let grants: Vec = serde_json::from_str(&row.get::("grant_types")) + .map_err(|_| oauth_server::invalid_client(headers))?; + if !grants.iter().any(|grant| grant == GRANT) { + return Err(OAuthError::new( + "unauthorized_client", + "The authenticated client is not authorized to use this authorization grant type.", + )); + } + if authenticate + && let Some(hash) = row + .get::, _>("secret") + .filter(|value| !value.is_empty()) + { + let secret = supplied + .as_deref() + .ok_or_else(|| oauth_server::invalid_request("client_secret"))?; + if !oauth_server::verify_secret(secret, &hash) { + return Err(oauth_server::invalid_client(headers)); + } + } + Ok(Client { id, grants }) +} +fn verification_uri(headers: &HeaderMap) -> String { + let mut base = std::env::var("APP_URL") + .ok() + .filter(|value| !value.is_empty()) + .unwrap_or_else(|| { + format!( + "http://{}", + headers + .get(header::HOST) + .and_then(|value| value.to_str().ok()) + .unwrap_or("localhost") + ) + }) + .trim_end_matches('/') + .to_owned(); + let prefix = crate::subdirectory::configured_prefix(); + if !prefix.is_empty() && !base.ends_with(&prefix) { + base.push_str(&prefix); + } + format!("{base}/oauth/device") +} +async fn issue(State(state): State, request: Request) -> Result { + let (headers, input) = match oauth_server::read_request(request).await { + Ok(value) => value, + Err(response) => return Ok(*response), + }; + let uri = verification_uri(&headers); + issue_code(&state, &headers, &input, &uri).await +} +async fn issue_code( + state: &AppState, + headers: &HeaderMap, + input: &Parameters, + uri: &str, +) -> Result { + let client = client(&state.db, headers, input, false).await?; + let scopes = oauth_server::scope(oauth_server::parameter(input, "scope")?.as_ref())?; + let now = Utc::now(); + let expires = now + chrono::Duration::seconds(600); + for _ in 0..10 { + let id = oauth_server::random_id(); + let mut rng = OsRng; + let user_code: String = (0..8) + .map(|_| CONSONANTS[rng.gen_range(0..CONSONANTS.len())] as char) + .collect(); + let result=sqlx::query("INSERT INTO oauth_device_codes(id,user_id,client_id,user_code,scopes,revoked,user_approved_at,last_polled_at,expires_at) VALUES(?,NULL,?,?,?,0,NULL,NULL,?)").bind(&id).bind(&client.id).bind(&user_code).bind(serde_json::to_string(&scopes).unwrap()).bind(expires.format("%Y-%m-%d %H:%M:%S").to_string()).execute(&state.db).await; + match result { + Ok(_)=>return Ok(([(header::CACHE_CONTROL,"no-store, private"),(header::PRAGMA,"no-cache"),(header::CONTENT_TYPE,"application/json; charset=UTF-8")],Json(json!({"device_code":id,"user_code":user_code,"verification_uri":uri,"expires_in":expires.timestamp()-Utc::now().timestamp(),"verification_uri_complete":format!("{uri}?user_code={user_code}"),"interval":5}))).into_response()), + Err(sqlx::Error::Database(error)) if error.is_unique_violation()=>continue, + Err(error)=>return Err(error.into()), + } + } + Err(OAuthError::server("Could not generate a random string")) +} +fn expired() -> OAuthError { + OAuthError::new( + "expired_token", + "The `device_code` has expired and the device authorization session has concluded.", + ) + .hint("device_code") +} +fn expiry(row: &SqliteRow) -> Result { + let value: Option = row.try_get("expires_at")?; + value + .and_then(|value| chrono::NaiveDateTime::parse_from_str(&value, "%Y-%m-%d %H:%M:%S").ok()) + .map(|value| value.and_utc().timestamp()) + .ok_or_else(|| OAuthError::server("An unexpected error has occurred")) +} +pub(crate) async fn issue_token( + state: AppState, + headers: HeaderMap, + input: Parameters, +) -> Result { + let client = client(&state.db, &headers, &input, true).await?; + let code = oauth_server::parameter(&input, "device_code")? + .ok_or_else(|| oauth_server::invalid_request("device_code"))?; + let row = sqlx::query("SELECT * FROM oauth_device_codes WHERE id=? AND revoked=0") + .bind(&code) + .fetch_optional(&state.db) + .await? + .ok_or_else(|| oauth_server::grant_error_hint(""))?; + let now = Utc::now(); + if expiry(&row)? < now.timestamp() { + return Err(expired()); + } + if row.get::("client_id") != client.id { + return Err(oauth_server::invalid_request_hint( + "Device code was not issued to this client", + )); + } + let user: Option = row.try_get("user_id")?; + if user.is_none() { + let at = now.format("%Y-%m-%d %H:%M:%S").to_string(); + let cutoff = (now - chrono::Duration::seconds(5)) + .format("%Y-%m-%d %H:%M:%S") + .to_string(); + // One atomic gate lets only one concurrent first poll return pending. + let pending=sqlx::query("UPDATE oauth_device_codes SET last_polled_at=? WHERE id=? AND revoked=0 AND user_id IS NULL AND (last_polled_at IS NULL OR datetime(last_polled_at)<=datetime(?))").bind(&at).bind(&code).bind(cutoff).execute(&state.db).await?.rows_affected(); + if pending == 1 { + return Err(OAuthError::new("authorization_pending", PENDING).hint("")); + } + let active=sqlx::query("UPDATE oauth_device_codes SET last_polled_at=? WHERE id=? AND revoked=0 AND user_id IS NULL").bind(at).bind(&code).execute(&state.db).await?.rows_affected(); + if active == 0 { + return Err(oauth_server::grant_error_hint("")); + } + return Err(OAuthError::new("slow_down", SLOW_DOWN).hint("")); + } + let user = user.unwrap(); + if row.get::, _>("user_approved_at").is_none() { + return Err(OAuthError::new( + "access_denied", + "The resource owner or authorization server denied the request.", + )); + } + // The pinned application registers only wildcard scope; Passport strips it + // from device tokens, and filters any unregistered persisted scopes. + let _: Vec = serde_json::from_str(&row.get::("scopes")) + .map_err(|_| OAuthError::server("An unexpected error has occurred"))?; + let scopes: Vec = Vec::new(); + let expires = crate::passport::one_year_from(now) + .ok_or_else(|| OAuthError::server("Unable to determine token expiry"))?; + let token_id = oauth_server::random_id(); + let access = crate::passport::sign_access_token( + &client.id, + &user.to_string(), + &token_id, + scopes.clone(), + now.timestamp(), + expires.timestamp(), + )?; + let refresh = if client.grants.iter().any(|grant| grant == "refresh_token") { + let id = oauth_server::random_id(); + let payload = json!({"client_id":client.id,"refresh_token_id":id,"access_token_id":token_id,"scopes":scopes,"user_id":user.to_string(),"expire_time":expires.timestamp()}); + Some((id, oauth_server::encrypt_payload(&payload)?)) + } else { + None + }; + let mut tx = state.db.begin().await?; + let changed=sqlx::query("UPDATE oauth_device_codes SET revoked=1 WHERE id=? AND revoked=0 AND user_id=? AND user_approved_at IS NOT NULL").bind(&code).bind(user).execute(&mut *tx).await?.rows_affected(); + if changed != 1 { + return Err(oauth_server::grant_error_hint("")); + } + sqlx::query("INSERT INTO oauth_access_tokens(id,user_id,client_id,scopes,revoked,created_at,updated_at,expires_at) VALUES(?,?,?,'[]',0,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,?)").bind(&token_id).bind(user).bind(&client.id).bind(expires.format("%Y-%m-%d %H:%M:%S").to_string()).execute(&mut *tx).await?; + if let Some((id, _)) = &refresh { + sqlx::query("INSERT INTO oauth_refresh_tokens(id,access_token_id,revoked,expires_at) VALUES(?,?,0,?)").bind(id).bind(&token_id).bind(expires.format("%Y-%m-%d %H:%M:%S").to_string()).execute(&mut *tx).await?; + } + tx.commit().await?; + let mut body = json!({"token_type":"Bearer","expires_in":expires.timestamp()-Utc::now().timestamp(),"access_token":access}); + if let Some((_, token)) = refresh { + body["refresh_token"] = json!(token); + } + Ok(( + [ + (header::CACHE_CONTROL, "no-store, private"), + (header::PRAGMA, "no-cache"), + (header::CONTENT_TYPE, "application/json; charset=UTF-8"), + ], + Json(body), + ) + .into_response()) +} + +#[cfg(test)] +mod tests { + use super::*; + use http_body_util::BodyExt; + use serde_json::Value; + fn input(values: &[(&str, &str)]) -> Parameters { + values + .iter() + .map(|(key, value)| (key.to_string(), json!(value))) + .collect() + } + async fn fixture() -> AppState { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + crate::db::init(&db).await.unwrap(); + crate::passport::init(&db).await.unwrap(); + init(&db).await.unwrap(); + sqlx::query("INSERT INTO oauth_clients(id,name,secret,redirect_uris,grant_types) VALUES(1,'device',NULL,'[]',?),(2,'other',NULL,'[]',?)").bind(json!([GRANT,"refresh_token"]).to_string()).bind(json!([GRANT]).to_string()).execute(&db).await.unwrap(); + AppState { + db, + cipher: None, + encrypt_db: std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)), + } + } + fn php_case(label: &str) -> Value { + let report: Value = serde_json::from_str(include_str!( + "../compatibility/oauth-device-php-reference.json" + )) + .unwrap(); + report["results"] + .as_array() + .unwrap() + .iter() + .find(|case| case["case"] == label) + .unwrap() + .clone() + } + async fn assert_php(label: &str, response: Response) -> Value { + let expected = php_case(label); + assert_eq!( + response.status().as_u16(), + expected["status"].as_u64().unwrap() as u16, + "{label}" + ); + for name in [ + "Content-Type", + "Cache-Control", + "Pragma", + "WWW-Authenticate", + ] { + assert_eq!( + response + .headers() + .get(name) + .and_then(|value| value.to_str().ok()), + expected["headers"][name].as_str(), + "{label}:{name}" + ); + } + let bytes = response.into_body().collect().await.unwrap().to_bytes(); + let body: Value = serde_json::from_slice(&bytes).unwrap(); + assert_eq!(body, expected["body"], "{label}"); + body + } + #[tokio::test] + async fn issuer_and_pending_poll_match_real_php_and_apply_backoff() { + let state = fixture().await; + let error = issue_code( + &state, + &HeaderMap::new(), + &Parameters::new(), + "https://example.invalid/oauth/device", + ) + .await + .unwrap_err(); + assert_php("issuer-missing-client", error.into_response()).await; + let response = issue_code( + &state, + &HeaderMap::new(), + &input(&[("client_id", "1"), ("scope", "*")]), + "https://example.invalid/oauth/device", + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + assert_eq!( + response.headers()[header::CACHE_CONTROL], + "no-store, private" + ); + let body: Value = + serde_json::from_slice(&response.into_body().collect().await.unwrap().to_bytes()) + .unwrap(); + let code = body["device_code"].as_str().unwrap(); + let user_code = body["user_code"].as_str().unwrap(); + assert_eq!(code.len(), 80); + assert!(code.bytes().all(|value| value.is_ascii_hexdigit())); + assert_eq!(user_code.len(), 8); + assert!(user_code.bytes().all(|value| CONSONANTS.contains(&value))); + assert_eq!(body["interval"], 5); + assert!((595..=600).contains(&body["expires_in"].as_i64().unwrap())); + assert_eq!( + body["verification_uri_complete"], + format!("https://example.invalid/oauth/device?user_code={user_code}") + ); + let parameters = input(&[("client_id", "1"), ("device_code", code)]); + let error = issue_token(state.clone(), HeaderMap::new(), parameters.clone()) + .await + .unwrap_err(); + assert_php("poll-pending", error.into_response()).await; + let error = issue_token(state.clone(), HeaderMap::new(), parameters.clone()) + .await + .unwrap_err(); + assert_php("poll-too-soon", error.into_response()).await; + sqlx::query( + "UPDATE oauth_device_codes SET last_polled_at=datetime('now','-6 seconds') WHERE id=?", + ) + .bind(code) + .execute(&state.db) + .await + .unwrap(); + let error = issue_token(state, HeaderMap::new(), parameters) + .await + .unwrap_err(); + assert_php("poll-pending", error.into_response()).await; + } + #[tokio::test] + async fn unknown_revoked_expired_denied_and_wrong_client_codes_are_distinct() { + let state = fixture().await; + let missing = input(&[("client_id", "1")]); + let error = issue_token(state.clone(), HeaderMap::new(), missing) + .await + .unwrap_err(); + assert_php("poll-missing-device-code", error.into_response()).await; + let parameters = input(&[("client_id", "1"), ("device_code", "unknown")]); + let error = issue_token(state.clone(), HeaderMap::new(), parameters) + .await + .unwrap_err(); + assert_php("poll-unknown-device-code", error.into_response()).await; + sqlx::query("INSERT INTO oauth_device_codes(id,client_id,user_code,scopes,revoked,expires_at) VALUES('test','1','BCDFGHJK','[]',0,datetime('now','+10 minutes'))").execute(&state.db).await.unwrap(); + let error = issue_token( + state.clone(), + HeaderMap::new(), + input(&[("client_id", "2"), ("device_code", "test")]), + ) + .await + .unwrap_err(); + let response = error.into_response(); + let body: Value = + serde_json::from_slice(&response.into_body().collect().await.unwrap().to_bytes()) + .unwrap(); + assert_eq!(body["hint"], "Device code was not issued to this client"); + sqlx::query( + "UPDATE oauth_device_codes SET expires_at=datetime('now','-1 second') WHERE id='test'", + ) + .execute(&state.db) + .await + .unwrap(); + let error = issue_token( + state.clone(), + HeaderMap::new(), + input(&[("client_id", "1"), ("device_code", "test")]), + ) + .await + .unwrap_err(); + let response = error.into_response(); + let body: Value = + serde_json::from_slice(&response.into_body().collect().await.unwrap().to_bytes()) + .unwrap(); + assert_eq!(body["error"], "expired_token"); + assert_eq!(body["hint"], "device_code"); + sqlx::query("UPDATE oauth_device_codes SET expires_at=datetime('now','+10 minutes'),user_id=1,user_approved_at=NULL WHERE id='test'").execute(&state.db).await.unwrap(); + let response = issue_token( + state.clone(), + HeaderMap::new(), + input(&[("client_id", "1"), ("device_code", "test")]), + ) + .await + .unwrap_err() + .into_response(); + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + let body: Value = + serde_json::from_slice(&response.into_body().collect().await.unwrap().to_bytes()) + .unwrap(); + assert_eq!( + body, + json!({"error":"access_denied","error_description":"The resource owner or authorization server denied the request."}) + ); + sqlx::query("UPDATE oauth_device_codes SET revoked=1 WHERE id='test'") + .execute(&state.db) + .await + .unwrap(); + let error = issue_token( + state, + HeaderMap::new(), + input(&[("client_id", "1"), ("device_code", "test")]), + ) + .await + .unwrap_err(); + assert_php("poll-unknown-device-code", error.into_response()).await; + } +} diff --git a/src/oauth_management.rs b/src/oauth_management.rs new file mode 100644 index 0000000..7a72e8c --- /dev/null +++ b/src/oauth_management.rs @@ -0,0 +1,1238 @@ +//! Passport 13.7.6 browser client administration and authorization-code consent. +//! Consent requests are held server-side and bound to the authenticated browser +//! session. Browser input can never choose the user, client, redirect or scopes +//! when approving an already validated request. +use crate::{ApiError, AppState, auth::AuthUser}; +use axum::{ + Extension, Json, Router, + body::Bytes, + extract::{Path, Query, State}, + http::{HeaderMap, StatusCode, header}, + response::{Html, IntoResponse, Response}, + routing::{delete, get, put}, +}; +use chrono::Utc; +use rand::{Rng, distributions::Alphanumeric}; +use serde::{Deserialize, Serialize}; +use serde_json::{Value, json}; +use sqlx::{Row, SqlitePool, sqlite::SqliteRow}; +use std::collections::HashMap; +use subtle::ConstantTimeEq; + +const OWNER: &str = "App\\Models\\User"; +pub async fn init(db: &SqlitePool) -> Result<(), sqlx::Error> { + sqlx::raw_sql("CREATE TABLE IF NOT EXISTS rust_oauth_authorizations(session_id TEXT PRIMARY KEY,user_id INTEGER NOT NULL,auth_token TEXT NOT NULL,request TEXT NOT NULL,expires_at INTEGER NOT NULL); CREATE TABLE IF NOT EXISTS rust_oauth_login_prompts(id TEXT PRIMARY KEY,request_hash TEXT NOT NULL,expires_at INTEGER NOT NULL);").execute(db).await?; + Ok(()) +} +/// The pinned app enables Passport's JSON routes after Passport already boots. +/// Keep the actual SPA/405 defaults; explicit opt-in exposes corrected v13 +/// owner-based administration. Its deprecated upstream repository uses user_id. +pub fn routes(state: AppState) -> Router { + routes_with_options( + state, + std::env::var("PASSPORT_JSON_API_ROUTES").is_ok_and(|v| v == "true" || v == "1"), + std::env::var("RUST_OAUTH_CONSENT_ENABLED").is_ok_and(|v| v == "true" || v == "1"), + ) +} +pub fn routes_with_options(state: AppState, json_routes: bool, consent: bool) -> Router { + // Refresh and consent approval routes are outside Passport's JSON gate. + let mut protected = Router::new() + .route("/oauth/token/refresh", axum::routing::post(refresh_cookie)) + .route( + "/oauth/authorize", + axum::routing::post(approve).delete(deny), + ); + if json_routes { + protected = protected + .route("/oauth/clients", get(list_clients).post(create_client)) + .route( + "/oauth/clients/{client_id}", + put(update_client).delete(delete_client), + ) + .route("/oauth/tokens", get(list_tokens)) + .route("/oauth/tokens/{token_id}", delete(delete_token)); + } + protected = protected.route_layer(axum::middleware::from_fn_with_state( + state, + crate::auth::require_web_auth, + )); + let authorization = if consent { + Router::new().route("/oauth/authorize", get(authorize)) + } else { + Router::new().route( + "/oauth/authorize", + get(|| async { ApiError(StatusCode::INTERNAL_SERVER_ERROR, "Server Error") }), + ) + }; + protected.merge(authorization) +} + +fn random(length: usize) -> String { + rand::thread_rng() + .sample_iter(&Alphanumeric) + .take(length) + .map(char::from) + .collect() +} +fn date(row: &SqliteRow, name: &str) -> Value { + row.get::, _>(name) + .map(|v| { + chrono::NaiveDateTime::parse_from_str(&v, "%Y-%m-%d %H:%M:%S") + .map(|d| json!(d.and_utc().format("%Y-%m-%dT%H:%M:%S.000000Z").to_string())) + .unwrap_or(json!(v)) + }) + .unwrap_or(Value::Null) +} +fn client_json(row: &SqliteRow) -> Value { + json!({"id":row.get::("id"),"owner_id":row.get::,_>("owner_id"),"owner_type":row.get::,_>("owner_type"),"name":row.get::("name"),"provider":row.get::,_>("provider"),"redirect_uris":serde_json::from_str::(&row.get::("redirect_uris")).unwrap_or(json!([])),"grant_types":serde_json::from_str::(&row.get::("grant_types")).unwrap_or(json!([])),"revoked":row.get::("revoked"),"created_at":date(row,"created_at"),"updated_at":date(row,"updated_at")}) +} +fn token_json(row: &SqliteRow) -> Value { + json!({"id":row.get::("id"),"user_id":row.get::,_>("user_id"),"client_id":row.get::("client_id"),"name":row.get::,_>("name"),"scopes":serde_json::from_str::(&row.get::,_>("scopes").unwrap_or_else(||"[]".into())).unwrap_or(json!([])),"revoked":row.get::("revoked"),"created_at":date(row,"created_at"),"updated_at":date(row,"updated_at"),"expires_at":date(row,"expires_at")}) +} +fn input(headers: &HeaderMap, body: &[u8]) -> Result { + if headers + .get(header::CONTENT_TYPE) + .and_then(|h| h.to_str().ok()) + .is_some_and(|v| v.split(';').next() == Some("application/x-www-form-urlencoded")) + { + let values: HashMap = serde_urlencoded::from_bytes(body) + .map_err(|_| ApiError(StatusCode::UNPROCESSABLE_ENTITY, "Invalid request."))?; + Ok(json!(values)) + } else { + serde_json::from_slice(body) + .map_err(|_| ApiError(StatusCode::UNPROCESSABLE_ENTITY, "Invalid request.")) + } +} +fn validation_errors(input: &Value, confidential: bool) -> Value { + let mut errors = serde_json::Map::new(); + match input["name"].as_str() { + None => { + errors.insert("name".into(), json!(["The name field is required."])); + } + Some(v) if v.trim().is_empty() => { + errors.insert("name".into(), json!(["The name field is required."])); + } + Some(v) if v.chars().count() > 255 => { + errors.insert( + "name".into(), + json!(["The name field must not be greater than 255 characters."]), + ); + } + _ => {} + } + match input["redirect"].as_str() { + None | Some("") => { + errors.insert( + "redirect".into(), + json!(["The redirect field is required."]), + ); + } + Some(v) if v.split(',').any(|u| !valid_uri(u)) => { + errors.insert( + "redirect".into(), + json!(["One or more redirects have an invalid URI format."]), + ); + } + _ => {} + } + if confidential + && input + .get("confidential") + .is_some_and(|v| bool_value(v).is_none()) + { + errors.insert( + "confidential".into(), + json!(["The confidential field must be true or false."]), + ); + } + Value::Object(errors) +} +fn bool_value(v: &Value) -> Option { + match v { + Value::Bool(v) => Some(*v), + Value::Number(v) if v.as_i64() == Some(0) => Some(false), + Value::Number(v) if v.as_i64() == Some(1) => Some(true), + Value::String(v) if v == "0" => Some(false), + Value::String(v) if v == "1" => Some(true), + _ => None, + } +} +fn valid_uri(s: &str) -> bool { + !s.chars().any(|c| c.is_whitespace() || c.is_control()) + && url::Url::parse(s).is_ok_and(|u| u.host_str().is_some() && !u.scheme().is_empty()) +} +fn validation_response(errors: Value) -> Response { + let message = errors + .as_object() + .and_then(|o| o.values().next()) + .and_then(|a| a[0].as_str()) + .unwrap_or("The given data was invalid."); + ( + StatusCode::UNPROCESSABLE_ENTITY, + Json(json!({"message":message,"errors":errors})), + ) + .into_response() +} +async fn owned(db: &SqlitePool, id: &str, user: i64) -> Result, sqlx::Error> { + sqlx::query("SELECT * FROM oauth_clients WHERE CAST(id AS TEXT)=? AND owner_id=? AND owner_type=? AND revoked=0").bind(id).bind(user).bind(OWNER).fetch_optional(db).await +} +async fn list_clients( + State(state): State, + Extension(user): Extension, +) -> Result, ApiError> { + let rows = sqlx::query( + "SELECT * FROM oauth_clients WHERE owner_id=? AND owner_type=? AND revoked=0 ORDER BY name", + ) + .bind(user.id) + .bind(OWNER) + .fetch_all(&state.db) + .await?; + Ok(Json(json!( + rows.iter().map(client_json).collect::>() + ))) +} +async fn create_client( + State(state): State, + Extension(user): Extension, + headers: HeaderMap, + body: Bytes, +) -> Result { + let i = input(&headers, &body)?; + let errors = validation_errors(&i, true); + if !errors.as_object().unwrap().is_empty() { + return Ok(validation_response(errors)); + } + let secret = if i.get("confidential").and_then(bool_value).unwrap_or(true) { + Some(random(40)) + } else { + None + }; + let hashed = secret + .as_ref() + .map(|s| bcrypt::hash(s, bcrypt::DEFAULT_COST)) + .transpose() + .map_err(|_| ApiError(StatusCode::INTERNAL_SERVER_ERROR, "Server Error"))?; + let redirects = i["redirect"] + .as_str() + .unwrap() + .split(',') + .collect::>(); + let r=sqlx::query("INSERT INTO oauth_clients(owner_id,owner_type,name,secret,provider,redirect_uris,grant_types,revoked,created_at,updated_at) VALUES(?,?,?,?,NULL,?,'[\"authorization_code\",\"refresh_token\"]',0,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)").bind(user.id).bind(OWNER).bind(i["name"].as_str().unwrap().trim()).bind(hashed).bind(json!(redirects).to_string()).execute(&state.db).await?; + let row = sqlx::query("SELECT * FROM oauth_clients WHERE id=?") + .bind(r.last_insert_rowid()) + .fetch_one(&state.db) + .await?; + let mut value = client_json(&row); + if let Some(secret) = secret { + value["plain_secret"] = json!(secret); + } + Ok(Json(value).into_response()) +} +async fn update_client( + State(state): State, + Extension(user): Extension, + Path(id): Path, + headers: HeaderMap, + body: Bytes, +) -> Result { + if owned(&state.db, &id, user.id).await?.is_none() { + return Ok(StatusCode::NOT_FOUND.into_response()); + } + let i = input(&headers, &body)?; + let errors = validation_errors(&i, false); + if !errors.as_object().unwrap().is_empty() { + return Ok(validation_response(errors)); + } + sqlx::query("UPDATE oauth_clients SET name=?,redirect_uris=?,updated_at=CURRENT_TIMESTAMP WHERE CAST(id AS TEXT)=? AND owner_id=? AND owner_type=? AND revoked=0").bind(i["name"].as_str().unwrap().trim()).bind(json!(i["redirect"].as_str().unwrap().split(',').collect::>()).to_string()).bind(&id).bind(user.id).bind(OWNER).execute(&state.db).await?; + Ok(Json(client_json( + &owned(&state.db, &id, user.id) + .await? + .ok_or(ApiError(StatusCode::NOT_FOUND, "Not Found"))?, + )) + .into_response()) +} +async fn delete_client( + State(state): State, + Extension(user): Extension, + Path(id): Path, +) -> Result { + let mut tx = state.db.begin().await?; + let n=sqlx::query("UPDATE oauth_clients SET revoked=1,updated_at=CURRENT_TIMESTAMP WHERE CAST(id AS TEXT)=? AND owner_id=? AND owner_type=? AND revoked=0").bind(&id).bind(user.id).bind(OWNER).execute(&mut *tx).await?.rows_affected(); + if n == 0 { + return Ok(StatusCode::NOT_FOUND); + } + sqlx::query("UPDATE oauth_refresh_tokens SET revoked=1 WHERE access_token_id IN (SELECT id FROM oauth_access_tokens WHERE CAST(client_id AS TEXT)=?)").bind(&id).execute(&mut *tx).await?; + sqlx::query("UPDATE oauth_access_tokens SET revoked=1 WHERE CAST(client_id AS TEXT)=?") + .bind(&id) + .execute(&mut *tx) + .await?; + tx.commit().await?; + Ok(StatusCode::NO_CONTENT) +} +async fn list_tokens( + State(state): State, + Extension(user): Extension, +) -> Result, ApiError> { + let rows=sqlx::query("SELECT t.* FROM oauth_access_tokens t JOIN oauth_clients c ON c.id=t.client_id WHERE t.user_id=? AND t.revoked=0 AND datetime(t.expires_at)>datetime('now') AND c.revoked=0 AND c.owner_id IS NOT NULL AND c.owner_id!=0").bind(user.id).fetch_all(&state.db).await?; + let mut result = Vec::new(); + for row in rows { + let mut v = token_json(&row); + let c = sqlx::query("SELECT * FROM oauth_clients WHERE id=?") + .bind(row.get::("client_id")) + .fetch_one(&state.db) + .await?; + v["client"] = client_json(&c); + result.push(v); + } + Ok(Json(json!(result))) +} +async fn delete_token( + State(state): State, + Extension(user): Extension, + Path(id): Path, +) -> Result { + let mut tx = state.db.begin().await?; + let n=sqlx::query("UPDATE oauth_access_tokens SET revoked=1 WHERE id=? AND user_id=? AND revoked=0 AND datetime(expires_at)>datetime('now')").bind(&id).bind(user.id).execute(&mut *tx).await?.rows_affected(); + if n == 0 { + return Ok(StatusCode::NOT_FOUND); + } + sqlx::query("UPDATE oauth_refresh_tokens SET revoked=1 WHERE access_token_id=?") + .bind(id) + .execute(&mut *tx) + .await?; + tx.commit().await?; + Ok(StatusCode::NO_CONTENT) +} + +async fn refresh_cookie( + State(state): State, + Extension(user): Extension, + headers: HeaderMap, +) -> Result { + let csrf = crate::auth::browser_csrf_token(&state, &headers) + .await? + .ok_or(ApiError(StatusCode::UNAUTHORIZED, "Unauthenticated."))?; + let cookie = crate::passport::fresh_cookie_value(&state, user.id, &csrf)?; + let path = std::env::var("SESSION_PATH").unwrap_or_else(|_| "/".into()); + let domain = std::env::var("SESSION_DOMAIN") + .ok() + .filter(|v| !v.is_empty() && v != "null"); + let secure = std::env::var("SESSION_SECURE_COOKIE").is_ok_and(|v| v == "true" || v == "1"); + let age = crate::auth::TTL; + let expiry = (Utc::now() + chrono::Duration::seconds(age)) + .format("%a, %d %b %Y %H:%M:%S GMT") + .to_string(); + let mut value = format!( + "laravel_token={}; expires={}; Max-Age={}; path={}; HttpOnly; SameSite=Lax", + percent_encoding::utf8_percent_encode(&cookie, percent_encoding::NON_ALPHANUMERIC), + expiry, + age, + path + ); + if let Some(domain) = domain { + value.push_str(&format!("; domain={domain}")); + } + if secure { + value.push_str("; Secure"); + } + let mut r = "Refreshed.".into_response(); + r.headers_mut().insert( + header::CONTENT_TYPE, + header::HeaderValue::from_static("text/html; charset=UTF-8"), + ); + r.headers_mut().append( + header::SET_COOKIE, + header::HeaderValue::from_str(&value) + .map_err(|_| ApiError(StatusCode::INTERNAL_SERVER_ERROR, "Server Error"))?, + ); + Ok(r) +} + +#[derive(Debug, Serialize, Deserialize)] +struct Authorization { + client_id: String, + redirect_uri: String, + #[serde(default)] + requested_redirect_uri: Option, + #[serde(default)] + scopes: Vec, + state: Option, + code_challenge: Option, + code_challenge_method: Option, +} +fn error_payload(error: &str, hint: &str) -> Value { + let description = match error { + "invalid_request" => { + "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed." + } + "invalid_client" => "Client authentication failed", + "invalid_scope" => "The requested scope is invalid, unknown, or malformed", + "unauthorized_client" => { + "The authenticated client is not authorized to use this authorization grant type." + } + "consent_required" => "The authorization server requires end-user consent.", + _ => hint, + }; + let mut payload = json!({"error":error,"error_description":description}); + match error { + "invalid_client" | "consent_required" => {} + "login_required" => payload["hint"] = json!("The user is not authenticated"), + "access_denied" => payload["hint"] = json!("The user denied the request"), + _ => payload["hint"] = json!(hint), + } + payload +} +fn oauth_error(error: &str, hint: &str) -> Response { + ( + if error == "invalid_client" { + StatusCode::UNAUTHORIZED + } else { + StatusCode::BAD_REQUEST + }, + Json(error_payload(error, hint)), + ) + .into_response() +} + +fn redirect(uri: &str, params: &[(&str, &str)]) -> Response { + match url::Url::parse(uri) { + Ok(mut u) => { + u.query_pairs_mut().extend_pairs(params.iter().copied()); + (StatusCode::FOUND, [(header::LOCATION, u.as_str())]).into_response() + } + Err(_) => oauth_error("invalid_request", "The redirect URI is invalid."), + } +} +fn redirect_error(a: &Authorization, error: &str, description: &str) -> Response { + let payload = error_payload(error, description); + let mut p = payload + .as_object() + .unwrap() + .iter() + .filter_map(|(key, value)| value.as_str().map(|value| (key.as_str(), value))) + .collect::>(); + if let Some(s) = a.state.as_deref() { + p.push(("state", s)); + } + redirect(&a.redirect_uri, &p) +} + +fn validate_authorization( + q: &HashMap, + c: &SqliteRow, +) -> Result> { + let grants: Vec = + serde_json::from_str(&c.get::("grant_types")).unwrap_or_default(); + if !grants.iter().any(|g| g == "authorization_code") + || c.get::, _>("provider") + .is_some_and(|p| p != "users") + { + return Err(Box::new(oauth_error( + "unauthorized_client", + "The client is not authorized to request an authorization code using this method.", + ))); + } + let uris: Vec = + serde_json::from_str(&c.get::("redirect_uris")).unwrap_or_default(); + let uri = match q.get("redirect_uri") { + Some(uri) if uris.contains(uri) => uri.clone(), + None if uris.len() == 1 => uris[0].clone(), + _ => { + return Err(Box::new(oauth_error( + "invalid_request", + "The redirect URI is missing or does not match the registered redirect URI.", + ))); + } + }; + if !valid_uri(&uri) || url::Url::parse(&uri).is_ok_and(|u| u.fragment().is_some()) { + return Err(Box::new(oauth_error( + "invalid_request", + "The redirect URI is invalid.", + ))); + } + let a = Authorization { + client_id: c.get::("id").to_string(), + redirect_uri: uri, + requested_redirect_uri: q.get("redirect_uri").cloned(), + scopes: q + .get("scope") + .map(|s| s.split_whitespace().map(str::to_owned).collect()) + .unwrap_or_default(), + state: q.get("state").cloned(), + code_challenge: q.get("code_challenge").cloned(), + code_challenge_method: q.get("code_challenge").map(|_| { + q.get("code_challenge_method") + .cloned() + .unwrap_or_else(|| "plain".into()) + }), + }; + if q.get("response_type").map(String::as_str) != Some("code") { + return Err(Box::new(redirect_error( + &a, + "unsupported_response_type", + "The authorization server does not support the requested response type.", + ))); + } + if q.get("scope") + .is_some_and(|s| s.split_whitespace().any(|v| v != "*")) + { + return Err(Box::new(redirect_error( + &a, + "invalid_scope", + "The requested scope is invalid, unknown, or malformed.", + ))); + } + if c.get::, _>("secret") + .is_none_or(|s| s.is_empty()) + && a.code_challenge.is_none() + { + return Err(Box::new(redirect_error( + &a, + "invalid_request", + "Code challenge must be provided for public clients.", + ))); + } + if a.code_challenge.as_ref().is_some_and(|s| { + s.len() < 43 + || s.len() > 128 + || !s + .bytes() + .all(|b| b.is_ascii_alphanumeric() || b"-._~".contains(&b)) + }) { + return Err(Box::new(redirect_error( + &a, + "invalid_request", + "The code challenge is invalid.", + ))); + } + if a.code_challenge_method + .as_ref() + .is_some_and(|m| m != "plain" && m != "S256") + { + return Err(Box::new(redirect_error( + &a, + "invalid_request", + "The code challenge method is not supported.", + ))); + } + Ok(a) +} +fn html(s: &str) -> String { + s.replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('"', """) + .replace('\'', "'") +} +fn prompt_cookie(headers: &HeaderMap) -> Option { + let mut found = None; + for h in headers.get_all(header::COOKIE) { + for part in h.to_str().ok()?.split(';') { + if let Some(("rust_oauth_prompt", value)) = part.trim().split_once('=') { + if found.is_some() + || value.len() != 64 + || !value.bytes().all(|v| v.is_ascii_alphanumeric()) + { + return None; + } + found = Some(value.to_owned()); + } + } + } + found +} +async fn authorize( + State(state): State, + headers: HeaderMap, + Query(q): Query>, +) -> Result { + let Some(id) = q.get("client_id") else { + return Ok(oauth_error( + "invalid_request", + "The request is missing a required parameter: client_id.", + )); + }; + let Some(c) = sqlx::query("SELECT * FROM oauth_clients WHERE CAST(id AS TEXT)=? AND revoked=0") + .bind(id) + .fetch_optional(&state.db) + .await? + else { + return Ok(oauth_error( + "invalid_client", + "Client authentication failed.", + )); + }; + let a = match validate_authorization(&q, &c) { + Ok(a) => a, + Err(e) => return Ok(*e), + }; + let prompt = q + .get("prompt") + .map(|v| v.split_whitespace().collect::>()) + .unwrap_or_default(); + let user = crate::auth::browser_user(&state, &headers).await?; + // A random, one-use browser cookie survives the deliberate logout and login + // session rotation. It proves this exact authorization request has already + // prompted for login; the marker expires and cannot approve consent itself. + if prompt.contains(&"login") && !prompt.contains(&"none") { + let request_hash = crate::auth::digest(&serde_json::to_string(&a).unwrap()); + let mut prompted = false; + if let Some(marker) = prompt_cookie(&headers) { + let row = sqlx::query( + "DELETE FROM rust_oauth_login_prompts WHERE id=? RETURNING request_hash,expires_at", + ) + .bind(crate::auth::digest(&marker)) + .fetch_optional(&state.db) + .await?; + prompted = row.is_some_and(|r| { + r.get::("expires_at") > Utc::now().timestamp() + && bool::from( + r.get::("request_hash") + .as_bytes() + .ct_eq(request_hash.as_bytes()), + ) + }); + } + if !prompted || user.is_none() { + crate::auth::invalidate_browser(&state, &headers).await?; + let marker = random(64); + sqlx::query("DELETE FROM rust_oauth_login_prompts WHERE expires_at<=?") + .bind(Utc::now().timestamp()) + .execute(&state.db) + .await?; + sqlx::query( + "INSERT INTO rust_oauth_login_prompts(id,request_hash,expires_at) VALUES(?,?,?)", + ) + .bind(crate::auth::digest(&marker)) + .bind(request_hash) + .bind(Utc::now().timestamp() + 600) + .execute(&state.db) + .await?; + let mut r = (StatusCode::FOUND, [(header::LOCATION, "/login")]).into_response(); + crate::auth::clear_laravel_session_cookies(&mut r); + let cookie = format!( + "rust_oauth_prompt={marker}; Path=/; HttpOnly; SameSite=Lax; Max-Age=600{}", + if std::env::var("RUST_COOKIE_SECURE").as_deref() != Ok("false") { + "; Secure" + } else { + "" + } + ); + r.headers_mut().append( + header::SET_COOKIE, + header::HeaderValue::from_str(&cookie).unwrap(), + ); + return Ok(r); + } + } + let Some(user) = user else { + return Ok(if prompt.contains(&"none") { + redirect_error( + &a, + "login_required", + "The authorization server requires end-user authentication.", + ) + } else { + (StatusCode::FOUND, [(header::LOCATION, "/login")]).into_response() + }); + }; + let previously:bool=sqlx::query_scalar("SELECT EXISTS(SELECT 1 FROM oauth_access_tokens WHERE CAST(client_id AS TEXT)=? AND user_id=? AND revoked=0 AND datetime(expires_at)>datetime('now'))").bind(id).bind(user.id).fetch_one(&state.db).await?; + if previously && (!prompt.contains(&"consent") || prompt.contains(&"none")) { + return issue_code(&state, user.id, &a).await; + } + if prompt.contains(&"none") { + return Ok(redirect_error( + &a, + "consent_required", + "The authorization server requires user consent.", + )); + } + let sid = crate::auth::browser_session_id(&state, &headers) + .await? + .ok_or(ApiError(StatusCode::UNAUTHORIZED, "Unauthenticated."))?; + sqlx::query("DELETE FROM rust_oauth_authorizations WHERE expires_at<=?") + .bind(Utc::now().timestamp()) + .execute(&state.db) + .await?; + let auth_token = random(40); + sqlx::query("INSERT INTO rust_oauth_authorizations(session_id,user_id,auth_token,request,expires_at) VALUES(?,?,?,?,?) ON CONFLICT(session_id) DO UPDATE SET user_id=excluded.user_id,auth_token=excluded.auth_token,request=excluded.request,expires_at=excluded.expires_at").bind(sid).bind(user.id).bind(&auth_token).bind(serde_json::to_string(&a).unwrap()).bind(Utc::now().timestamp()+600).execute(&state.db).await?; + let csrf = crate::auth::browser_csrf_token(&state, &headers) + .await? + .ok_or(ApiError(StatusCode::UNAUTHORIZED, "Unauthenticated."))?; + let page = format!( + "Authorization Request

Authorization Request

{} is requesting permission to access your account.

", + html(&c.get::("name")), + html(&csrf), + html(&auth_token), + html(&csrf), + html(&auth_token) + ); + Ok(( + [ + (header::CACHE_CONTROL, "no-store"), + (header::PRAGMA, "no-cache"), + ], + Html(page), + ) + .into_response()) +} +async fn consume( + state: &AppState, + user: &AuthUser, + headers: &HeaderMap, + i: &Value, +) -> Result { + let sid = crate::auth::browser_session_id(state, headers) + .await? + .ok_or(ApiError(StatusCode::UNAUTHORIZED, "Unauthenticated."))?; + // Delete even on a mismatched nonce, as Passport's session pull does. A + // successful DELETE RETURNING also makes concurrent approval one-use. + let r = sqlx::query("DELETE FROM rust_oauth_authorizations WHERE session_id=? RETURNING *") + .bind(sid) + .fetch_optional(&state.db) + .await?; + let r = r.ok_or(ApiError( + StatusCode::FORBIDDEN, + "The provided auth token for the request is different from the session auth token.", + ))?; + let expected = r.get::("auth_token"); + if r.get::("user_id") != user.id + || r.get::("expires_at") <= Utc::now().timestamp() + || !i["auth_token"] + .as_str() + .is_some_and(|v| bool::from(v.as_bytes().ct_eq(expected.as_bytes()))) + { + return Err(ApiError( + StatusCode::FORBIDDEN, + "The provided auth token for the request is different from the session auth token.", + )); + } + serde_json::from_str(&r.get::("request")) + .map_err(|_| ApiError(StatusCode::INTERNAL_SERVER_ERROR, "Server Error")) +} +async fn approve( + State(state): State, + Extension(user): Extension, + headers: HeaderMap, + body: Bytes, +) -> Result { + let i = input(&headers, &body)?; + let a = consume(&state, &user, &headers, &i).await?; + if i["_method"] + .as_str() + .is_some_and(|v| v.eq_ignore_ascii_case("DELETE")) + { + return Ok(redirect_error( + &a, + "access_denied", + "The resource owner or authorization server denied the request.", + )); + } + issue_code(&state, user.id, &a).await +} +async fn deny( + State(state): State, + Extension(user): Extension, + headers: HeaderMap, + body: Bytes, +) -> Result { + let a = consume(&state, &user, &headers, &input(&headers, &body)?).await?; + Ok(redirect_error( + &a, + "access_denied", + "The resource owner or authorization server denied the request.", + )) +} +async fn issue_code(state: &AppState, user: i64, a: &Authorization) -> Result { + let active: bool = sqlx::query_scalar( + "SELECT EXISTS(SELECT 1 FROM oauth_clients WHERE CAST(id AS TEXT)=? AND revoked=0)", + ) + .bind(&a.client_id) + .fetch_one(&state.db) + .await?; + if !active { + return Ok(oauth_error( + "invalid_client", + "Client authentication failed.", + )); + } + let id = random(80); + let exp = Utc::now().timestamp() + 600; + let code = crate::oauth_server::encrypt_payload( + &json!({"client_id":a.client_id,"redirect_uri":a.requested_redirect_uri,"auth_code_id":id,"scopes":a.scopes,"user_id":user.to_string(),"expire_time":exp,"code_challenge":a.code_challenge,"code_challenge_method":a.code_challenge_method}), + )?; + sqlx::query("INSERT INTO oauth_auth_codes(id,user_id,client_id,scopes,revoked,expires_at) VALUES(?,?,?,?,0,?)").bind(id).bind(user).bind(&a.client_id).bind(json!(a.scopes).to_string()).bind(chrono::DateTime::from_timestamp(exp,0).unwrap().format("%Y-%m-%d %H:%M:%S").to_string()).execute(&state.db).await?; + let mut p = vec![("code", code.as_str())]; + if let Some(s) = a.state.as_deref() { + p.push(("state", s)); + } + Ok(redirect(&a.redirect_uri, &p)) +} + +#[cfg(test)] +mod tests { + use super::*; + async fn fixture() -> AppState { + let db = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect("sqlite::memory:") + .await + .unwrap(); + crate::db::init(&db).await.unwrap(); + crate::auth::init(&db).await.unwrap(); + crate::passport::init(&db).await.unwrap(); + crate::oauth_server::init(&db).await.unwrap(); + init(&db).await.unwrap(); + sqlx::query("INSERT INTO users(id,name,email,password) VALUES(7,'owner','owner@example.test','unused'),(8,'other','other@example.test','unused')").execute(&db).await.unwrap(); + AppState { + db, + cipher: None, + encrypt_db: std::sync::atomic::AtomicBool::new(false).into(), + } + } + fn user(id: i64) -> AuthUser { + AuthUser { id, is_admin: true } + } + fn body(v: Value) -> Bytes { + Bytes::from(v.to_string()) + } + async fn response_json(r: Response) -> Value { + serde_json::from_slice( + &axum::body::to_bytes(r.into_body(), 64 * 1024) + .await + .unwrap(), + ) + .unwrap() + } + async fn create(state: &AppState, confidential: bool) -> Value { + response_json(create_client(State(state.clone()),Extension(user(7)),HeaderMap::new(),body(json!({"name":"Example","redirect":"https://client.example/callback","confidential":confidential}))).await.unwrap()).await + } + #[tokio::test] + async fn client_secret_is_hashed_visible_once_and_owned_by_model_type() { + let state = fixture().await; + let c = create(&state, true).await; + let id = c["id"].as_i64().unwrap(); + let plain = c["plain_secret"].as_str().unwrap(); + assert_eq!(plain.len(), 40); + assert!(c.get("secret").is_none()); + let hash: String = sqlx::query_scalar("SELECT secret FROM oauth_clients WHERE id=?") + .bind(id) + .fetch_one(&state.db) + .await + .unwrap(); + assert!(bcrypt::verify(plain, &hash).unwrap()); + let Json(list) = list_clients(State(state.clone()), Extension(user(7))) + .await + .unwrap(); + assert_eq!(list.as_array().unwrap().len(), 1); + assert!(list[0].get("secret").is_none()); + assert!(list[0].get("plain_secret").is_none()); + let Json(list) = list_clients(State(state.clone()), Extension(user(8))) + .await + .unwrap(); + assert_eq!(list, json!([])); + let other = update_client( + State(state.clone()), + Extension(user(8)), + Path(id.to_string()), + HeaderMap::new(), + body(json!({"name":"stolen","redirect":"https://attacker.example"})), + ) + .await + .unwrap(); + assert_eq!(other.status(), StatusCode::NOT_FOUND); + sqlx::query("UPDATE oauth_clients SET owner_type='Other\\User' WHERE id=?") + .bind(id) + .execute(&state.db) + .await + .unwrap(); + assert_eq!( + delete_client( + State(state.clone()), + Extension(user(7)), + Path(id.to_string()) + ) + .await + .unwrap(), + StatusCode::NOT_FOUND + ); + let public = create(&state, false).await; + assert!(public.get("plain_secret").is_none()); + assert!(public.get("secret").is_none()); + let secret: Option = + sqlx::query_scalar("SELECT secret FROM oauth_clients WHERE id=?") + .bind(public["id"].as_i64().unwrap()) + .fetch_one(&state.db) + .await + .unwrap(); + assert!(secret.is_none()); + } + #[tokio::test] + async fn revocations_cover_refresh_tokens_and_enforce_token_owner() { + let state = fixture().await; + let c = create(&state, false).await; + let id = c["id"].as_i64().unwrap(); + for (tid, uid) in [("one", 7), ("two", 8)] { + sqlx::query("INSERT INTO oauth_access_tokens(id,user_id,client_id,scopes,revoked,expires_at) VALUES(?,?,?,'[]',0,datetime('now','+1 day'))").bind(tid).bind(uid).bind(id).execute(&state.db).await.unwrap(); + sqlx::query("INSERT INTO oauth_refresh_tokens(id,access_token_id,revoked,expires_at) VALUES(?,?,0,datetime('now','+1 day'))").bind(format!("refresh-{tid}")).bind(tid).execute(&state.db).await.unwrap(); + } + assert_eq!( + delete_token(State(state.clone()), Extension(user(8)), Path("one".into())) + .await + .unwrap(), + StatusCode::NOT_FOUND + ); + assert_eq!( + delete_token(State(state.clone()), Extension(user(7)), Path("one".into())) + .await + .unwrap(), + StatusCode::NO_CONTENT + ); + let revoked: bool = + sqlx::query_scalar("SELECT revoked FROM oauth_refresh_tokens WHERE id='refresh-one'") + .fetch_one(&state.db) + .await + .unwrap(); + assert!(revoked); + assert_eq!( + delete_client( + State(state.clone()), + Extension(user(8)), + Path(id.to_string()) + ) + .await + .unwrap(), + StatusCode::NOT_FOUND + ); + assert_eq!( + delete_client( + State(state.clone()), + Extension(user(7)), + Path(id.to_string()) + ) + .await + .unwrap(), + StatusCode::NO_CONTENT + ); + let count: i64 = + sqlx::query_scalar("SELECT count(*) FROM oauth_access_tokens WHERE revoked=0") + .fetch_one(&state.db) + .await + .unwrap(); + assert_eq!(count, 0); + let count: i64 = + sqlx::query_scalar("SELECT count(*) FROM oauth_refresh_tokens WHERE revoked=0") + .fetch_one(&state.db) + .await + .unwrap(); + assert_eq!(count, 0); + } + #[tokio::test] + async fn consent_validates_redirect_scope_grant_pkce_before_using_redirect() { + let state = fixture().await; + let c = create(&state, false).await; + let row = sqlx::query("SELECT * FROM oauth_clients WHERE id=?") + .bind(c["id"].as_i64().unwrap()) + .fetch_one(&state.db) + .await + .unwrap(); + let mut q = HashMap::from([ + ("client_id".into(), c["id"].to_string()), + ("response_type".into(), "code".into()), + ( + "redirect_uri".into(), + "https://attacker.example/callback".into(), + ), + ]); + let r = validate_authorization(&q, &row).unwrap_err(); + assert_eq!(r.status(), StatusCode::BAD_REQUEST); + assert!(r.headers().get(header::LOCATION).is_none()); + q.insert( + "redirect_uri".into(), + "https://client.example/callback".into(), + ); + let r = validate_authorization(&q, &row).unwrap_err(); + assert_eq!(r.status(), StatusCode::FOUND); + assert!( + r.headers()[header::LOCATION] + .to_str() + .unwrap() + .contains("invalid_request") + ); + q.insert("code_challenge".into(), "a".repeat(43)); + q.insert("code_challenge_method".into(), "S256".into()); + assert!(validate_authorization(&q, &row).is_ok()); + q.insert("scope".into(), "*".into()); + assert!(validate_authorization(&q, &row).is_ok()); + q.insert("scope".into(), "admin".into()); + assert!(validate_authorization(&q, &row).is_err()); + q.remove("scope"); + q.insert("code_challenge_method".into(), "other".into()); + assert!(validate_authorization(&q, &row).is_err()); + q.insert("code_challenge_method".into(), "plain".into()); + q.insert("code_challenge".into(), "