From ba64be7fa33b25c86445a6f3b24e74b3a5672f8b Mon Sep 17 00:00:00 2001 From: s8n Date: Fri, 8 May 2026 03:59:19 +0100 Subject: [PATCH] snapshot: pre-ElegantFin migration baseline Captures the full Cineplex-themed deploy state for rollback before swapping the active CSS theme to ElegantFin with ARRFLIX recolor. - branding.json: full /System/Configuration/branding payload (CustomCss + LoginDisclaimer + SplashscreenEnabled) - index.html: bind-mounted Jellyfin web shim from nullstone - docker-compose.yml: jellyfin compose file from nullstone - users.json + libraries.json: reference state (not for direct restore) - displayprefs-.json x5: per-user DisplayPreferences - RESTORE.md: three concrete rollback commands --- .../2026-05-08-pre-elegantfin/RESTORE.md | 119 ++++++++++++++++++ .../2026-05-08-pre-elegantfin/branding.json | 1 + ...refs-2be0f0d3fe3a45dc9298138a15a01925.json | 1 + ...refs-571decc67cdc4ea683b4c936b0a31ff8.json | 1 + ...refs-82dd8542915740c8ae799b6723542c63.json | 1 + ...refs-a4cbcdf95bb34888885af6fbf5c340d1.json | 1 + ...refs-d787fbfc373a44119a247e7406b2721e.json | 1 + .../docker-compose.yml | 42 +++++++ .../2026-05-08-pre-elegantfin/index.html | 94 ++++++++++++++ .../2026-05-08-pre-elegantfin/libraries.json | 1 + .../2026-05-08-pre-elegantfin/users.json | 1 + 11 files changed, 263 insertions(+) create mode 100644 snapshots/2026-05-08-pre-elegantfin/RESTORE.md create mode 100644 snapshots/2026-05-08-pre-elegantfin/branding.json create mode 100644 snapshots/2026-05-08-pre-elegantfin/displayprefs-2be0f0d3fe3a45dc9298138a15a01925.json create mode 100644 snapshots/2026-05-08-pre-elegantfin/displayprefs-571decc67cdc4ea683b4c936b0a31ff8.json create mode 100644 snapshots/2026-05-08-pre-elegantfin/displayprefs-82dd8542915740c8ae799b6723542c63.json create mode 100644 snapshots/2026-05-08-pre-elegantfin/displayprefs-a4cbcdf95bb34888885af6fbf5c340d1.json create mode 100644 snapshots/2026-05-08-pre-elegantfin/displayprefs-d787fbfc373a44119a247e7406b2721e.json create mode 100644 snapshots/2026-05-08-pre-elegantfin/docker-compose.yml create mode 100644 snapshots/2026-05-08-pre-elegantfin/index.html create mode 100644 snapshots/2026-05-08-pre-elegantfin/libraries.json create mode 100644 snapshots/2026-05-08-pre-elegantfin/users.json diff --git a/snapshots/2026-05-08-pre-elegantfin/RESTORE.md b/snapshots/2026-05-08-pre-elegantfin/RESTORE.md new file mode 100644 index 0000000..25eb5f3 --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/RESTORE.md @@ -0,0 +1,119 @@ +# Rollback — 2026-05-08 pre-ElegantFin + +Snapshot captured immediately before the Cineplex → ElegantFin theme migration. +Restore one or all of the artefacts below to revert to the Cineplex-themed +ARRFLIX deploy as of 2026-05-08 03:58 UTC. + +Tag: `snapshot-2026-05-08-pre-elegantfin` +Remote: `git.s8n.ru/s8n/ARRFLIX` + +--- + +## Files in this snapshot + +| File | Source | Purpose | +|------|--------|---------| +| `branding.json` | `GET /System/Configuration/branding` | CustomCss + LoginDisclaimer + SplashscreenEnabled | +| `index.html` | `nullstone:/opt/docker/jellyfin/web-overrides/index.html` | Bind-mounted Jellyfin web shim (critical-path CSS, branding, runtime shim include) | +| `docker-compose.yml` | `nullstone:/opt/docker/jellyfin/docker-compose.yml` | Compose file driving the jellyfin container | +| `users.json` | `GET /Users` | Full user list with policies + configurations | +| `libraries.json` | `GET /Library/VirtualFolders` | Library definitions (paths, types, options) | +| `displayprefs-.json` × 5 | `GET /DisplayPreferences/usersettings?userId=&client=emby` | Per-user UI preferences (home sections, theme, etc.) | + +User IDs captured: +- `571decc67cdc4ea683b4c936b0a31ff8` — 5 +- `82dd8542915740c8ae799b6723542c63` — guest +- `a4cbcdf95bb34888885af6fbf5c340d1` — house +- `d787fbfc373a44119a247e7406b2721e` — marco +- `2be0f0d3fe3a45dc9298138a15a01925` — s8n + +--- + +## Rollback — three concrete commands + +```bash +SNAP=/tmp/ARRFLIX/snapshots/2026-05-08-pre-elegantfin +TOKEN="*redacted*" +BASE="https://arrflix.s8n.ru" +``` + +### 1. Restore CustomCss + LoginDisclaimer (branding) + +```bash +curl -ksX POST "$BASE/System/Configuration/branding" \ + -H "Authorization: MediaBrowser Token=$TOKEN" \ + -H "Content-Type: application/json" \ + --data-binary @$SNAP/branding.json +# Expected: HTTP 204 +``` + +### 2. Restore the bind-mounted index.html on nullstone + +```bash +scp $SNAP/index.html user@nullstone:/opt/docker/jellyfin/web-overrides/index.html +# No restart needed — Traefik serves the file directly via the bind-mount. +``` + +### 3. Restore per-user DisplayPreferences + +```bash +for uid in 571decc67cdc4ea683b4c936b0a31ff8 \ + 82dd8542915740c8ae799b6723542c63 \ + a4cbcdf95bb34888885af6fbf5c340d1 \ + d787fbfc373a44119a247e7406b2721e \ + 2be0f0d3fe3a45dc9298138a15a01925; do + curl -ksX POST "$BASE/DisplayPreferences/usersettings?userId=$uid&client=emby" \ + -H "Authorization: MediaBrowser Token=$TOKEN" \ + -H "Content-Type: application/json" \ + --data-binary @$SNAP/displayprefs-$uid.json +done +# Expected: HTTP 204 each +``` + +--- + +## One-shot rollback (all three at once) + +```bash +SNAP=/tmp/ARRFLIX/snapshots/2026-05-08-pre-elegantfin +TOKEN="*redacted*" +BASE="https://arrflix.s8n.ru" + +# 1. branding +curl -ksX POST "$BASE/System/Configuration/branding" \ + -H "Authorization: MediaBrowser Token=$TOKEN" \ + -H "Content-Type: application/json" \ + --data-binary @$SNAP/branding.json + +# 2. index.html +scp $SNAP/index.html user@nullstone:/opt/docker/jellyfin/web-overrides/index.html + +# 3. per-user displayprefs +for uid in 571decc67cdc4ea683b4c936b0a31ff8 82dd8542915740c8ae799b6723542c63 \ + a4cbcdf95bb34888885af6fbf5c340d1 d787fbfc373a44119a247e7406b2721e \ + 2be0f0d3fe3a45dc9298138a15a01925; do + curl -ksX POST "$BASE/DisplayPreferences/usersettings?userId=$uid&client=emby" \ + -H "Authorization: MediaBrowser Token=$TOKEN" \ + -H "Content-Type: application/json" \ + --data-binary @$SNAP/displayprefs-$uid.json +done +``` + +--- + +## Reference (read-only — for diffing, not posting back) + +- `users.json` — sanity-check that policies/permissions match before/after a future user-mgmt change. The User API uses `/Users/{id}/Policy` and `/Users/{id}/Configuration` endpoints, NOT a bulk POST. +- `libraries.json` — sanity-check that VirtualFolders are still intact. Library mutations go through `/Library/VirtualFolders` add/remove endpoints, not a single POST. +- `docker-compose.yml` — reference only. If the compose file changes, restore by hand and `docker compose up -d` on nullstone. + +--- + +## What this snapshot does NOT cover + +- Jellyfin SQLite databases (`library.db`, `users.db`, etc.) — full data is preserved by Restic backups, not this snapshot. +- Plugins / plugin config — not part of the CSS/branding migration scope. +- Media files on disk — never touched by theme work. + +If a recovery requires DB-level restore, fall back to the Restic snapshot job +documented in `SYSTEM.md` rather than this CSS-scoped rollback. diff --git a/snapshots/2026-05-08-pre-elegantfin/branding.json b/snapshots/2026-05-08-pre-elegantfin/branding.json new file mode 100644 index 0000000..2c04405 --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/branding.json @@ -0,0 +1 @@ +{"LoginDisclaimer":"Welcome to ARRFLIX - Private invite only service","CustomCss":"/* Cineplex v1.0.6 \u2014 Netflix-faithful theme by MRunkehl, pinned tag (immutable on jsDelivr) */\n/* Compat: Jellyfin 10.10.7\u002B ; we run 10.10.3 \u2014 verified rendering 2026-05-08 */\n@import url(\u0022https://cdn.jsdelivr.net/gh/MRunkehl/cineplex@v1.0.6/cineplex.css\u0022);\n\n/* Hide Cast \u0026 Crew \u002B Guest Stars sections globally (preserved 2026-05-08) */\n#castCollapsible, #guestCastCollapsible { display: none !important; }\n\n\n/* ARRFLIX logo override (replace Cineplex branding) \u2014 2026-05-08 */\n.adminDrawerLogo img {\n content: url(\u0022data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAABVCAYAAACoyhPQAAAgAElEQVR4Ae1dC7AlR1m\u002BeWgUEBFMIsnunZ7dS5I903OTuJaAYHHxUfgWLCKoKUXKJ1UgFgoiKoqKBCnwrRVeIpZUBUFQISiGhKigsBCSLLt7p\u002BfuJiQkIS\u002ByeZDdzd5z3a\u002Bnvzl9ZmdO/3POnLthna262/M43f3/X/\u002Bvfs7CQv\u002BvR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BH4KsagY2FhVPAwNq2nd9olP6yUXpjir\u002B7zdLS41EOy2sChe/3nnvBk4zS901RV5W\u002BoVH6qFH6nixO/iNX\u002BgVmq96\u002Ba\u002BfOr7H0rKycvrGycnodPaTlgBp8i1Ea5VTLFt/nRX6UcShTyQETJZcblTxn3/nnfwPrNktLZ7BOPrM0ujbAb41KVmehQ5I3U/pB4E8a9sf67FylwDDE70Or55z3zT7NLEOakv98\u002B/JZwEpQ51G0j6vzVKR71QXKKH1QkBft8XY5bZecht\u002BCtizSj4TKzyP9PGnZnfyO4G0sLJxqlF4PEVj3Hg19xcKCZZTlNRHnv89V\u002BpW68mZ9liv9kIn0W/fHOyLSQeXlPVLS8rsF7yFBne59pG8xKn0VjCHqBB2sl7T497nSN83KvyD/EdaNVMo/BJj5fJr5TJL6\u002BaTyxjygk3VkSr9fwCfa7MuQbeRjyjKqKd/nKn2uoOx1tmm1nLndk8CNhUtOExDYKLDIDyJZXhPBBB6/M1CqsDVvrDOUN1P6tlylv0haaFB4T1quXlk5PVTWrO9zlV67b\u002Bv556Du3YPB17Ju3PvXRun9s9YlyH/IrxO4CPKgHQ4zH1NiKU2Zz7Z/HPZeiHgoU8h79UIRJe2JdjxZGA0N92292OJOGa2jlXTBmOaC6CZX\u002BoaqPNWV2\u002BkzAmEWBwNhg9Uqz9q2NAVhLK\u002BJSILiBGSuyur4OZSr5GdADxqa9TtabRcAz2fhvUXe/BNbtnw96vY9vU\u002BTDaHnaMBAa1YoXemlpIY6U/oIBdSnuamt654zn2t/Seg99OukfKFLkSl9jxD7v6qjxX9GRUb7SDz\u002BapR\u002Bv59/U6\u002BNSt8sZLxWWU2U/LmEYDYWQJ\u002B3Z/X4uQ/9MtBHy4xr0rKJyrphIv1p4uQLIZ9thrKir0ihL3CQRVVQVuYjdqRbmjKfMxAiZaUijfIW4yzHwvLXeG1cL5eF4bsfyl3wOgqlfZrJVxalPxksM9KP3HbOzsf4\u002Bed\u002B7TF/aq709UEiJ1j8TOk97FOw3DoG\u002BG6TlXXDqPRK0uPRsNmeFQI1NCp9FmipE8LNCIOdZ7W8g44WxupwnYEhrpKU2LfxrDSwzMv7A0p9ncQLAvN8u97qY\u002B7TynKh0BL8M5X8D3Hwy5nrNYksgEsko2vN1ivSDxBElltHPN\u002B5xtqMMNjSjEGwz28ZPBE0EWjS0kJYm/mfYMiqRjBTeh8EDbSABtKB\u002B83yrAzHUaeU/8KzlmMTpbKjDOk/8uqMtcizVtuLZVjlirSp4lt7H6WXezSO0U6jecuWp4tC4L2R/g6URbq8cud3SaaLTrWd/phFGNfZD2O5dZTzHdIWYTCG\u002BI9ggKOYGrHXGLluNd2yqpIXgiafBnsvHGCCwkPRcqX3GaX34jpTen\u002Bu9G2OPil\u002B6xhkcrSc6tMjsexOGPcYpa/LlL6efybSN5Z/Kt1tlP68\u002B9sLejEtBNpzpf\u002BJYR9okCor8KeAkmbkb/OP\u002BdooK5WJeVEf6RCO3G6YWD8AZURen3f/PlfpL9Qq\u002BrghPswQmDS04X/q35JoB5xU0Bp/R\u002BKZ1hFGwBEy2ymWcSDqyh6ubdvxFAj39WcvPxbWlGWsxsvfaZS\u002BWQCwLTdX\u002BlOcc0UZLKeFsN5axxOerUb6eVBcKS2YK0Q\u002B4EA6cC/2rEsXn4nfz/JvhMXm91khI25\u002BvK7N/WdDtA/49HEaKbClHYbcz1N3XRsKs0zrVWNMs00uJ4/1R4k58/J\u002BrimVdV\u002B8fH6ISMn7PEqeDYLZd60jngw6AyEKg\u002BvK4bMbY302FkRI6MNE\u002BgYXS0yjrJG\u002By067rKycjsbFHwwIBWd/gaNsrjpOfo48eJgg2hAp/AE1uAhTTrDypKUuRbiLP4Td\u002BAP9EH7QzPZ3ilMn4GPPuh1gsgOMojCY\u002BBIn4MZrR/s1wvZ/BzFfcAtRWDZwlPR/R7MeRXfAK29zLnOVXiZkdqzxjssT63d7FI/1C/icILdRVioYGgb5i79LTmPYvab0rxxHS72FPIQyQAvLKa5lnsUofadHf8kfLT/KMkrfLqSlnE5gmRAgqbLuHU2VlXQQY2nKetsoKw0x80rr4u\u002BYD0oyi2dFecQ937qshZg/yL46DRXpySP9ilAZWMQDg4i6mZ98zTUlkQDfqPSzkwjNlV4XLkdb85WhjgHW20pZRwsuxgSTjYV6JtHvvTtKSwo6SEuLRRG1yspyCjrSq7z6Go1brpIPM5\u002BfSpU1376sUR/z1mEdesa8wFFC84nyrGxn0ku\u002BSlkrxhwkUdpwdcuF5xa42cjCypMbVb5DgMEVrLtKC5/PJWVlzsKF1gRjWaBktPgro35QMRdWJX5Ur3yetalMlgUPKwAairPuN/wU\u002Be8MeZZM6T8V0nINsSEdSE\u002BEsjoZaDQs5OdEjQb7BpaYubQ03kbpd5DOSWmukneyDBhpXGNdu2Cwcri2bbCI35MeljP3lAKCPowJL/vCelWMLIYadEhGKNRVRlivC70k1nCDoDIvy\u002BS989KSkeF10oe8o/yzhcGkB2kWp78twAk4HqesNj82AYRx3tiztTvP2iYMLr2Z6/P5vEuuibnz5qI\u002Bq29gq3XwHTYYCBQOq7cerC6QyKL09wWY389R4E0NgcEwK3SgBZQw/aCJ9VsFDG1wlwkbtQouG6uNsvoK5pfHshwPUyurDANrqGrDYJ\u002BmLE5mUdZTpKPBXYbBztgFZMDyj7XBXBRfejWf/9A12wxtKu2zNrU/6irpQXQV67sEMjrkajbkdyHw3aF8mdJ/Q97IA\u002B/nnlKZsJ0sRKiJ00uMWn5a8HfwCLH\u002BcRDfxBCfOwGRedaaoXu/DtfwUysrwmwRbw0DTH5jtfCsHysFzfNSUmU1ixcmPgY\u002BDdJrtoUznEFlRRhMuWFeaV38HfO5OkWelQOJzMuymPJ5Llx\u002BmKnkncxzw2L6TQKPXCo4PTnr3tTUqPR3QoIK6yPtF\u002Bax/lcCwdRniM\u002BcgomUtcmysqwWnvUowUZe5ne0BIW1aTTY5y\u002BLk98K4WnfR3bk3Hon0tFmNBgjoKjXy\u002BuTIbpmXmlkUShrVyuYWnhW17ckvVXm2KYIUzEYGsQ/1g\u002Bg\u002B4dyctkYw90nZBQYBJJppJnS/xtijuAILBAE/tYm5Rqv2zZWJ8rqvLTEsz7sewbiIBVWKCv74sxLbDhvZ5R\u002BfQhPvM/j5OeZ1yvrq2CAqZswuI1npTJ6OBE6m/K5HX9Rek2CP/eiSgZO8yh5HStkXbyfe8oKnZBOjNf9DcdG6YcFQByaFLaw7hMUBt/t1d\u002BZZ2WZaDij9EcEGG3scRvjgQPzI330jwZ3o6xO9kRhcEhZgTu7FCbWl0rwNyp5s1m6\u002BEyBAyo3mZOOuSuoXwG9AyxR6PiKXOl7mRdeUwDE0FPWcs8kyxgJ5uyelV7SNbwkjN2DkB60gA7S0iJ/rWdlOdYACZasWQy9LVvMD7qkfdZuB5hsWwTx63Ke9YoWA0xUEh8nyhNTRnNu54zECNxnYv33Anm\u002BlSEw9YZ1bkpaWqFiS9DE8DFT\u002BnMkKov0RwXMbfCcHioT8yMl4HgnXBu8UddYKIdGIY8G3yWh65jheZlPA2mZts9qveLKyul3nL38WJaL7WcCWu6lAIAG0oEypMqaqcFFwBDlVP92nbPzMfhDHw7p1W7MoSpsrLeFsepsIT9oF48GB/qsxL5IreH5jKANNiTyl8X6pV75U42AI//U/6hE7miMyRbV21Sex/qlEhCM0r/cRBwFxCmIqM9KpYRyQOBAP5cg4p1R\u002BgYBXesH1EVPAF20wqRFLKyxvssO9S8tnQEl8IXfjijH6XsFdADvVxd0FAtHSAdSaRi82x0i1oRz0/Mxmr31sUK6O5u6aaOsdca6jj/KdbaYfo\u002BQn8myr/RRGlXSUFfvvJ9ZC2Gi5CVhppafRmJcjB9iEO\u002Bv8QWQ\u002BZF6z8UnRcBDQFEZwvrlmVj/oaDfAZqu4yCQR4PFQayskb7FrxtnKh3jdcXE\u002Bk1G6SyMpZ2rfJj7aqtGA2VLPatROjd2G5zdCgdj9TnwaJTelSn9KWyQNkr/t4n1fxmVXrWq0uf6tOOaOIj573SLnPWAknC1dtdNlRfcI7RG6kJhSYQTkOVklTJHrOrqndszVooUjRgSMBILgtDHdUduBpjUX6oTRJTh1S/eIueD4Ub8VjBJbYr\u002B4cQwHvyhX766OHhmUf9otwRpka4NdtMCt5tI3\u002BXO/7m/7T7WXCWvBB02Oig928jDSj1rqN1q3mMPK8M4m/LeRTmhNsX7zjyrMxCdKiv5Ab5G6X\u002BrwUDCY/mbVaVfUMhM/VEweDfXf2QIDeQ2TZfE1TA3ZLgJoqzFCi9NxJKuI1Aq5GF9ZIr38JQtNp/fjc3DGI1G2aK5tNGSvSFWX3n1l4NeI1pkAyw1\u002BEzCbvxdrB/BumHS4YdVpAPvWnjW8fJH/NY\u002Bx/w362Z9o1TGfzHA1M086zyUFfzRSZho\u002BVtnaS8YeMqw31bEcFNS9lmchwodslxOw1ggipU\u002BoUX/EJYhGYVS\u002BoxVBETUZ50B9HWM\u002BLF\u002Bbggo70vPJhPWKemA5791TelfYr1c68x7YoL7eSmrifW/VOtjva7/WKvkPs8nSlk5ZkHZJR91KfutdmxBNtXYxPcuOiriVFffXJ9ReVxcPzGEhOelpQJRyIvzUv0GbLq\u002BxW1FInhkiow7AZmbsoLOzFMQ8EsamJIWZ\u002BWbGm3W5wczNXgRcUD/uyp0pAPpvMLgbIJnbcF/Z2Gwa39RGNxGWYEh8cyUfk\u002BTfIae74/190JO2G6UmU1NqXzFpxqCu2jKgSISWXwWIpgPR27\u002BJvP4KYF063Hnpqx2cGWr3s66UR/rLp85z9pCWKdTXNt1SD7AkUVEHT4t/vW8PGsXylp41s1fFMEorWrk2I7VlB4Rg3/CMZZqu5ZHtZ6wEBhMlZ41Tn44ZF2MSn\u002BDQJT5VPqscD6rzJ9kHl8YeQ2j0aLPWgVTev\u002BQiZO/IA9V4EnL3JWV/clI30ga/JCcdCCdl2c1KvkgcfDrw7MW/Hc2z\u002BrqFHnWNspK3sCXUfqfhbI6Jk8YPPSwGuvG8fnc0wojV4QYOaAusod6IRSgR3bh8xhzdeWAYQqkXy\u002BvN0lZQSf6rX9JcP2wpqRFvusmyHcdFv6zXCXXkpY6YzYvz2qU/jg9Tsl3yz47PCunR1gGeZGmzOciqzkoazEAhshRuEDl\u002BDZFJFSuMBvNHkh57OR3JVCFVwsueOa0TaGsRfiDZ5LRWLuM0THshy8VGuYZBvuNcHQtSn8AINLoFNecMpnrAJNPB66HuTt3lrQQE9AkVdZMJa/MIv2DJh483345L9aXZir9WWwQKObPk5cblbzqmKF4rVHJH2WuD\u002BYLEutt41nraPbLDF2zznkpK40x\u002Bpy\u002BkWx9vagvBS80qCG\u002BOn9PpUFYYbBjnuFZfbqOZWokmES7vMEF/egrcGCAALqy/IUIm6Ws2Gd7C/uMpcDQs8g968G1SL8Yn/rDebU4fhSLDbJIvzFTGnOuVcVsur/ap8G/lobBN0U7njyNgLAd/bZwUU4TreXzR/toMOXb8YNFIiXtba9xJjTll\u002B0zDd5T52FD4YQ3wbGLD/l9BRJcWOH0ixLm17ZdeJ4TijLuZzkOUKmyfiRX\u002Bj15lF6OucpMpZflkX6jsZ9TFDfIkNuiqt7BWXlJw95eBz54ytTyU430dHilD3uCMNWuG6wNRr0I1zZgfLHO2/0h\u002BsEf2hkGCteoj9iTB96fCGW1mAvm7BGJMHynMpL\u002BagrZxLObiw3lkhC7sc1xQCCOmUV5LLda31zvKaS2UcNW5ybOB6JR2bAAzCj9MYmyYikgGWL\u002BMi28mURZhyyjmuKkulzpvxbRgpVMsf51V8bYCh5xGBgld1nlQDfCKQkVAeXu2bbjKQIjaAWE4wHAk5igDGkY3Onmc3lkcZgy5NNcbZdJ98znMJcoVDlnH1DWU/gea9OlMjHxd1H6U\u002BCFTm4SX52/I9A4qHgikdgcrfSHSAAAJsh4lsf610L53ftdZJT5mbrGkijrxp2DweNgiTFogHnK3YPB4xjSQmlylYoOGTNK38R8Pk/wOkJ\u002BGrbIjQYhjgnKl0RlRclLfHx5LVbWE3AUabHcsJsVTBZzoWdlFEJlJFZ\u002BSjlDNJjJtnI2elW2X6b0XkaXlFu/zrld\u002B5XZEDLgWbnixs/Hvie8AhkKpPcSaJZDwF3oJVLWujAIjQMFBmBrkf6xAB1smK/49JAmRwt/MynFgWk2pGde1O9fZ5H\u002BTxEtUVJ\u002BKMnPL\u002B2zdulZW/DfmWedJgwm9nVKwlDVLC1vkQyASrbHYQsfIifUx/Lr6u78GQUCypJH\u002BtMhgcq3L58FIuiN/evCmwk\u002BCjU2BF4IOZXVWlbhl8\u002BpYMxLcAigK2uSkvHdEfIDPIhJi/zB0w2FZ/rgE5RXkQ/SgVSqrF0emOaiHGI0Ke1MWS3mQs/qebdy7IPYFXJZblBYkH1nODloItlpnSZefn5Rxyh68uueyzUF3QnmxKNcoMgIN0EIUvwhFMV\u002BUACHDrzkhH6MCGPwA\u002BXQK1foEHlWNhbzEiBaWnhe4Ta5sS/dUUlaCGujsrKsTOzl092k3\u002Bfr0R4Gsx3JL9tCmjKfk8NWfVbiVa2LBhhe0Ch9X9ARRfrPcBypUGZuYGRH2qv1d35PRh1Doa9uHQ0RkCkdVHgL2uJggLJYPwXTbUsTKSs8OcpgXtLGe1eWqOEZOgN4gt9GWVkn85IW3rc4stUwD8tEWSdCWW1IGugWOQWY2bOS1249a\u002BH13FjMxPXuVkGXlrcAa6M0vjQxKZLAstnN331Di\u002BiUdSJDudL34ZOEqyq9oDgzWL/aROnl2CPovpD\u002BBaFVAhCv9wWajeUUpBNldX2ukAGyjQIhAT1QFCqL88yTG61o1No\u002Bq\u002BPPjjDvW0yeERQAlBVpw83wxAT0yMPgQWfnBjsvJ\u002BH/MNqN\u002BLFd26TktY2y0ljT4Pv1sQ3xLFP6/QLsD3JKJpf9fiNXg\u002B9D\u002BeTdr38u16NQ4aInCBjCaPBEhZaU4X7zGdYNYMcaS9hnZRhcbaxKWSJlrZuOQvlCfhrDYCoeVieJyqpR1kLgZJ/P6PLAtDbKSqPvK0kbga20mSgamqyshVeFE8plnrLc2wwMJW1lv\u002Bvb8HG0NryLf0uQ7NK0kOvv9v29jPlBA\u002BlwAiLyrCFldV5apKyoF6D5hqNLZTVR\u002BnSJADjPatuPmIAmqWftUlkdfiLP2pWyWsyFA0wc96gaa9eOdtAJyykFuNsPc1Np3PrhoNxg5dbIYMx5oMm3giZKpId6SRov\u002BBt/jTDALgVTvihiYwRUMaJMsCtlBUFHY/p9VuZ/tCgr\u002BDoRytqmz8pQ0JcptockHcNcqKyy9rdnToXk8SAHTkEr5NEo/UmBkm9kavBU5CH/El6n\u002Bg2BdY2SS4jr8DfD0UKE0de2HS2h9ckF\u002BOUOiAZlLUaDg8rqr1cGJhScFsIaDINn8axo3BMxwNQiDD7CL72jTWHkkBcCTENMWWsSVGJu65xRWak4oEV0Flas30a62B1Cf1Qm68dPtbGsTlOGD7BQJrJnGYUsUKfv98XL54MhhFCkxQmIKAwOWVZXlkhZIWCgBUIzJjiy0H\u002BuygpBF3vWDr914/ALtnmu9MMSwUQ7A2esTYZy41xlKBTqYRhtoxmhsqI/inopO46GcoBQeAr/kHKIMRSOo\u002BDbrJJpSJz/xYEp8iDBovVvyCQAExIWbDiZNeKwePJ7JJq0uBFYkbI2NFY5lWMbHv0KgcJBYECLr6wuv4TnScpqWcylo8GxHQ22eWg0cPMo96xHjUrfkCn9skylLzI4wCBKn44NGzimlthaphr\u002Bo6C3UVYoPYqj7PjX1gHJjoE9iLOei7yXnEbMQYcQ82G\u002BZbCE/PTKuO78H62Im7aRCGWnv8E5tgSatDhr3kkY7MoSKSsaBwD7ytpy6mZsE4DXWPa5dIQRAsK8FByMKAsFZwNzisgfCjtZR13KvA6/1m3uZgyGzgEA/4fdKZT3ZErfZmJtjEo/i43vmFbhoJilW/YRb9A0rDPWVBh3PJFkVPkdxIB8UybxpQaJoc9V\u002Bg/VMnjfWUoFEX2Ltd47De1AEaZaIvvBWmxcxycKRJ8psB\u002B5df1O9jO69KzOuk6trF14Viqc\u002B\u002BR9UPCLw\u002BiKZXLM2yYM3tuhsrboswf5Cgh9Oedu20wYBle7QVQ2KAiOHgrUaRU\u002Bi/QO/J66gGvK4m3n7ZR9NT3SD\u002Bw\u002Bc/C4opzx8RM86\u002BQfmTMq\u002BdUQY/Yz7sXJgP9uIv1u7B01Knl5rpIXri0uf7eJBhdni\u002Bk2WDsAECrPvT\u002BCEBzM0CI6BRF51jrLirIo5M4zhI5VtYJW51lbKutxC/l9WiAAEkzssTdu8zv5QDlSz9rlQv5pPauET/83udJ/Ah7xr42yVtufoXQxsCTaW32Q8ucrKz0rys\u002BVFh2xy6\u002Bmw8A5VrpPCqsdPoHfqOQNIAgWBI1IoOooAmjClUxlKIMyUVYbZa3rs6AMCvm0I8vM31JZa8NgGkSpl8oi/QAxpdC0CYPNYncrmKQ0\u002B4o33XX6FvI8i7JSUW4994InifYPFx\u002ButlWznXDjX5tYv03Ik40OnOxYWSBPnaXwaO5zExNDmZui5biuUhAHq2Qb1oW0GB0TDZkjtD63WI9JZXVhcCee1QmbxDJ686yjQQYrOPXhfxWr2v2sfsO3UPxy/TU9BZRVPBrc4X7WzfKsWQeedUzB8I3VcLsNTbk\u002B/fgFDVT8FlHil0YDVXMKhZ1ABhcuY2M3hA\u002B/hxAVSjraguQEswgFi2V6IiXJI/2KGqEWKesohBkHhw3nQk/Rpm8eHAZvRo8mHWDKlS6PdWHd4An/eO8EX9R/LkMqt0cW5WCDvEAAN25yfTAucyyoaPc/aYYRFkZIVePV6n7aMBiy6DC2DgPXWNxglL4niFWkH2B06IfARIrPipBa9LnO8uPKVHSW1VnqiFkPMLcusRoMH4sw2H7FTNJoVzMfmHJC3YmyojFwwFWAN0tjrpIPEFR6tBae5X7/W6wsBykF33lWbHSQYPJ2nguFMtzglHTRyopf/zTXbA8XIUnonek30yrrSNkWTuWgUL5dbxUZmCh9L7FhG/EeKZ/BcGPWQtRu5XEvx3tqv\u002BypryFkIUKwENo/0bCpMjKI9ybSfxcqF\u002B8x\u002BglBZplOqEXK6ltW5kc6RofSr5fQgaNJ9sc7oiJ/ATbOcnIf9oUxw6cCMf\u002BLfZHw1jfnhSG4DjuPvDqP66/QU6M/aeLBj\u002BAjz1jYny\u002BmOzFtsXfbheehm/GFrRefs4bzmpaWHk9\u002BmPcG7BXevnwW9g7j05D4MDW\u002BxYrPS0JAsRtqfzz4dgot80\u002BTkhfUZZS\u002Bw20ZO\u002BymYrrayFEqeB7pPyadMJBuhqF839B\u002B5XiHz3Ouknc2/N4vb4gBUdRJD8r6/ZTvcKyroEyUv2duXhWE7Y\u002BXzw8Tkn4RISF\u002BT6vrM\u002BVdl6tHsm36h8LlWi9ziBYS5djQVbqaygk1Bdqjo2wErE4xSh9yAnB/rvQdOeb57KkY6ZW5Sv82j/WbGI6jDAgrvSsHsfyym659ofF/U0ef/77uGnlAh0trT0Koy4dnFLKm95Lnk4QOMoDFDgi58yh5dqaSn1izMwPpZbnS7zIqvRL4AmfgjUEzZ\u002ByaIrh3ESMXRQQNAo5o4UJ\u002BGnsXAkuOfn2Ihr6pzYAR3zmH1kT7yAhgyskztBKcW/3mmBC/JqRUuUqvpbVl2lQJBcVZ5REjzeHfOsFGmVBc17AT8\u002BKsnNERM\u002BN9Z5QDOmlYJglelQ/\u002BFspKXlAWGhfCgL67nXBfWno8GgbXoJm/rZbHe5Rhy8S3dVZWTocgIA/\u002BirqKvjKVlPmYkh/whD8qcU16nGdnGW1S1GejnKWlM2xXCac2djAtAXp3bxssrm4bPBPLAbMoeR0PNwd91xXe/AvOuE5UWkQbyEPDin3WknOWMqU/BDqQlzKC6\u002Bo/vnNdRUQYE2US7w\u002BoZbuwv1rWzPcgBl8jDxGRx/oPvMomCgOBc/29sDUCAN6Hom7ZMngiwgl8DhHWOVP6fZg2MjhEezF5BhWU9ND68d5PqQx4ht9B2XxFg7JB\u002BZwS4qNQx3kwCK1f5v/3a\u002BDh/uygjm3npaUzEIHQmFnv6Bkz4hvCjtGb/zu0t12qGekXWzmI9T\u002B6RTd79557wZP4W3h6o5IPh2QZ/dm1bfrbkI\u002ByyjJqUrS9bX/ZGU4a3yAuT/\u002BsKW/6RxBgqxQBi4GDo1FLyHsUvykEvmGuC8qLkefbjdK7cqXfh1PrqRAC8MaYheVn3rEXlRvJbypZ\u002Bts5IOArOdoOEQn\u002BoPDunfXmmE6Utpkvk/DWxSHvdrvnLidnkLeR04hGoeokQ0/2GU3cKBy4QsTHwUaW0UnqQs7QtM2Q8b0PTBMBBBmKZ1T6lmOW7rVY2L3HDd405XMNZkf1kBfWmBaa5wGjgQGwCwN7j9cE5knwHHKEdkZ7o90RikIO2PVAf5UyUxcRVSHA4KFR6Y/imz98R1nlfV1KB2IjCNlHmIcY8Ksra6ZnAMGNdk6MxTFKiYokoBS/ax66hsL7iohGkBiBmRjtM5/0CEDxEEbb6SYXgkPOmmRL4lULWR51g4zwg\u002BEYB\u002Boc8EmDQK6Dj8nlj7NiiSUig7BE8NywhpijhWEAcNIyWGef9gjMgoBV4oVL7D5aDpRJFZX10kkZlTwH3Tej9L0TV\u002BjF\u002Bi7m7Zxp/AQAAADrSURBVCx10zaY07zTKP0JfB8mj5OfxlxftRLG7tXn/X2PwMmOAJW1yif0BPrivquEY2Bud07uUPW3M9/D6sDaTCrI9gvcHOuk3/XvegROZgSgsBi74fjNJF73bS1Gmyf9ZqZ3duLXzRtCgdl5n6nQPnOPwEmIABQX\u002BgE94VQg9IfzsnNhGSNdCG\u002Bb3PxcKu0L7RE4SRGAHtlBW7fB4CRls2erR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR\u002BCkQeD/AO7PdhOwCsvkAAAAAElFTkSuQmCC\u0022) !important;\n}\n.pageTitleWithLogo {\n background-image: url(\u0022data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOsAAABVCAYAAACoyhPQAAAgAElEQVR4Ae1dC7AlR1m\u002BeWgUEBFMIsnunZ7dS5I903OTuJaAYHHxUfgWLCKoKUXKJ1UgFgoiKoqKBCnwrRVeIpZUBUFQISiGhKigsBCSLLt7p\u002BfuJiQkIS\u002ByeZDdzd5z3a\u002Bnvzl9ZmdO/3POnLthna262/M43f3/X/\u002Bvfs7CQv\u002BvR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BH4KsagY2FhVPAwNq2nd9olP6yUXpjir\u002B7zdLS41EOy2sChe/3nnvBk4zS901RV5W\u002BoVH6qFH6nixO/iNX\u002BgVmq96\u002Ba\u002BfOr7H0rKycvrGycnodPaTlgBp8i1Ea5VTLFt/nRX6UcShTyQETJZcblTxn3/nnfwPrNktLZ7BOPrM0ujbAb41KVmehQ5I3U/pB4E8a9sf67FylwDDE70Or55z3zT7NLEOakv98\u002B/JZwEpQ51G0j6vzVKR71QXKKH1QkBft8XY5bZecht\u002BCtizSj4TKzyP9PGnZnfyO4G0sLJxqlF4PEVj3Hg19xcKCZZTlNRHnv89V\u002BpW68mZ9liv9kIn0W/fHOyLSQeXlPVLS8rsF7yFBne59pG8xKn0VjCHqBB2sl7T497nSN83KvyD/EdaNVMo/BJj5fJr5TJL6\u002BaTyxjygk3VkSr9fwCfa7MuQbeRjyjKqKd/nKn2uoOx1tmm1nLndk8CNhUtOExDYKLDIDyJZXhPBBB6/M1CqsDVvrDOUN1P6tlylv0haaFB4T1quXlk5PVTWrO9zlV67b\u002Bv556Du3YPB17Ju3PvXRun9s9YlyH/IrxO4CPKgHQ4zH1NiKU2Zz7Z/HPZeiHgoU8h79UIRJe2JdjxZGA0N92292OJOGa2jlXTBmOaC6CZX\u002BoaqPNWV2\u002BkzAmEWBwNhg9Uqz9q2NAVhLK\u002BJSILiBGSuyur4OZSr5GdADxqa9TtabRcAz2fhvUXe/BNbtnw96vY9vU\u002BTDaHnaMBAa1YoXemlpIY6U/oIBdSnuamt654zn2t/Seg99OukfKFLkSl9jxD7v6qjxX9GRUb7SDz\u002BapR\u002Bv59/U6\u002BNSt8sZLxWWU2U/LmEYDYWQJ\u002B3Z/X4uQ/9MtBHy4xr0rKJyrphIv1p4uQLIZ9thrKir0ihL3CQRVVQVuYjdqRbmjKfMxAiZaUijfIW4yzHwvLXeG1cL5eF4bsfyl3wOgqlfZrJVxalPxksM9KP3HbOzsf4\u002Bed\u002B7TF/aq709UEiJ1j8TOk97FOw3DoG\u002BG6TlXXDqPRK0uPRsNmeFQI1NCp9FmipE8LNCIOdZ7W8g44WxupwnYEhrpKU2LfxrDSwzMv7A0p9ncQLAvN8u97qY\u002B7TynKh0BL8M5X8D3Hwy5nrNYksgEsko2vN1ivSDxBElltHPN\u002B5xtqMMNjSjEGwz28ZPBE0EWjS0kJYm/mfYMiqRjBTeh8EDbSABtKB\u002B83yrAzHUaeU/8KzlmMTpbKjDOk/8uqMtcizVtuLZVjlirSp4lt7H6WXezSO0U6jecuWp4tC4L2R/g6URbq8cud3SaaLTrWd/phFGNfZD2O5dZTzHdIWYTCG\u002BI9ggKOYGrHXGLluNd2yqpIXgiafBnsvHGCCwkPRcqX3GaX34jpTen\u002Bu9G2OPil\u002B6xhkcrSc6tMjsexOGPcYpa/LlL6efybSN5Z/Kt1tlP68\u002B9sLejEtBNpzpf\u002BJYR9okCor8KeAkmbkb/OP\u002BdooK5WJeVEf6RCO3G6YWD8AZURen3f/PlfpL9Qq\u002BrghPswQmDS04X/q35JoB5xU0Bp/R\u002BKZ1hFGwBEy2ymWcSDqyh6ubdvxFAj39WcvPxbWlGWsxsvfaZS\u002BWQCwLTdX\u002BlOcc0UZLKeFsN5axxOerUb6eVBcKS2YK0Q\u002B4EA6cC/2rEsXn4nfz/JvhMXm91khI25\u002BvK7N/WdDtA/49HEaKbClHYbcz1N3XRsKs0zrVWNMs00uJ4/1R4k58/J\u002BrimVdV\u002B8fH6ISMn7PEqeDYLZd60jngw6AyEKg\u002BvK4bMbY302FkRI6MNE\u002BgYXS0yjrJG\u002By067rKycjsbFHwwIBWd/gaNsrjpOfo48eJgg2hAp/AE1uAhTTrDypKUuRbiLP4Td\u002BAP9EH7QzPZ3ilMn4GPPuh1gsgOMojCY\u002BBIn4MZrR/s1wvZ/BzFfcAtRWDZwlPR/R7MeRXfAK29zLnOVXiZkdqzxjssT63d7FI/1C/icILdRVioYGgb5i79LTmPYvab0rxxHS72FPIQyQAvLKa5lnsUofadHf8kfLT/KMkrfLqSlnE5gmRAgqbLuHU2VlXQQY2nKetsoKw0x80rr4u\u002BYD0oyi2dFecQ937qshZg/yL46DRXpySP9ilAZWMQDg4i6mZ98zTUlkQDfqPSzkwjNlV4XLkdb85WhjgHW20pZRwsuxgSTjYV6JtHvvTtKSwo6SEuLRRG1yspyCjrSq7z6Go1brpIPM5\u002BfSpU1376sUR/z1mEdesa8wFFC84nyrGxn0ku\u002BSlkrxhwkUdpwdcuF5xa42cjCypMbVb5DgMEVrLtKC5/PJWVlzsKF1gRjWaBktPgro35QMRdWJX5Ur3yetalMlgUPKwAairPuN/wU\u002Be8MeZZM6T8V0nINsSEdSE\u002BEsjoZaDQs5OdEjQb7BpaYubQ03kbpd5DOSWmukneyDBhpXGNdu2Cwcri2bbCI35MeljP3lAKCPowJL/vCelWMLIYadEhGKNRVRlivC70k1nCDoDIvy\u002BS989KSkeF10oe8o/yzhcGkB2kWp78twAk4HqesNj82AYRx3tiztTvP2iYMLr2Z6/P5vEuuibnz5qI\u002Bq29gq3XwHTYYCBQOq7cerC6QyKL09wWY389R4E0NgcEwK3SgBZQw/aCJ9VsFDG1wlwkbtQouG6uNsvoK5pfHshwPUyurDANrqGrDYJ\u002BmLE5mUdZTpKPBXYbBztgFZMDyj7XBXBRfejWf/9A12wxtKu2zNrU/6irpQXQV67sEMjrkajbkdyHw3aF8mdJ/Q97IA\u002B/nnlKZsJ0sRKiJ00uMWn5a8HfwCLH\u002BcRDfxBCfOwGRedaaoXu/DtfwUysrwmwRbw0DTH5jtfCsHysFzfNSUmU1ixcmPgY\u002BDdJrtoUznEFlRRhMuWFeaV38HfO5OkWelQOJzMuymPJ5Llx\u002BmKnkncxzw2L6TQKPXCo4PTnr3tTUqPR3QoIK6yPtF\u002Bax/lcCwdRniM\u002BcgomUtcmysqwWnvUowUZe5ne0BIW1aTTY5y\u002BLk98K4WnfR3bk3Hon0tFmNBgjoKjXy\u002BuTIbpmXmlkUShrVyuYWnhW17ckvVXm2KYIUzEYGsQ/1g\u002Bg\u002B4dyctkYw90nZBQYBJJppJnS/xtijuAILBAE/tYm5Rqv2zZWJ8rqvLTEsz7sewbiIBVWKCv74sxLbDhvZ5R\u002BfQhPvM/j5OeZ1yvrq2CAqZswuI1npTJ6OBE6m/K5HX9Rek2CP/eiSgZO8yh5HStkXbyfe8oKnZBOjNf9DcdG6YcFQByaFLaw7hMUBt/t1d\u002BZZ2WZaDij9EcEGG3scRvjgQPzI330jwZ3o6xO9kRhcEhZgTu7FCbWl0rwNyp5s1m6\u002BEyBAyo3mZOOuSuoXwG9AyxR6PiKXOl7mRdeUwDE0FPWcs8kyxgJ5uyelV7SNbwkjN2DkB60gA7S0iJ/rWdlOdYACZasWQy9LVvMD7qkfdZuB5hsWwTx63Ke9YoWA0xUEh8nyhNTRnNu54zECNxnYv33Anm\u002BlSEw9YZ1bkpaWqFiS9DE8DFT\u002BnMkKov0RwXMbfCcHioT8yMl4HgnXBu8UddYKIdGIY8G3yWh65jheZlPA2mZts9qveLKyul3nL38WJaL7WcCWu6lAIAG0oEypMqaqcFFwBDlVP92nbPzMfhDHw7p1W7MoSpsrLeFsepsIT9oF48GB/qsxL5IreH5jKANNiTyl8X6pV75U42AI//U/6hE7miMyRbV21Sex/qlEhCM0r/cRBwFxCmIqM9KpYRyQOBAP5cg4p1R\u002BgYBXesH1EVPAF20wqRFLKyxvssO9S8tnQEl8IXfjijH6XsFdADvVxd0FAtHSAdSaRi82x0i1oRz0/Mxmr31sUK6O5u6aaOsdca6jj/KdbaYfo\u002BQn8myr/RRGlXSUFfvvJ9ZC2Gi5CVhppafRmJcjB9iEO\u002Bv8QWQ\u002BZF6z8UnRcBDQFEZwvrlmVj/oaDfAZqu4yCQR4PFQayskb7FrxtnKh3jdcXE\u002Bk1G6SyMpZ2rfJj7aqtGA2VLPatROjd2G5zdCgdj9TnwaJTelSn9KWyQNkr/t4n1fxmVXrWq0uf6tOOaOIj573SLnPWAknC1dtdNlRfcI7RG6kJhSYQTkOVklTJHrOrqndszVooUjRgSMBILgtDHdUduBpjUX6oTRJTh1S/eIueD4Ub8VjBJbYr\u002B4cQwHvyhX766OHhmUf9otwRpka4NdtMCt5tI3\u002BXO/7m/7T7WXCWvBB02Oig928jDSj1rqN1q3mMPK8M4m/LeRTmhNsX7zjyrMxCdKiv5Ab5G6X\u002BrwUDCY/mbVaVfUMhM/VEweDfXf2QIDeQ2TZfE1TA3ZLgJoqzFCi9NxJKuI1Aq5GF9ZIr38JQtNp/fjc3DGI1G2aK5tNGSvSFWX3n1l4NeI1pkAyw1\u002BEzCbvxdrB/BumHS4YdVpAPvWnjW8fJH/NY\u002Bx/w362Z9o1TGfzHA1M086zyUFfzRSZho\u002BVtnaS8YeMqw31bEcFNS9lmchwodslxOw1ggipU\u002BoUX/EJYhGYVS\u002BoxVBETUZ50B9HWM\u002BLF\u002Bbggo70vPJhPWKemA5791TelfYr1c68x7YoL7eSmrifW/VOtjva7/WKvkPs8nSlk5ZkHZJR91KfutdmxBNtXYxPcuOiriVFffXJ9ReVxcPzGEhOelpQJRyIvzUv0GbLq\u002BxW1FInhkiow7AZmbsoLOzFMQ8EsamJIWZ\u002BWbGm3W5wczNXgRcUD/uyp0pAPpvMLgbIJnbcF/Z2Gwa39RGNxGWYEh8cyUfk\u002BTfIae74/190JO2G6UmU1NqXzFpxqCu2jKgSISWXwWIpgPR27\u002BJvP4KYF063Hnpqx2cGWr3s66UR/rLp85z9pCWKdTXNt1SD7AkUVEHT4t/vW8PGsXylp41s1fFMEorWrk2I7VlB4Rg3/CMZZqu5ZHtZ6wEBhMlZ41Tn44ZF2MSn\u002BDQJT5VPqscD6rzJ9kHl8YeQ2j0aLPWgVTev\u002BQiZO/IA9V4EnL3JWV/clI30ga/JCcdCCdl2c1KvkgcfDrw7MW/Hc2z\u002BrqFHnWNspK3sCXUfqfhbI6Jk8YPPSwGuvG8fnc0wojV4QYOaAusod6IRSgR3bh8xhzdeWAYQqkXy\u002BvN0lZQSf6rX9JcP2wpqRFvusmyHcdFv6zXCXXkpY6YzYvz2qU/jg9Tsl3yz47PCunR1gGeZGmzOciqzkoazEAhshRuEDl\u002BDZFJFSuMBvNHkh57OR3JVCFVwsueOa0TaGsRfiDZ5LRWLuM0THshy8VGuYZBvuNcHQtSn8AINLoFNecMpnrAJNPB66HuTt3lrQQE9AkVdZMJa/MIv2DJh483345L9aXZir9WWwQKObPk5cblbzqmKF4rVHJH2WuD\u002BYLEutt41nraPbLDF2zznkpK40x\u002Bpy\u002BkWx9vagvBS80qCG\u002BOn9PpUFYYbBjnuFZfbqOZWokmES7vMEF/egrcGCAALqy/IUIm6Ws2Gd7C/uMpcDQs8g968G1SL8Yn/rDebU4fhSLDbJIvzFTGnOuVcVsur/ap8G/lobBN0U7njyNgLAd/bZwUU4TreXzR/toMOXb8YNFIiXtba9xJjTll\u002B0zDd5T52FD4YQ3wbGLD/l9BRJcWOH0ixLm17ZdeJ4TijLuZzkOUKmyfiRX\u002Bj15lF6OucpMpZflkX6jsZ9TFDfIkNuiqt7BWXlJw95eBz54ytTyU430dHilD3uCMNWuG6wNRr0I1zZgfLHO2/0h\u002BsEf2hkGCteoj9iTB96fCGW1mAvm7BGJMHynMpL\u002BagrZxLObiw3lkhC7sc1xQCCOmUV5LLda31zvKaS2UcNW5ybOB6JR2bAAzCj9MYmyYikgGWL\u002BMi28mURZhyyjmuKkulzpvxbRgpVMsf51V8bYCh5xGBgld1nlQDfCKQkVAeXu2bbjKQIjaAWE4wHAk5igDGkY3Onmc3lkcZgy5NNcbZdJ98znMJcoVDlnH1DWU/gea9OlMjHxd1H6U\u002BCFTm4SX52/I9A4qHgikdgcrfSHSAAAJsh4lsf610L53ftdZJT5mbrGkijrxp2DweNgiTFogHnK3YPB4xjSQmlylYoOGTNK38R8Pk/wOkJ\u002BGrbIjQYhjgnKl0RlRclLfHx5LVbWE3AUabHcsJsVTBZzoWdlFEJlJFZ\u002BSjlDNJjJtnI2elW2X6b0XkaXlFu/zrld\u002B5XZEDLgWbnixs/Hvie8AhkKpPcSaJZDwF3oJVLWujAIjQMFBmBrkf6xAB1smK/49JAmRwt/MynFgWk2pGde1O9fZ5H\u002BTxEtUVJ\u002BKMnPL\u002B2zdulZW/DfmWedJgwm9nVKwlDVLC1vkQyASrbHYQsfIifUx/Lr6u78GQUCypJH\u002BtMhgcq3L58FIuiN/evCmwk\u002BCjU2BF4IOZXVWlbhl8\u002BpYMxLcAigK2uSkvHdEfIDPIhJi/zB0w2FZ/rgE5RXkQ/SgVSqrF0emOaiHGI0Ke1MWS3mQs/qebdy7IPYFXJZblBYkH1nODloItlpnSZefn5Rxyh68uueyzUF3QnmxKNcoMgIN0EIUvwhFMV\u002BUACHDrzkhH6MCGPwA\u002BXQK1foEHlWNhbzEiBaWnhe4Ta5sS/dUUlaCGujsrKsTOzl092k3\u002Bfr0R4Gsx3JL9tCmjKfk8NWfVbiVa2LBhhe0Ch9X9ARRfrPcBypUGZuYGRH2qv1d35PRh1Doa9uHQ0RkCkdVHgL2uJggLJYPwXTbUsTKSs8OcpgXtLGe1eWqOEZOgN4gt9GWVkn85IW3rc4stUwD8tEWSdCWW1IGugWOQWY2bOS1249a\u002BH13FjMxPXuVkGXlrcAa6M0vjQxKZLAstnN331Di\u002BiUdSJDudL34ZOEqyq9oDgzWL/aROnl2CPovpD\u002BBaFVAhCv9wWajeUUpBNldX2ukAGyjQIhAT1QFCqL88yTG61o1No\u002Bq\u002BPPjjDvW0yeERQAlBVpw83wxAT0yMPgQWfnBjsvJ\u002BH/MNqN\u002BLFd26TktY2y0ljT4Pv1sQ3xLFP6/QLsD3JKJpf9fiNXg\u002B9D\u002BeTdr38u16NQ4aInCBjCaPBEhZaU4X7zGdYNYMcaS9hnZRhcbaxKWSJlrZuOQvlCfhrDYCoeVieJyqpR1kLgZJ/P6PLAtDbKSqPvK0kbga20mSgamqyshVeFE8plnrLc2wwMJW1lv\u002Bvb8HG0NryLf0uQ7NK0kOvv9v29jPlBA\u002BlwAiLyrCFldV5apKyoF6D5hqNLZTVR\u002BnSJADjPatuPmIAmqWftUlkdfiLP2pWyWsyFA0wc96gaa9eOdtAJyykFuNsPc1Np3PrhoNxg5dbIYMx5oMm3giZKpId6SRov\u002BBt/jTDALgVTvihiYwRUMaJMsCtlBUFHY/p9VuZ/tCgr\u002BDoRytqmz8pQ0JcptockHcNcqKyy9rdnToXk8SAHTkEr5NEo/UmBkm9kavBU5CH/El6n\u002Bg2BdY2SS4jr8DfD0UKE0de2HS2h9ckF\u002BOUOiAZlLUaDg8rqr1cGJhScFsIaDINn8axo3BMxwNQiDD7CL72jTWHkkBcCTENMWWsSVGJu65xRWak4oEV0Flas30a62B1Cf1Qm68dPtbGsTlOGD7BQJrJnGYUsUKfv98XL54MhhFCkxQmIKAwOWVZXlkhZIWCgBUIzJjiy0H\u002BuygpBF3vWDr914/ALtnmu9MMSwUQ7A2esTYZy41xlKBTqYRhtoxmhsqI/inopO46GcoBQeAr/kHKIMRSOo\u002BDbrJJpSJz/xYEp8iDBovVvyCQAExIWbDiZNeKwePJ7JJq0uBFYkbI2NFY5lWMbHv0KgcJBYECLr6wuv4TnScpqWcylo8GxHQ22eWg0cPMo96xHjUrfkCn9skylLzI4wCBKn44NGzimlthaphr\u002Bo6C3UVYoPYqj7PjX1gHJjoE9iLOei7yXnEbMQYcQ82G\u002BZbCE/PTKuO78H62Im7aRCGWnv8E5tgSatDhr3kkY7MoSKSsaBwD7ytpy6mZsE4DXWPa5dIQRAsK8FByMKAsFZwNzisgfCjtZR13KvA6/1m3uZgyGzgEA/4fdKZT3ZErfZmJtjEo/i43vmFbhoJilW/YRb9A0rDPWVBh3PJFkVPkdxIB8UybxpQaJoc9V\u002Bg/VMnjfWUoFEX2Ltd47De1AEaZaIvvBWmxcxycKRJ8psB\u002B5df1O9jO69KzOuk6trF14Viqc\u002B\u002BR9UPCLw\u002BiKZXLM2yYM3tuhsrboswf5Cgh9Oedu20wYBle7QVQ2KAiOHgrUaRU\u002Bi/QO/J66gGvK4m3n7ZR9NT3SD\u002Bw\u002Bc/C4opzx8RM86\u002BQfmTMq\u002BdUQY/Yz7sXJgP9uIv1u7B01Knl5rpIXri0uf7eJBhdni\u002Bk2WDsAECrPvT\u002BCEBzM0CI6BRF51jrLirIo5M4zhI5VtYJW51lbKutxC/l9WiAAEkzssTdu8zv5QDlSz9rlQv5pPauET/83udJ/Ah7xr42yVtufoXQxsCTaW32Q8ucrKz0rys\u002BVFh2xy6\u002Bmw8A5VrpPCqsdPoHfqOQNIAgWBI1IoOooAmjClUxlKIMyUVYbZa3rs6AMCvm0I8vM31JZa8NgGkSpl8oi/QAxpdC0CYPNYncrmKQ0\u002B4o33XX6FvI8i7JSUW4994InifYPFx\u002ButlWznXDjX5tYv03Ik40OnOxYWSBPnaXwaO5zExNDmZui5biuUhAHq2Qb1oW0GB0TDZkjtD63WI9JZXVhcCee1QmbxDJ686yjQQYrOPXhfxWr2v2sfsO3UPxy/TU9BZRVPBrc4X7WzfKsWQeedUzB8I3VcLsNTbk\u002B/fgFDVT8FlHil0YDVXMKhZ1ABhcuY2M3hA\u002B/hxAVSjraguQEswgFi2V6IiXJI/2KGqEWKesohBkHhw3nQk/Rpm8eHAZvRo8mHWDKlS6PdWHd4An/eO8EX9R/LkMqt0cW5WCDvEAAN25yfTAucyyoaPc/aYYRFkZIVePV6n7aMBiy6DC2DgPXWNxglL4niFWkH2B06IfARIrPipBa9LnO8uPKVHSW1VnqiFkPMLcusRoMH4sw2H7FTNJoVzMfmHJC3YmyojFwwFWAN0tjrpIPEFR6tBae5X7/W6wsBykF33lWbHSQYPJ2nguFMtzglHTRyopf/zTXbA8XIUnonek30yrrSNkWTuWgUL5dbxUZmCh9L7FhG/EeKZ/BcGPWQtRu5XEvx3tqv\u002BypryFkIUKwENo/0bCpMjKI9ybSfxcqF\u002B8x\u002BglBZplOqEXK6ltW5kc6RofSr5fQgaNJ9sc7oiJ/ATbOcnIf9oUxw6cCMf\u002BLfZHw1jfnhSG4DjuPvDqP66/QU6M/aeLBj\u002BAjz1jYny\u002BmOzFtsXfbheehm/GFrRefs4bzmpaWHk9\u002BmPcG7BXevnwW9g7j05D4MDW\u002BxYrPS0JAsRtqfzz4dgot80\u002BTkhfUZZS\u002Bw20ZO\u002BymYrrayFEqeB7pPyadMJBuhqF839B\u002B5XiHz3Ouknc2/N4vb4gBUdRJD8r6/ZTvcKyroEyUv2duXhWE7Y\u002BXzw8Tkn4RISF\u002BT6vrM\u002BVdl6tHsm36h8LlWi9ziBYS5djQVbqaygk1Bdqjo2wErE4xSh9yAnB/rvQdOeb57KkY6ZW5Sv82j/WbGI6jDAgrvSsHsfyym659ofF/U0ef/77uGnlAh0trT0Koy4dnFLKm95Lnk4QOMoDFDgi58yh5dqaSn1izMwPpZbnS7zIqvRL4AmfgjUEzZ\u002ByaIrh3ESMXRQQNAo5o4UJ\u002BGnsXAkuOfn2Ihr6pzYAR3zmH1kT7yAhgyskztBKcW/3mmBC/JqRUuUqvpbVl2lQJBcVZ5REjzeHfOsFGmVBc17AT8\u002BKsnNERM\u002BN9Z5QDOmlYJglelQ/\u002BFspKXlAWGhfCgL67nXBfWno8GgbXoJm/rZbHe5Rhy8S3dVZWTocgIA/\u002BirqKvjKVlPmYkh/whD8qcU16nGdnGW1S1GejnKWlM2xXCac2djAtAXp3bxssrm4bPBPLAbMoeR0PNwd91xXe/AvOuE5UWkQbyEPDin3WknOWMqU/BDqQlzKC6\u002Bo/vnNdRUQYE2US7w\u002BoZbuwv1rWzPcgBl8jDxGRx/oPvMomCgOBc/29sDUCAN6Hom7ZMngiwgl8DhHWOVP6fZg2MjhEezF5BhWU9ND68d5PqQx4ht9B2XxFg7JB\u002BZwS4qNQx3kwCK1f5v/3a\u002BDh/uygjm3npaUzEIHQmFnv6Bkz4hvCjtGb/zu0t12qGekXWzmI9T\u002B6RTd79557wZP4W3h6o5IPh2QZ/dm1bfrbkI\u002ByyjJqUrS9bX/ZGU4a3yAuT/\u002BsKW/6RxBgqxQBi4GDo1FLyHsUvykEvmGuC8qLkefbjdK7cqXfh1PrqRAC8MaYheVn3rEXlRvJbypZ\u002Bts5IOArOdoOEQn\u002BoPDunfXmmE6Utpkvk/DWxSHvdrvnLidnkLeR04hGoeokQ0/2GU3cKBy4QsTHwUaW0UnqQs7QtM2Q8b0PTBMBBBmKZ1T6lmOW7rVY2L3HDd405XMNZkf1kBfWmBaa5wGjgQGwCwN7j9cE5knwHHKEdkZ7o90RikIO2PVAf5UyUxcRVSHA4KFR6Y/imz98R1nlfV1KB2IjCNlHmIcY8Ksra6ZnAMGNdk6MxTFKiYokoBS/ax66hsL7iohGkBiBmRjtM5/0CEDxEEbb6SYXgkPOmmRL4lULWR51g4zwg\u002BEYB\u002Boc8EmDQK6Dj8nlj7NiiSUig7BE8NywhpijhWEAcNIyWGef9gjMgoBV4oVL7D5aDpRJFZX10kkZlTwH3Tej9L0TV\u002BjF\u002Bi7m7Zxp/AQAAADrSURBVCx10zaY07zTKP0JfB8mj5OfxlxftRLG7tXn/X2PwMmOAJW1yif0BPrivquEY2Bud07uUPW3M9/D6sDaTCrI9gvcHOuk3/XvegROZgSgsBi74fjNJF73bS1Gmyf9ZqZ3duLXzRtCgdl5n6nQPnOPwEmIABQX\u002BgE94VQg9IfzsnNhGSNdCG\u002Bb3PxcKu0L7RE4SRGAHtlBW7fB4CRls2erR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR6BHoEegR\u002BCkQeD/AO7PdhOwCsvkAAAAAElFTkSuQmCC\u0022) !important;\n}\n\n\n\n/* Hide Quick Connect button on login page (server-side disabled too) \u2014 2026-05-08 */\n.btnQuick { display: none !important; }\n\n/* Hide Settings drawer link (non-admins lose pref pages anyway, admin uses Dashboard wrench) */\n\n\n\n/* Hide top-right header icons (keep Search) \u2014 2026-05-08 */\n.headerSyncButton { display: none !important; }\n.headerCastButton { display: none !important; }\n.headerUserButton { display: none !important; }\n\n\n\n/* Tweak: white thumbs (2026-05-08) \u2014 scrubber \u002B volume slider thumbs forced white, MUI palette untouched */\n.MuiSlider-thumb,\n.osdPositionSlider .MuiSlider-thumb,\n.osdVolumeSlider .MuiSlider-thumb,\nemby-slider .sliderThumb {\n color: #ffffff !important;\n background-color: #ffffff !important;\n border-color: #ffffff !important;\n}\n.MuiSlider-thumb:hover,\n.MuiSlider-thumb.Mui-focusVisible,\n.MuiSlider-thumb:active {\n box-shadow: 0 0 0 8px rgba(255, 255, 255, 0.16) !important;\n}\n\n\n/* Tweak: pure black bg (2026-05-08) \u2014 replace dark grey #181818 default with #000000 across page surfaces */\n:root {\n --primary-background-color: #000000 !important;\n --background-color: #000000 !important;\n}\nhtml, body, .preload, .skinBody, .mainDrawerHandle {\n background-color: #000000 !important;\n}\n.skinHeader,\n.skinHeader.semiTransparent,\n.skinHeader.skinHeader-withBackground,\n.mainAnimatedPages,\n#reactRoot,\n.dashboardDocument {\n background-color: #000000 !important;\n}\n\n\n/* Hide Settings drawer entry \u2014 wrapper :has() catches the MUI ListItem parent */\na[href*=\u0022mypreferencesmenu\u0022],\na[href$=\u0022mypreferencesmenu.html\u0022],\nli:has(\u003E a[href*=\u0022mypreferencesmenu\u0022]),\n.MuiListItem-root:has(a[href*=\u0022mypreferencesmenu\u0022]),\n.MuiListItemButton-root:has(a[href*=\u0022mypreferencesmenu\u0022]),\n[to=\u0022/mypreferencesmenu.html\u0022],\n.MuiListItem-root:has([to=\u0022/mypreferencesmenu.html\u0022]) { display: none !important; }\n\n\n/* Hide unwatched-episode count badges on series cards */\n.countIndicator { display: none !important; }\n","SplashscreenEnabled":true} \ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/displayprefs-2be0f0d3fe3a45dc9298138a15a01925.json b/snapshots/2026-05-08-pre-elegantfin/displayprefs-2be0f0d3fe3a45dc9298138a15a01925.json new file mode 100644 index 0000000..f24c77f --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/displayprefs-2be0f0d3fe3a45dc9298138a15a01925.json @@ -0,0 +1 @@ +{"Id":"3ce5b65d-e116-d731-65d1-efc4a30ec35c","SortBy":"SortName","RememberIndexing":false,"PrimaryImageHeight":250,"PrimaryImageWidth":250,"CustomPrefs":{"homesection0":"resume","homesection1":"resumeaudio","homesection2":"nextup","homesection3":"latestmedia","homesection4":"none","homesection5":"none","homesection6":"none","homesection7":"none","homesection8":"none","homesection9":"none","chromecastVersion":"stable","skipForwardLength":"30000","skipBackLength":"10000","enableNextVideoInfoOverlay":"False","tvhome":null,"dashboardTheme":null,"767bffe4f11c93ef34b805451a696a4e-series":"{\u0022SortBy\u0022:\u0022SortName\u0022,\u0022SortOrder\u0022:\u0022Ascending\u0022}"},"ScrollDirection":"Horizontal","ShowBackdrop":true,"RememberSorting":false,"SortOrder":"Ascending","ShowSidebar":false,"Client":"emby"} \ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/displayprefs-571decc67cdc4ea683b4c936b0a31ff8.json b/snapshots/2026-05-08-pre-elegantfin/displayprefs-571decc67cdc4ea683b4c936b0a31ff8.json new file mode 100644 index 0000000..cd11f7b --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/displayprefs-571decc67cdc4ea683b4c936b0a31ff8.json @@ -0,0 +1 @@ +{"Id":"3ce5b65d-e116-d731-65d1-efc4a30ec35c","SortBy":"SortName","RememberIndexing":false,"PrimaryImageHeight":250,"PrimaryImageWidth":250,"CustomPrefs":{"homesection0":"resume","homesection1":"resumeaudio","homesection2":"nextup","homesection3":"latestmedia","homesection4":"none","homesection5":"none","homesection6":"none","homesection7":"none","homesection8":"none","homesection9":"none","chromecastVersion":"stable","skipForwardLength":"30000","skipBackLength":"10000","enableNextVideoInfoOverlay":"False","tvhome":null,"dashboardTheme":null},"ScrollDirection":"Horizontal","ShowBackdrop":true,"RememberSorting":false,"SortOrder":"Ascending","ShowSidebar":false,"Client":"emby"} \ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/displayprefs-82dd8542915740c8ae799b6723542c63.json b/snapshots/2026-05-08-pre-elegantfin/displayprefs-82dd8542915740c8ae799b6723542c63.json new file mode 100644 index 0000000..0eb9a4f --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/displayprefs-82dd8542915740c8ae799b6723542c63.json @@ -0,0 +1 @@ +{"Id":"3ce5b65d-e116-d731-65d1-efc4a30ec35c","SortBy":"SortName","RememberIndexing":false,"PrimaryImageHeight":250,"PrimaryImageWidth":250,"CustomPrefs":{"homesection0":"resume","homesection1":"resumeaudio","homesection2":"nextup","homesection3":"latestmedia","homesection4":"none","homesection5":"none","homesection6":"none","homesection7":"none","homesection8":"none","homesection9":"none","chromecastVersion":"stable","skipForwardLength":"30000","skipBackLength":"10000","enableNextVideoInfoOverlay":"False","tvhome":null,"dashboardTheme":null,"767bffe4f11c93ef34b805451a696a4e-series":"{\u0022SortBy\u0022:\u0022SortName\u0022,\u0022SortOrder\u0022:\u0022Ascending\u0022}","f137a2dd21bbc1b99aa5c0f6bf02a805-moviecollections":"{\u0022SortBy\u0022:\u0022SortName\u0022,\u0022SortOrder\u0022:\u0022Ascending\u0022}","f137a2dd21bbc1b99aa5c0f6bf02a805-moviegenres":"{\u0022SortBy\u0022:\u0022SortName\u0022,\u0022SortOrder\u0022:\u0022Ascending\u0022}"},"ScrollDirection":"Horizontal","ShowBackdrop":true,"RememberSorting":false,"SortOrder":"Ascending","ShowSidebar":false,"Client":"emby"} \ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/displayprefs-a4cbcdf95bb34888885af6fbf5c340d1.json b/snapshots/2026-05-08-pre-elegantfin/displayprefs-a4cbcdf95bb34888885af6fbf5c340d1.json new file mode 100644 index 0000000..cd11f7b --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/displayprefs-a4cbcdf95bb34888885af6fbf5c340d1.json @@ -0,0 +1 @@ +{"Id":"3ce5b65d-e116-d731-65d1-efc4a30ec35c","SortBy":"SortName","RememberIndexing":false,"PrimaryImageHeight":250,"PrimaryImageWidth":250,"CustomPrefs":{"homesection0":"resume","homesection1":"resumeaudio","homesection2":"nextup","homesection3":"latestmedia","homesection4":"none","homesection5":"none","homesection6":"none","homesection7":"none","homesection8":"none","homesection9":"none","chromecastVersion":"stable","skipForwardLength":"30000","skipBackLength":"10000","enableNextVideoInfoOverlay":"False","tvhome":null,"dashboardTheme":null},"ScrollDirection":"Horizontal","ShowBackdrop":true,"RememberSorting":false,"SortOrder":"Ascending","ShowSidebar":false,"Client":"emby"} \ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/displayprefs-d787fbfc373a44119a247e7406b2721e.json b/snapshots/2026-05-08-pre-elegantfin/displayprefs-d787fbfc373a44119a247e7406b2721e.json new file mode 100644 index 0000000..cd11f7b --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/displayprefs-d787fbfc373a44119a247e7406b2721e.json @@ -0,0 +1 @@ +{"Id":"3ce5b65d-e116-d731-65d1-efc4a30ec35c","SortBy":"SortName","RememberIndexing":false,"PrimaryImageHeight":250,"PrimaryImageWidth":250,"CustomPrefs":{"homesection0":"resume","homesection1":"resumeaudio","homesection2":"nextup","homesection3":"latestmedia","homesection4":"none","homesection5":"none","homesection6":"none","homesection7":"none","homesection8":"none","homesection9":"none","chromecastVersion":"stable","skipForwardLength":"30000","skipBackLength":"10000","enableNextVideoInfoOverlay":"False","tvhome":null,"dashboardTheme":null},"ScrollDirection":"Horizontal","ShowBackdrop":true,"RememberSorting":false,"SortOrder":"Ascending","ShowSidebar":false,"Client":"emby"} \ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/docker-compose.yml b/snapshots/2026-05-08-pre-elegantfin/docker-compose.yml new file mode 100644 index 0000000..61c8a7f --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/docker-compose.yml @@ -0,0 +1,42 @@ +# Jellyfin — self-hosted media server (LAN-only) +# Deploy path on nullstone: /opt/docker/jellyfin/ +# Domain: arrflix.s8n.ru (LAN-only via Pi-hole local DNS + no-guest middleware) +# +# Notes: +# - GTX 1660 Ti present but nvidia-smi failing on host. CPU transcode only +# until driver is fixed; revisit hwaccel after fix. +# - Media mounted read-only into container; write only to /config + /cache. +# - userns: host matches nullstone Docker convention (host UID 1000 owns volumes). +# - Cert via existing letsencrypt resolver (Gandi DNS-01) — works without +# public A record. + +services: + jellyfin: + image: jellyfin/jellyfin:10.10.3 + container_name: jellyfin + restart: unless-stopped + user: "1000:1000" + userns_mode: "host" + environment: + - TZ=Europe/London + - JELLYFIN_PublishedServerUrl=https://arrflix.s8n.ru + volumes: + - /home/docker/jellyfin/config:/config + - /home/docker/jellyfin/cache:/cache + - /home/user/media:/media:ro + - /opt/docker/jellyfin/web-overrides/index.html:/jellyfin/jellyfin-web/index.html:ro + networks: + - proxy + labels: + - "traefik.enable=true" + - "traefik.docker.network=proxy" + - "traefik.http.routers.jellyfin.rule=Host(`arrflix.s8n.ru`)" + - "traefik.http.routers.jellyfin.entrypoints=websecure" + - "traefik.http.routers.jellyfin.tls=true" + - "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt" + - "traefik.http.routers.jellyfin.middlewares=security-headers@file" + - "traefik.http.services.jellyfin.loadbalancer.server.port=8096" + +networks: + proxy: + external: true diff --git a/snapshots/2026-05-08-pre-elegantfin/index.html b/snapshots/2026-05-08-pre-elegantfin/index.html new file mode 100644 index 0000000..f096d31 --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/index.html @@ -0,0 +1,94 @@ +ARRFLIX
\ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/libraries.json b/snapshots/2026-05-08-pre-elegantfin/libraries.json new file mode 100644 index 0000000..223c543 --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/libraries.json @@ -0,0 +1 @@ +[{"Name":"Movies","Locations":["/media/movies"],"CollectionType":"movies","LibraryOptions":{"Enabled":true,"EnablePhotos":false,"EnableRealtimeMonitor":true,"EnableLUFSScan":false,"EnableChapterImageExtraction":false,"ExtractChapterImagesDuringLibraryScan":false,"EnableTrickplayImageExtraction":false,"ExtractTrickplayImagesDuringLibraryScan":false,"PathInfos":[{"Path":"/media/movies"}],"SaveLocalMetadata":false,"EnableInternetProviders":false,"EnableAutomaticSeriesGrouping":true,"EnableEmbeddedTitles":false,"EnableEmbeddedExtrasTitles":false,"EnableEmbeddedEpisodeInfos":false,"AutomaticRefreshIntervalDays":0,"PreferredMetadataLanguage":"en","MetadataCountryCode":"US","SeasonZeroDisplayName":"Specials","DisabledLocalMetadataReaders":[],"DisabledSubtitleFetchers":[],"SubtitleFetcherOrder":[],"DisabledMediaSegmentProviders":[],"MediaSegmentProvideOrder":[],"SkipSubtitlesIfEmbeddedSubtitlesPresent":false,"SkipSubtitlesIfAudioTrackMatches":true,"SubtitleDownloadLanguages":["eng"],"RequirePerfectSubtitleMatch":true,"SaveSubtitlesWithMedia":true,"SaveLyricsWithMedia":false,"SaveTrickplayWithMedia":false,"DisabledLyricFetchers":[],"LyricFetcherOrder":[],"PreferNonstandardArtistsTag":false,"UseCustomTagDelimiters":false,"CustomTagDelimiters":["/","|",";","\\"],"DelimiterWhitelist":[],"AutomaticallyAddToCollection":false,"AllowEmbeddedSubtitles":"AllowAll","TypeOptions":[{"Type":"Movie","MetadataFetchers":["TheMovieDb"],"MetadataFetcherOrder":["TheMovieDb"],"ImageFetchers":["TheMovieDb"],"ImageFetcherOrder":["TheMovieDb"],"ImageOptions":[]}]},"ItemId":"f137a2dd21bbc1b99aa5c0f6bf02a805","PrimaryImageItemId":"f137a2dd21bbc1b99aa5c0f6bf02a805","RefreshStatus":"Idle"},{"Name":"TV Shows","Locations":["/media/tv"],"CollectionType":"tvshows","LibraryOptions":{"Enabled":true,"EnablePhotos":false,"EnableRealtimeMonitor":true,"EnableLUFSScan":false,"EnableChapterImageExtraction":false,"ExtractChapterImagesDuringLibraryScan":false,"EnableTrickplayImageExtraction":false,"ExtractTrickplayImagesDuringLibraryScan":false,"PathInfos":[{"Path":"/media/tv"}],"SaveLocalMetadata":false,"EnableInternetProviders":false,"EnableAutomaticSeriesGrouping":true,"EnableEmbeddedTitles":false,"EnableEmbeddedExtrasTitles":false,"EnableEmbeddedEpisodeInfos":false,"AutomaticRefreshIntervalDays":0,"PreferredMetadataLanguage":"en","MetadataCountryCode":"US","SeasonZeroDisplayName":"Specials","DisabledLocalMetadataReaders":[],"DisabledSubtitleFetchers":[],"SubtitleFetcherOrder":[],"DisabledMediaSegmentProviders":[],"MediaSegmentProvideOrder":[],"SkipSubtitlesIfEmbeddedSubtitlesPresent":false,"SkipSubtitlesIfAudioTrackMatches":true,"SubtitleDownloadLanguages":["eng"],"RequirePerfectSubtitleMatch":true,"SaveSubtitlesWithMedia":true,"SaveLyricsWithMedia":false,"SaveTrickplayWithMedia":false,"DisabledLyricFetchers":[],"LyricFetcherOrder":[],"PreferNonstandardArtistsTag":false,"UseCustomTagDelimiters":false,"CustomTagDelimiters":["/","|",";","\\"],"DelimiterWhitelist":[],"AutomaticallyAddToCollection":false,"AllowEmbeddedSubtitles":"AllowAll","TypeOptions":[{"Type":"Series","MetadataFetchers":["TheMovieDb"],"MetadataFetcherOrder":["TheMovieDb"],"ImageFetchers":["TheMovieDb"],"ImageFetcherOrder":["TheMovieDb"],"ImageOptions":[]},{"Type":"Season","MetadataFetchers":["TheMovieDb"],"MetadataFetcherOrder":["TheMovieDb"],"ImageFetchers":["TheMovieDb"],"ImageFetcherOrder":["TheMovieDb"],"ImageOptions":[]},{"Type":"Episode","MetadataFetchers":["TheMovieDb"],"MetadataFetcherOrder":["TheMovieDb"],"ImageFetchers":["TheMovieDb"],"ImageFetcherOrder":["TheMovieDb"],"ImageOptions":[]}]},"ItemId":"767bffe4f11c93ef34b805451a696a4e","PrimaryImageItemId":"767bffe4f11c93ef34b805451a696a4e","RefreshStatus":"Idle"}] \ No newline at end of file diff --git a/snapshots/2026-05-08-pre-elegantfin/users.json b/snapshots/2026-05-08-pre-elegantfin/users.json new file mode 100644 index 0000000..41dad7e --- /dev/null +++ b/snapshots/2026-05-08-pre-elegantfin/users.json @@ -0,0 +1 @@ +[{"Name":"5","ServerId":"14c3ed9fbe934608a2c76cefc70c2b28","Id":"571decc67cdc4ea683b4c936b0a31ff8","HasPassword":true,"HasConfiguredPassword":true,"HasConfiguredEasyPassword":false,"EnableAutoLogin":false,"Configuration":{"AudioLanguagePreference":"eng","PlayDefaultAudioTrack":true,"SubtitleLanguagePreference":"eng","DisplayMissingEpisodes":false,"GroupedFolders":[],"SubtitleMode":"Default","DisplayCollectionsView":false,"EnableLocalPassword":false,"OrderedViews":[],"LatestItemsExcludes":[],"MyMediaExcludes":[],"HidePlayedInLatest":true,"RememberAudioSelections":true,"RememberSubtitleSelections":true,"EnableNextEpisodeAutoPlay":true,"CastReceiverId":"F007D354"},"Policy":{"IsAdministrator":false,"IsHidden":true,"EnableCollectionManagement":false,"EnableSubtitleManagement":false,"EnableLyricManagement":false,"IsDisabled":false,"BlockedTags":[],"AllowedTags":[],"EnableUserPreferenceAccess":false,"AccessSchedules":[],"BlockUnratedItems":[],"EnableRemoteControlOfOtherUsers":false,"EnableSharedDeviceControl":true,"EnableRemoteAccess":true,"EnableLiveTvManagement":true,"EnableLiveTvAccess":true,"EnableMediaPlayback":true,"EnableAudioPlaybackTranscoding":true,"EnableVideoPlaybackTranscoding":true,"EnablePlaybackRemuxing":true,"ForceRemoteSourceTranscoding":false,"EnableContentDeletion":false,"EnableContentDeletionFromFolders":[],"EnableContentDownloading":true,"EnableSyncTranscoding":true,"EnableMediaConversion":true,"EnabledDevices":[],"EnableAllDevices":true,"EnabledChannels":[],"EnableAllChannels":true,"EnabledFolders":[],"EnableAllFolders":true,"InvalidLoginAttemptCount":0,"LoginAttemptsBeforeLockout":5,"MaxActiveSessions":0,"EnablePublicSharing":true,"BlockedMediaFolders":[],"BlockedChannels":[],"RemoteClientBitrateLimit":0,"AuthenticationProviderId":"Jellyfin.Server.Implementations.Users.DefaultAuthenticationProvider","PasswordResetProviderId":"Jellyfin.Server.Implementations.Users.DefaultPasswordResetProvider","SyncPlayAccess":"CreateAndJoinGroups"}},{"Name":"guest","ServerId":"14c3ed9fbe934608a2c76cefc70c2b28","Id":"82dd8542915740c8ae799b6723542c63","HasPassword":true,"HasConfiguredPassword":true,"HasConfiguredEasyPassword":false,"EnableAutoLogin":false,"LastLoginDate":"2026-05-08T02:28:53.9824712Z","LastActivityDate":"2026-05-08T02:55:59.9859707Z","Configuration":{"AudioLanguagePreference":"eng","PlayDefaultAudioTrack":true,"SubtitleLanguagePreference":"eng","DisplayMissingEpisodes":false,"GroupedFolders":[],"SubtitleMode":"Default","DisplayCollectionsView":false,"EnableLocalPassword":false,"OrderedViews":[],"LatestItemsExcludes":[],"MyMediaExcludes":[],"HidePlayedInLatest":true,"RememberAudioSelections":true,"RememberSubtitleSelections":true,"EnableNextEpisodeAutoPlay":true,"CastReceiverId":"F007D354"},"Policy":{"IsAdministrator":false,"IsHidden":true,"EnableCollectionManagement":false,"EnableSubtitleManagement":false,"EnableLyricManagement":false,"IsDisabled":false,"BlockedTags":[],"AllowedTags":[],"EnableUserPreferenceAccess":false,"AccessSchedules":[],"BlockUnratedItems":[],"EnableRemoteControlOfOtherUsers":false,"EnableSharedDeviceControl":true,"EnableRemoteAccess":true,"EnableLiveTvManagement":true,"EnableLiveTvAccess":true,"EnableMediaPlayback":true,"EnableAudioPlaybackTranscoding":true,"EnableVideoPlaybackTranscoding":true,"EnablePlaybackRemuxing":true,"ForceRemoteSourceTranscoding":false,"EnableContentDeletion":false,"EnableContentDeletionFromFolders":[],"EnableContentDownloading":true,"EnableSyncTranscoding":true,"EnableMediaConversion":true,"EnabledDevices":[],"EnableAllDevices":true,"EnabledChannels":[],"EnableAllChannels":true,"EnabledFolders":[],"EnableAllFolders":true,"InvalidLoginAttemptCount":0,"LoginAttemptsBeforeLockout":5,"MaxActiveSessions":0,"EnablePublicSharing":true,"BlockedMediaFolders":[],"BlockedChannels":[],"RemoteClientBitrateLimit":0,"AuthenticationProviderId":"Jellyfin.Server.Implementations.Users.DefaultAuthenticationProvider","PasswordResetProviderId":"Jellyfin.Server.Implementations.Users.DefaultPasswordResetProvider","SyncPlayAccess":"CreateAndJoinGroups"}},{"Name":"house","ServerId":"14c3ed9fbe934608a2c76cefc70c2b28","Id":"a4cbcdf95bb34888885af6fbf5c340d1","HasPassword":true,"HasConfiguredPassword":true,"HasConfiguredEasyPassword":false,"EnableAutoLogin":false,"Configuration":{"AudioLanguagePreference":"eng","PlayDefaultAudioTrack":true,"SubtitleLanguagePreference":"eng","DisplayMissingEpisodes":false,"GroupedFolders":[],"SubtitleMode":"Default","DisplayCollectionsView":false,"EnableLocalPassword":false,"OrderedViews":[],"LatestItemsExcludes":[],"MyMediaExcludes":[],"HidePlayedInLatest":true,"RememberAudioSelections":true,"RememberSubtitleSelections":true,"EnableNextEpisodeAutoPlay":true,"CastReceiverId":"F007D354"},"Policy":{"IsAdministrator":false,"IsHidden":true,"EnableCollectionManagement":false,"EnableSubtitleManagement":false,"EnableLyricManagement":false,"IsDisabled":false,"BlockedTags":[],"AllowedTags":[],"EnableUserPreferenceAccess":false,"AccessSchedules":[],"BlockUnratedItems":[],"EnableRemoteControlOfOtherUsers":false,"EnableSharedDeviceControl":true,"EnableRemoteAccess":true,"EnableLiveTvManagement":true,"EnableLiveTvAccess":true,"EnableMediaPlayback":true,"EnableAudioPlaybackTranscoding":true,"EnableVideoPlaybackTranscoding":true,"EnablePlaybackRemuxing":true,"ForceRemoteSourceTranscoding":false,"EnableContentDeletion":false,"EnableContentDeletionFromFolders":[],"EnableContentDownloading":true,"EnableSyncTranscoding":true,"EnableMediaConversion":true,"EnabledDevices":[],"EnableAllDevices":true,"EnabledChannels":[],"EnableAllChannels":true,"EnabledFolders":[],"EnableAllFolders":true,"InvalidLoginAttemptCount":0,"LoginAttemptsBeforeLockout":5,"MaxActiveSessions":0,"EnablePublicSharing":true,"BlockedMediaFolders":[],"BlockedChannels":[],"RemoteClientBitrateLimit":0,"AuthenticationProviderId":"Jellyfin.Server.Implementations.Users.DefaultAuthenticationProvider","PasswordResetProviderId":"Jellyfin.Server.Implementations.Users.DefaultPasswordResetProvider","SyncPlayAccess":"CreateAndJoinGroups"}},{"Name":"marco","ServerId":"14c3ed9fbe934608a2c76cefc70c2b28","Id":"d787fbfc373a44119a247e7406b2721e","HasPassword":true,"HasConfiguredPassword":true,"HasConfiguredEasyPassword":false,"EnableAutoLogin":false,"LastLoginDate":"2026-05-08T02:42:06.3008852Z","LastActivityDate":"2026-05-08T02:42:06.3008852Z","Configuration":{"AudioLanguagePreference":"eng","PlayDefaultAudioTrack":true,"SubtitleLanguagePreference":"eng","DisplayMissingEpisodes":false,"GroupedFolders":[],"SubtitleMode":"Default","DisplayCollectionsView":false,"EnableLocalPassword":false,"OrderedViews":[],"LatestItemsExcludes":[],"MyMediaExcludes":[],"HidePlayedInLatest":true,"RememberAudioSelections":true,"RememberSubtitleSelections":true,"EnableNextEpisodeAutoPlay":true,"CastReceiverId":"F007D354"},"Policy":{"IsAdministrator":false,"IsHidden":true,"EnableCollectionManagement":false,"EnableSubtitleManagement":false,"EnableLyricManagement":false,"IsDisabled":false,"BlockedTags":[],"AllowedTags":[],"EnableUserPreferenceAccess":false,"AccessSchedules":[],"BlockUnratedItems":[],"EnableRemoteControlOfOtherUsers":false,"EnableSharedDeviceControl":true,"EnableRemoteAccess":true,"EnableLiveTvManagement":true,"EnableLiveTvAccess":true,"EnableMediaPlayback":true,"EnableAudioPlaybackTranscoding":true,"EnableVideoPlaybackTranscoding":true,"EnablePlaybackRemuxing":true,"ForceRemoteSourceTranscoding":false,"EnableContentDeletion":false,"EnableContentDeletionFromFolders":[],"EnableContentDownloading":true,"EnableSyncTranscoding":true,"EnableMediaConversion":true,"EnabledDevices":[],"EnableAllDevices":true,"EnabledChannels":[],"EnableAllChannels":true,"EnabledFolders":[],"EnableAllFolders":true,"InvalidLoginAttemptCount":0,"LoginAttemptsBeforeLockout":5,"MaxActiveSessions":0,"EnablePublicSharing":true,"BlockedMediaFolders":[],"BlockedChannels":[],"RemoteClientBitrateLimit":0,"AuthenticationProviderId":"Jellyfin.Server.Implementations.Users.DefaultAuthenticationProvider","PasswordResetProviderId":"Jellyfin.Server.Implementations.Users.DefaultPasswordResetProvider","SyncPlayAccess":"CreateAndJoinGroups"}},{"Name":"s8n","ServerId":"14c3ed9fbe934608a2c76cefc70c2b28","Id":"2be0f0d3fe3a45dc9298138a15a01925","HasPassword":true,"HasConfiguredPassword":true,"HasConfiguredEasyPassword":false,"EnableAutoLogin":false,"LastLoginDate":"2026-05-08T02:14:31.8869384Z","LastActivityDate":"2026-05-08T02:14:31.8869384Z","Configuration":{"AudioLanguagePreference":"eng","PlayDefaultAudioTrack":true,"SubtitleLanguagePreference":"eng","DisplayMissingEpisodes":false,"GroupedFolders":[],"SubtitleMode":"Default","DisplayCollectionsView":false,"EnableLocalPassword":false,"OrderedViews":[],"LatestItemsExcludes":[],"MyMediaExcludes":[],"HidePlayedInLatest":true,"RememberAudioSelections":true,"RememberSubtitleSelections":true,"EnableNextEpisodeAutoPlay":true,"CastReceiverId":"F007D354"},"Policy":{"IsAdministrator":true,"IsHidden":true,"EnableCollectionManagement":false,"EnableSubtitleManagement":false,"EnableLyricManagement":false,"IsDisabled":false,"BlockedTags":[],"AllowedTags":[],"EnableUserPreferenceAccess":true,"AccessSchedules":[],"BlockUnratedItems":[],"EnableRemoteControlOfOtherUsers":true,"EnableSharedDeviceControl":true,"EnableRemoteAccess":true,"EnableLiveTvManagement":true,"EnableLiveTvAccess":true,"EnableMediaPlayback":true,"EnableAudioPlaybackTranscoding":true,"EnableVideoPlaybackTranscoding":true,"EnablePlaybackRemuxing":true,"ForceRemoteSourceTranscoding":false,"EnableContentDeletion":true,"EnableContentDeletionFromFolders":[],"EnableContentDownloading":true,"EnableSyncTranscoding":true,"EnableMediaConversion":true,"EnabledDevices":[],"EnableAllDevices":true,"EnabledChannels":[],"EnableAllChannels":true,"EnabledFolders":[],"EnableAllFolders":true,"InvalidLoginAttemptCount":0,"LoginAttemptsBeforeLockout":5,"MaxActiveSessions":0,"EnablePublicSharing":true,"BlockedMediaFolders":[],"BlockedChannels":[],"RemoteClientBitrateLimit":0,"AuthenticationProviderId":"Jellyfin.Server.Implementations.Users.DefaultAuthenticationProvider","PasswordResetProviderId":"Jellyfin.Server.Implementations.Users.DefaultPasswordResetProvider","SyncPlayAccess":"CreateAndJoinGroups"}}] \ No newline at end of file