diff --git a/package.json b/package.json index a2936d77..99156884 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sudo-flix", - "version": "4.6.0", + "version": "4.6.1", "private": true, "homepage": "https://sudo-flix.lol", "scripts": { @@ -50,6 +50,7 @@ "immer": "^10.0.3", "jwt-decode": "^4.0.0", "lodash.isequal": "^4.5.0", + "lodash.merge": "^4.6.2", "million": "^2.6.4", "nanoid": "^5.0.4", "node-forge": "^1.3.1", @@ -80,6 +81,7 @@ "@types/dompurify": "^3.0.5", "@types/fscreen": "^1.0.4", "@types/lodash.isequal": "^4.5.8", + "@types/lodash.merge": "^4.6.9", "@types/lodash.throttle": "^4.1.9", "@types/node": "^20.10.5", "@types/pako": "^2.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e8e69f6..1157ab86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,6 +84,9 @@ dependencies: lodash.isequal: specifier: ^4.5.0 version: 4.5.0 + lodash.merge: + specifier: ^4.6.2 + version: 4.6.2 million: specifier: ^2.6.4 version: 2.6.4 @@ -170,6 +173,9 @@ devDependencies: '@types/lodash.isequal': specifier: ^4.5.8 version: 4.5.8 + '@types/lodash.merge': + specifier: ^4.6.9 + version: 4.6.9 '@types/lodash.throttle': specifier: ^4.1.9 version: 4.1.9 @@ -271,7 +277,7 @@ devDependencies: version: 0.5.9(prettier@3.1.1) rollup-plugin-visualizer: specifier: ^5.11.0 - version: 5.11.0(@rollup/wasm-node@4.12.0) + version: 5.11.0(@rollup/wasm-node@4.12.1) tailwind-scrollbar: specifier: ^3.0.5 version: 3.0.5(tailwindcss@3.4.0) @@ -2062,7 +2068,7 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.12.0): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.12.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2075,36 +2081,36 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-module-imports': 7.22.15 - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.12.0) - rollup: /@rollup/wasm-node@4.12.0 + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.12.1) + rollup: /@rollup/wasm-node@4.12.1 dev: true - /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.12.0): + /@rollup/plugin-node-resolve@11.2.1(@rollup/wasm-node@4.12.1): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.12.0) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.12.1) '@types/resolve': 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.4 - rollup: /@rollup/wasm-node@4.12.0 + rollup: /@rollup/wasm-node@4.12.1 dev: true - /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.12.0): + /@rollup/plugin-replace@2.4.2(@rollup/wasm-node@4.12.1): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: npm:@rollup/wasm-node dependencies: - '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.12.0) + '@rollup/pluginutils': 3.1.0(@rollup/wasm-node@4.12.1) magic-string: 0.25.9 - rollup: /@rollup/wasm-node@4.12.0 + rollup: /@rollup/wasm-node@4.12.1 dev: true - /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.12.0): + /@rollup/pluginutils@3.1.0(@rollup/wasm-node@4.12.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2113,11 +2119,11 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.12.0 + rollup: /@rollup/wasm-node@4.12.1 dev: true - /@rollup/wasm-node@4.12.0: - resolution: {integrity: sha512-sqy3+YvV/uWX6bPZOR5PlEdH6xyMPXoelllRQ/uZ13tzy9f4pXZTbajnoWN8IHHXwTNKPiLzsePLiDEVmkxMNw==} + /@rollup/wasm-node@4.12.1: + resolution: {integrity: sha512-5j3BVQEccCzCb8fkl++IbDgAsnlsKBPz049C4C//j5s3pFKxKGlybl63QApdJKl1fNLr7HIwQEJcBImQtA3ZHg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: @@ -2262,17 +2268,23 @@ packages: /@types/lodash.isequal@4.5.8: resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==} dependencies: - '@types/lodash': 4.14.197 + '@types/lodash': 4.14.202 + dev: true + + /@types/lodash.merge@4.6.9: + resolution: {integrity: sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ==} + dependencies: + '@types/lodash': 4.14.202 dev: true /@types/lodash.throttle@4.1.9: resolution: {integrity: sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g==} dependencies: - '@types/lodash': 4.14.197 + '@types/lodash': 4.14.202 dev: true - /@types/lodash@4.14.197: - resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==} + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} dev: true /@types/node-forge@1.3.10: @@ -5019,7 +5031,6 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} @@ -5116,7 +5127,7 @@ packages: '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) '@babel/types': 7.23.6 kleur: 4.1.5 - rollup: /@rollup/wasm-node@4.12.0 + rollup: /@rollup/wasm-node@4.12.1 unplugin: 1.5.1 transitivePeerDependencies: - supports-color @@ -6044,7 +6055,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.12.0): + /rollup-plugin-terser@7.0.2(@rollup/wasm-node@4.12.1): resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: @@ -6052,12 +6063,12 @@ packages: dependencies: '@babel/code-frame': 7.23.5 jest-worker: 26.6.2 - rollup: /@rollup/wasm-node@4.12.0 + rollup: /@rollup/wasm-node@4.12.1 serialize-javascript: 4.0.0 terser: 5.19.3 dev: true - /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.12.0): + /rollup-plugin-visualizer@5.11.0(@rollup/wasm-node@4.12.1): resolution: {integrity: sha512-exM0Ms2SN3AgTzMeW7y46neZQcyLY7eKwWAop1ZoRTCZwyrIRdMMJ6JjToAJbML77X/9N8ZEpmXG4Z/Clb9k8g==} engines: {node: '>=14'} hasBin: true @@ -6069,7 +6080,7 @@ packages: dependencies: open: 8.4.2 picomatch: 2.3.1 - rollup: /@rollup/wasm-node@4.12.0 + rollup: /@rollup/wasm-node@4.12.1 source-map: 0.7.4 yargs: 17.7.2 dev: true @@ -7059,7 +7070,7 @@ packages: '@types/node': 20.10.5 esbuild: 0.19.10 postcss: 8.4.32 - rollup: /@rollup/wasm-node@4.12.0 + rollup: /@rollup/wasm-node@4.12.1 optionalDependencies: fsevents: 2.3.3 dev: true @@ -7321,9 +7332,9 @@ packages: '@babel/core': 7.23.6 '@babel/preset-env': 7.23.6(@babel/core@7.23.6) '@babel/runtime': 7.23.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.12.0) - '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.12.0) - '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.12.0) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.6)(@rollup/wasm-node@4.12.1) + '@rollup/plugin-node-resolve': 11.2.1(@rollup/wasm-node@4.12.1) + '@rollup/plugin-replace': 2.4.2(@rollup/wasm-node@4.12.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -7332,8 +7343,8 @@ packages: glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: /@rollup/wasm-node@4.12.0 - rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.12.0) + rollup: /@rollup/wasm-node@4.12.1 + rollup-plugin-terser: 7.0.2(@rollup/wasm-node@4.12.1) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 diff --git a/src/assets/locales/cs.json b/src/assets/locales/cs.json index 708b35ed..86ff372e 100644 --- a/src/assets/locales/cs.json +++ b/src/assets/locales/cs.json @@ -57,6 +57,8 @@ }, "host": "Připojujete se k <0>{{hostname}} - potvrďte, že mu věříte před vytvořením účtu", "no": "Zpět", + "noHost": "Server nebyl nakonfigurován, tudíž si nemůžete vytvořit účet", + "noHostTitle": "Server není nakonfigurován!", "title": "Věříte tomuto serveru?", "yes": "Věřím tomuto serveru" }, @@ -118,22 +120,33 @@ "noResults": "Nemohli jsme nic najít!", "placeholder": { "default": "Co si přejete sledovat?", - "extra": [] + "extra": [ + "Co chcete objevit?", + null, + "Jaký je váš oblíbený film?", + "Jaký je tvůj oblíbený seriál?" + ] }, "sectionTitle": "Výsledky vyhledávání" }, "titles": { "day": { "default": "Na co byste se chtěli dnes odpoledne dívat?", - "extra": ["Chceš zažít dobrodružství? Jurský Park je pro tebe."] + "extra": [ + "Chceš zažít dobrodružství? Jurský Park je pro tebe." + ] }, "morning": { "default": "Na co byste se chtěli dnes ráno dívat?", - "extra": ["Slyšel jsem, že Před úsvitem je super."] + "extra": [ + "Slyšel jsem, že Před úsvitem je super." + ] }, "night": { "default": "Na co byste se chtěli dnes večer dívat?", - "extra": ["Unaven? Slyšel jsem, že Vymítač ďábla je super."] + "extra": [ + "Unaven? Slyšel jsem, že Vymítač ďábla je super." + ] } } }, @@ -173,9 +186,11 @@ "extension": { "back": "Zpět", "explainer": "Pomocí rozšíření prohlížeče můžete získat nejlepší streamy, které nabízíme. S pouhou instalací.", + "explainerIos": "Bohužel rozšíření není podporováno na iOS. Stiskněte Zpět pro výběr jiné možnosti.", "extensionHelp": "Pokud jste rozšíření nainstalovali, ale nebylo zjištěno. Otevřete rozšíření pomocí nabídky rozšíření ve vašem prohlížeči a postupujte podle pokynů na obrazovce.", "linkChrome": "Instalovat rozšíření pro Chrome", "linkFirefox": "Instalovat rozšíření pro Firefox", + "notDetectingAction": "Obnovit stránku", "status": { "disallowed": "Rozšíření není pro tuto stránku povoleno", "disallowedAction": "Povolit rozšíření", diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json index 984f8d32..b39cc412 100644 --- a/src/assets/locales/de.json +++ b/src/assets/locales/de.json @@ -57,6 +57,8 @@ }, "host": "Du verbindest dich mit <0>{{hostname}} - stelle sicher das du dem Server vertraust, bevor du ein Konto erstellst", "no": "Zurück", + "noHost": "Da der Server nicht eingerichtet wurde, kannst du keinen Account erstellen", + "noHostTitle": "Server nicht eingerichtet!", "title": "Vertraust du diesem Server?", "yes": "Ich vertraue diesem Server" }, @@ -118,7 +120,12 @@ "noResults": "Wir haben nichts gefunden!", "placeholder": { "default": "Was möchtest du schauen?", - "extra": [] + "extra": [ + "Was möchtest du entdecken?", + "Was ist auf deiner Merkliste?", + "Was ist dein Lieblingsfilm?", + "Was ist deine Lieblingsserie?" + ] }, "sectionTitle": "Suchergebnisse" }, @@ -241,6 +248,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS-Playlist Link kopieren", "disclaimer": "Videos werden direkt vom Provider heruntergeladen. sudo-flix hat keinen Einfluss darauf, wie Downloads bereitgestellt werden.", "downloadSubtitle": "Aktuelle Untertitel herunterladen", "downloadVideo": "Video herunterladen", @@ -524,6 +532,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Hintergrundunschärfe", "backgroundLabel": "Hintergrunddeckkraft", "colorLabel": "Farbe", "previewQuote": "Das Gras wächst nicht schneller, wenn man daran zieht.", diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index 98eec9b3..e6d6f3c1 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "تاری پس زمینه", "backgroundLabel": "شفافیت پس‌زمینه", "colorLabel": "رنگ", "previewQuote": "نباید بترسم، ترس قاتل ذهن است.", diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json index 86d93015..beab2c57 100644 --- a/src/assets/locales/fr.json +++ b/src/assets/locales/fr.json @@ -58,6 +58,8 @@ }, "host": "Vous êtes en train de vous connecter à <0>{{hostname}} - veuillez confirmer que vous lui faites confiance avant de créer un compte", "no": "Retour", + "noHost": "Le serveur n'a pas été configuré, vous ne pouvez donc pas créer de compte", + "noHostTitle": "Serveur non configuré !", "title": "Avez-vous confiance en ce serveur ?", "yes": "Je fais confiance à ce serveur" }, @@ -118,7 +120,13 @@ "loading": "Chargement...", "noResults": "Nous n'avons rien trouvé !", "placeholder": { - "default": "Que voulez-vous voir ?" + "default": "Que voulez-vous voir ?", + "extra": [ + "Que voulez-vous explorer ?", + "Que y a-t-il dans votre liste de lecture?", + "Quel est votre film préféré ?", + "Quelle est votre série préférée ?" + ] }, "sectionTitle": "Résultats de la recherche" }, @@ -529,6 +537,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Flou d'arrière-plan", "backgroundLabel": "Opacité du fond", "colorLabel": "Couleur", "previewQuote": "Plus l'obscurité est profonde, plus la lumière brille.", diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index 2a591c1c..c4baa6a6 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Sfocatura di sfondo", "backgroundLabel": "Opacità di sfondo", "colorLabel": "Colore", "previewQuote": "Cantami o Diva del pelide Achille l'ira funesta.", diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index 9d7b6e0f..1ef3c2ba 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Achtergrondvervaging", "backgroundLabel": "Achtergrond dekking", "colorLabel": "Kleur", "previewQuote": "Ik mag niet bang zijn. Angst doodt de geest.", diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json index 176d838b..2d0bea4a 100644 --- a/src/assets/locales/ru.json +++ b/src/assets/locales/ru.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Размытие фона", "backgroundLabel": "Прозрачность фона", "colorLabel": "Цвет", "previewQuote": "Я не должен бояться. Страх убивает разум.", diff --git a/src/assets/locales/sl.json b/src/assets/locales/sl.json index 144a37ae..0ae32cbb 100644 --- a/src/assets/locales/sl.json +++ b/src/assets/locales/sl.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Zameglitev ozadja", "backgroundLabel": "Motnost ozadja", "colorLabel": "Barva", "previewQuote": "Ne smem se bati. Strah je ubijalec misli.", diff --git a/src/assets/locales/uk.json b/src/assets/locales/uk.json index 22a72dbd..fa87747d 100644 --- a/src/assets/locales/uk.json +++ b/src/assets/locales/uk.json @@ -57,6 +57,8 @@ }, "host": "Ви під’єднуєтеся до <0>{{hostname}} – підтвердьте, що довіряєте йому, перш ніж створювати обліковий запис", "no": "Повернутися назад", + "noHost": "Сервер не був налаштований, тому ви не можете створити обліковий запис", + "noHostTitle": "Сервер не налаштований!", "title": "Чи довіряєте ви цьому серверу?", "yes": "Я довіряю цьому серверу" }, @@ -118,7 +120,12 @@ "noResults": "Ми не змогли знайти нічого!", "placeholder": { "default": "Що ви хочете подивитися?", - "extra": [] + "extra": [ + "Що ви бажаєте дослідити?", + "Що у вашому списку спостереження?", + "Який ваш улюблений фільм?", + "Який ваш улюблений серіал?" + ] }, "sectionTitle": "Результати пошуку" }, @@ -241,6 +248,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Копіювати посилання на плейлист HLS", "disclaimer": "Завантаження беруться безпосередньо від провайдера. У sudo-flix немає контролю над тим, як надаються завантаження.", "downloadSubtitle": "Завантажити поточні субтитри", "downloadVideo": "Завантажити відео", @@ -524,6 +532,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "Розмиття фону", "backgroundLabel": "Прозорість фону", "colorLabel": "Колір", "previewQuote": "Я не повинен боятися. Страх вбиває розум.", diff --git a/src/assets/locales/zh.json b/src/assets/locales/zh.json index 5c6fbd1a..de8fdd05 100644 --- a/src/assets/locales/zh.json +++ b/src/assets/locales/zh.json @@ -536,6 +536,7 @@ } }, "subtitles": { + "backgroundBlurLabel": "背景模糊", "backgroundLabel": "背景不透明度", "colorLabel": "颜色", "previewQuote": "我不能害怕。恐惧是心灵的杀手。", diff --git a/src/components/player/atoms/settings/CaptionSettingsView.tsx b/src/components/player/atoms/settings/CaptionSettingsView.tsx index 2e78ed7a..d6b39fd5 100644 --- a/src/components/player/atoms/settings/CaptionSettingsView.tsx +++ b/src/components/player/atoms/settings/CaptionSettingsView.tsx @@ -231,7 +231,7 @@ export function CaptionSettingsView({ id }: { id: string }) { router.navigate("/captions")}> {t("player.menus.subtitles.settings.backlink")} - + merge({}, current, persisted), }, ), ); diff --git a/src/stores/subtitles/index.ts b/src/stores/subtitles/index.ts index 31e59836..90a3fd8c 100644 --- a/src/stores/subtitles/index.ts +++ b/src/stores/subtitles/index.ts @@ -1,3 +1,4 @@ +import merge from "lodash.merge"; import { create } from "zustand"; import { persist } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; @@ -67,13 +68,19 @@ export const useSubtitleStore = create( updateStyling(newStyling) { set((s) => { if (newStyling.backgroundOpacity !== undefined) - s.styling.backgroundOpacity = newStyling.backgroundOpacity; + s.styling.backgroundOpacity = Math.min( + 1, + Math.max(0, newStyling.backgroundOpacity), + ); if (newStyling.backgroundBlur !== undefined) - s.styling.backgroundBlur = newStyling.backgroundBlur; + s.styling.backgroundBlur = Math.min( + 1, + Math.max(0, newStyling.backgroundBlur), + ); if (newStyling.color !== undefined) s.styling.color = newStyling.color.toLowerCase(); if (newStyling.size !== undefined) - s.styling.size = Math.min(2, Math.max(0.01, newStyling.size)); + s.styling.size = Math.min(10, Math.max(0.01, newStyling.size)); }); }, setLanguage(lang) { @@ -107,6 +114,7 @@ export const useSubtitleStore = create( })), { name: "__MW::subtitles", + merge: (persisted, current) => merge({}, current, persisted), }, ), );