Repository: IgnisDa/ryot (language: rust)

Issue:
[FEATURE REQUEST] Tighter Plex integration/import.
The current Plex integration is good for marking things as they are being watched but it would be great to have it track all media owned on Plex and track watched/listened media even if it's been marked as watched before linking the integration (this may be best implemented with an import)

Some people have very large media collections so it's implausiblethat I will set aside a whole weekend just to manually transfer all of my shows, movies, and songs so this is the most important integration for me personally and probably other users as well.


Discussion / hints:
Notes to self:

- https://www.plexopedia.com/plex-media-server/general/plex-token#getcurrentusertoken

Fix patch:
diff --git a/Cargo.lock b/Cargo.lock
index f4bb7974ab..2491c94eca 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -48,7 +48,7 @@ dependencies = [
  "getrandom",
  "once_cell",
  "version_check",
- "zerocopy",
+ "zerocopy 0.7.35",
 ]
 
 [[package]]
@@ -68,9 +68,9 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
 
 [[package]]
 name = "allocator-api2"
-version = "0.2.18"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
+checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9"
 
 [[package]]
 name = "android-tzdata"
@@ -89,9 +89,9 @@ dependencies = [
 
 [[package]]
 name = "anstream"
-version = "0.6.17"
+version = "0.6.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -104,9 +104,9 @@ dependencies = [
 
 [[package]]
 name = "anstyle"
-version = "1.0.9"
+version = "1.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
 
 [[package]]
 name = "anstyle-parse"
@@ -138,9 +138,9 @@ dependencies = [
 
 [[package]]
 name = "anyhow"
-version = "1.0.91"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8"
+checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
 
 [[package]]
 name = "apalis"
@@ -155,9 +155,9 @@ dependencies = [
  "futures",
  "pin-project-lite",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
  "tokio",
- "tower 0.5.1",
+ "tower",
  "tracing",
  "tracing-futures",
 ]
@@ -174,8 +174,8 @@ dependencies = [
  "pin-project-lite",
  "serde",
  "serde_json",
- "thiserror",
- "tower 0.5.1",
+ "thiserror 1.0.69",
+ "tower",
  "ulid",
 ]
 
@@ -190,7 +190,7 @@ dependencies = [
  "chrono",
  "cron",
  "futures",
- "tower 0.5.1",
+ "tower",
 ]
 
 [[package]]
@@ -307,7 +307,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "serde",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -345,7 +345,7 @@ dependencies = [
  "futures-util",
  "handlebars",
  "http 1.1.0",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "log",
  "mime",
  "multer",
@@ -359,7 +359,7 @@ dependencies = [
  "serde_urlencoded",
  "static_assertions_next",
  "tempfile",
- "thiserror",
+ "thiserror 1.0.69",
  "tracing",
  "tracing-futures",
 ]
@@ -395,8 +395,8 @@ dependencies = [
  "proc-macro2",
  "quote",
  "strum",
- "syn 2.0.85",
- "thiserror",
+ "syn 2.0.90",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -418,7 +418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ef5ec94176a12a8cbe985cd73f2e54dc9c702c88c766bdef12f1f3a67cedbee1"
 dependencies = [
  "bytes",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "serde",
  "serde_json",
 ]
@@ -451,7 +451,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -462,7 +462,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -526,9 +526,9 @@ dependencies = [
 
 [[package]]
 name = "aws-sdk-s3"
-version = "1.58.0"
+version = "1.63.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0656a79cf5e6ab0d4bb2465cd750a7a2fd7ea26c062183ed94225f5782e22365"
+checksum = "f43850204a109a5eea1ea93951cf0440268cef98b0d27dfef4534949e23735f7"
 dependencies = [
  "aws-credential-types",
  "aws-runtime",
@@ -689,9 +689,9 @@ dependencies = [
 
 [[package]]
 name = "aws-smithy-runtime-api"
-version = "1.7.2"
+version = "1.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e086682a53d3aa241192aa110fa8dfce98f2f5ac2ead0de84d41582c7e8fdb96"
+checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd"
 dependencies = [
  "aws-smithy-async",
  "aws-smithy-types",
@@ -706,9 +706,9 @@ dependencies = [
 
 [[package]]
 name = "aws-smithy-types"
-version = "1.2.8"
+version = "1.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07c9cdc179e6afbf5d391ab08c85eac817b51c87e1892a5edb5f7bbdc64314b4"
+checksum = "4fbd94a32b3a7d55d3806fe27d98d3ad393050439dd05eb53ece36ec5e3d3510"
 dependencies = [
  "base64-simd",
  "bytes",
@@ -755,9 +755,9 @@ dependencies = [
 
 [[package]]
 name = "axum"
-version = "0.7.7"
+version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae"
+checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
 dependencies = [
  "async-trait",
  "axum-core",
@@ -768,7 +768,7 @@ dependencies = [
  "http 1.1.0",
  "http-body 1.0.1",
  "http-body-util",
- "hyper 1.5.0",
+ "hyper 1.5.1",
  "hyper-util",
  "itoa",
  "matchit",
@@ -783,10 +783,10 @@ dependencies = [
  "serde_path_to_error",
  "serde_urlencoded",
  "sha1",
- "sync_wrapper 1.0.1",
+ "sync_wrapper 1.0.2",
  "tokio",
  "tokio-tungstenite",
- "tower 0.5.1",
+ "tower",
  "tower-layer",
  "tower-service",
  "tracing",
@@ -807,7 +807,7 @@ dependencies = [
  "mime",
  "pin-project-lite",
  "rustversion",
- "sync_wrapper 1.0.1",
+ "sync_wrapper 1.0.2",
  "tower-layer",
  "tower-service",
  "tracing",
@@ -821,7 +821,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -876,7 +876,7 @@ dependencies = [
  "statistics-service",
  "supporting-service",
  "tokio",
- "tower 0.4.13",
+ "tower",
  "tower-http",
  "tracing",
  "tracing-subscriber",
@@ -1052,9 +1052,9 @@ dependencies = [
 
 [[package]]
 name = "borsh"
-version = "1.5.1"
+version = "1.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed"
+checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03"
 dependencies = [
  "borsh-derive",
  "cfg_aliases",
@@ -1062,16 +1062,15 @@ dependencies = [
 
 [[package]]
 name = "borsh-derive"
-version = "1.5.1"
+version = "1.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b"
+checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244"
 dependencies = [
  "once_cell",
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
- "syn_derive",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1110,9 +1109,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.8.0"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da"
+checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
 dependencies = [
  "serde",
 ]
@@ -1153,9 +1152,9 @@ dependencies = [
 
 [[package]]
 name = "cc"
-version = "1.1.31"
+version = "1.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f"
+checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc"
 dependencies = [
  "shlex",
 ]
@@ -1195,7 +1194,7 @@ checksum = "cd6dd8046d00723a59a2f8c5f295c515b9bb9a331ee4f8f3d4dd49e428acd3b6"
 dependencies = [
  "chrono",
  "chrono-tz-build",
- "phf 0.11.2",
+ "phf",
 ]
 
 [[package]]
@@ -1205,7 +1204,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e94fea34d77a245229e7746bd2beb786cd2a896f306ff491fb8cecb3074b10a7"
 dependencies = [
  "parse-zoneinfo",
- "phf_codegen 0.11.2",
+ "phf_codegen",
 ]
 
 [[package]]
@@ -1220,9 +1219,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "4.5.20"
+version = "4.5.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8"
+checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -1230,9 +1229,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.5.20"
+version = "4.5.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54"
+checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec"
 dependencies = [
  "anstream",
  "anstyle",
@@ -1249,14 +1248,14 @@ dependencies = [
  "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.7.2"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
+checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7"
 
 [[package]]
 name = "collection-resolver"
@@ -1346,6 +1345,7 @@ dependencies = [
  "chrono",
  "compile-time",
  "const-str",
+ "enums",
  "env-utils",
  "reqwest 0.12.9",
  "serde",
@@ -1438,9 +1438,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.14"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0"
+checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
 dependencies = [
  "libc",
 ]
@@ -1549,14 +1549,14 @@ dependencies = [
 
 [[package]]
 name = "cssparser"
-version = "0.31.2"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b3df4f93e5fbbe73ec01ec8d3f68bba73107993a5b1e7519273c32db9b0d5be"
+checksum = "b7c66d1cd8ed61bf80b38432613a7a2f09401ab8d0501110655f8b341484a3e3"
 dependencies = [
  "cssparser-macros",
  "dtoa-short",
  "itoa",
- "phf 0.11.2",
+ "phf",
  "smallvec",
 ]
 
@@ -1567,14 +1567,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
 dependencies = [
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "csv"
-version = "1.3.0"
+version = "1.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe"
+checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf"
 dependencies = [
  "csv-core",
  "itoa",
@@ -1615,7 +1615,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1639,7 +1639,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "strsim",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1650,7 +1650,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
 dependencies = [
  "darling_core",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1734,6 +1734,7 @@ dependencies = [
  "schematic",
  "serde",
  "serde_with 3.11.0",
+ "strum",
 ]
 
 [[package]]
@@ -1809,7 +1810,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1829,7 +1830,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1911,7 +1912,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1943,12 +1944,13 @@ dependencies = [
 
 [[package]]
 name = "duplicate"
-version = "1.0.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb"
+checksum = "97af9b5f014e228b33e77d75ee0e6e87960124f0f4b16337b586a6bec91867b1"
 dependencies = [
- "heck 0.4.1",
- "proc-macro-error",
+ "heck 0.5.0",
+ "proc-macro2",
+ "proc-macro2-diagnostics",
 ]
 
 [[package]]
@@ -2016,14 +2018,14 @@ dependencies = [
  "enum-ordinalize",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "ego-tree"
-version = "0.6.3"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12a0bb14ac04a9fcf170d0bbbef949b44cc492f4452bd20c095636956f653642"
+checksum = "7c6ba7d4eec39eaa9ab24d44a0e73a7949a1095a8b3f3abb11eddf27dbb56a53"
 
 [[package]]
 name = "either"
@@ -2077,9 +2079,9 @@ dependencies = [
 
 [[package]]
 name = "email-encoding"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60d1d33cdaede7e24091f039632eb5d3c7469fe5b066a985281a34fc70fa317f"
+checksum = "ea3d894bbbab314476b265f9b2d46bf24b123a36dd0e96b06a1b49545b9d9dcc"
 dependencies = [
  "base64 0.22.1",
  "memchr",
@@ -2123,7 +2125,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -2160,12 +2162,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.9"
+version = "0.3.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
 dependencies = [
  "libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -2260,9 +2262,9 @@ dependencies = [
 
 [[package]]
 name = "fastrand"
-version = "2.1.1"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
+checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4"
 
 [[package]]
 name = "ff"
@@ -2356,7 +2358,6 @@ dependencies = [
  "dependent-utils",
  "enums",
  "fitness-models",
- "itertools 0.13.0",
  "migrations",
  "nanoid",
  "reqwest 0.12.9",
@@ -2369,9 +2370,9 @@ dependencies = [
 
 [[package]]
 name = "flate2"
-version = "1.0.34"
+version = "1.0.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
+checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
 dependencies = [
  "crc32fast",
  "miniz_oxide",
@@ -2501,9 +2502,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
 
 [[package]]
 name = "futures-lite"
-version = "2.3.0"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
+checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1"
 dependencies = [
  "fastrand",
  "futures-core",
@@ -2520,7 +2521,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -2599,7 +2600,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -2663,7 +2664,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d2ebc8013b4426d5b81a4364c419a95ed0b404af2b82e2457de52d9348f0e474"
 dependencies = [
  "combine 3.8.1",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -2739,7 +2740,7 @@ dependencies = [
  "futures-sink",
  "futures-util",
  "http 0.2.12",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "slab",
  "tokio",
  "tokio-util",
@@ -2748,9 +2749,9 @@ dependencies = [
 
 [[package]]
 name = "h2"
-version = "0.4.6"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
+checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
 dependencies = [
  "atomic-waker",
  "bytes",
@@ -2758,7 +2759,7 @@ dependencies = [
  "futures-core",
  "futures-sink",
  "http 1.1.0",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "slab",
  "tokio",
  "tokio-util",
@@ -2776,7 +2777,7 @@ dependencies = [
  "pest_derive",
  "serde",
  "serde_json",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -2806,9 +2807,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.15.0"
+version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
 dependencies = [
  "allocator-api2",
  "equivalent",
@@ -2836,12 +2837,6 @@ version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
-[[package]]
-name = "hermit-abi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
-
 [[package]]
 name = "hermit-abi"
 version = "0.4.0"
@@ -2894,16 +2889,16 @@ dependencies = [
 
 [[package]]
 name = "html5ever"
-version = "0.27.0"
+version = "0.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4"
+checksum = "2e15626aaf9c351bc696217cbe29cb9b5e86c43f8a46b5e2f5c6c5cf7cb904ce"
 dependencies = [
  "log",
  "mac",
  "markup5ever",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3018,14 +3013,14 @@ dependencies = [
 
 [[package]]
 name = "hyper"
-version = "1.5.0"
+version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
+checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f"
 dependencies = [
  "bytes",
  "futures-channel",
  "futures-util",
- "h2 0.4.6",
+ "h2 0.4.7",
  "http 1.1.0",
  "http-body 1.0.1",
  "httparse",
@@ -3061,9 +3056,9 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333"
 dependencies = [
  "futures-util",
  "http 1.1.0",
- "hyper 1.5.0",
+ "hyper 1.5.1",
  "hyper-util",
- "rustls 0.23.16",
+ "rustls 0.23.19",
  "rustls-pki-types",
  "tokio",
  "tokio-rustls 0.26.0",
@@ -3091,7 +3086,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
 dependencies = [
  "bytes",
  "http-body-util",
- "hyper 1.5.0",
+ "hyper 1.5.1",
  "hyper-util",
  "native-tls",
  "tokio",
@@ -3110,7 +3105,7 @@ dependencies = [
  "futures-util",
  "http 1.1.0",
  "http-body 1.0.1",
- "hyper 1.5.0",
+ "hyper 1.5.1",
  "pin-project-lite",
  "socket2",
  "tokio",
@@ -3256,7 +3251,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3267,24 +3262,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
 
 [[package]]
 name = "idna"
-version = "0.5.0"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
 dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
 ]
 
 [[package]]
-name = "idna"
-version = "1.0.2"
+name = "idna_adapter"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd69211b9b519e98303c015e21a007e293db403b6c85b9b124e133d25e242cdd"
+checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
 dependencies = [
  "icu_normalizer",
  "icu_properties",
- "smallvec",
- "utf8_iter",
 ]
 
 [[package]]
@@ -3334,10 +3328,11 @@ dependencies = [
  "fitness-models",
  "flate2",
  "importer-models",
+ "indexmap 2.7.0",
  "itertools 0.13.0",
  "media-models",
+ "nanoid",
  "providers",
- "regex",
  "reqwest 0.12.9",
  "rust_decimal",
  "rust_decimal_macros",
@@ -3365,12 +3360,12 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.6.0"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
+checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
 dependencies = [
  "equivalent",
- "hashbrown 0.15.0",
+ "hashbrown 0.15.2",
  "serde",
 ]
 
@@ -3388,7 +3383,7 @@ checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3441,7 +3436,7 @@ version = "0.4.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b"
 dependencies = [
- "hermit-abi 0.4.0",
+ "hermit-abi",
  "libc",
  "windows-sys 0.52.0",
 ]
@@ -3464,7 +3459,7 @@ version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fe50d48c77760c55188549098b9a7f6e37ae980c586a24693d6b01c3b2010c3c"
 dependencies = [
- "phf 0.11.2",
+ "phf",
 ]
 
 [[package]]
@@ -3496,15 +3491,15 @@ dependencies = [
 
 [[package]]
 name = "itoa"
-version = "1.0.11"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
 
 [[package]]
 name = "js-sys"
-version = "0.3.72"
+version = "0.3.73"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9"
+checksum = "fb15147158e79fd8b8afd0252522769c4f48725460b37338544d8379d94fc8f9"
 dependencies = [
  "wasm-bindgen",
 ]
@@ -3557,7 +3552,7 @@ dependencies = [
  "futures-util",
  "hostname",
  "httpdate",
- "idna 1.0.2",
+ "idna",
  "mime",
  "native-tls",
  "nom",
@@ -3570,9 +3565,9 @@ dependencies = [
 
 [[package]]
 name = "libc"
-version = "0.2.161"
+version = "0.2.167"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
+checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc"
 
 [[package]]
 name = "libm"
@@ -3609,9 +3604,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
 
 [[package]]
 name = "litemap"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
+checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
 
 [[package]]
 name = "lock_api"
@@ -3645,7 +3640,7 @@ version = "0.12.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
 dependencies = [
- "hashbrown 0.15.0",
+ "hashbrown 0.15.2",
 ]
 
 [[package]]
@@ -3665,13 +3660,13 @@ dependencies = [
 
 [[package]]
 name = "markup5ever"
-version = "0.12.1"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45"
+checksum = "82c88c6129bd24319e62a0359cb6b958fa7e8be6e19bb1663bc396b90883aca5"
 dependencies = [
  "log",
- "phf 0.11.2",
- "phf_codegen 0.11.2",
+ "phf",
+ "phf_codegen",
  "string_cache",
  "string_cache_codegen",
  "tendril",
@@ -3729,25 +3724,25 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
 
 [[package]]
 name = "miette"
-version = "7.2.0"
+version = "7.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1"
+checksum = "317f146e2eb7021892722af37cf1b971f0a70c8406f487e24952667616192c64"
 dependencies = [
  "cfg-if",
  "miette-derive",
- "thiserror",
+ "thiserror 1.0.69",
  "unicode-width",
 ]
 
 [[package]]
 name = "miette-derive"
-version = "7.2.0"
+version = "7.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c"
+checksum = "23c9b935fbe1d6cbd1dac857b54a688145e2d93f48db36010514d0f612d0ad67"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3794,11 +3789,10 @@ dependencies = [
 
 [[package]]
 name = "mio"
-version = "1.0.2"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
+checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
 dependencies = [
- "hermit-abi 0.3.9",
  "libc",
  "wasi",
  "windows-sys 0.52.0",
@@ -4020,7 +4014,7 @@ dependencies = [
  "serde_json",
  "serde_path_to_error",
  "sha2",
- "thiserror",
+ "thiserror 1.0.69",
  "url",
 ]
 
@@ -4067,7 +4061,7 @@ dependencies = [
  "serde_with 3.11.0",
  "sha2",
  "subtle",
- "thiserror",
+ "thiserror 1.0.69",
  "url",
 ]
 
@@ -4094,7 +4088,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -4161,7 +4155,7 @@ dependencies = [
  "proc-macro2",
  "proc-macro2-diagnostics",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -4300,7 +4294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442"
 dependencies = [
  "memchr",
- "thiserror",
+ "thiserror 1.0.69",
  "ucd-trie",
 ]
 
@@ -4324,7 +4318,7 @@ dependencies = [
  "pest_meta",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -4338,15 +4332,6 @@ dependencies = [
  "sha2",
 ]
 
-[[package]]
-name = "phf"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
-dependencies = [
- "phf_shared 0.10.0",
-]
-
 [[package]]
 name = "phf"
 version = "0.11.2"
@@ -4357,16 +4342,6 @@ dependencies = [
  "phf_shared 0.11.2",
 ]
 
-[[package]]
-name = "phf_codegen"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
-dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
-]
-
 [[package]]
 name = "phf_codegen"
 version = "0.11.2"
@@ -4407,7 +4382,7 @@ dependencies = [
  "phf_shared 0.11.2",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -4445,7 +4420,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -4509,7 +4484,7 @@ version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
 dependencies = [
- "zerocopy",
+ "zerocopy 0.7.35",
 ]
 
 [[package]]
@@ -4550,30 +4525,6 @@ dependencies = [
  "toml_edit",
 ]
 
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
 [[package]]
 name = "proc-macro-error-attr2"
 version = "2.0.0"
@@ -4593,14 +4544,14 @@ dependencies = [
  "proc-macro-error-attr2",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.89"
+version = "1.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
 dependencies = [
  "unicode-ident",
 ]
@@ -4613,7 +4564,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
  "version_check",
  "yansi",
 ]
@@ -4642,7 +4593,7 @@ dependencies = [
  "itertools 0.13.0",
  "media-models",
  "paginate",
- "rand 0.9.0-alpha.2",
+ "rand 0.9.0-beta.0",
  "reqwest 0.12.9",
  "rust_decimal",
  "rust_decimal_macros",
@@ -4659,9 +4610,9 @@ dependencies = [
 
 [[package]]
 name = "psm"
-version = "0.1.23"
+version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205"
+checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810"
 dependencies = [
  "cc",
 ]
@@ -4735,13 +4686,13 @@ dependencies = [
 
 [[package]]
 name = "rand"
-version = "0.9.0-alpha.2"
+version = "0.9.0-beta.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3e256ff62cee3e03def855c4d4260106d2bb1696fdc01af03e9935b993720a5"
+checksum = "64535f75665ca4111b59c1b2c9eb99358dc57c3775cc3379675c11dca030f81a"
 dependencies = [
- "rand_chacha 0.9.0-alpha.2",
- "rand_core 0.9.0-alpha.2",
- "zerocopy",
+ "rand_chacha 0.9.0-beta.0",
+ "rand_core 0.9.0-beta.0",
+ "zerocopy 0.8.11",
 ]
 
 [[package]]
@@ -4756,12 +4707,12 @@ dependencies = [
 
 [[package]]
 name = "rand_chacha"
-version = "0.9.0-alpha.2"
+version = "0.9.0-beta.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d299e9db34f6623b2a9e86c015d6e173d5f46d64d4b9b8cc46ae8a982a50b04c"
+checksum = "6ae4df114eac4201e5830fbecc6b8f775425e5782ac6741f5ba2c8d5e7861136"
 dependencies = [
  "ppv-lite86",
- "rand_core 0.9.0-alpha.2",
+ "rand_core 0.9.0-beta.0",
 ]
 
 [[package]]
@@ -4775,12 +4726,12 @@ dependencies = [
 
 [[package]]
 name = "rand_core"
-version = "0.9.0-alpha.2"
+version = "0.9.0-beta.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4e93f5a5e3c528cda9acb0928c31b2ba868c551cc46e67b778075e34aab9906"
+checksum = "faff9cb0513c709c88c66ba1c44e7dfb0e6343494c57576614524400ee60d7cb"
 dependencies = [
  "getrandom",
- "zerocopy",
+ "zerocopy 0.8.11",
 ]
 
 [[package]]
@@ -4823,7 +4774,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
 dependencies = [
  "getrandom",
  "libredox",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -4834,7 +4785,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-automata 0.4.8",
+ "regex-automata 0.4.9",
  "regex-syntax 0.8.5",
 ]
 
@@ -4849,9 +4800,9 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.8"
+version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
+checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -4942,11 +4893,11 @@ dependencies = [
  "futures-channel",
  "futures-core",
  "futures-util",
- "h2 0.4.6",
+ "h2 0.4.7",
  "http 1.1.0",
  "http-body 1.0.1",
  "http-body-util",
- "hyper 1.5.0",
+ "hyper 1.5.1",
  "hyper-rustls 0.27.3",
  "hyper-tls 0.6.0",
  "hyper-util",
@@ -4963,7 +4914,7 @@ dependencies = [
  "serde",
  "serde_json",
  "serde_urlencoded",
- "sync_wrapper 1.0.1",
+ "sync_wrapper 1.0.2",
  "system-configuration 0.6.1",
  "tokio",
  "tokio-native-tls",
@@ -5059,9 +5010,9 @@ dependencies = [
 
 [[package]]
 name = "rsa"
-version = "0.9.6"
+version = "0.9.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519"
 dependencies = [
  "const-oid",
  "digest 0.10.7",
@@ -5110,7 +5061,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dd3126eab517ef8ca4761a366cb0d55e1bf5ab9c7b7f18301d712a57de000a90"
 dependencies = [
  "js-sys",
- "phf 0.11.2",
+ "phf",
  "prettytable-rs",
  "wasm-bindgen",
 ]
@@ -5132,9 +5083,9 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.38.38"
+version = "0.38.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a"
+checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6"
 dependencies = [
  "bitflags 2.6.0",
  "errno",
@@ -5157,9 +5108,9 @@ dependencies = [
 
 [[package]]
 name = "rustls"
-version = "0.23.16"
+version = "0.23.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e"
+checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1"
 dependencies = [
  "once_cell",
  "ring",
@@ -5240,21 +5191,21 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
 [[package]]
 name = "schannel"
-version = "0.1.26"
+version = "0.1.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1"
+checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
 dependencies = [
  "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "schematic"
-version = "0.17.5"
+version = "0.17.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9803bd9e6cccb1cc9cec6943f34ba93aa6cf7b6f183ee20a43457934dbc2b686"
+checksum = "8ef9a634be1649ec5f5516e39eb78d2e84fcf5eef3792acae353d8ade6a7b391"
 dependencies = [
  "garde",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "miette",
  "reqwest 0.12.9",
  "schematic_macros",
@@ -5264,32 +5215,32 @@ dependencies = [
  "serde_path_to_error",
  "serde_yaml",
  "starbase_styles",
- "thiserror",
+ "thiserror 2.0.3",
  "toml",
  "tracing",
 ]
 
 [[package]]
 name = "schematic_macros"
-version = "0.17.3"
+version = "0.17.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "641ca4c08e2735689cbc88901b755a806cbdb328a5dbddcd9176ec6de2ce59b0"
+checksum = "26d2d4005b3b6482801d60ba093c550d25382401e0c4d1c3fbba80eb07e28626"
 dependencies = [
  "convert_case",
  "darling",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "schematic_types"
-version = "0.9.4"
+version = "0.9.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baae6c4555fd2a9cad6b1675fde90c8c3eff3772a1053b251d6ff0d547852e1f"
+checksum = "f320deb050277c5bcc79213b01d749f8a847a63713e76d5748fdad654f47ed52"
 dependencies = [
  "chrono",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "rust_decimal",
  "serde_json",
  "serde_yaml",
@@ -5304,16 +5255,16 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 [[package]]
 name = "scraper"
-version = "0.20.0"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b90460b31bfe1fc07be8262e42c665ad97118d4585869de9345a84d501a9eaf0"
+checksum = "b0e749d29b2064585327af5038a5a8eb73aeebad4a3472e83531a436563f7208"
 dependencies = [
  "ahash 0.8.11",
  "cssparser",
  "ego-tree",
  "getopts",
  "html5ever",
- "once_cell",
+ "precomputed-hash",
  "selectors",
  "tendril",
 ]
@@ -5338,14 +5289,14 @@ dependencies = [
  "proc-macro-error2",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "sea-orm"
-version = "1.1.0"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c4872675cc5d5d399a2a202c60f3a393ec8d3f3307c36adb166517f348e4db5"
+checksum = "d5680a8b686985116607ef5f5af2b1f9e1cc2c228330e93101816a0baa279afa"
 dependencies = [
  "async-stream",
  "async-trait",
@@ -5362,7 +5313,7 @@ dependencies = [
  "serde_json",
  "sqlx",
  "strum",
- "thiserror",
+ "thiserror 1.0.69",
  "time",
  "tracing",
  "url",
@@ -5371,9 +5322,9 @@ dependencies = [
 
 [[package]]
 name = "sea-orm-cli"
-version = "1.1.0"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0aefbd960c9ed7b2dfbab97b11890f5d8c314ad6e2f68c7b36c73ea0967fcc25"
+checksum = "70a157f42d291ccbd6e913b9d9b12dbe2ccbcf0472efc60c8715dd1254083aec"
 dependencies = [
  "chrono",
  "clap",
@@ -5388,23 +5339,23 @@ dependencies = [
 
 [[package]]
 name = "sea-orm-macros"
-version = "1.1.0"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85f714906b72e7265c0b2077d0ad8f235dabebda513c92f1326d5d40cef0dd01"
+checksum = "3a239e3bb1b566ad4ec2654d0d193d6ceddfd733487edc9c21a64d214c773910"
 dependencies = [
  "heck 0.4.1",
  "proc-macro2",
  "quote",
  "sea-bae",
- "syn 2.0.85",
+ "syn 2.0.90",
  "unicode-ident",
 ]
 
 [[package]]
 name = "sea-orm-migration"
-version = "1.1.0"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa7bbfbe3bec60b5925193acc9c98b9f8ae9853f52c8004df0c1ea5193c01ea0"
+checksum = "63ba07e9f2479cc671758fcb1edee42ff2e32c34b3e67ab41d0af1e41f73c74e"
 dependencies = [
  "async-trait",
  "clap",
@@ -5456,8 +5407,8 @@ dependencies = [
  "heck 0.4.1",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
- "thiserror",
+ "syn 2.0.90",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -5480,7 +5431,7 @@ dependencies = [
  "heck 0.4.1",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -5532,9 +5483,9 @@ dependencies = [
 
 [[package]]
 name = "security-framework-sys"
-version = "2.12.0"
+version = "2.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6"
+checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -5542,9 +5493,9 @@ dependencies = [
 
 [[package]]
 name = "selectors"
-version = "0.25.0"
+version = "0.26.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06"
+checksum = "fd568a4c9bb598e291a08244a5c1f5a8a6650bee243b5b0f8dbb3d9cc1d87fe8"
 dependencies = [
  "bitflags 2.6.0",
  "cssparser",
@@ -5552,8 +5503,8 @@ dependencies = [
  "fxhash",
  "log",
  "new_debug_unreachable",
- "phf 0.10.1",
- "phf_codegen 0.10.0",
+ "phf",
+ "phf_codegen",
  "precomputed-hash",
  "servo_arc",
  "smallvec",
@@ -5567,9 +5518,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 
 [[package]]
 name = "serde"
-version = "1.0.214"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5"
+checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
 dependencies = [
  "serde_derive",
 ]
@@ -5592,28 +5543,28 @@ checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782"
 dependencies = [
  "log",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
  "xml-rs",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.214"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766"
+checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.132"
+version = "1.0.133"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
+checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
 dependencies = [
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "itoa",
  "memchr",
  "ryu",
@@ -5686,7 +5637,7 @@ dependencies = [
  "chrono",
  "hex",
  "indexmap 1.9.3",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "serde",
  "serde_derive",
  "serde_json",
@@ -5703,7 +5654,7 @@ dependencies = [
  "darling",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -5715,7 +5666,7 @@ dependencies = [
  "darling",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -5724,7 +5675,7 @@ version = "0.9.34+deprecated"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
 dependencies = [
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "itoa",
  "ryu",
  "serde",
@@ -5733,9 +5684,9 @@ dependencies = [
 
 [[package]]
 name = "servo_arc"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d036d71a959e00c77a63538b90a6c2390969f9772b096ea837205c6bd0491a44"
+checksum = "ae65c4249478a2647db249fb43e23cec56a2c8974a427e7bd8cb5a1d0964921a"
 dependencies = [
  "stable_deref_trait",
 ]
@@ -5854,9 +5805,9 @@ dependencies = [
 
 [[package]]
 name = "socket2"
-version = "0.5.7"
+version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
+checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
 dependencies = [
  "libc",
  "windows-sys 0.52.0",
@@ -5959,7 +5910,7 @@ dependencies = [
  "hashbrown 0.14.5",
  "hashlink",
  "hex",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "log",
  "memchr",
  "native-tls",
@@ -5967,20 +5918,20 @@ dependencies = [
  "paste",
  "percent-encoding",
  "rust_decimal",
- "rustls 0.23.16",
+ "rustls 0.23.19",
  "rustls-pemfile 2.2.0",
  "serde",
  "serde_json",
  "sha2",
  "smallvec",
  "sqlformat",
- "thiserror",
+ "thiserror 1.0.69",
  "tokio",
  "tokio-stream",
  "tracing",
  "url",
  "uuid",
- "webpki-roots 0.26.6",
+ "webpki-roots 0.26.7",
 ]
 
 [[package]]
@@ -5993,7 +5944,7 @@ dependencies = [
  "quote",
  "sqlx-core",
  "sqlx-macros-core",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -6016,7 +5967,7 @@ dependencies = [
  "sqlx-mysql",
  "sqlx-postgres",
  "sqlx-sqlite",
- "syn 2.0.85",
+ "syn 2.0.90",
  "tempfile",
  "tokio",
  "url",
@@ -6061,7 +6012,7 @@ dependencies = [
  "smallvec",
  "sqlx-core",
  "stringprep",
- "thiserror",
+ "thiserror 1.0.69",
  "tracing",
  "uuid",
  "whoami",
@@ -6102,7 +6053,7 @@ dependencies = [
  "smallvec",
  "sqlx-core",
  "stringprep",
- "thiserror",
+ "thiserror 1.0.69",
  "tracing",
  "uuid",
  "whoami",
@@ -6154,9 +6105,9 @@ dependencies = [
 
 [[package]]
 name = "starbase_styles"
-version = "0.4.4"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49d8a8222c97b23595fe393ac35d62b88942bdc7e89c8c88736d9ea2c986dbae"
+checksum = "b1664b29d64bf37a14a0f50ae4c1568eb712c7eb28fb489aabac81c36e5558c1"
 dependencies = [
  "dirs",
  "owo-colors",
@@ -6262,19 +6213,19 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "struson"
-version = "0.5.0"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd1ac2aafe0de8ac5f0daf57eab7d8e986724237e03b3092dbb47b867b9c4a76"
+checksum = "18c68ef850864c0fa120c07a17d6369ec4df02a33cad4aa593e0e0566e031bda"
 dependencies = [
  "duplicate",
  "serde",
  "strum",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -6300,9 +6251,9 @@ dependencies = [
 
 [[package]]
 name = "supports-color"
-version = "3.0.1"
+version = "3.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8775305acf21c96926c900ad056abeef436701108518cf890020387236ac5a77"
+checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6"
 dependencies = [
  "is_ci",
 ]
@@ -6320,27 +6271,15 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.85"
+version = "2.0.90"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56"
+checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
 dependencies = [
  "proc-macro2",
  "quote",
  "unicode-ident",
 ]
 
-[[package]]
-name = "syn_derive"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
-dependencies = [
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn 2.0.85",
-]
-
 [[package]]
 name = "sync_wrapper"
 version = "0.1.2"
@@ -6349,9 +6288,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
 
 [[package]]
 name = "sync_wrapper"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
 dependencies = [
  "futures-core",
 ]
@@ -6364,7 +6303,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -6417,9 +6356,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
 
 [[package]]
 name = "tempfile"
-version = "3.13.0"
+version = "3.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
+checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c"
 dependencies = [
  "cfg-if",
  "fastrand",
@@ -6452,22 +6391,42 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.65"
+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.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa"
+dependencies = [
+ "thiserror-impl 2.0.3",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
 dependencies = [
- "thiserror-impl",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.65"
+version = "2.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
+checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -6538,9 +6497,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.41.0"
+version = "1.41.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb"
+checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33"
 dependencies = [
  "backtrace",
  "bytes",
@@ -6562,7 +6521,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -6602,7 +6561,7 @@ version = "0.26.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
 dependencies = [
- "rustls 0.23.16",
+ "rustls 0.23.19",
  "rustls-pki-types",
  "tokio",
 ]
@@ -6632,9 +6591,9 @@ dependencies = [
 
 [[package]]
 name = "tokio-util"
-version = "0.7.11"
+version = "0.7.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
+checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a"
 dependencies = [
  "bytes",
  "futures-core",
@@ -6671,28 +6630,13 @@ version = "0.22.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
 dependencies = [
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
  "serde",
  "serde_spanned",
  "toml_datetime",
  "winnow",
 ]
 
-[[package]]
-name = "tower"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
- "tokio-util",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
 [[package]]
 name = "tower"
 version = "0.5.1"
@@ -6712,9 +6656,9 @@ dependencies = [
 
 [[package]]
 name = "tower-http"
-version = "0.5.2"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
+checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697"
 dependencies = [
  "bitflags 2.6.0",
  "bytes",
@@ -6742,9 +6686,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
 
 [[package]]
 name = "tracing"
-version = "0.1.40"
+version = "0.1.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
 dependencies = [
  "log",
  "pin-project-lite",
@@ -6754,20 +6698,20 @@ dependencies = [
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
 dependencies = [
  "once_cell",
  "valuable",
@@ -6798,9 +6742,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-subscriber"
-version = "0.3.18"
+version = "0.3.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
 dependencies = [
  "matchers",
  "nu-ansi-term",
@@ -6853,7 +6797,7 @@ dependencies = [
  "log",
  "rand 0.8.5",
  "sha1",
- "thiserror",
+ "thiserror 1.0.69",
  "utf-8",
 ]
 
@@ -6900,9 +6844,9 @@ checksum = "10103c57044730945224467c09f71a4db0071c123a0648cc3e818913bde6b561"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.13"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
+checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
 
 [[package]]
 name = "unicode-normalization"
@@ -6972,12 +6916,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
 
 [[package]]
 name = "url"
-version = "2.5.2"
+version = "2.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
+checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
 dependencies = [
  "form_urlencoded",
- "idna 0.5.0",
+ "idna",
  "percent-encoding",
  "serde",
 ]
@@ -7127,9 +7071,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.95"
+version = "0.2.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e"
+checksum = "21d3b25c3ea1126a2ad5f4f9068483c2af1e64168f847abe863a526b8dbfe00b"
 dependencies = [
  "cfg-if",
  "once_cell",
@@ -7138,36 +7082,37 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.95"
+version = "0.2.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358"
+checksum = "52857d4c32e496dc6537646b5b117081e71fd2ff06de792e3577a150627db283"
 dependencies = [
  "bumpalo",
  "log",
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.45"
+version = "0.4.46"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b"
+checksum = "951fe82312ed48443ac78b66fa43eded9999f738f6022e67aead7b708659e49a"
 dependencies = [
  "cfg-if",
  "js-sys",
+ "once_cell",
  "wasm-bindgen",
  "web-sys",
 ]
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.95"
+version = "0.2.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56"
+checksum = "920b0ffe069571ebbfc9ddc0b36ba305ef65577c94b06262ed793716a1afd981"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -7175,22 +7120,22 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.95"
+version = "0.2.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
+checksum = "bf59002391099644be3524e23b781fa43d2be0c5aa0719a18c0731b9d195cab6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.95"
+version = "0.2.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
+checksum = "e5047c5392700766601942795a436d7d2599af60dcc3cc1248c9120bfb0827b0"
 
 [[package]]
 name = "wasm-streams"
@@ -7207,9 +7152,9 @@ dependencies = [
 
 [[package]]
 name = "web-sys"
-version = "0.3.72"
+version = "0.3.73"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112"
+checksum = "476364ff87d0ae6bfb661053a9104ab312542658c3d8f963b7ace80b6f9b26b9"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -7233,9 +7178,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
 
 [[package]]
 name = "webpki-roots"
-version = "0.26.6"
+version = "0.26.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958"
+checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e"
 dependencies = [
  "rustls-pki-types",
 ]
@@ -7511,9 +7456,9 @@ dependencies = [
 
 [[package]]
 name = "xml-rs"
-version = "0.8.22"
+version = "0.8.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26"
+checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f"
 
 [[package]]
 name = "xmlparser"
@@ -7529,9 +7474,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
 
 [[package]]
 name = "yoke"
-version = "0.7.4"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5"
+checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
 dependencies = [
  "serde",
  "stable_deref_trait",
@@ -7541,13 +7486,13 @@ dependencies = [
 
 [[package]]
 name = "yoke-derive"
-version = "0.7.4"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
+checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
  "synstructure",
 ]
 
@@ -7558,7 +7503,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
 dependencies = [
  "byteorder",
- "zerocopy-derive",
+ "zerocopy-derive 0.7.35",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cce3b5629d87654b53a49002acc2ce64aa5aa7255f5c718374a37ac7fd98c218"
+dependencies = [
+ "zerocopy-derive 0.8.11",
 ]
 
 [[package]]
@@ -7569,27 +7523,38 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74a82c26c3986af2623ec9eb890ff4aa19c006e30a1133dc9bd1830ec1612e20"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "zerofrom"
-version = "0.1.4"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55"
+checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
 dependencies = [
  "zerofrom-derive",
 ]
 
 [[package]]
 name = "zerofrom-derive"
-version = "0.1.4"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
+checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
  "synstructure",
 ]
 
@@ -7618,5 +7583,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.85",
+ "syn 2.0.90",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 17a46b52d0..60dfb076a5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -47,7 +47,8 @@ members = [
 resolver = "2"
 
 [workspace.dependencies]
-anyhow = "=1.0.91"
+askama = "0.12.1"
+anyhow = "=1.0.93"
 apalis = { version = "=0.5.5", features = ["cron", "limit"] }
 argon2 = "=0.6.0-pre.1"
 async-graphql = { version = "=7.0.11", features = [
@@ -56,35 +57,56 @@ async-graphql = { version = "=7.0.11", features = [
     "log",
     "tracing",
 ] }
+async-graphql-axum = "=7.0.11"
 async-trait = "=0.1.83"
-aws-sdk-s3 = { version = "=1.58.0", features = ["behavior-version-latest"] }
-axum = { version = "=0.7.7", features = ["macros", "multipart"] }
+aws-sdk-s3 = { version = "=1.63.0", features = ["behavior-version-latest"] }
+axum = { version = "=0.7.9", features = ["macros", "multipart"] }
 boilermates = "=0.3.0"
 chrono = "=0.4.38"
 chrono-tz = "=0.10.0"
+compile-time = "=0.2.0"
 const-str = "=0.5.7"
 convert_case = "=0.6.0"
+csv = "=1.3.1"
+data-encoding = "=2.6.0"
 derive_more = { version = "=1.0.0", features = [
     "add",
     "add_assign",
     "sum",
 ], default-features = false }
+dotenvy = "=0.15.7"
+dotenv-build = "0.1.1"
 educe = { version = "=0.6.0", features = [
     "Debug",
     "Default",
     "full",
 ], default-features = false }
 enum_meta = "=0.7.0"
-itertools = "=0.13.0"
+eventsource-stream = "=0.2.3"
+flate2 = "=1.0.35"
 futures = "=0.3.31"
+graphql_client = "=0.14.0"
 hashbag = "=0.1.12"
+http = "=1.1.0"
+indexmap = "=2.7.0"
+indoc = "=2.0.5"
+isolang = { version = "=2.4.0", features = ["list_languages"] }
+itertools = "=0.13.0"
+jsonwebtoken = { version = "=9.3.0", default-features = false }
+lettre = "=0.11.10"
+logs-wheel = "=0.3.1"
 markdown = "=1.0.0-alpha.21"
+mime_guess = "=2.0.5"
 nanoid = "=0.4.0"
 openidconnect = "=3.5.0"
+paginate = "=1.1.11"
+radarr-api-rs = "=3.0.1"
+rand = "=0.9.0-beta.0"
 regex = "=1.11.1"
 rust_decimal = "=1.36.0"
 rust_decimal_macros = "=1.36.0"
-schematic = { version = "=0.17.5", features = [
+rust_iso3166 = "=0.1.13"
+schematic = { version = "=0.17.7", features = [
     "config",
     "env",
     "json",
@@ -98,7 +120,8 @@ schematic = { version = "=0.17.5", features = [
     "validate",
     "yaml",
 ], default-features = false }
-sea-orm = { version = "=1.1.0", features = [
+scraper = "=0.21.0"
+sea-orm = { version = "=1.1.1", features = [
     "debug-print",
     "postgres-array",
     "macros",
@@ -109,16 +132,24 @@ sea-orm = { version = "=1.1.0", features = [
     "with-rust_decimal",
     "with-uuid",
 ], default-features = false }
-sea-orm-migration = "=1.1.0"
+sea-orm-migration = "=1.1.1"
 sea-query = "=0.32.0"
-serde = { version = "=1.0.214", features = ["derive"] }
-serde_json = "=1.0.132"
+serde = { version = "=1.0.215", features = ["derive"] }
+serde_json = "=1.0.133"
 serde_with = { version = "=3.11.0", features = ["chrono_0_4"] }
+serde-xml-rs = "=0.6.0"
 slug = "=0.1.6"
+sonarr-api-rs = "=3.0.0"
 strum = { version = "=0.26.3", features = ["derive"] }
+struson = { version = "=0.6.0", features = ["serde"] }
 reqwest = { version = "=0.12.9", features = ["json", "stream"] }
-tokio = { version = "=1.41.0", features = ["full"] }
-tracing = { version = "=0.1.40", features = ["attributes"] }
+tokio = { version = "=1.41.1", features = ["full"] }
+tokio-util = { version = "=0.7.12", features = ["codec"] }
+tower = { version = "=0.5.1", features = ["buffer"] }
+tower-http = { version = "=0.6.2", features = ["catch-panic", "cors", "trace"] }
+tracing = { version = "=0.1.41", features = ["attributes"] }
+tracing-subscriber = "=0.3.19"
+unkey = "=0.5.0"
 uuid = { version = "=1.11.0", features = ["v4"], default-features = false }
 
 [profile.release]
diff --git a/apps/backend/Cargo.toml b/apps/backend/Cargo.toml
index 660b3ecc40..8c9074914e 100644
--- a/apps/backend/Cargo.toml
+++ b/apps/backend/Cargo.toml
@@ -10,7 +10,7 @@ anyhow = { workspace = true }
 apalis = { workspace = true }
 application-utils = { path = "../../crates/utils/application" }
 async-graphql = { workspace = true }
-async-graphql-axum = "=7.0.11"
+async-graphql-axum = { workspace = true }
 axum = { workspace = true }
 aws-sdk-s3 = { workspace = true }
 background = { path = "../../crates/background" }
@@ -23,7 +23,7 @@ common-utils = { path = "../../crates/utils/common" }
 config = { path = "../../crates/config" }
 database-models = { path = "../../crates/models/database" }
 dependent-models = { path = "../../crates/models/dependent" }
-dotenvy = "=0.15.7"
+dotenvy = { workspace = true }
 env-utils = { path = "../../crates/utils/env" }
 exporter-resolver = { path = "../../crates/resolvers/exporter" }
 exporter-service = { path = "../../crates/services/exporter" }
@@ -31,12 +31,12 @@ file-storage-resolver = { path = "../../crates/resolvers/file-storage" }
 file-storage-service = { path = "../../crates/services/file-storage" }
 fitness-resolver = { path = "../../crates/resolvers/fitness" }
 fitness-service = { path = "../../crates/services/fitness" }
-http = "=1.1.0"
+http = { workspace = true }
 importer-resolver = { path = "../../crates/resolvers/importer" }
 importer-service = { path = "../../crates/services/importer" }
 integration-service = { path = "../../crates/services/integration" }
 itertools = { workspace = true }
-logs-wheel = "=0.3.1"
+logs-wheel = { workspace = true }
 media-models = { path = "../../crates/models/media" }
 migrations = { path = "../../crates/migrations" }
 miscellaneous-resolver = { path = "../../crates/resolvers/miscellaneous" }
@@ -54,10 +54,10 @@ statistics-resolver = { path = "../../crates/resolvers/statistics" }
 statistics-service = { path = "../../crates/services/statistics" }
 supporting-service = { path = "../../crates/services/supporting" }
 tokio = { workspace = true }
-tower = { version = "=0.4.13", features = ["buffer"] }
-tower-http = { version = "=0.5.2", features = ["catch-panic", "cors", "trace"] }
+tower = { workspace = true }
+tower-http = { workspace = true }
 tracing = { workspace = true }
-tracing-subscriber = "=0.3.18"
-unkey = "=0.5.0"
+tracing-subscriber = { workspace = true }
+unkey = { workspace = true }
 user-resolver = { path = "../../crates/resolvers/user" }
 user-service = { path = "../../crates/services/user" }
diff --git a/apps/frontend/app/components/fitness.tsx b/apps/frontend/app/components/fitness.tsx
index b29b152cf6..23a81120d0 100644
--- a/apps/frontend/app/components/fitness.tsx
+++ b/apps/frontend/app/components/fitness.tsx
@@ -45,7 +45,12 @@ import { $path } from "remix-routes";
 import { match } from "ts-pattern";
 import { withFragment } from "ufo";
 import { BaseMediaDisplayItem } from "~/components/common";
-import { FitnessEntity, dayjsLib, getSetColor } from "~/lib/generals";
+import {
+	FitnessEntity,
+	dayjsLib,
+	getExerciseDetailsPath,
+	getSetColor,
+} from "~/lib/generals";
 import { useGetRandomMantineColor, useUserUnitSystem } from "~/lib/hooks";
 import {
 	getExerciseDetailsQuery,
@@ -271,9 +276,7 @@ export const ExerciseHistory = (props: {
 													}),
 													props.exerciseIdx.toString(),
 												)
-											: $path("/fitness/exercises/item/:id", {
-													id: encodeURIComponent(exercise.name),
-												})
+											: getExerciseDetailsPath(exercise.name)
 									}
 									fw="bold"
 									lineClamp={1}
@@ -424,10 +427,8 @@ export const ExerciseDisplayItem = (props: {
 			innerRef={ref}
 			name={exerciseDetails?.id}
 			isLoading={isExerciseDetailsLoading}
-			onImageClickBehavior={$path("/fitness/exercises/item/:id", {
-				id: encodeURIComponent(props.exerciseId),
-			})}
 			imageUrl={exerciseDetails?.attributes.images.at(0)}
+			onImageClickBehavior={getExerciseDetailsPath(props.exerciseId)}
 			labels={{
 				left: isNumber(times)
 					? `${times} time${times > 1 ? "s" : ""}`
diff --git a/apps/frontend/app/lib/generals.ts b/apps/frontend/app/lib/generals.ts
index 7592debe33..dea2c05a70 100644
--- a/apps/frontend/app/lib/generals.ts
+++ b/apps/frontend/app/lib/generals.ts
@@ -32,6 +32,7 @@ import timezone from "dayjs/plugin/timezone";
 import utc from "dayjs/plugin/utc";
 import { GraphQLClient } from "graphql-request";
 import Cookies from "js-cookie";
+import { $path } from "remix-routes";
 import { match } from "ts-pattern";
 import { z } from "zod";
 
@@ -382,9 +383,6 @@ const fitnessQueryKeys = createQueryKeys("fitness", {
 	workoutDetails: (workoutId: string) => ({
 		queryKey: ["workoutDetails", workoutId],
 	}),
-	exerciseParameters: () => ({
-		queryKey: ["exerciseParameters"],
-	}),
 	workoutTemplateDetails: (workoutTemplateId: string) => ({
 		queryKey: ["workoutTemplateDetails", workoutTemplateId],
 	}),
@@ -452,3 +450,8 @@ export const refreshUserMetadataDetails = (metadataId: string) =>
 			queryKey: queryFactory.media.userMetadataDetails(metadataId).queryKey,
 		});
 	}, 1500);
+
+export const getExerciseDetailsPath = (exerciseId: string) =>
+	$path("/fitness/exercises/item/:id", {
+		id: encodeURIComponent(exerciseId),
+	});
diff --git a/apps/frontend/app/lib/state/fitness.ts b/apps/frontend/app/lib/state/fitness.ts
index d4f9965ab2..b6a65c1c14 100644
--- a/apps/frontend/app/lib/state/fitness.ts
+++ b/apps/frontend/app/lib/state/fitness.ts
@@ -261,6 +261,10 @@ const measurementsDrawerOpenAtom = atom(false);
 export const useMeasurementsDrawerOpen = () =>
 	useAtom(measurementsDrawerOpenAtom);
 
+export const mergingExerciseAtom = atom<string | null>(null);
+
+export const useMergingExercise = () => useAtom(mergingExerciseAtom);
+
 export const duplicateOldWorkout = async (
 	name: string,
 	fitnessEntity: FitnessAction,
diff --git a/apps/frontend/app/lib/utilities.server.ts b/apps/frontend/app/lib/utilities.server.ts
index 2072edc5fe..024ae6bacf 100644
--- a/apps/frontend/app/lib/utilities.server.ts
+++ b/apps/frontend/app/lib/utilities.server.ts
@@ -9,7 +9,6 @@ import {
 import {
 	BackendError,
 	CoreDetailsDocument,
-	ExerciseParametersDocument,
 	GetPresignedS3UrlDocument,
 	PresignedPutS3UrlDocument,
 	UserCollectionsListDocument,
@@ -194,16 +193,6 @@ const getCachedUserDetails = async (request: Request) => {
 	});
 };
 
-export const getCachedExerciseParameters = async () => {
-	return queryClient.ensureQueryData({
-		queryKey: queryFactory.fitness.exerciseParameters().queryKey,
-		queryFn: () =>
-			serverGqlService
-				.request(ExerciseParametersDocument)
-				.then((data) => data.exerciseParameters),
-	});
-};
-
 export const getCachedUserPreferences = async (request: Request) => {
 	const userDetails = await redirectIfNotAuthenticatedOrUpdated(request);
 	return userDetails.preferences;
diff --git a/apps/frontend/app/routes/_dashboard.fitness.$action.tsx b/apps/frontend/app/routes/_dashboard.fitness.$action.tsx
index 4b774c9e4b..8d41cfcfa6 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.$action.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.$action.tsx
@@ -110,6 +110,7 @@ import {
 	PRO_REQUIRED_MESSAGE,
 	clientGqlService,
 	dayjsLib,
+	getExerciseDetailsPath,
 	getSetColor,
 	getSurroundingElements,
 	postMessageToServiceWorker,
@@ -1115,12 +1116,10 @@ const ExerciseDisplay = (props: {
 					<Menu shadow="md" width={200} position="left-end">
 						<Group justify="space-between" pos="relative" wrap="nowrap">
 							<Anchor
-								component={Link}
-								to={$path("/fitness/exercises/item/:id", {
-									id: encodeURIComponent(exercise.exerciseId),
-								})}
 								fw="bold"
 								lineClamp={1}
+								component={Link}
+								to={getExerciseDetailsPath(exercise.exerciseId)}
 							>
 								{exercise.exerciseId}
 							</Anchor>
diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx
index c46982874c..cc6a47f650 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.$action.tsx
@@ -44,6 +44,7 @@ import { match } from "ts-pattern";
 import { withQuery } from "ufo";
 import { z } from "zod";
 import { zx } from "zodix";
+import { getExerciseDetailsPath } from "~/lib/generals";
 import { useCoreDetails } from "~/lib/hooks";
 import {
 	createToastHeaders,
@@ -115,11 +116,7 @@ export const action = async ({ request }: ActionFunctionArgs) => {
 						CreateCustomExerciseDocument,
 						{ input },
 					);
-				return redirect(
-					$path("/fitness/exercises/item/:id", {
-						id: encodeURIComponent(createCustomExercise),
-					}),
-				);
+				return redirect(getExerciseDetailsPath(createCustomExercise));
 			})
 			.with(Action.Update, async () => {
 				invariant(submission.oldName);
diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx
index 414c0f5461..4c07a78fbc 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.item.$id._index.tsx
@@ -82,6 +82,7 @@ import {
 } from "~/lib/generals";
 import {
 	useComplexJsonUpdate,
+	useCoreDetails,
 	useIsFitnessActionActive,
 	useUserDetails,
 	useUserPreferences,
@@ -91,13 +92,10 @@ import {
 	addExerciseToWorkout,
 	getWorkoutDetailsQuery,
 	useCurrentWorkout,
+	useMergingExercise,
 } from "~/lib/state/fitness";
 import { useAddEntityToCollection, useReviewEntity } from "~/lib/state/media";
-import {
-	createToastHeaders,
-	getCachedExerciseParameters,
-	serverGqlService,
-} from "~/lib/utilities.server";
+import { createToastHeaders, serverGqlService } from "~/lib/utilities.server";
 
 const searchParamsSchema = z.object({
 	defaultTab: z.string().optional(),
@@ -110,23 +108,15 @@ const paramsSchema = { id: z.string() };
 export const loader = async ({ params, request }: LoaderFunctionArgs) => {
 	const { id: exerciseId } = zx.parseParams(params, paramsSchema);
 	const query = zx.parseQuery(request, searchParamsSchema);
-	const [exerciseParameters, { exerciseDetails }, { userExerciseDetails }] =
-		await Promise.all([
-			getCachedExerciseParameters(),
-			serverGqlService.request(ExerciseDetailsDocument, { exerciseId }),
-			serverGqlService.authenticatedRequest(
-				request,
-				UserExerciseDetailsDocument,
-				{ exerciseId },
-			),
-		]);
-	return {
-		query,
-		exerciseId,
-		exerciseDetails,
-		exerciseParameters,
-		userExerciseDetails,
-	};
+	const [{ exerciseDetails }, { userExerciseDetails }] = await Promise.all([
+		serverGqlService.request(ExerciseDetailsDocument, { exerciseId }),
+		serverGqlService.authenticatedRequest(
+			request,
+			UserExerciseDetailsDocument,
+			{ exerciseId },
+		),
+	]);
+	return { query, exerciseId, exerciseDetails, userExerciseDetails };
 };
 
 export const meta = ({ data }: MetaArgs<typeof loader>) => {
@@ -161,6 +151,7 @@ export const action = async ({ params, request }: ActionFunctionArgs) => {
 
 export default function Page() {
 	const loaderData = useLoaderData<typeof loader>();
+	const coreDetails = useCoreDetails();
 	const userPreferences = useUserPreferences();
 	const unitSystem = useUserUnitSystem();
 	const userDetails = useUserDetails();
@@ -177,6 +168,7 @@ export default function Page() {
 		"ExerciseChartTimeSpan",
 		TimeSpan.Last90Days,
 	);
+	const [_m, setMergingExercise] = useMergingExercise();
 	const [_r, setEntityToReview] = useReviewEntity();
 	const [
 		updatePreferencesModalOpened,
@@ -194,7 +186,7 @@ export default function Page() {
 			: workoutEndOn.isAfter(computedDateAfterForCharts);
 	});
 	const bestMappings =
-		loaderData.exerciseParameters.lotMapping.find(
+		coreDetails.exerciseParameters.lotMapping.find(
 			(lm) => lm.lot === loaderData.exerciseDetails.lot,
 		)?.bests || [];
 
@@ -609,6 +601,19 @@ export default function Page() {
 											Edit exercise
 										</Button>
 									) : null}
+									<Button
+										variant="outline"
+										onClick={() => {
+											setMergingExercise(loaderData.exerciseDetails.id);
+											navigate(
+												$path("/fitness/exercises/list", {
+													type: loaderData.exerciseDetails.lot,
+												}),
+											);
+										}}
+									>
+										Merge exercise
+									</Button>
 								</SimpleGrid>
 							</MediaScrollArea>
 						</Tabs.Panel>
diff --git a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
index 1990cb5ab8..646786d2b4 100644
--- a/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
+++ b/apps/frontend/app/routes/_dashboard.fitness.exercises.list.tsx
@@ -21,8 +21,12 @@ import {
 	rem,
 } from "@mantine/core";
 import { useDisclosure, useListState } from "@mantine/hooks";
-import type { LoaderFunctionArgs, MetaArgs } from "@remix-run/node";
-import { Link, useLoaderData, useNavigate } from "@remix-run/react";
+import type {
+	ActionFunctionArgs,
+	LoaderFunctionArgs,
+	MetaArgs,
+} from "@remix-run/node";
+import { Link, useLoaderData, useNavigate, useSubmit } from "@remix-run/react";
 import {
 	ExerciseEquipment,
 	ExerciseForce,
@@ -32,8 +36,15 @@ import {
 	ExerciseMuscle,
 	ExerciseSortBy,
 	ExercisesListDocument,
+	MergeExerciseDocument,
 } from "@ryot/generated/graphql/backend/graphql";
-import { isNumber, snakeCase, startCase } from "@ryot/ts-utils";
+import {
+	getActionIntent,
+	isNumber,
+	processSubmission,
+	snakeCase,
+	startCase,
+} from "@ryot/ts-utils";
 import {
 	IconAlertCircle,
 	IconCheck,
@@ -42,22 +53,34 @@ import {
 } from "@tabler/icons-react";
 import { produce } from "immer";
 import { $path } from "remix-routes";
+import { match } from "ts-pattern";
+import { withQuery } from "ufo";
 import { z } from "zod";
 import { zx } from "zodix";
 import { DebouncedSearchInput, FiltersModal } from "~/components/common";
-import { dayjsLib, pageQueryParam } from "~/lib/generals";
+import { confirmWrapper } from "~/components/confirmation";
+import {
+	dayjsLib,
+	getExerciseDetailsPath,
+	pageQueryParam,
+} from "~/lib/generals";
 import {
 	useAppSearchParam,
+	useCoreDetails,
 	useIsFitnessActionActive,
 	useUserCollections,
 	useUserPreferences,
 } from "~/lib/hooks";
-import { addExerciseToWorkout, useCurrentWorkout } from "~/lib/state/fitness";
 import {
-	getCachedExerciseParameters,
+	addExerciseToWorkout,
+	useCurrentWorkout,
+	useMergingExercise,
+} from "~/lib/state/fitness";
+import {
 	getEnhancedCookieName,
 	redirectToFirstPageIfOnInvalidPage,
 	redirectUsingEnhancedCookieSearchParams,
+	redirectWithToast,
 	serverGqlService,
 } from "~/lib/utilities.server";
 
@@ -93,8 +116,7 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
 	const query = zx.parseQuery(request, searchParamsSchema);
 	query.sortBy = query.sortBy ?? defaultFiltersValue.sortBy;
 	query[pageQueryParam] = query[pageQueryParam] ?? 1;
-	const [exerciseParameters, { exercisesList }] = await Promise.all([
-		getCachedExerciseParameters(),
+	const [{ exercisesList }] = await Promise.all([
 		serverGqlService.authenticatedRequest(
 			request.clone(),
 			ExercisesListDocument,
@@ -120,25 +142,46 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
 		exercisesList.details.total,
 		query[pageQueryParam],
 	);
-	return {
-		query,
-		totalPages,
-		cookieName,
-		exercisesList,
-		exerciseParameters,
-	};
+	return { query, totalPages, cookieName, exercisesList };
 };
 
 export const meta = (_args: MetaArgs<typeof loader>) => {
 	return [{ title: "Exercises | Ryot" }];
 };
 
+export const action = async ({ request }: ActionFunctionArgs) => {
+	const formData = await request.clone().formData();
+	const intent = getActionIntent(request);
+	return await match(intent)
+		.with("mergeExercise", async () => {
+			const submission = processSubmission(formData, mergeExerciseSchema);
+			await serverGqlService.authenticatedRequest(
+				request,
+				MergeExerciseDocument,
+				submission,
+			);
+			return redirectWithToast(getExerciseDetailsPath(submission.mergeInto), {
+				type: "success",
+				message: "Exercise merged successfully",
+			});
+		})
+		.run();
+};
+
+const mergeExerciseSchema = z.object({
+	mergeFrom: z.string(),
+	mergeInto: z.string(),
+});
+
 export default function Page() {
 	const loaderData = useLoaderData<typeof loader>();
 	const navigate = useNavigate();
+	const submit = useSubmit();
+	const coreDetails = useCoreDetails();
 	const userPreferences = useUserPreferences();
 	const [currentWorkout, setCurrentWorkout] = useCurrentWorkout();
 	const isFitnessActionActive = useIsFitnessActionActive();
+	const [mergingExercise, setMergingExercise] = useMergingExercise();
 	const [_, { setP }] = useAppSearchParam(loaderData.cookieName);
 	const [selectedExercises, setSelectedExercises] = useListState<{
 		name: string;
@@ -175,13 +218,13 @@ export default function Page() {
 						<IconPlus size={16} />
 					</ActionIcon>
 				</Flex>
-				{loaderData.exerciseParameters.downloadRequired ? (
+				{coreDetails.exerciseParameters.downloadRequired ? (
 					<Alert icon={<IconAlertCircle />} variant="outline" color="violet">
 						Please deploy a job to download the exercise dataset from the{" "}
 						<Anchor
+							size="sm"
 							component={Link}
 							to={$path("/settings/miscellaneous")}
-							size="sm"
 						>
 							miscellaneous settings
 						</Anchor>
@@ -209,6 +252,20 @@ export default function Page() {
 								<FiltersModalForm />
 							</FiltersModal>
 						</Group>
+						{currentWorkout?.replacingExerciseIdx ? (
+							<Alert icon={<IconAlertCircle />}>
+								You are replacing exercise:{" "}
+								{
+									currentWorkout.exercises[currentWorkout.replacingExerciseIdx]
+										.exerciseId
+								}
+							</Alert>
+						) : null}
+						{mergingExercise ? (
+							<Alert icon={<IconAlertCircle />}>
+								You are merging exercise: {mergingExercise}
+							</Alert>
+						) : null}
 						{loaderData.exercisesList.details.total > 0 ? (
 							<>
 								<Box>
@@ -266,8 +323,30 @@ export default function Page() {
 												/>
 											</Indicator>
 											<Link
-												onClick={(e) => {
+												style={{ all: "unset", cursor: "pointer" }}
+												to={getExerciseDetailsPath(exercise.id)}
+												onClick={async (e) => {
 													if (allowAddingExerciseToWorkout) return;
+													if (mergingExercise) {
+														e.preventDefault();
+														const conf = await confirmWrapper({
+															confirmation:
+																"Are you sure you want to merge this exercise? This will replace this exercise in all workouts.",
+														});
+														if (conf) {
+															const formData = new FormData();
+															formData.append("mergeFrom", mergingExercise);
+															formData.append("mergeInto", exercise.id);
+															setMergingExercise(null);
+															submit(formData, {
+																method: "POST",
+																action: withQuery(".", {
+																	intent: "mergeExercise",
+																}),
+															});
+														}
+														return;
+													}
 													if (currentWorkout) {
 														e.preventDefault();
 														setCurrentWorkout(
@@ -283,12 +362,9 @@ export default function Page() {
 															}),
 														);
 														navigate(-1);
+														return;
 													}
 												}}
-												style={{ all: "unset", cursor: "pointer" }}
-												to={$path("/fitness/exercises/item/:id", {
-													id: encodeURIComponent(exercise.id),
-												})}
 											>
 												<Flex direction="column" justify="space-around">
 													<Text>{exercise.id}</Text>
@@ -355,6 +431,7 @@ export default function Page() {
 
 const FiltersModalForm = () => {
 	const loaderData = useLoaderData<typeof loader>();
+	const coreDetails = useCoreDetails();
 	const collections = useUserCollections();
 	const [_, { setP }] = useAppSearchParam(loaderData.cookieName);
 
@@ -377,13 +454,13 @@ const FiltersModalForm = () => {
 					onChange={(v) => setP("sortBy", v)}
 				/>
 				{Object.keys(defaultFiltersValue)
-					.filter((f) => f !== "sortBy" && f !== "order" && f !== "collection")
+					.filter((f) => !["sortBy", "order", "collection"].includes(f))
 					.map((f) => (
 						<Select
 							key={f}
 							clearable
 							// biome-ignore lint/suspicious/noExplicitAny: required here
-							data={(loaderData.exerciseParameters.filters as any)[f].map(
+							data={(coreDetails.exerciseParameters.filters as any)[f].map(
 								// biome-ignore lint/suspicious/noExplicitAny: required here
 								(v: any) => ({
 									label: startCase(snakeCase(v)),
diff --git a/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx b/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx
index a7a7ce2055..2bc566eb06 100644
--- a/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx
+++ b/apps/frontend/app/routes/_dashboard.media.$action.$lot.tsx
@@ -27,7 +27,7 @@ import {
 	GraphqlSortOrder,
 	GridPacking,
 	MediaGeneralFilter,
-	MediaLot,
+	type MediaLot,
 	MediaSortBy,
 	MediaSource,
 	MetadataListDocument,
@@ -80,6 +80,7 @@ import {
 	useMetadataProgressUpdate,
 } from "~/lib/state/media";
 import {
+	getCachedCoreDetails,
 	getEnhancedCookieName,
 	redirectToFirstPageIfOnInvalidPage,
 	redirectUsingEnhancedCookieSearchParams,
@@ -102,22 +103,6 @@ enum Action {
 	Search = "search",
 }
 
-const metadataMapping = {
-	[MediaLot.AudioBook]: [MediaSource.Audible],
-	[MediaLot.Book]: [MediaSource.Openlibrary, MediaSource.GoogleBooks],
-	[MediaLot.Podcast]: [MediaSource.Itunes, MediaSource.Listennotes],
-	[MediaLot.VideoGame]: [MediaSource.Igdb],
-	[MediaLot.Anime]: [MediaSource.Anilist, MediaSource.Mal],
-	[MediaLot.Manga]: [
-		MediaSource.Anilist,
-		MediaSource.MangaUpdates,
-		MediaSource.Mal,
-	],
-	[MediaLot.Movie]: [MediaSource.Tmdb],
-	[MediaLot.Show]: [MediaSource.Tmdb],
-	[MediaLot.VisualNovel]: [MediaSource.Vndb],
-};
-
 export const loader = async ({ request, params }: LoaderFunctionArgs) => {
 	const { action, lot } = zx.parseParams(params, {
 		action: z.nativeEnum(Action),
@@ -168,9 +153,15 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
 			] as const;
 		})
 		.with(Action.Search, async () => {
-			const metadataSourcesForLot = metadataMapping[lot];
+			const coreDetails = await getCachedCoreDetails();
+			const metadataSourcesForLot = coreDetails.metadataLotSourceMappings.find(
+				(m) => m.lot === lot,
+			);
+			if (!metadataSourcesForLot) throw new Error("Mapping not found");
 			const urlParse = zx.parseQuery(request, {
-				source: z.nativeEnum(MediaSource).default(metadataSourcesForLot[0]),
+				source: z
+					.nativeEnum(MediaSource)
+					.default(metadataSourcesForLot.sources[0]),
 			});
 			let metadataSearch: MetadataSearchQuery["metadataSearch"] | false;
 			try {
@@ -195,7 +186,7 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
 				{
 					search: metadataSearch,
 					url: urlParse,
-					mediaSources: metadataSourcesForLot,
+					mediaSources: metadataSourcesForLot.sources,
 				},
 			] as const;
 		})
diff --git a/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx b/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx
index e0412f4828..ddddf926e0 100644
--- a/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx
+++ b/apps/frontend/app/routes/_dashboard.settings.imports-and-exports._index.tsx
@@ -10,8 +10,7 @@ import {
 	Flex,
 	Group,
 	Indicator,
-	JsonInput,
-	PasswordInput,
+	Progress,
 	Select,
 	Stack,
 	Tabs,
@@ -35,7 +34,12 @@ import {
 	ImportSource,
 	UserExportsDocument,
 } from "@ryot/generated/graphql/backend/graphql";
-import { changeCase, getActionIntent, processSubmission } from "@ryot/ts-utils";
+import {
+	changeCase,
+	getActionIntent,
+	kebabCase,
+	processSubmission,
+} from "@ryot/ts-utils";
 import { IconDownload } from "@tabler/icons-react";
 import { filesize } from "filesize";
 import { useState } from "react";
@@ -77,7 +81,7 @@ export const action = async ({ request }: ActionFunctionArgs) => {
 			formData.delete("source");
 			const values = await match(source)
 				.with(
-					ImportSource.StoryGraph,
+					ImportSource.Storygraph,
 					ImportSource.Imdb,
 					ImportSource.Goodreads,
 					ImportSource.OpenScale,
@@ -85,8 +89,16 @@ export const action = async ({ request }: ActionFunctionArgs) => {
 						genericCsv: processSubmission(formData, genericCsvImportFormSchema),
 					}),
 				)
-				.with(ImportSource.Audiobookshelf, ImportSource.MediaTracker, () => ({
-					urlAndKey: processSubmission(formData, urlAndKeyImportFormSchema),
+				.with(
+					ImportSource.Plex,
+					ImportSource.Mediatracker,
+					ImportSource.Audiobookshelf,
+					() => ({
+						urlAndKey: processSubmission(formData, urlAndKeyImportFormSchema),
+					}),
+				)
+				.with(ImportSource.StrongApp, () => ({
+					strongApp: processSubmission(formData, strongAppImportFormSchema),
 				}))
 				.with(ImportSource.Trakt, () => ({
 					trakt: processSubmission(formData, usernameImportFormSchema),
@@ -94,18 +106,9 @@ export const action = async ({ request }: ActionFunctionArgs) => {
 				.with(ImportSource.Movary, async () => ({
 					movary: processSubmission(formData, movaryImportFormSchema),
 				}))
-				.with(ImportSource.Mal, async () => ({
+				.with(ImportSource.Myanimelist, async () => ({
 					mal: processSubmission(formData, malImportFormSchema),
 				}))
-				.with(ImportSource.StrongApp, async () => {
-					const newLocal = processSubmission(
-						formData,
-						strongAppImportFormSchema,
-					);
-					return {
-						strongApp: { ...newLocal, mapping: JSON.parse(newLocal.mapping) },
-					};
-				})
 				.with(ImportSource.GenericJson, async () => ({
 					genericJson: processSubmission(formData, jsonImportFormSchema),
 				}))
@@ -166,6 +169,8 @@ const jellyfinImportFormSchema = usernameImportFormSchema
 
 const genericCsvImportFormSchema = z.object({ csvPath: z.string() });
 
+const strongAppImportFormSchema = z.object({ dataExportPath: z.string() });
+
 const igdbImportFormSchema = z
 	.object({ collection: z.string() })
 	.merge(genericCsvImportFormSchema);
@@ -176,11 +181,6 @@ const movaryImportFormSchema = z.object({
 	watchlist: z.string(),
 });
 
-const strongAppImportFormSchema = z.object({
-	exportPath: z.string(),
-	mapping: z.string(),
-});
-
 const jsonImportFormSchema = z.object({ export: z.string() });
 
 const malImportFormSchema = z.object({
@@ -220,51 +220,39 @@ export default function Page() {
 									<Title order={2}>Import data</Title>
 									<Anchor
 										size="xs"
-										href={withFragment(
-											`${coreDetails.docsLink}/importing.html`,
-											match(deployImportSource)
-												.with(ImportSource.Goodreads, () => "goodreads")
-												.with(ImportSource.Mal, () => "myanimelist")
-												.with(ImportSource.MediaTracker, () => "mediatracker")
-												.with(ImportSource.Movary, () => "movary")
-												.with(ImportSource.StoryGraph, () => "storygraph")
-												.with(ImportSource.StrongApp, () => "strong-app")
-												.with(ImportSource.Trakt, () => "trakt")
-												.with(
-													ImportSource.Audiobookshelf,
-													() => "audiobookshelf",
-												)
-												.with(ImportSource.Imdb, () => "imdb")
-												.with(ImportSource.Igdb, () => "igdb")
-												.with(ImportSource.Jellyfin, () => "jellyfin")
-												.with(ImportSource.GenericJson, () => "generic-json")
-												.with(ImportSource.OpenScale, () => "open-scale")
-												.with(undefined, () => "")
-												.exhaustive(),
-										)}
+										href={
+											deployImportSource
+												? withFragment(
+														`${coreDetails.docsLink}/importing.html`,
+														kebabCase(deployImportSource),
+													)
+												: ""
+										}
 										target="_blank"
 									>
 										Docs
 									</Anchor>
 								</Flex>
 								<Select
+									required
+									searchable
 									id="import-source"
 									label="Select a source"
-									required
+									onChange={(v) => {
+										if (v) setDeployImportSource(v as ImportSource);
+									}}
 									data={Object.values(ImportSource).map((is) => ({
 										label: changeCase(is),
 										value: is,
 									}))}
-									onChange={(v) => {
-										if (v) setDeployImportSource(v as ImportSource);
-									}}
 								/>
 								{deployImportSource ? (
 									<>
 										{match(deployImportSource)
 											.with(
+												ImportSource.Plex,
+												ImportSource.Mediatracker,
 												ImportSource.Audiobookshelf,
-												ImportSource.MediaTracker,
 												() => (
 													<>
 														<TextInput
@@ -272,7 +260,7 @@ export default function Page() {
 															required
 															name="apiUrl"
 														/>
-														<PasswordInput
+														<TextInput
 															mt="sm"
 															label="API Key"
 															required
@@ -285,7 +273,7 @@ export default function Page() {
 												ImportSource.OpenScale,
 												ImportSource.Goodreads,
 												ImportSource.Imdb,
-												ImportSource.StoryGraph,
+												ImportSource.Storygraph,
 												() => (
 													<>
 														<FileInput
@@ -297,6 +285,16 @@ export default function Page() {
 													</>
 												),
 											)
+											.with(ImportSource.StrongApp, () => (
+												<>
+													<FileInput
+														required
+														accept=".csv"
+														label="CSV file"
+														name="dataExportPath"
+													/>
+												</>
+											))
 											.with(ImportSource.Trakt, () => (
 												<>
 													<TextInput
@@ -318,7 +316,7 @@ export default function Page() {
 														required
 														name="username"
 													/>
-													<PasswordInput
+													<TextInput
 														mt="sm"
 														label="Password"
 														required
@@ -364,7 +362,7 @@ export default function Page() {
 													/>
 												</>
 											))
-											.with(ImportSource.Mal, () => (
+											.with(ImportSource.Myanimelist, () => (
 												<>
 													<FileInput
 														label="Anime export file"
@@ -376,39 +374,6 @@ export default function Page() {
 													/>
 												</>
 											))
-											.with(ImportSource.StrongApp, () => (
-												<>
-													<FileInput
-														label="CSV export file"
-														accept=".csv"
-														required
-														name="exportPath"
-													/>
-													<JsonInput
-														label="Mappings"
-														required
-														name="mapping"
-														autosize
-														minRows={10}
-														defaultValue={JSON.stringify(
-															[
-																{
-																	sourceName: "Bench Press (Barbell)",
-																	targetName:
-																		"Barbell Bench Press - Medium Grip",
-																},
-																{
-																	sourceName: "Bicep Curl (Barbell)",
-																	targetName: "Barbell Curl",
-																},
-															],
-															null,
-															4,
-														)}
-														description="This is an example. Every exercise must be mapped, otherwise the import will fail."
-													/>
-												</>
-											))
 											.with(ImportSource.GenericJson, () => (
 												<>
 													<FileInput
@@ -445,59 +410,69 @@ export default function Page() {
 								<Title order={3}>Import history</Title>
 								{loaderData.importReports.length > 0 ? (
 									<Accordion>
-										{loaderData.importReports.map((report) => (
-											<Accordion.Item
-												value={report.id.toString()}
-												key={report.id}
-												data-import-report-id={report.id}
-											>
-												<Accordion.Control
-													disabled={typeof report.wasSuccess !== "boolean"}
+										{loaderData.importReports.map((report) => {
+											const isInProgress =
+												typeof report.wasSuccess !== "boolean";
+
+											return (
+												<Accordion.Item
+													key={report.id}
+													value={report.id}
+													data-import-report-id={report.id}
 												>
-													<Indicator
-														inline
-														size={12}
-														offset={-3}
-														processing={typeof report.wasSuccess !== "boolean"}
-														color={
-															typeof report.wasSuccess === "boolean"
-																? report.wasSuccess
-																	? "green"
-																	: "red"
-																: undefined
-														}
-													>
-														{changeCase(report.source)}{" "}
-														<Text size="xs" span c="dimmed">
-															({dayjsLib(report.startedOn).fromNow()})
-														</Text>
-													</Indicator>
-												</Accordion.Control>
-												<Accordion.Panel>
-													{report.details ? (
-														<>
-															<Text>
-																Total imported: {report.details.import.total}
+													<Accordion.Control disabled={isInProgress}>
+														<Indicator
+															inline
+															size={12}
+															offset={-3}
+															processing={isInProgress}
+															color={
+																isInProgress
+																	? undefined
+																	: report.wasSuccess
+																		? "green"
+																		: "red"
+															}
+														>
+															{changeCase(report.source)}{" "}
+															<Text size="xs" span c="dimmed">
+																({dayjsLib(report.startedOn).fromNow()})
 															</Text>
-															<Text>
-																Failed: {report.details.failedItems.length}
-															</Text>
-															{report.details.failedItems.length > 0 ? (
-																<Code mah={400} block>
-																	{JSON.stringify(
-																		report.details.failedItems,
-																		null,
-																		4,
-																	)}
-																</Code>
-															) : null}
-														</>
-													) : (
-														<Text>This import never finished</Text>
-													)}
-												</Accordion.Panel>
-											</Accordion.Item>
-										))}
+														</Indicator>
+														{isInProgress && report.progress ? (
+															<Progress
+																mt="xs"
+																animated
+																value={Number(report.progress)}
+															/>
+														) : null}
+													</Accordion.Control>
+													<Accordion.Panel>
+														{report.details ? (
+															<>
+																<Text>
+																	Total imported: {report.details.import.total}
+																</Text>
+																<Text>
+																	Failed: {report.details.failedItems.length}
+																</Text>
+																{report.details.failedItems.length > 0 ? (
+																	<Code mah={400} block>
+																		{JSON.stringify(
+																			report.details.failedItems,
+																			null,
+																			4,
+																		)}
+																	</Code>
+																) : null}
+															</>
+														) : (
+															<Text>This import never finished</Text>
+														)}
+													</Accordion.Panel>
+												</Accordion.Item>
+											);
+										})}
 									</Accordion>
 								) : (
 									<Text>You have not performed any imports</Text>
diff --git a/crates/enums/src/lib.rs b/crates/enums/src/lib.rs
index a11021f802..8a0f89ce21 100644
--- a/crates/enums/src/lib.rs
+++ b/crates/enums/src/lib.rs
@@ -129,7 +129,17 @@ pub enum EntityLot {
 
 // The different possible states of a seen item.
 #[derive(
-    Debug, Clone, Copy, PartialEq, Eq, EnumIter, DeriveActiveEnum, Deserialize, Serialize, Enum,
+    Eq,
+    Enum,
+    Copy,
+    Debug,
+    Clone,
+    Display,
+    EnumIter,
+    PartialEq,
+    Serialize,
+    Deserialize,
+    DeriveActiveEnum,
 )]
 #[sea_orm(
     rs_type = "String",
@@ -144,18 +154,18 @@ pub enum SeenState {
 }
 
 #[derive(
+    Eq,
+    Enum,
+    Copy,
     Debug,
     Clone,
-    Copy,
-    PartialEq,
-    Eq,
+    Default,
     EnumIter,
-    DeriveActiveEnum,
-    Deserialize,
+    PartialEq,
     Serialize,
-    Enum,
-    Default,
     ConfigEnum,
+    Deserialize,
+    DeriveActiveEnum,
 )]
 #[sea_orm(
     rs_type = "String",
@@ -169,17 +179,17 @@ pub enum Visibility {
 }
 
 #[derive(
+    Eq,
+    Enum,
+    Copy,
     Debug,
     Clone,
-    Copy,
-    PartialEq,
-    Eq,
+    Display,
     EnumIter,
-    DeriveActiveEnum,
-    Deserialize,
+    PartialEq,
     Serialize,
-    Enum,
-    Display,
+    Deserialize,
+    DeriveActiveEnum,
 )]
 #[sea_orm(
     rs_type = "String",
@@ -187,19 +197,20 @@ pub enum Visibility {
     rename_all = "snake_case"
 )]
 pub enum ImportSource {
-    Audiobookshelf,
-    GenericJson,
-    Goodreads,
     Igdb,
     Imdb,
-    Jellyfin,
-    Mal,
+    Plex,
+    Trakt,
     Movary,
-    MediaTracker,
+    Jellyfin,
     OpenScale,
     StrongApp,
-    StoryGraph,
-    Trakt,
+    Goodreads,
+    Storygraph,
+    Myanimelist,
+    GenericJson,
+    Mediatracker,
+    Audiobookshelf,
 }
 
 #[derive(
@@ -302,7 +313,17 @@ pub enum ExerciseLevel {
 }
 
 #[derive(
-    Debug, Clone, Serialize, Enum, Copy, Deserialize, DeriveActiveEnum, EnumIter, Eq, PartialEq,
+    Eq,
+    Hash,
+    Enum,
+    Copy,
+    Debug,
+    Clone,
+    EnumIter,
+    PartialEq,
+    Serialize,
+    Deserialize,
+    DeriveActiveEnum,
 )]
 #[sea_orm(
     rs_type = "String",
@@ -388,17 +409,18 @@ pub enum ExerciseLot {
 }
 
 #[derive(
-    Default,
-    Clone,
-    Debug,
-    Deserialize,
-    Serialize,
-    DeriveActiveEnum,
     Eq,
-    PartialEq,
     Enum,
     Copy,
+    Hash,
+    Debug,
+    Clone,
+    Default,
     EnumIter,
+    Serialize,
+    PartialEq,
+    Deserialize,
+    DeriveActiveEnum,
 )]
 #[sea_orm(
     rs_type = "String",
@@ -411,6 +433,31 @@ pub enum ExerciseSource {
     Custom,
 }
 
+/// The different types of personal bests that can be achieved on a set.
+#[derive(
+    Clone,
+    Debug,
+    Deserialize,
+    Serialize,
+    FromJsonQueryResult,
+    Eq,
+    PartialEq,
+    Enum,
+    Copy,
+    Default,
+    ConfigEnum,
+)]
+#[serde(rename_all = "snake_case")]
+pub enum WorkoutSetPersonalBest {
+    #[default]
+    Weight,
+    OneRm,
+    Volume,
+    Time,
+    Pace,
+    Reps,
+}
+
 #[derive(Debug, Clone, Copy, PartialEq, Eq, EnumIter, DeriveActiveEnum, Deserialize, Serialize)]
 #[sea_orm(
     rs_type = "String",
diff --git a/crates/migrations/Cargo.toml b/crates/migrations/Cargo.toml
index 377188a8bc..08d9ff16b4 100644
--- a/crates/migrations/Cargo.toml
+++ b/crates/migrations/Cargo.toml
@@ -5,7 +5,7 @@ edition = "2021"
 
 [dependencies]
 enums = { path = "../enums" }
-indoc = "=2.0.5"
+indoc = { workspace = true }
 sea-orm = { workspace = true }
 sea-orm-migration = { workspace = true }
 tracing = { workspace = true }
diff --git a/crates/migrations/src/lib.rs b/crates/migrations/src/lib.rs
index 54441e953e..42fc2195ea 100644
--- a/crates/migrations/src/lib.rs
+++ b/crates/migrations/src/lib.rs
@@ -50,6 +50,7 @@ mod m20241025_changes_for_issue_1084;
 mod m20241110_changes_for_issue_1103;
 mod m20241121_changes_for_issue_445;
 mod m20241124_changes_for_issue_1118;
+mod m20241129_changes_for_issue_1114;
 
 pub use m20230410_create_metadata::Metadata as AliasedMetadata;
 pub use m20230413_create_person::Person as AliasedPerson;
@@ -121,6 +122,7 @@ impl MigratorTrait for Migrator {
             Box::new(m20241110_changes_for_issue_1103::Migration),
             Box::new(m20241121_changes_for_issue_445::Migration),
             Box::new(m20241124_changes_for_issue_1118::Migration),
+            Box::new(m20241129_changes_for_issue_1114::Migration),
         ]
     }
 }
diff --git a/crates/migrations/src/m20230509_create_import_report.rs b/crates/migrations/src/m20230509_create_import_report.rs
index 5c703b08d6..30fe0f4d29 100644
--- a/crates/migrations/src/m20230509_create_import_report.rs
+++ b/crates/migrations/src/m20230509_create_import_report.rs
@@ -7,14 +7,16 @@ pub struct Migration;
 
 #[derive(Iden)]
 pub enum ImportReport {
-    Table,
     Id,
+    Table,
     UserId,
-    StartedOn,
-    FinishedOn,
     Source,
     Details,
+    Progress,
+    StartedOn,
+    FinishedOn,
     WasSuccess,
+    SourceResult,
 }
 
 #[async_trait::async_trait]
@@ -41,6 +43,8 @@ impl MigrationTrait for Migration {
                     .col(ColumnDef::new(ImportReport::WasSuccess).boolean())
                     .col(ColumnDef::new(ImportReport::Details).json_binary())
                     .col(ColumnDef::new(ImportReport::UserId).text().not_null())
+                    .col(ColumnDef::new(ImportReport::Progress).decimal())
+                    .col(ColumnDef::new(ImportReport::SourceResult).json_binary())
                     .foreign_key(
                         ForeignKey::create()
                             .name("media_import_report_to_user_foreign_key")
diff --git a/crates/migrations/src/m20241129_changes_for_issue_1114.rs b/crates/migrations/src/m20241129_changes_for_issue_1114.rs
new file mode 100644
index 0000000000..d0addaf7a9
--- /dev/null
+++ b/crates/migrations/src/m20241129_changes_for_issue_1114.rs
@@ -0,0 +1,34 @@
+use sea_orm_migration::prelude::*;
+
+#[derive(DeriveMigrationName)]
+pub struct Migration;
+
+#[async_trait::async_trait]
+impl MigrationTrait for Migration {
+    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+        let db = manager.get_connection();
+        if !manager.has_column("import_report", "progress").await? {
+            db.execute_unprepared(r#"ALTER TABLE "import_report" ADD COLUMN "progress" DECIMAL"#)
+                .await?;
+        }
+        if !manager.has_column("import_report", "source_result").await? {
+            db.execute_unprepared(
+                r#"ALTER TABLE "import_report" ADD COLUMN "source_result" JSONB"#,
+            )
+            .await?;
+        }
+        db.execute_unprepared(
+            r#"
+UPDATE "import_report" SET "source" = 'myanimelist' WHERE "source" = 'mal';
+UPDATE "import_report" SET "source" = 'mediatracker' WHERE "source" = 'media_tracker';
+UPDATE "import_report" SET "source" = 'storygraph' WHERE "source" = 'story_graph';
+            "#,
+        )
+        .await?;
+        Ok(())
+    }
+
+    async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> {
+        Ok(())
+    }
+}
diff --git a/crates/models/database/src/exercise.rs b/crates/models/database/src/exercise.rs
index c05b085c34..73451b0f0f 100644
--- a/crates/models/database/src/exercise.rs
+++ b/crates/models/database/src/exercise.rs
@@ -13,15 +13,17 @@ use sea_orm::entity::prelude::*;
 use serde::{Deserialize, Serialize};
 
 #[derive(
+    Eq,
+    Hash,
     Clone,
     Debug,
+    Default,
     PartialEq,
-    DeriveEntityModel,
-    Eq,
     Serialize,
+    InputObject,
     Deserialize,
     SimpleObject,
-    InputObject,
+    DeriveEntityModel,
 )]
 #[sea_orm(table_name = "exercise")]
 #[graphql(name = "Exercise", input_name = "ExerciseInput")]
diff --git a/crates/models/database/src/import_report.rs b/crates/models/database/src/import_report.rs
index 6e4d8413c5..f3883f6547 100644
--- a/crates/models/database/src/import_report.rs
+++ b/crates/models/database/src/import_report.rs
@@ -17,9 +17,12 @@ pub struct Model {
     pub user_id: String,
     pub source: ImportSource,
     pub started_on: DateTimeUtc,
+    pub progress: Option<Decimal>,
+    pub was_success: Option<bool>,
     pub finished_on: Option<DateTimeUtc>,
     pub details: Option<ImportResultResponse>,
-    pub was_success: Option<bool>,
+    #[graphql(skip)]
+    pub source_result: Option<serde_json::Value>,
 }
 
 #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
diff --git a/crates/models/dependent/Cargo.toml b/crates/models/dependent/Cargo.toml
index 21a3c07004..ae2e1a3944 100644
--- a/crates/models/dependent/Cargo.toml
+++ b/crates/models/dependent/Cargo.toml
@@ -16,3 +16,4 @@ rust_decimal = { workspace = true }
 schematic = { workspace = true }
 serde = { workspace = true }
 serde_with = { workspace = true }
+strum = { workspace = true }
diff --git a/crates/models/dependent/src/lib.rs b/crates/models/dependent/src/lib.rs
index 0658ceebe1..b524d9840c 100644
--- a/crates/models/dependent/src/lib.rs
+++ b/crates/models/dependent/src/lib.rs
@@ -5,13 +5,16 @@ use database_models::{
     collection, exercise, metadata, metadata_group, person, seen, user, user_measurement,
     user_to_entity, workout, workout_template,
 };
-use enums::UserToMediaReason;
+use enums::{
+    ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic, ExerciseMuscle,
+    MediaLot, MediaSource, UserToMediaReason, WorkoutSetPersonalBest,
+};
 use fitness_models::{UserToExerciseHistoryExtraInformation, UserWorkoutInput};
 use importer_models::ImportFailedItem;
 use media_models::{
     CreateOrUpdateCollectionInput, DailyUserActivitiesResponseGroupedBy, DailyUserActivityItem,
     EntityWithLot, GenreListItem, GraphqlMediaAssets, ImportOrExportExerciseItem,
-    ImportOrExportMediaGroupItem, ImportOrExportMediaItem, ImportOrExportPersonItem,
+    ImportOrExportMetadataGroupItem, ImportOrExportMetadataItem, ImportOrExportPersonItem,
     MetadataCreatorGroupedByRole, PersonDetailsGroupedByRole, ReviewItem, UserDetailsError,
     UserMediaNextEntry, UserMetadataDetailsEpisodeProgress, UserMetadataDetailsShowSeasonProgress,
 };
@@ -19,6 +22,7 @@ use rust_decimal::Decimal;
 use schematic::Schematic;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
+use strum::Display;
 
 #[derive(Serialize, Deserialize, Debug, SimpleObject, Clone)]
 #[graphql(concrete(name = "ExerciseListResults", params(fitness_models::ExerciseListItem)))]
@@ -67,7 +71,7 @@ pub struct ImportOrExportWorkoutTemplateItem {
 #[serde(rename_all = "snake_case")]
 pub struct CompleteExport {
     /// Data about user's media.
-    pub media: Option<Vec<media_models::ImportOrExportMediaItem>>,
+    pub media: Option<Vec<media_models::ImportOrExportMetadataItem>>,
     /// Data about user's people.
     pub people: Option<Vec<media_models::ImportOrExportPersonItem>>,
     /// Data about user's measurements.
@@ -75,7 +79,7 @@ pub struct CompleteExport {
     /// Data about user's workouts.
     pub workouts: Option<Vec<ImportOrExportWorkoutItem>>,
     /// Data about user's media groups.
-    pub media_groups: Option<Vec<media_models::ImportOrExportMediaGroupItem>>,
+    pub media_groups: Option<Vec<media_models::ImportOrExportMetadataGroupItem>>,
     /// Data about user's exercises.
     pub exercises: Option<Vec<ImportOrExportExerciseItem>>,
     /// Data about user's workout templates.
@@ -147,6 +151,45 @@ pub struct MetadataBaseData {
     pub creators: Vec<MetadataCreatorGroupedByRole>,
 }
 
+#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)]
+pub struct ExerciseParametersLotMapping {
+    pub lot: ExerciseLot,
+    pub bests: Vec<WorkoutSetPersonalBest>,
+}
+
+#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)]
+pub struct ExerciseFilters {
+    #[graphql(name = "type")]
+    pub lot: Vec<ExerciseLot>,
+    pub level: Vec<ExerciseLevel>,
+    pub force: Vec<ExerciseForce>,
+    pub mechanic: Vec<ExerciseMechanic>,
+    pub equipment: Vec<ExerciseEquipment>,
+    pub muscle: Vec<ExerciseMuscle>,
+}
+
+#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)]
+pub struct ExerciseParameters {
+    /// All filters applicable to an exercises query.
+    pub filters: ExerciseFilters,
+    pub download_required: bool,
+    /// Exercise type mapped to the personal bests possible.
+    pub lot_mapping: Vec<ExerciseParametersLotMapping>,
+}
+
+#[derive(Debug, SimpleObject, Serialize, Deserialize)]
+pub struct ProviderLanguageInformation {
+    pub source: MediaSource,
+    pub supported: Vec<String>,
+    pub default: String,
+}
+
+#[derive(Debug, SimpleObject, Serialize, Deserialize)]
+pub struct MetadataLotSourceMappings {
+    pub lot: MediaLot,
+    pub sources: Vec<MediaSource>,
+}
+
 #[derive(Debug, SimpleObject, Serialize, Deserialize)]
 pub struct CoreDetails {
     pub is_pro: bool,
@@ -164,6 +207,9 @@ pub struct CoreDetails {
     pub local_auth_disabled: bool,
     pub file_storage_enabled: bool,
     pub backend_errors: Vec<BackendError>,
+    pub exercise_parameters: ExerciseParameters,
+    pub metadata_lot_source_mappings: Vec<MetadataLotSourceMappings>,
+    pub metadata_provider_languages: Vec<ProviderLanguageInformation>,
 }
 
 #[derive(SimpleObject)]
@@ -206,16 +252,24 @@ pub struct UserMetadataDetails {
     pub has_interacted: bool,
 }
 
-#[derive(Debug, Default)]
+#[derive(Debug, Default, Display, Clone, Serialize)]
+pub enum ImportCompletedItem {
+    #[default]
+    Empty,
+    Workout(UserWorkoutInput),
+    Exercise(exercise::Model),
+    Person(ImportOrExportPersonItem),
+    Metadata(ImportOrExportMetadataItem),
+    Measurement(user_measurement::Model),
+    Collection(CreateOrUpdateCollectionInput),
+    MetadataGroup(ImportOrExportMetadataGroupItem),
+    ApplicationWorkout(ImportOrExportWorkoutItem),
+}
+
+#[derive(Debug, Default, Clone, Serialize)]
 pub struct ImportResult {
-    pub workouts: Vec<UserWorkoutInput>,
-    pub failed_items: Vec<ImportFailedItem>,
-    pub metadata: Vec<ImportOrExportMediaItem>,
-    pub people: Vec<ImportOrExportPersonItem>,
-    pub measurements: Vec<user_measurement::Model>,
-    pub metadata_groups: Vec<ImportOrExportMediaGroupItem>,
-    pub collections: Vec<CreateOrUpdateCollectionInput>,
-    pub application_workouts: Vec<ImportOrExportWorkoutItem>,
+    pub failed: Vec<ImportFailedItem>,
+    pub completed: Vec<ImportCompletedItem>,
 }
 
 #[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)]
diff --git a/crates/models/fitness/src/lib.rs b/crates/models/fitness/src/lib.rs
index 5f3136d69f..c4c640aee9 100644
--- a/crates/models/fitness/src/lib.rs
+++ b/crates/models/fitness/src/lib.rs
@@ -6,6 +6,7 @@ use derive_more::{Add, AddAssign, Sum};
 use educe::Educe;
 use enums::{
     ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic, ExerciseMuscle,
+    WorkoutSetPersonalBest,
 };
 use rust_decimal::Decimal;
 use schematic::{ConfigEnum, Schematic};
@@ -13,24 +14,6 @@ use sea_orm::{prelude::DateTimeUtc, FromJsonQueryResult, FromQueryResult};
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 
-pub const LOT_MAPPINGS: &[(ExerciseLot, &[WorkoutSetPersonalBest])] = &[
-    (ExerciseLot::Duration, &[WorkoutSetPersonalBest::Time]),
-    (
-        ExerciseLot::DistanceAndDuration,
-        &[WorkoutSetPersonalBest::Pace, WorkoutSetPersonalBest::Time],
-    ),
-    (
-        ExerciseLot::RepsAndWeight,
-        &[
-            WorkoutSetPersonalBest::Weight,
-            WorkoutSetPersonalBest::OneRm,
-            WorkoutSetPersonalBest::Volume,
-            WorkoutSetPersonalBest::Reps,
-        ],
-    ),
-    (ExerciseLot::Reps, &[WorkoutSetPersonalBest::Reps]),
-];
-
 #[derive(Debug, Clone, Serialize, Enum, Copy, Deserialize, FromJsonQueryResult, Eq, PartialEq)]
 #[serde(rename_all = "snake_case")]
 pub enum ExerciseCategory {
@@ -45,15 +28,17 @@ pub enum ExerciseCategory {
 }
 
 #[derive(
+    Eq,
+    Hash,
     Debug,
     Clone,
+    Default,
     Serialize,
-    SimpleObject,
-    Deserialize,
-    FromJsonQueryResult,
-    Eq,
     PartialEq,
     InputObject,
+    Deserialize,
+    SimpleObject,
+    FromJsonQueryResult,
 )]
 #[serde(rename_all = "camelCase")]
 #[graphql(input_name = "ExerciseAttributesInput")]
@@ -231,31 +216,6 @@ pub enum SetLot {
     Failure,
 }
 
-/// The different types of personal bests that can be achieved on a set.
-#[derive(
-    Clone,
-    Debug,
-    Deserialize,
-    Serialize,
-    FromJsonQueryResult,
-    Eq,
-    PartialEq,
-    Enum,
-    Copy,
-    Default,
-    ConfigEnum,
-)]
-#[serde(rename_all = "snake_case")]
-pub enum WorkoutSetPersonalBest {
-    #[default]
-    Weight,
-    OneRm,
-    Volume,
-    Time,
-    Pace,
-    Reps,
-}
-
 #[skip_serializing_none]
 #[derive(
     Clone,
@@ -670,32 +630,6 @@ pub struct ExercisesListInput {
     pub sort_by: Option<ExerciseSortBy>,
 }
 
-#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)]
-pub struct ExerciseParametersLotMapping {
-    pub lot: ExerciseLot,
-    pub bests: Vec<WorkoutSetPersonalBest>,
-}
-
-#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)]
-pub struct ExerciseParameters {
-    /// All filters applicable to an exercises query.
-    pub filters: ExerciseFilters,
-    pub download_required: bool,
-    /// Exercise type mapped to the personal bests possible.
-    pub lot_mapping: Vec<ExerciseParametersLotMapping>,
-}
-
-#[derive(Debug, Serialize, Deserialize, SimpleObject, Clone)]
-pub struct ExerciseFilters {
-    #[graphql(name = "type")]
-    pub lot: Vec<ExerciseLot>,
-    pub level: Vec<ExerciseLevel>,
-    pub force: Vec<ExerciseForce>,
-    pub mechanic: Vec<ExerciseMechanic>,
-    pub equipment: Vec<ExerciseEquipment>,
-    pub muscle: Vec<ExerciseMuscle>,
-}
-
 #[derive(Debug, InputObject)]
 pub struct UpdateUserExerciseSettings {
     pub exercise_id: String,
diff --git a/crates/models/media/src/lib.rs b/crates/models/media/src/lib.rs
index 58c63904f2..c6242ebc6c 100644
--- a/crates/models/media/src/lib.rs
+++ b/crates/models/media/src/lib.rs
@@ -35,7 +35,7 @@ pub struct MetadataSearchItemResponse {
     pub database_id: Option<String>,
 }
 
-#[derive(Debug, InputObject, Default, Clone)]
+#[derive(Debug, InputObject, Default, Clone, Serialize)]
 pub struct CreateOrUpdateCollectionInput {
     pub name: String,
     pub description: Option<String>,
@@ -490,7 +490,7 @@ pub struct MetadataDetails {
 #[skip_serializing_none]
 #[derive(Debug, Serialize, Deserialize, Clone, Default, Schematic)]
 #[serde(rename_all = "snake_case")]
-pub struct ImportOrExportMediaItemSeen {
+pub struct ImportOrExportMetadataItemSeen {
     /// The progress of media done. If none, it is considered as done.
     pub progress: Option<Decimal>,
     /// The timestamp when started watching.
@@ -555,40 +555,40 @@ pub struct ImportOrExportItemRating {
 #[skip_serializing_none]
 #[derive(Debug, Serialize, Deserialize, Clone, Schematic, Default)]
 #[serde(rename_all = "snake_case")]
-pub struct ImportOrExportMediaItem {
-    /// An string to help identify it in the original source.
-    pub source_id: String,
+pub struct ImportOrExportMetadataItem {
     /// The type of media.
     pub lot: MediaLot,
-    /// The source of media.
-    pub source: MediaSource,
+    /// An string to help identify it in the original source.
+    pub source_id: String,
     /// The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on.
     pub identifier: String,
-    /// The seen history for the user.
-    pub seen_history: Vec<ImportOrExportMediaItemSeen>,
-    /// The review history for the user.
-    pub reviews: Vec<ImportOrExportItemRating>,
+    /// The source of media.
+    pub source: MediaSource,
     /// The collections this entity was added to.
     pub collections: Vec<String>,
+    /// The review history for the user.
+    pub reviews: Vec<ImportOrExportItemRating>,
+    /// The seen history for the user.
+    pub seen_history: Vec<ImportOrExportMetadataItemSeen>,
 }
 
 /// Details about a specific media group item that needs to be imported or exported.
 #[skip_serializing_none]
 #[derive(Debug, Serialize, Deserialize, Clone, Schematic)]
 #[serde(rename_all = "snake_case")]
-pub struct ImportOrExportMediaGroupItem {
+pub struct ImportOrExportMetadataGroupItem {
     /// Name of the group.
     pub title: String,
     /// The type of media.
     pub lot: MediaLot,
-    /// The source of media.
-    pub source: MediaSource,
     /// The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on.
     pub identifier: String,
-    /// The review history for the user.
-    pub reviews: Vec<ImportOrExportItemRating>,
+    /// The source of media.
+    pub source: MediaSource,
     /// The collections this entity was added to.
     pub collections: Vec<String>,
+    /// The review history for the user.
+    pub reviews: Vec<ImportOrExportItemRating>,
 }
 
 /// Details about a specific creator item that needs to be exported.
@@ -596,18 +596,18 @@ pub struct ImportOrExportMediaGroupItem {
 #[derive(Debug, Serialize, Deserialize, Clone, Schematic)]
 #[serde(rename_all = "snake_case")]
 pub struct ImportOrExportPersonItem {
+    /// The name of the creator.
+    pub name: String,
     /// The provider identifier.
     pub identifier: String,
     /// The source of data.
     pub source: MediaSource,
-    /// The source specific data.
-    pub source_specifics: Option<PersonSourceSpecifics>,
-    /// The name of the creator.
-    pub name: String,
-    /// The review history for the user.
-    pub reviews: Vec<ImportOrExportItemRating>,
     /// The collections this entity was added to.
     pub collections: Vec<String>,
+    /// The review history for the user.
+    pub reviews: Vec<ImportOrExportItemRating>,
+    /// The source specific data.
+    pub source_specifics: Option<PersonSourceSpecifics>,
 }
 
 /// Details about a specific exercise item that needs to be exported.
@@ -929,18 +929,10 @@ pub struct DeployMalImportInput {
     pub manga_path: Option<String>,
 }
 
-#[derive(Debug, InputObject, Serialize, Deserialize, Clone)]
-pub struct StrongAppImportMapping {
-    pub source_name: String,
-    pub target_name: String,
-    pub multiplier: Option<Decimal>,
-}
-
 #[derive(Debug, InputObject, Serialize, Deserialize, Clone)]
 pub struct DeployStrongAppImportInput {
-    // The path to the CSV file in the local file system.
-    pub export_path: String,
-    pub mapping: Vec<StrongAppImportMapping>,
+    pub data_export_path: Option<String>,
+    pub measurements_zip_path: Option<String>,
 }
 
 #[derive(Debug, InputObject, Serialize, Deserialize, Clone)]
@@ -1046,13 +1038,6 @@ pub enum CreateCustomMediaErrorVariant {
     LotDoesNotMatchSpecifics,
 }
 
-#[derive(Debug, SimpleObject)]
-pub struct ProviderLanguageInformation {
-    pub source: MediaSource,
-    pub supported: Vec<String>,
-    pub default: String,
-}
-
 #[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)]
 pub enum UserDetailsErrorVariant {
     AuthTokenInvalid,
diff --git a/crates/providers/Cargo.toml b/crates/providers/Cargo.toml
index 71a9a3f205..2ff63807f4 100644
--- a/crates/providers/Cargo.toml
+++ b/crates/providers/Cargo.toml
@@ -18,18 +18,18 @@ database-models = { path = "../models/database" }
 dependent-models = { path = "../models/dependent" }
 educe = { workspace = true }
 enums = { path = "../enums" }
-graphql_client = "=0.14.0"
+graphql_client = { workspace = true }
 hashbag = { workspace = true }
-isolang = { version = "=2.4.0", features = ["list_languages"] }
+isolang = { workspace = true }
 itertools = { workspace = true }
 media-models = { path = "../models/media" }
-paginate = "=1.1.11"
-rand = "=0.9.0-alpha.2"
+paginate = { workspace = true }
+rand = { workspace = true }
 reqwest = { workspace = true }
 rust_decimal = { workspace = true }
 rust_decimal_macros = { workspace = true }
-rust_iso3166 = "=0.1.13"
-scraper = "=0.20.0"
+rust_iso3166 = { workspace = true }
+scraper = { workspace = true }
 sea-orm = { workspace = true }
 serde = { workspace = true }
 serde_json = { workspace = true }
diff --git a/crates/providers/src/mal.rs b/crates/providers/src/mal.rs
index ecbe4168b2..05cde95045 100644
--- a/crates/providers/src/mal.rs
+++ b/crates/providers/src/mal.rs
@@ -10,7 +10,7 @@ use media_models::{
     AnimeSpecifics, MangaSpecifics, MetadataDetails, MetadataImageForMediaDetails,
     MetadataSearchItem, PartialMetadataWithoutId,
 };
-use rand::{seq::SliceRandom, thread_rng};
+use rand::{rng, seq::SliceRandom};
 use reqwest::{
     header::{HeaderName, HeaderValue},
     Client,
@@ -254,7 +254,7 @@ async fn details(client: &Client, media_type: &str, id: &str) -> Result<Metadata
             is_recommendation: None,
         });
     }
-    suggestions.shuffle(&mut thread_rng());
+    suggestions.shuffle(&mut rng());
     let is_nsfw = details.nsfw.map(|n| !matches!(n.as_str(), "white"));
     let data = MetadataDetails {
         identifier: details.id.to_string(),
diff --git a/crates/resolvers/fitness/src/lib.rs b/crates/resolvers/fitness/src/lib.rs
index 56d2ca2be2..d780c437a4 100644
--- a/crates/resolvers/fitness/src/lib.rs
+++ b/crates/resolvers/fitness/src/lib.rs
@@ -8,7 +8,7 @@ use dependent_models::{
     UserWorkoutTemplateDetails,
 };
 use fitness_models::{
-    ExerciseListItem, ExerciseParameters, ExercisesListInput, UpdateUserExerciseSettings,
+    ExerciseListItem, ExercisesListInput, UpdateUserExerciseSettings,
     UpdateUserWorkoutAttributesInput, UserMeasurementsListInput, UserWorkoutInput,
 };
 use fitness_service::ExerciseService;
@@ -46,12 +46,6 @@ impl ExerciseQuery {
             .await
     }
 
-    /// Get all the parameters related to exercises.
-    async fn exercise_parameters(&self, gql_ctx: &Context<'_>) -> Result<ExerciseParameters> {
-        let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
-        service.exercise_parameters().await
-    }
-
     /// Get a paginated list of exercises in the database.
     async fn exercises_list(
         &self,
@@ -214,7 +208,7 @@ impl ExerciseMutation {
     ) -> Result<String> {
         let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
         let user_id = self.user_id_from_ctx(gql_ctx).await?;
-        service.create_custom_exercise(user_id, input).await
+        service.create_custom_exercise(&user_id, input).await
     }
 
     /// Update a custom exercise.
@@ -238,4 +232,18 @@ impl ExerciseMutation {
         let user_id = self.user_id_from_ctx(gql_ctx).await?;
         service.update_user_exercise_settings(user_id, input).await
     }
+
+    /// Merge an exercise into another.
+    async fn merge_exercise(
+        &self,
+        gql_ctx: &Context<'_>,
+        merge_from: String,
+        merge_into: String,
+    ) -> Result<bool> {
+        let service = gql_ctx.data_unchecked::<Arc<ExerciseService>>();
+        let user_id = self.user_id_from_ctx(gql_ctx).await?;
+        service
+            .merge_exercise(user_id, merge_from, merge_into)
+            .await
+    }
 }
diff --git a/crates/resolvers/miscellaneous/src/lib.rs b/crates/resolvers/miscellaneous/src/lib.rs
index 397ea7cca7..014f722188 100644
--- a/crates/resolvers/miscellaneous/src/lib.rs
+++ b/crates/resolvers/miscellaneous/src/lib.rs
@@ -12,8 +12,8 @@ use media_models::{
     GraphqlMetadataDetails, GroupedCalendarEvent, MetadataGroupSearchInput,
     MetadataGroupSearchItem, MetadataGroupsListInput, MetadataListInput, MetadataPartialDetails,
     MetadataSearchInput, MetadataSearchItemResponse, PeopleListInput, PeopleSearchInput,
-    PeopleSearchItem, ProgressUpdateInput, ProviderLanguageInformation, UpdateSeenItemInput,
-    UserCalendarEventInput, UserUpcomingCalendarEventInput,
+    PeopleSearchItem, ProgressUpdateInput, UpdateSeenItemInput, UserCalendarEventInput,
+    UserUpcomingCalendarEventInput,
 };
 use miscellaneous_service::MiscellaneousService;
 use traits::AuthProvider;
@@ -26,7 +26,7 @@ impl AuthProvider for MiscellaneousQuery {}
 #[Object]
 impl MiscellaneousQuery {
     /// Get some primary information about the service.
-    async fn core_details(&self, gql_ctx: &Context<'_>) -> CoreDetails {
+    async fn core_details(&self, gql_ctx: &Context<'_>) -> Result<CoreDetails> {
         let service = gql_ctx.data_unchecked::<Arc<MiscellaneousService>>();
         service.core_details().await
     }
@@ -124,15 +124,6 @@ impl MiscellaneousQuery {
         service.metadata_groups_list(user_id, input).await
     }
 
-    /// Get all languages supported by all the providers.
-    async fn providers_language_information(
-        &self,
-        gql_ctx: &Context<'_>,
-    ) -> Vec<ProviderLanguageInformation> {
-        let service = gql_ctx.data_unchecked::<Arc<MiscellaneousService>>();
-        service.providers_language_information()
-    }
-
     /// Get details that can be displayed to a user for a metadata group.
     async fn user_metadata_group_details(
         &self,
diff --git a/crates/services/exporter/Cargo.toml b/crates/services/exporter/Cargo.toml
index 1d212e3daa..963e05af9f 100644
--- a/crates/services/exporter/Cargo.toml
+++ b/crates/services/exporter/Cargo.toml
@@ -15,11 +15,11 @@ dependent-models = { path = "../../models/dependent" }
 enums = { path = "../../enums" }
 fitness-models = { path = "../../models/fitness" }
 media-models = { path = "../../models/media" }
-mime_guess = "=2.0.5"
+mime_guess = { workspace = true }
 nanoid = { workspace = true }
 reqwest = { workspace = true }
 sea-orm = { workspace = true }
-struson = { version = "=0.5.0", features = ["serde"] }
+struson = { workspace = true }
 supporting-service = { path = "../supporting" }
 tokio = { workspace = true }
-tokio-util = { version = "=0.7.11", features = ["codec"] }
+tokio-util = { workspace = true }
diff --git a/crates/services/exporter/src/lib.rs b/crates/services/exporter/src/lib.rs
index 068f4481d4..575f0ffd74 100644
--- a/crates/services/exporter/src/lib.rs
+++ b/crates/services/exporter/src/lib.rs
@@ -20,7 +20,7 @@ use enums::EntityLot;
 use fitness_models::UserMeasurementsListInput;
 use media_models::{
     ImportOrExportExerciseItem, ImportOrExportItemRating, ImportOrExportItemReview,
-    ImportOrExportMediaGroupItem, ImportOrExportMediaItem, ImportOrExportMediaItemSeen,
+    ImportOrExportMetadataGroupItem, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen,
     ImportOrExportPersonItem, ReviewItem,
 };
 use nanoid::nanoid;
@@ -201,7 +201,7 @@ impl ExporterService {
                     let manga_chapter_number =
                         s.manga_extra_information.clone().and_then(|d| d.chapter);
                     let manga_volume_number = s.manga_extra_information.and_then(|d| d.volume);
-                    ImportOrExportMediaItemSeen {
+                    ImportOrExportMetadataItemSeen {
                         progress: Some(s.progress),
                         started_on: s.started_on,
                         ended_on: s.finished_on,
@@ -226,7 +226,7 @@ impl ExporterService {
                     .into_iter()
                     .map(|c| c.name)
                     .collect();
-            let exp = ImportOrExportMediaItem {
+            let exp = ImportOrExportMetadataItem {
                 source_id: m.title,
                 lot: m.lot,
                 source: m.source,
@@ -269,7 +269,7 @@ impl ExporterService {
                     .into_iter()
                     .map(|c| c.name)
                     .collect();
-            let exp = ImportOrExportMediaGroupItem {
+            let exp = ImportOrExportMetadataGroupItem {
                 title: m.title,
                 lot: m.lot,
                 source: m.source,
diff --git a/crates/services/fitness/Cargo.toml b/crates/services/fitness/Cargo.toml
index 7ee7bda38e..a6d75e96ab 100644
--- a/crates/services/fitness/Cargo.toml
+++ b/crates/services/fitness/Cargo.toml
@@ -16,7 +16,6 @@ dependent-models = { path = "../../models/dependent" }
 dependent-utils = { path = "../../utils/dependent" }
 enums = { path = "../../enums" }
 fitness-models = { path = "../../models/fitness" }
-itertools = { workspace = true }
 migrations = { path = "../../migrations" }
 nanoid = { workspace = true }
 reqwest = { workspace = true }
diff --git a/crates/services/fitness/src/lib.rs b/crates/services/fitness/src/lib.rs
index b3ad129730..fe1c409b3a 100644
--- a/crates/services/fitness/src/lib.rs
+++ b/crates/services/fitness/src/lib.rs
@@ -3,9 +3,7 @@ use std::sync::Arc;
 use application_utils::GraphqlRepresentation;
 use async_graphql::{Error, Result};
 use background::ApplicationJob;
-use common_models::{
-    ChangeCollectionToEntityInput, DefaultCollection, SearchDetails, SearchInput, StoredUrl,
-};
+use common_models::{SearchDetails, SearchInput, StoredUrl};
 use common_utils::{ryot_log, PAGE_SIZE};
 use database_models::{
     collection_to_entity, exercise,
@@ -15,8 +13,8 @@ use database_models::{
     user_measurement, user_to_entity, workout, workout_template,
 };
 use database_utils::{
-    add_entity_to_collection, deploy_job_to_re_evaluate_user_workouts, entity_in_collections,
-    ilike_sql, item_reviews, pro_instance_guard, user_measurements_list, user_workout_details,
+    deploy_job_to_re_evaluate_user_workouts, entity_in_collections, ilike_sql, item_reviews,
+    pro_instance_guard, user_measurements_list, user_workout_details,
     user_workout_template_details,
 };
 use dependent_models::{
@@ -24,27 +22,22 @@ use dependent_models::{
     UserWorkoutTemplateDetails,
 };
 use dependent_utils::{
-    create_or_update_workout, create_user_measurement, db_workout_to_workout_input,
-    get_focused_workout_summary,
-};
-use enums::{
-    EntityLot, ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic,
-    ExerciseMuscle, ExerciseSource, Visibility,
+    create_custom_exercise, create_or_update_workout, create_user_measurement,
+    db_workout_to_workout_input, get_focused_workout_summary,
 };
+use enums::{EntityLot, ExerciseLot, ExerciseSource, Visibility};
 use fitness_models::{
-    ExerciseAttributes, ExerciseCategory, ExerciseFilters, ExerciseListItem, ExerciseParameters,
-    ExerciseParametersLotMapping, ExerciseSortBy, ExercisesListInput, GithubExercise,
-    GithubExerciseAttributes, ProcessedExercise, UpdateUserExerciseSettings,
+    ExerciseAttributes, ExerciseCategory, ExerciseListItem, ExerciseSortBy, ExercisesListInput,
+    GithubExercise, GithubExerciseAttributes, ProcessedExercise, UpdateUserExerciseSettings,
     UpdateUserWorkoutAttributesInput, UserMeasurementsListInput, UserToExerciseExtraInformation,
     UserWorkoutInput, WorkoutInformation, WorkoutSetRecord, WorkoutSummary, WorkoutSummaryExercise,
-    LOT_MAPPINGS,
 };
-use itertools::Itertools;
 use migrations::AliasedExercise;
 use nanoid::nanoid;
 use sea_orm::{
-    prelude::DateTimeUtc, ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait, Iterable,
-    ModelTrait, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect, QueryTrait, RelationTrait,
+    prelude::DateTimeUtc, ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait,
+    ItemsAndPagesNumber, ModelTrait, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect,
+    QueryTrait, RelationTrait,
 };
 use sea_query::{extension::postgres::PgExpr, Alias, Condition, Expr, Func, JoinType, OnConflict};
 use slug::slugify;
@@ -63,23 +56,27 @@ impl ExerciseService {
         input: SearchInput,
     ) -> Result<SearchResults<workout_template::Model>> {
         let page = input.page.unwrap_or(1);
-        let query = WorkoutTemplate::find()
+        let paginator = WorkoutTemplate::find()
             .filter(workout_template::Column::UserId.eq(user_id))
             .apply_if(input.query, |query, v| {
                 query.filter(Expr::col(workout_template::Column::Name).ilike(ilike_sql(&v)))
             })
-            .order_by_desc(workout_template::Column::CreatedOn);
-        let total = query.clone().count(&self.0.db).await?;
-        let total: i32 = total.try_into().unwrap();
-        let data = query.paginate(&self.0.db, PAGE_SIZE.try_into().unwrap());
-        let items = data.fetch_page((page - 1).try_into().unwrap()).await?;
-        let next_page = if total - (page * PAGE_SIZE) > 0 {
-            Some(page + 1)
-        } else {
-            None
-        };
+            .order_by_desc(workout_template::Column::CreatedOn)
+            .paginate(&self.0.db, PAGE_SIZE.try_into().unwrap());
+        let ItemsAndPagesNumber {
+            number_of_items,
+            number_of_pages,
+        } = paginator.num_items_and_pages().await?;
+        let items = paginator.fetch_page((page - 1).try_into().unwrap()).await?;
         Ok(SearchResults {
-            details: SearchDetails { total, next_page },
+            details: SearchDetails {
+                total: number_of_items.try_into().unwrap(),
+                next_page: if page < number_of_pages.try_into().unwrap() {
+                    Some(page + 1)
+                } else {
+                    None
+                },
+            },
             items,
         })
     }
@@ -182,28 +179,6 @@ impl ExerciseService {
         Ok(true)
     }
 
-    pub async fn exercise_parameters(&self) -> Result<ExerciseParameters> {
-        let download_required = Exercise::find().count(&self.0.db).await? == 0;
-        Ok(ExerciseParameters {
-            filters: ExerciseFilters {
-                lot: ExerciseLot::iter().collect_vec(),
-                level: ExerciseLevel::iter().collect_vec(),
-                force: ExerciseForce::iter().collect_vec(),
-                mechanic: ExerciseMechanic::iter().collect_vec(),
-                equipment: ExerciseEquipment::iter().collect_vec(),
-                muscle: ExerciseMuscle::iter().collect_vec(),
-            },
-            download_required,
-            lot_mapping: LOT_MAPPINGS
-                .iter()
-                .map(|(lot, pbs)| ExerciseParametersLotMapping {
-                    lot: *lot,
-                    bests: pbs.to_vec(),
-                })
-                .collect(),
-        })
-    }
-
     async fn get_all_exercises_from_dataset(&self) -> Result<Vec<GithubExercise>> {
         let data = reqwest::get(JSON_URL)
             .await
@@ -283,23 +258,27 @@ impl ExerciseService {
         input: SearchInput,
     ) -> Result<SearchResults<workout::Model>> {
         let page = input.page.unwrap_or(1);
-        let query = Workout::find()
+        let paginator = Workout::find()
             .filter(workout::Column::UserId.eq(user_id))
             .apply_if(input.query, |query, v| {
                 query.filter(Expr::col(workout::Column::Name).ilike(ilike_sql(&v)))
             })
-            .order_by_desc(workout::Column::EndTime);
-        let total = query.clone().count(&self.0.db).await?;
-        let total: i32 = total.try_into().unwrap();
-        let data = query.paginate(&self.0.db, PAGE_SIZE.try_into().unwrap());
-        let items = data.fetch_page((page - 1).try_into().unwrap()).await?;
-        let next_page = if total - (page * PAGE_SIZE) > 0 {
-            Some(page + 1)
-        } else {
-            None
-        };
+            .order_by_desc(workout::Column::EndTime)
+            .paginate(&self.0.db, PAGE_SIZE.try_into().unwrap());
+        let ItemsAndPagesNumber {
+            number_of_items,
+            number_of_pages,
+        } = paginator.num_items_and_pages().await?;
+        let items = paginator.fetch_page((page - 1).try_into().unwrap()).await?;
         Ok(SearchResults {
-            details: SearchDetails { total, next_page },
+            details: SearchDetails {
+                total: number_of_items.try_into().unwrap(),
+                next_page: if page < number_of_pages.try_into().unwrap() {
+                    Some(page + 1)
+                } else {
+                    None
+                },
+            },
             items,
         })
     }
@@ -309,6 +288,7 @@ impl ExerciseService {
         user_id: String,
         input: ExercisesListInput,
     ) -> Result<SearchResults<ExerciseListItem>> {
+        let page = input.search.page.unwrap_or(1);
         let ex = Alias::new("exercise");
         let etu = Alias::new("user_to_entity");
         let order_by_col = match input.sort_by {
@@ -332,7 +312,7 @@ impl ExerciseService {
                 ])),
             },
         };
-        let query = Exercise::find()
+        let paginator = Exercise::find()
             .column_as(
                 Expr::col((
                     etu.clone(),
@@ -344,6 +324,11 @@ impl ExerciseService {
                 Expr::col((etu, user_to_entity::Column::LastUpdatedOn)),
                 "last_updated_on",
             )
+            .filter(
+                exercise::Column::Source
+                    .eq(ExerciseSource::Github)
+                    .or(exercise::Column::CreatedByUserId.eq(&user_id)),
+            )
             .apply_if(input.filter, |query, q| {
                 query
                     .apply_if(q.lot, |q, v| q.filter(exercise::Column::Lot.eq(v)))
@@ -390,17 +375,15 @@ impl ExerciseService {
                     }),
             )
             .order_by_desc(order_by_col)
-            .order_by_asc(exercise::Column::Id);
-        let total = query.clone().count(&self.0.db).await?;
-        let total: i32 = total.try_into().unwrap();
-        let data = query
+            .order_by_asc(exercise::Column::Id)
             .into_model::<ExerciseListItem>()
             .paginate(&self.0.db, PAGE_SIZE.try_into().unwrap());
+        let ItemsAndPagesNumber {
+            number_of_items,
+            number_of_pages,
+        } = paginator.num_items_and_pages().await?;
         let mut items = vec![];
-        for ex in data
-            .fetch_page((input.search.page.unwrap() - 1).try_into().unwrap())
-            .await?
-        {
+        for ex in paginator.fetch_page((page - 1).try_into().unwrap()).await? {
             let mut converted_exercise = ex.clone();
             if let Some(img) = ex.attributes.internal_images.first() {
                 converted_exercise.image = Some(
@@ -413,13 +396,15 @@ impl ExerciseService {
             converted_exercise.muscle = ex.muscles.first().cloned();
             items.push(converted_exercise);
         }
-        let next_page = if total - ((input.search.page.unwrap()) * PAGE_SIZE) > 0 {
-            Some(input.search.page.unwrap() + 1)
-        } else {
-            None
-        };
         Ok(SearchResults {
-            details: SearchDetails { total, next_page },
+            details: SearchDetails {
+                total: number_of_items.try_into().unwrap(),
+                next_page: if page < number_of_pages.try_into().unwrap() {
+                    Some(page + 1)
+                } else {
+                    None
+                },
+            },
             items,
         })
     }
@@ -567,46 +552,10 @@ impl ExerciseService {
 
     pub async fn create_custom_exercise(
         &self,
-        user_id: String,
+        user_id: &String,
         input: exercise::Model,
     ) -> Result<String> {
-        let exercise_id = input.id.clone();
-        let mut input = input;
-        input.created_by_user_id = Some(user_id.clone());
-        input.source = ExerciseSource::Custom;
-        input.attributes.internal_images = input
-            .attributes
-            .images
-            .clone()
-            .into_iter()
-            .map(StoredUrl::S3)
-            .collect();
-        input.attributes.images = vec![];
-        let input: exercise::ActiveModel = input.into();
-        let exercise = match Exercise::find_by_id(exercise_id)
-            .filter(exercise::Column::Source.eq(ExerciseSource::Custom))
-            .one(&self.0.db)
-            .await?
-        {
-            None => input.insert(&self.0.db).await?,
-            Some(_) => {
-                let input = input.reset_all();
-                input.update(&self.0.db).await?
-            }
-        };
-        add_entity_to_collection(
-            &user_id.clone(),
-            ChangeCollectionToEntityInput {
-                creator_user_id: user_id,
-                collection_name: DefaultCollection::Custom.to_string(),
-                entity_id: exercise.id.clone(),
-                entity_lot: EntityLot::Exercise,
-                ..Default::default()
-            },
-            &self.0,
-        )
-        .await?;
-        Ok(exercise.id)
+        create_custom_exercise(user_id, input, &self.0).await
     }
 
     pub async fn delete_user_workout(&self, user_id: String, workout_id: String) -> Result<bool> {
@@ -642,9 +591,7 @@ impl ExerciseService {
             association.update(&self.0.db).await?;
         }
         wkt.delete(&self.0.db).await?;
-        self.0
-            .perform_application_job(ApplicationJob::ReEvaluateUserWorkouts(user_id))
-            .await?;
+        deploy_job_to_re_evaluate_user_workouts(&user_id, &self.0).await;
         Ok(true)
     }
 
@@ -670,32 +617,53 @@ impl ExerciseService {
         Ok(())
     }
 
+    async fn change_exercise_name_in_history(
+        &self,
+        new_name: String,
+        old_entity: user_to_entity::Model,
+    ) -> Result<()> {
+        for workout in old_entity.exercise_extra_information.unwrap().history {
+            let db_workout = Workout::find_by_id(workout.workout_id)
+                .one(&self.0.db)
+                .await?
+                .unwrap();
+            let mut summary = db_workout.summary.clone();
+            let mut information = db_workout.information.clone();
+            summary.exercises[workout.idx].name = new_name.clone();
+            information.exercises[workout.idx].name = new_name.clone();
+            let mut db_workout: workout::ActiveModel = db_workout.into();
+            db_workout.summary = ActiveValue::Set(summary);
+            db_workout.information = ActiveValue::Set(information);
+            db_workout.update(&self.0.db).await?;
+        }
+        Ok(())
+    }
+
     pub async fn update_custom_exercise(
         &self,
         user_id: String,
         input: UpdateCustomExerciseInput,
     ) -> Result<bool> {
-        let entities = UserToEntity::find()
+        let entity = UserToEntity::find()
             .filter(user_to_entity::Column::UserId.eq(&user_id))
             .filter(user_to_entity::Column::ExerciseId.eq(input.old_name.clone()))
-            .all(&self.0.db)
-            .await?;
+            .one(&self.0.db)
+            .await?
+            .ok_or_else(|| Error::new("Exercise does not exist"))?;
         let old_exercise = Exercise::find_by_id(input.old_name.clone())
             .one(&self.0.db)
             .await?
             .unwrap();
         if input.should_delete.unwrap_or_default() {
-            for entity in entities {
-                if !entity
-                    .exercise_extra_information
-                    .unwrap_or_default()
-                    .history
-                    .is_empty()
-                {
-                    return Err(Error::new(
-                        "Exercise is associated with one or more workouts.",
-                    ));
-                }
+            if !entity
+                .exercise_extra_information
+                .unwrap_or_default()
+                .history
+                .is_empty()
+            {
+                return Err(Error::new(
+                    "Exercise is associated with one or more workouts.",
+                ));
             }
             old_exercise.delete(&self.0.db).await?;
             return Ok(true);
@@ -713,30 +681,17 @@ impl ExerciseService {
                 .filter(exercise::Column::Id.eq(input.old_name.clone()))
                 .exec(&self.0.db)
                 .await?;
-            for entity in entities {
-                for workout in entity.exercise_extra_information.unwrap().history {
-                    let db_workout = Workout::find_by_id(workout.workout_id)
-                        .one(&self.0.db)
-                        .await?
-                        .unwrap();
-                    let mut summary = db_workout.summary.clone();
-                    let mut information = db_workout.information.clone();
-                    summary.exercises[workout.idx].name = input.update.id.clone();
-                    information.exercises[workout.idx].name = input.update.id.clone();
-                    let mut db_workout: workout::ActiveModel = db_workout.into();
-                    db_workout.summary = ActiveValue::Set(summary);
-                    db_workout.information = ActiveValue::Set(information);
-                    db_workout.update(&self.0.db).await?;
-                }
-            }
+            self.change_exercise_name_in_history(input.update.id.clone(), entity)
+                .await?;
         }
         for image in old_exercise.attributes.internal_images {
             if let StoredUrl::S3(key) = image {
                 self.0.file_storage_service.delete_object(key).await;
             }
         }
-        self.create_custom_exercise(user_id, input.update.clone())
+        self.create_custom_exercise(&user_id, input.update.clone())
             .await?;
+        deploy_job_to_re_evaluate_user_workouts(&user_id, &self.0).await;
         Ok(true)
     }
 
@@ -786,4 +741,39 @@ impl ExerciseService {
         ute.update(&self.0.db).await?;
         Ok(true)
     }
+
+    pub async fn merge_exercise(
+        &self,
+        user_id: String,
+        merge_from: String,
+        merge_into: String,
+    ) -> Result<bool> {
+        let old_exercise = Exercise::find_by_id(merge_from.clone())
+            .one(&self.0.db)
+            .await?
+            .ok_or_else(|| Error::new("Exercise does not exist"))?;
+        let new_exercise = Exercise::find_by_id(merge_into.clone())
+            .one(&self.0.db)
+            .await?
+            .ok_or_else(|| Error::new("Exercise does not exist"))?;
+        if old_exercise.id == new_exercise.id {
+            return Err(Error::new("Cannot merge exercise with itself"));
+        }
+        if old_exercise.lot != new_exercise.lot {
+            return Err(Error::new(format!(
+                "Exercises must be of the same lot, got from={:#?} and into={:#?}",
+                old_exercise.lot, new_exercise.lot
+            )));
+        }
+        let old_entity = UserToEntity::find()
+            .filter(user_to_entity::Column::UserId.eq(&user_id))
+            .filter(user_to_entity::Column::ExerciseId.eq(merge_from.clone()))
+            .one(&self.0.db)
+            .await?
+            .ok_or_else(|| Error::new("Exercise does not exist"))?;
+        self.change_exercise_name_in_history(merge_into, old_entity)
+            .await?;
+        deploy_job_to_re_evaluate_user_workouts(&user_id, &self.0).await;
+        Ok(true)
+    }
 }
diff --git a/crates/services/importer/Cargo.toml b/crates/services/importer/Cargo.toml
index 8991939e2b..c28a56c420 100644
--- a/crates/services/importer/Cargo.toml
+++ b/crates/services/importer/Cargo.toml
@@ -11,8 +11,8 @@ background = { path = "../../background" }
 chrono = { workspace = true }
 chrono-tz = { workspace = true }
 convert_case = { workspace = true }
-csv = "=1.3.0"
-data-encoding = "=2.6.0"
+csv = { workspace = true }
+data-encoding = { workspace = true }
 enum_meta = { workspace = true }
 env-utils = { path = "../../utils/env" }
 external-utils = { path = "../../utils/external" }
@@ -23,12 +23,13 @@ dependent-models = { path = "../../models/dependent" }
 dependent-utils = { path = "../../utils/dependent" }
 enums = { path = "../../enums" }
 fitness-models = { path = "../../models/fitness" }
-flate2 = "=1.0.34"
+flate2 = { workspace = true }
 importer-models = { path = "../../models/importer" }
+indexmap = { workspace = true }
 itertools = { workspace = true }
 media-models = { path = "../../models/media" }
+nanoid = { workspace = true }
 providers = { path = "../../providers" }
-regex = { workspace = true }
 reqwest = { workspace = true }
 rust_decimal = { workspace = true }
 rust_decimal_macros = { workspace = true }
@@ -36,7 +37,7 @@ sea-orm = { workspace = true }
 serde = { workspace = true }
 serde_json = { workspace = true }
 serde_with = { workspace = true }
-serde-xml-rs = "=0.6.0"
+serde-xml-rs = { workspace = true }
 specific-models = { path = "../../models/specific" }
 supporting-service = { path = "../supporting" }
 tracing = { workspace = true }
diff --git a/crates/services/importer/src/audiobookshelf.rs b/crates/services/importer/src/audiobookshelf.rs
index a673bc754d..e604c1411a 100644
--- a/crates/services/importer/src/audiobookshelf.rs
+++ b/crates/services/importer/src/audiobookshelf.rs
@@ -6,11 +6,11 @@ use async_graphql::Result;
 use common_utils::ryot_log;
 use data_encoding::BASE64;
 use database_models::metadata;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{ImportSource, MediaLot, MediaSource};
 use media_models::{
-    CommitMediaInput, DeployUrlAndKeyImportInput, ImportOrExportMediaItem,
-    ImportOrExportMediaItemSeen,
+    CommitMediaInput, DeployUrlAndKeyImportInput, ImportOrExportMetadataItem,
+    ImportOrExportMetadataItemSeen,
 };
 use providers::{google_books::GoogleBooksService, openlibrary::OpenlibraryService};
 use reqwest::{
@@ -33,8 +33,8 @@ pub async fn import<F>(
 where
     F: Future<Output = Result<metadata::Model>>,
 {
-    let mut media = vec![];
-    let mut failed_items = vec![];
+    let mut completed = vec![];
+    let mut failed = vec![];
     let url = format!("{}/api", input.api_url);
     let client = get_base_http_client(Some(vec![(
         AUTHORIZATION,
@@ -81,7 +81,7 @@ where
                     {
                         Some((identifier, source)) => (identifier, MediaLot::Book, source, None),
                         _ => {
-                            failed_items.push(ImportFailedItem {
+                            failed.push(ImportFailedItem {
                                 error: Some("No Google Books ID found".to_string()),
                                 identifier: title,
                                 lot: None,
@@ -91,7 +91,7 @@ where
                         }
                     },
                     _ => {
-                        failed_items.push(ImportFailedItem {
+                        failed.push(ImportFailedItem {
                             error: Some("No ISBN found".to_string()),
                             identifier: title,
                             lot: None,
@@ -138,7 +138,7 @@ where
                         (itunes_id, lot, source, Some(to_return))
                     }
                     _ => {
-                        failed_items.push(ImportFailedItem {
+                        failed.push(ImportFailedItem {
                             error: Some("No episodes found for podcast".to_string()),
                             identifier: title,
                             lot: Some(MediaLot::Podcast),
@@ -158,33 +158,29 @@ where
             let mut seen_history = vec![];
             if let Some(podcasts) = episodes {
                 for episode in podcasts {
-                    seen_history.push(ImportOrExportMediaItemSeen {
+                    seen_history.push(ImportOrExportMetadataItemSeen {
                         provider_watched_on: Some(ImportSource::Audiobookshelf.to_string()),
                         podcast_episode_number: Some(episode),
                         ..Default::default()
                     });
                 }
             } else {
-                seen_history.push(ImportOrExportMediaItemSeen {
+                seen_history.push(ImportOrExportMetadataItemSeen {
                     provider_watched_on: Some(ImportSource::Audiobookshelf.to_string()),
                     ..Default::default()
                 });
             };
-            media.push(ImportOrExportMediaItem {
+            completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
                 lot,
                 source,
                 identifier,
                 seen_history,
                 source_id: metadata.title,
                 ..Default::default()
-            })
+            }))
         }
     }
-    Ok(ImportResult {
-        metadata: media,
-        failed_items,
-        ..Default::default()
-    })
+    Ok(ImportResult { completed, failed })
 }
 
 async fn get_item_details(
diff --git a/crates/services/importer/src/generic_json.rs b/crates/services/importer/src/generic_json.rs
index 31420cc2da..80967dccef 100644
--- a/crates/services/importer/src/generic_json.rs
+++ b/crates/services/importer/src/generic_json.rs
@@ -1,7 +1,7 @@
 use std::fs;
 
 use async_graphql::Result;
-use dependent_models::{CompleteExport, ImportResult};
+use dependent_models::{CompleteExport, ImportCompletedItem, ImportResult};
 use enums::ImportSource;
 use itertools::Itertools;
 use media_models::DeployJsonImportInput;
@@ -22,12 +22,24 @@ pub async fn import(input: DeployJsonImportInput) -> Result<ImportResult> {
         })
         .collect_vec();
 
+    let mut completed = vec![];
+    for media in media {
+        completed.push(ImportCompletedItem::Metadata(media));
+    }
+    for people in complete_data.people.unwrap_or_default() {
+        completed.push(ImportCompletedItem::Person(people));
+    }
+    for measurement in complete_data.measurements.unwrap_or_default() {
+        completed.push(ImportCompletedItem::Measurement(measurement));
+    }
+    for workout in complete_data.workouts.unwrap_or_default() {
+        completed.push(ImportCompletedItem::ApplicationWorkout(workout));
+    }
+    for media_group in complete_data.media_groups.unwrap_or_default() {
+        completed.push(ImportCompletedItem::MetadataGroup(media_group));
+    }
     Ok(ImportResult {
-        metadata: media,
-        people: complete_data.people.unwrap_or_default(),
-        metadata_groups: complete_data.media_groups.unwrap_or_default(),
-        measurements: complete_data.measurements.unwrap_or_default(),
-        application_workouts: complete_data.workouts.unwrap_or_default(),
+        completed,
         ..Default::default()
     })
 }
diff --git a/crates/services/importer/src/goodreads.rs b/crates/services/importer/src/goodreads.rs
index 233e3343c5..f497399a35 100644
--- a/crates/services/importer/src/goodreads.rs
+++ b/crates/services/importer/src/goodreads.rs
@@ -3,12 +3,12 @@ use chrono::NaiveDate;
 use common_utils::ryot_log;
 use convert_case::{Case, Casing};
 use csv::Reader;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{ImportSource, MediaLot};
 use itertools::Itertools;
 use media_models::{
     DeployGenericCsvImportInput, ImportOrExportItemRating, ImportOrExportItemReview,
-    ImportOrExportMediaItem, ImportOrExportMediaItemSeen,
+    ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen,
 };
 use providers::{google_books::GoogleBooksService, openlibrary::OpenlibraryService};
 use rust_decimal::Decimal;
@@ -43,8 +43,8 @@ pub async fn import(
     open_library_service: &OpenlibraryService,
 ) -> Result<ImportResult> {
     let lot = MediaLot::Book;
-    let mut media = vec![];
-    let mut failed_items = vec![];
+    let mut completed = vec![];
+    let mut failed = vec![];
     let ratings_reader = Reader::from_path(input.csv_path)
         .unwrap()
         .deserialize()
@@ -54,7 +54,7 @@ pub async fn import(
         let record: Book = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -70,7 +70,7 @@ pub async fn import(
         );
         let isbn = record.isbn13[2..record.isbn13.len() - 1].to_owned();
         if isbn.is_empty() {
-            failed_items.push(ImportFailedItem {
+            failed.push(ImportFailedItem {
                 lot: Some(lot),
                 step: ImportFailStep::InputTransformation,
                 identifier: record.title,
@@ -82,7 +82,7 @@ pub async fn import(
             utils::get_identifier_from_book_isbn(&isbn, google_books_service, open_library_service)
                 .await
         else {
-            failed_items.push(ImportFailedItem {
+            failed.push(ImportFailedItem {
                 lot: Some(lot),
                 step: ImportFailStep::InputTransformation,
                 identifier: record.title,
@@ -94,7 +94,7 @@ pub async fn import(
             continue;
         };
         let mut seen_history = vec![
-            ImportOrExportMediaItemSeen {
+            ImportOrExportMetadataItemSeen {
                 started_on: None,
                 ended_on: None,
                 provider_watched_on: Some(ImportSource::Goodreads.to_string()),
@@ -132,7 +132,7 @@ pub async fn import(
                 visibility: None,
             });
         }
-        media.push(ImportOrExportMediaItem {
+        completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
             lot,
             source,
             identifier,
@@ -144,11 +144,7 @@ pub async fn import(
                 rating,
                 ..Default::default()
             }],
-        });
+        }));
     }
-    Ok(ImportResult {
-        metadata: media,
-        failed_items,
-        ..Default::default()
-    })
+    Ok(ImportResult { completed, failed })
 }
diff --git a/crates/services/importer/src/igdb.rs b/crates/services/importer/src/igdb.rs
index a1d9c44755..ace062a5f8 100644
--- a/crates/services/importer/src/igdb.rs
+++ b/crates/services/importer/src/igdb.rs
@@ -1,10 +1,12 @@
 use async_graphql::Result;
 use common_models::DefaultCollection;
 use csv::Reader;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
-use media_models::{DeployIgdbImportInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen};
+use media_models::{
+    DeployIgdbImportInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen,
+};
 use rust_decimal_macros::dec;
 use serde::Deserialize;
 
@@ -20,18 +22,18 @@ pub async fn import(input: DeployIgdbImportInput) -> Result<ImportResult> {
     let lot = MediaLot::VideoGame;
     let source = MediaSource::Igdb;
     let collection = input.collection;
-    let mut media = vec![];
-    let mut failed_items = vec![];
+    let mut completed = vec![];
+    let mut failed = vec![];
     let items = Reader::from_path(input.csv_path)
         .unwrap()
         .deserialize()
         .collect_vec();
     let seen_history = if collection == DefaultCollection::Completed.to_string() {
-        vec![ImportOrExportMediaItemSeen {
+        vec![ImportOrExportMetadataItemSeen {
             ..Default::default()
         }]
     } else if collection == DefaultCollection::InProgress.to_string() {
-        vec![ImportOrExportMediaItemSeen {
+        vec![ImportOrExportMetadataItemSeen {
             progress: Some(dec!(5)),
             ..Default::default()
         }]
@@ -42,7 +44,7 @@ pub async fn import(input: DeployIgdbImportInput) -> Result<ImportResult> {
         let record: Item = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -51,19 +53,15 @@ pub async fn import(input: DeployIgdbImportInput) -> Result<ImportResult> {
                 continue;
             }
         };
-        media.push(ImportOrExportMediaItem {
+        completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
             lot,
             source,
-            source_id: record.game,
             identifier: record.id,
+            source_id: record.game,
             seen_history: seen_history.clone(),
             collections: vec![collection.clone()],
             ..Default::default()
-        });
+        }));
     }
-    Ok(ImportResult {
-        metadata: media,
-        failed_items,
-        ..Default::default()
-    })
+    Ok(ImportResult { failed, completed })
 }
diff --git a/crates/services/importer/src/imdb.rs b/crates/services/importer/src/imdb.rs
index 43d0e21b75..cd5bf7e7d1 100644
--- a/crates/services/importer/src/imdb.rs
+++ b/crates/services/importer/src/imdb.rs
@@ -2,10 +2,10 @@ use async_graphql::Result;
 use common_models::DefaultCollection;
 use common_utils::ryot_log;
 use csv::Reader;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
 use itertools::Itertools;
-use media_models::{DeployGenericCsvImportInput, ImportOrExportMediaItem};
+use media_models::{DeployGenericCsvImportInput, ImportOrExportMetadataItem};
 pub use providers::tmdb::NonMediaTmdbService;
 use serde::Deserialize;
 
@@ -25,8 +25,8 @@ pub async fn import(
     tmdb_service: &NonMediaTmdbService,
 ) -> Result<ImportResult> {
     let source = MediaSource::Tmdb;
-    let mut media = vec![];
-    let mut failed_items = vec![];
+    let mut completed = vec![];
+    let mut failed = vec![];
     let ratings_reader = Reader::from_path(input.csv_path)
         .unwrap()
         .deserialize()
@@ -36,7 +36,7 @@ pub async fn import(
         let record: Item = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: None,
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -49,7 +49,7 @@ pub async fn import(
             "Movie" | "Video" | "movie" | "video" => MediaLot::Movie,
             "TV Series" | "TV Mini Series" | "tvSeries" | "tvMiniSeries" => MediaLot::Show,
             tt => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: None,
                     step: ImportFailStep::InputTransformation,
                     identifier: record.id.clone(),
@@ -64,7 +64,7 @@ pub async fn import(
         {
             Ok(i) => i,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::MediaDetailsFromProvider,
                     identifier: record.id.clone(),
@@ -80,18 +80,14 @@ pub async fn import(
             idx + 1,
             total
         );
-        media.push(ImportOrExportMediaItem {
-            identifier,
+        completed.push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
             lot,
             source,
+            identifier,
             source_id: record.id,
             collections: vec![DefaultCollection::Watchlist.to_string()],
             ..Default::default()
-        });
+        }));
     }
-    Ok(ImportResult {
-        metadata: media,
-        failed_items,
-        ..Default::default()
-    })
+    Ok(ImportResult { failed, completed })
 }
diff --git a/crates/services/importer/src/jellyfin.rs b/crates/services/importer/src/jellyfin.rs
index 3a7abeb227..751256f205 100644
--- a/crates/services/importer/src/jellyfin.rs
+++ b/crates/services/importer/src/jellyfin.rs
@@ -1,11 +1,12 @@
 use async_graphql::Result;
 use common_utils::ryot_log;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enum_meta::HashMap;
 use enums::{MediaLot, MediaSource};
 use external_utils::jellyfin::{get_authenticated_client, ItemResponse, ItemsResponse, MediaType};
 use media_models::{
-    DeployUrlAndKeyAndUsernameImportInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen,
+    DeployUrlAndKeyAndUsernameImportInput, ImportOrExportMetadataItem,
+    ImportOrExportMetadataItemSeen,
 };
 use serde_json::json;
 
@@ -13,7 +14,7 @@ use super::{ImportFailStep, ImportFailedItem};
 
 pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<ImportResult> {
     let mut to_handle_media = vec![];
-    let mut failed_items = vec![];
+    let mut failed = vec![];
 
     let base_url = input.api_url;
     let (client, user_id) =
@@ -64,7 +65,7 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<Impo
                 }
             }
             _ => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     step: ImportFailStep::ItemDetailsFromSource,
                     identifier: item.name,
                     error: Some(format!("Unknown media type: {:?}", type_)),
@@ -75,7 +76,7 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<Impo
         };
         if let Some(tmdb_id) = tmdb_id {
             let item_user_data = item.user_data.unwrap();
-            let seen = ImportOrExportMediaItemSeen {
+            let seen = ImportOrExportMetadataItemSeen {
                 show_season_number: ssn,
                 show_episode_number: sen,
                 ended_on: item_user_data.last_played_date.map(|d| d.date_naive()),
@@ -85,7 +86,7 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<Impo
             if let Some(true) = item_user_data.is_favorite {
                 collections.push("Favorites".to_string());
             }
-            to_handle_media.push(ImportOrExportMediaItem {
+            to_handle_media.push(ImportOrExportMetadataItem {
                 lot,
                 source_id: item.series_name.unwrap_or(item.name),
                 source: MediaSource::Tmdb,
@@ -95,7 +96,7 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<Impo
                 ..Default::default()
             });
         } else {
-            failed_items.push(ImportFailedItem {
+            failed.push(ImportFailedItem {
                 step: ImportFailStep::ItemDetailsFromSource,
                 identifier: item.name,
                 error: Some("No tmdb id found".to_string()),
@@ -104,7 +105,7 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<Impo
         }
     }
 
-    let mut media: Vec<ImportOrExportMediaItem> = vec![];
+    let mut media: Vec<ImportOrExportMetadataItem> = vec![];
 
     for item in to_handle_media {
         let mut found = false;
@@ -122,8 +123,10 @@ pub async fn import(input: DeployUrlAndKeyAndUsernameImportInput) -> Result<Impo
     }
 
     Ok(ImportResult {
-        metadata: media,
-        failed_items,
-        ..Default::default()
+        failed,
+        completed: media
+            .into_iter()
+            .map(ImportCompletedItem::Metadata)
+            .collect(),
     })
 }
diff --git a/crates/services/importer/src/lib.rs b/crates/services/importer/src/lib.rs
index ee256a5dfe..1527da6ed2 100644
--- a/crates/services/importer/src/lib.rs
+++ b/crates/services/importer/src/lib.rs
@@ -11,10 +11,13 @@ use dependent_utils::{
     get_tmdb_non_media_service, process_import,
 };
 use enums::{ImportSource, MediaSource};
-use importer_models::{ImportFailStep, ImportFailedItem, ImportResultResponse};
-use media_models::{DeployImportJobInput, ImportOrExportMediaItem};
+use importer_models::{ImportFailStep, ImportFailedItem};
+use media_models::{DeployImportJobInput, ImportOrExportMetadataItem};
 use providers::{google_books::GoogleBooksService, openlibrary::OpenlibraryService};
-use sea_orm::{ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait, QueryFilter, QueryOrder};
+use rust_decimal_macros::dec;
+use sea_orm::{
+    prelude::Expr, ActiveModelTrait, ActiveValue, ColumnTrait, EntityTrait, QueryFilter, QueryOrder,
+};
 use supporting_service::SupportingService;
 use traits::TraceOk;
 
@@ -24,11 +27,12 @@ mod goodreads;
 mod igdb;
 mod imdb;
 mod jellyfin;
-mod mal;
-mod media_tracker;
+mod mediatracker;
 mod movary;
+mod myanimelist;
 mod open_scale;
-mod story_graph;
+mod plex;
+mod storygraph;
 mod strong_app;
 mod trakt;
 
@@ -61,96 +65,104 @@ impl ImporterService {
         user_id: String,
         input: Box<DeployImportJobInput>,
     ) -> Result<()> {
-        let db_import_job = self.start_import_job(&user_id, input.source).await?;
-        let import = match input.source {
-            ImportSource::StrongApp => {
-                strong_app::import(input.strong_app.unwrap(), &self.0.timezone)
-                    .await
-                    .unwrap()
+        let model = import_report::ActiveModel {
+            source: ActiveValue::Set(input.source),
+            progress: ActiveValue::Set(Some(dec!(0))),
+            user_id: ActiveValue::Set(user_id.to_owned()),
+            ..Default::default()
+        };
+        let db_import_job = model.insert(&self.0.db).await.unwrap();
+        let import_id = db_import_job.id.clone();
+        ryot_log!(debug, "Started import job with id {import_id}");
+        let maybe_import = match input.source {
+            ImportSource::StrongApp => strong_app::import(input.strong_app.unwrap(), &self.0).await,
+            ImportSource::Mediatracker => mediatracker::import(input.url_and_key.unwrap()).await,
+            ImportSource::Myanimelist => myanimelist::import(input.mal.unwrap()).await,
+            ImportSource::Goodreads => {
+                goodreads::import(
+                    input.generic_csv.unwrap(),
+                    &get_google_books_service(&self.0.config).await.unwrap(),
+                    &get_openlibrary_service(&self.0.config).await.unwrap(),
+                )
+                .await
             }
-            ImportSource::MediaTracker => media_tracker::import(input.url_and_key.unwrap())
+            ImportSource::Trakt => trakt::import(input.trakt.unwrap()).await,
+            ImportSource::Movary => movary::import(input.movary.unwrap()).await,
+            ImportSource::Storygraph => {
+                storygraph::import(
+                    input.generic_csv.unwrap(),
+                    &get_google_books_service(&self.0.config).await.unwrap(),
+                    &get_openlibrary_service(&self.0.config).await.unwrap(),
+                )
                 .await
-                .unwrap(),
-            ImportSource::Mal => mal::import(input.mal.unwrap()).await.unwrap(),
-            ImportSource::Goodreads => goodreads::import(
-                input.generic_csv.unwrap(),
-                &get_google_books_service(&self.0.config).await.unwrap(),
-                &get_openlibrary_service(&self.0.config).await.unwrap(),
-            )
-            .await
-            .unwrap(),
-            ImportSource::Trakt => trakt::import(input.trakt.unwrap()).await.unwrap(),
-            ImportSource::Movary => movary::import(input.movary.unwrap()).await.unwrap(),
-            ImportSource::StoryGraph => story_graph::import(
-                input.generic_csv.unwrap(),
-                &get_google_books_service(&self.0.config).await.unwrap(),
-                &get_openlibrary_service(&self.0.config).await.unwrap(),
-            )
-            .await
-            .unwrap(),
-            ImportSource::Audiobookshelf => audiobookshelf::import(
-                input.url_and_key.unwrap(),
-                &get_google_books_service(&self.0.config).await.unwrap(),
-                &get_openlibrary_service(&self.0.config).await.unwrap(),
-                |input| commit_metadata(input, &self.0),
-            )
-            .await
-            .unwrap(),
-            ImportSource::Igdb => igdb::import(input.igdb.unwrap()).await.unwrap(),
-            ImportSource::Imdb => imdb::import(
-                input.generic_csv.unwrap(),
-                &get_tmdb_non_media_service(&self.0).await.unwrap(),
-            )
-            .await
-            .unwrap(),
-            ImportSource::GenericJson => generic_json::import(input.generic_json.unwrap())
+            }
+            ImportSource::Audiobookshelf => {
+                audiobookshelf::import(
+                    input.url_and_key.unwrap(),
+                    &get_google_books_service(&self.0.config).await.unwrap(),
+                    &get_openlibrary_service(&self.0.config).await.unwrap(),
+                    |input| commit_metadata(input, &self.0),
+                )
                 .await
-                .unwrap(),
+            }
+            ImportSource::Igdb => igdb::import(input.igdb.unwrap()).await,
+            ImportSource::Imdb => {
+                imdb::import(
+                    input.generic_csv.unwrap(),
+                    &get_tmdb_non_media_service(&self.0).await.unwrap(),
+                )
+                .await
+            }
+            ImportSource::GenericJson => generic_json::import(input.generic_json.unwrap()).await,
             ImportSource::OpenScale => {
-                open_scale::import(input.generic_csv.unwrap(), &self.0.timezone)
-                    .await
-                    .unwrap()
+                open_scale::import(input.generic_csv.unwrap(), &self.0.timezone).await
             }
-            ImportSource::Jellyfin => jellyfin::import(input.jellyfin.unwrap()).await.unwrap(),
-        };
-        let details = process_import(&user_id, false, import, &self.0).await?;
-        self.finish_import_job(db_import_job, details).await?;
-        deploy_background_job(
-            &user_id,
-            BackgroundJob::CalculateUserActivitiesAndSummary,
-            &self.0,
-        )
-        .await
-        .trace_ok();
-        Ok(())
-    }
-
-    async fn start_import_job(
-        &self,
-        user_id: &String,
-        source: ImportSource,
-    ) -> Result<import_report::Model> {
-        let model = import_report::ActiveModel {
-            user_id: ActiveValue::Set(user_id.to_owned()),
-            source: ActiveValue::Set(source),
-            ..Default::default()
+            ImportSource::Jellyfin => jellyfin::import(input.jellyfin.unwrap()).await,
+            ImportSource::Plex => plex::import(input.url_and_key.unwrap()).await,
         };
-        let model = model.insert(&self.0.db).await.unwrap();
-        ryot_log!(debug, "Started import job with id = {id}", id = model.id);
-        Ok(model)
-    }
-
-    async fn finish_import_job(
-        &self,
-        job: import_report::Model,
-        details: ImportResultResponse,
-    ) -> Result<import_report::Model> {
-        let mut model: import_report::ActiveModel = job.into();
+        let mut model: import_report::ActiveModel = db_import_job.into();
+        match maybe_import {
+            Ok(import) => {
+                match process_import(&user_id, false, import, &self.0, |progress| {
+                    let id = import_id.clone();
+                    async move {
+                        ImportReport::update_many()
+                            .filter(import_report::Column::Id.eq(id.clone()))
+                            .col_expr(import_report::Column::Progress, Expr::value(progress))
+                            .exec(&self.0.db)
+                            .await?;
+                        Ok(())
+                    }
+                })
+                .await
+                {
+                    Ok((source_result, details)) => {
+                        model.source_result =
+                            ActiveValue::Set(Some(serde_json::to_value(&source_result)?));
+                        model.details = ActiveValue::Set(Some(details));
+                        model.was_success = ActiveValue::Set(Some(true));
+                        deploy_background_job(
+                            &user_id,
+                            BackgroundJob::CalculateUserActivitiesAndSummary,
+                            &self.0,
+                        )
+                        .await
+                        .trace_ok();
+                    }
+                    Err(e) => {
+                        ryot_log!(debug, "Error while importing: {:?}", e);
+                        model.was_success = ActiveValue::Set(Some(false));
+                    }
+                }
+            }
+            Err(e) => {
+                ryot_log!(debug, "Error while importing: {:?}", e);
+                model.was_success = ActiveValue::Set(Some(false));
+            }
+        }
         model.finished_on = ActiveValue::Set(Some(Utc::now()));
-        model.details = ActiveValue::Set(Some(details));
-        model.was_success = ActiveValue::Set(Some(true));
-        let model = model.update(&self.0.db).await.unwrap();
-        Ok(model)
+        model.update(&self.0.db).await.trace_ok();
+        Ok(())
     }
 }
 
diff --git a/crates/services/importer/src/media_tracker.rs b/crates/services/importer/src/mediatracker.rs
similarity index 92%
rename from crates/services/importer/src/media_tracker.rs
rename to crates/services/importer/src/mediatracker.rs
index cace5c2cca..1ab4684f43 100644
--- a/crates/services/importer/src/media_tracker.rs
+++ b/crates/services/importer/src/mediatracker.rs
@@ -1,11 +1,11 @@
 use async_graphql::Result;
 use common_models::IdObject;
 use common_utils::{ryot_log, USER_AGENT_STR};
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{ImportSource, MediaLot, MediaSource};
 use media_models::{
     CreateOrUpdateCollectionInput, DeployUrlAndKeyImportInput, ImportOrExportItemRating,
-    ImportOrExportItemReview, ImportOrExportMediaItemSeen,
+    ImportOrExportItemReview, ImportOrExportMetadataItemSeen,
 };
 use providers::openlibrary::get_key;
 use reqwest::{
@@ -18,7 +18,7 @@ use sea_orm::prelude::DateTimeUtc;
 use serde::{Deserialize, Serialize};
 use serde_with::{formats::Flexible, serde_as, TimestampMilliSeconds};
 
-use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem};
+use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem};
 
 #[derive(Debug, Serialize, Deserialize, Clone)]
 #[serde(rename_all = "snake_case")]
@@ -146,17 +146,6 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
         .unwrap();
     let mut lists: Vec<ListResponse> = rsp.json().await.unwrap();
 
-    let collections = lists
-        .iter()
-        .map(|l| CreateOrUpdateCollectionInput {
-            name: l.name.clone(),
-            description: l.description.as_ref().and_then(|s| match s.as_str() {
-                "" => None,
-                x => Some(x.to_owned()),
-            }),
-            ..Default::default()
-        })
-        .collect();
     for list in lists.iter_mut() {
         let rsp = client
             .get(format!("{}/list/items", url))
@@ -168,7 +157,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
         list.items = items;
     }
 
-    let mut failed_items = vec![];
+    let mut failed = vec![];
 
     // all items returned here are seen at least once
     let rsp = client.get(format!("{}/items", url)).send().await.unwrap();
@@ -193,10 +182,10 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
 
     let data_len = data.len();
 
-    let mut final_data = vec![];
+    let mut completed = vec![];
     for (idx, d) in data.into_iter().enumerate() {
         let Some(media_type) = d.media_type else {
-            failed_items.push(ImportFailedItem {
+            failed.push(ImportFailedItem {
                 lot: None,
                 step: ImportFailStep::ItemDetailsFromSource,
                 identifier: d.id.to_string(),
@@ -214,7 +203,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
             Ok(s) => s,
             Err(e) => {
                 ryot_log!(error, "Encountered error for id = {id:?}: {e:?}", id = d.id);
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::ItemDetailsFromSource,
                     identifier: d.id.to_string(),
@@ -226,7 +215,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
         let (identifier, source) = match media_type {
             MediaType::Book => {
                 if let Some(_g_id) = details.goodreads_id {
-                    failed_items.push(ImportFailedItem {
+                    failed.push(ImportFailedItem {
                         lot: Some(lot),
                         step: ImportFailStep::ItemDetailsFromSource,
                         identifier: d.id.to_string(),
@@ -264,7 +253,7 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
             }
         }
 
-        let item = ImportOrExportMediaItem {
+        let item = ImportOrExportMetadataItem {
             source_id: d.id.to_string(),
             source,
             lot,
@@ -302,22 +291,27 @@ pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
                     } else {
                         (None, None)
                     };
-                    ImportOrExportMediaItemSeen {
+                    ImportOrExportMetadataItemSeen {
                         ended_on: s.date.map(|d| d.date_naive()),
                         show_season_number: season_number,
                         show_episode_number: episode_number,
-                        provider_watched_on: Some(ImportSource::MediaTracker.to_string()),
+                        provider_watched_on: Some(ImportSource::Mediatracker.to_string()),
                         ..Default::default()
                     }
                 })
                 .collect(),
         };
-        final_data.push(item);
+        completed.push(ImportCompletedItem::Metadata(item));
     }
-    Ok(ImportResult {
-        metadata: final_data,
-        failed_items,
-        collections,
-        ..Default::default()
-    })
+    completed.extend(lists.iter().map(|l| {
+        ImportCompletedItem::Collection(CreateOrUpdateCollectionInput {
+            name: l.name.clone(),
+            description: l.description.as_ref().and_then(|s| match s.as_str() {
+                "" => None,
+                x => Some(x.to_owned()),
+            }),
+            ..Default::default()
+        })
+    }));
+    Ok(ImportResult { completed, failed })
 }
diff --git a/crates/services/importer/src/movary.rs b/crates/services/importer/src/movary.rs
index 82f213e1bb..08b2a90305 100644
--- a/crates/services/importer/src/movary.rs
+++ b/crates/services/importer/src/movary.rs
@@ -3,17 +3,17 @@ use chrono::NaiveDate;
 use common_models::DefaultCollection;
 use common_utils::convert_naive_to_utc;
 use csv::Reader;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{ImportSource, MediaLot, MediaSource};
 use media_models::{
     DeployMovaryImportInput, ImportOrExportItemRating, ImportOrExportItemReview,
-    ImportOrExportMediaItemSeen,
+    ImportOrExportMetadataItemSeen,
 };
 use rust_decimal::Decimal;
 use rust_decimal_macros::dec;
 use serde::{Deserialize, Serialize};
 
-use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem};
+use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem};
 
 #[derive(Debug, Serialize, Deserialize)]
 #[serde(rename_all = "camelCase")]
@@ -43,13 +43,13 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
     let lot = MediaLot::Movie;
     let source = MediaSource::Tmdb;
     let mut media = vec![];
-    let mut failed_items = vec![];
+    let mut failed = vec![];
     let mut ratings_reader = Reader::from_path(input.ratings).unwrap();
     for (idx, result) in ratings_reader.deserialize().enumerate() {
         let record: Rating = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -58,7 +58,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
                 continue;
             }
         };
-        media.push(ImportOrExportMediaItem {
+        media.push(ImportOrExportMetadataItem {
             source_id: record.common.title.clone(),
             lot,
             source,
@@ -76,7 +76,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
         let record: Common = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -85,7 +85,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
                 continue;
             }
         };
-        media.push(ImportOrExportMediaItem {
+        media.push(ImportOrExportMetadataItem {
             source_id: record.title.clone(),
             lot,
             source,
@@ -99,7 +99,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
         let record: History = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -109,7 +109,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
             }
         };
         let watched_at = Some(convert_naive_to_utc(record.watched_at));
-        let seen_item = ImportOrExportMediaItemSeen {
+        let seen_item = ImportOrExportMetadataItemSeen {
             started_on: None,
             ended_on: watched_at.map(|d| d.date_naive()),
             provider_watched_on: Some(ImportSource::Movary.to_string()),
@@ -144,7 +144,7 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
                     ..Default::default()
                 })
             }
-            media.push(ImportOrExportMediaItem {
+            media.push(ImportOrExportMetadataItem {
                 source_id: record.common.title.clone(),
                 lot,
                 source,
@@ -156,8 +156,10 @@ pub async fn import(input: DeployMovaryImportInput) -> Result<ImportResult> {
         }
     }
     Ok(ImportResult {
-        metadata: media,
-        failed_items,
-        ..Default::default()
+        failed,
+        completed: media
+            .into_iter()
+            .map(ImportCompletedItem::Metadata)
+            .collect(),
     })
 }
diff --git a/crates/services/importer/src/mal.rs b/crates/services/importer/src/myanimelist.rs
similarity index 85%
rename from crates/services/importer/src/mal.rs
rename to crates/services/importer/src/myanimelist.rs
index fd8f7ef96f..6db8b11573 100644
--- a/crates/services/importer/src/mal.rs
+++ b/crates/services/importer/src/myanimelist.rs
@@ -6,13 +6,13 @@ use std::{
 use async_graphql::Result;
 use chrono::NaiveDate;
 use common_utils::convert_string_to_date;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{ImportSource, MediaLot, MediaSource};
 use flate2::bufread::GzDecoder;
 use itertools::Itertools;
 use media_models::{
-    DeployMalImportInput, ImportOrExportItemRating, ImportOrExportMediaItem,
-    ImportOrExportMediaItemSeen,
+    DeployMalImportInput, ImportOrExportItemRating, ImportOrExportMetadataItem,
+    ImportOrExportMetadataItemSeen,
 };
 use rust_decimal::{prelude::FromPrimitive, Decimal};
 use rust_decimal_macros::dec;
@@ -27,15 +27,18 @@ pub async fn import(input: DeployMalImportInput) -> Result<ImportResult> {
         .manga_path
         .map(|p| decode_data::<DataRoot>(&p).unwrap())
         .unwrap_or_default();
-    let mut media = vec![];
+    let mut metadata = vec![];
     for item in anime_data.items.into_iter() {
-        media.push(convert_to_format(item, MediaLot::Anime));
+        metadata.push(convert_to_format(item, MediaLot::Anime));
     }
     for item in manga_data.items.into_iter() {
-        media.push(convert_to_format(item, MediaLot::Manga));
+        metadata.push(convert_to_format(item, MediaLot::Manga));
     }
     Ok(ImportResult {
-        metadata: media,
+        completed: metadata
+            .into_iter()
+            .map(ImportCompletedItem::Metadata)
+            .collect(),
         ..Default::default()
     })
 }
@@ -60,7 +63,7 @@ fn get_date(date: String) -> Option<NaiveDate> {
     }
 }
 
-fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMediaItem {
+fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMetadataItem {
     let seen_history = (1..item.done + 1)
         .map(|i| {
             let (anime_episode, manga_chapter) = match lot {
@@ -68,12 +71,12 @@ fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMediaItem {
                 MediaLot::Manga => (None, Some(Decimal::new(i as i64, 0))),
                 _ => unreachable!(),
             };
-            ImportOrExportMediaItemSeen {
+            ImportOrExportMetadataItemSeen {
                 started_on: get_date(item.my_start_date.clone()),
                 ended_on: get_date(item.my_finish_date.clone()),
                 anime_episode_number: anime_episode,
                 manga_chapter_number: manga_chapter,
-                provider_watched_on: Some(ImportSource::Mal.to_string()),
+                provider_watched_on: Some(ImportSource::Myanimelist.to_string()),
                 ..Default::default()
             }
         })
@@ -87,7 +90,7 @@ fn convert_to_format(item: Item, lot: MediaLot) -> ImportOrExportMediaItem {
         },
         ..Default::default()
     };
-    ImportOrExportMediaItem {
+    ImportOrExportMetadataItem {
         lot,
         source: MediaSource::Mal,
         identifier: item.identifier.to_string(),
diff --git a/crates/services/importer/src/open_scale.rs b/crates/services/importer/src/open_scale.rs
index 521c561a45..8b8a6e939b 100644
--- a/crates/services/importer/src/open_scale.rs
+++ b/crates/services/importer/src/open_scale.rs
@@ -2,7 +2,7 @@ use async_graphql::Result;
 use chrono::NaiveDateTime;
 use csv::ReaderBuilder;
 use database_models::user_measurement;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use fitness_models::UserMeasurementStats;
 use itertools::Itertools;
 use media_models::DeployGenericCsvImportInput;
@@ -40,8 +40,8 @@ pub async fn import(
     input: DeployGenericCsvImportInput,
     timezone: &chrono_tz::Tz,
 ) -> Result<ImportResult> {
-    let mut measurements = vec![];
-    let mut failed_items = vec![];
+    let mut completed = vec![];
+    let mut failed = vec![];
     let ratings_reader = ReaderBuilder::new()
         .from_path(input.csv_path)
         .unwrap()
@@ -51,7 +51,7 @@ pub async fn import(
         let record: Record = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: None,
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -63,7 +63,7 @@ pub async fn import(
         let ndt = NaiveDateTime::parse_from_str(&record.date_time, "%Y-%m-%d %H:%M")
             .expect("Failed to parse input string");
         let timestamp = utils::get_date_time_with_offset(ndt, timezone);
-        measurements.push(user_measurement::Model {
+        completed.push(ImportCompletedItem::Measurement(user_measurement::Model {
             timestamp,
             user_id: "".to_string(),
             name: None,
@@ -88,11 +88,7 @@ pub async fn import(
                 total_body_water: record.water,
                 ..Default::default()
             },
-        });
+        }));
     }
-    Ok(ImportResult {
-        measurements,
-        failed_items,
-        ..Default::default()
-    })
+    Ok(ImportResult { failed, completed })
 }
diff --git a/crates/services/importer/src/plex.rs b/crates/services/importer/src/plex.rs
new file mode 100644
index 0000000000..54edf87b5b
--- /dev/null
+++ b/crates/services/importer/src/plex.rs
@@ -0,0 +1,171 @@
+use application_utils::get_base_http_client;
+use async_graphql::Result;
+use common_models::StringIdObject;
+use common_utils::ryot_log;
+use dependent_models::{ImportCompletedItem, ImportResult};
+use enums::{ImportSource, MediaLot, MediaSource};
+use importer_models::{ImportFailStep, ImportFailedItem};
+use media_models::{
+    DeployUrlAndKeyImportInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen,
+};
+use reqwest::header::{HeaderName, HeaderValue, ACCEPT};
+use sea_orm::prelude::DateTimeUtc;
+use serde::Deserialize;
+use serde_with::{formats::Flexible, serde_as, TimestampSeconds};
+
+#[serde_as]
+#[derive(Debug, Deserialize)]
+struct PlexMetadataItem {
+    title: String,
+    #[serde(rename = "type")]
+    item_type: String,
+    #[serde(rename = "ratingKey")]
+    rating_key: Option<String>,
+    key: String,
+    #[serde(rename = "Guid")]
+    guid: Option<Vec<StringIdObject>>,
+    #[serde_as(as = "Option<TimestampSeconds<i64, Flexible>>")]
+    #[serde(rename = "lastViewedAt")]
+    last_viewed_at: Option<DateTimeUtc>,
+    index: Option<i32>,
+    #[serde(rename = "parentIndex")]
+    parent_index: Option<i32>,
+}
+
+#[derive(Debug, Deserialize)]
+#[serde(rename_all = "PascalCase")]
+struct PlexLibrary {
+    pub directory: Vec<PlexMetadataItem>,
+}
+
+#[derive(Debug, Deserialize)]
+#[serde(rename_all = "PascalCase")]
+struct PlexMetadata {
+    pub metadata: Vec<PlexMetadataItem>,
+}
+
+#[derive(Debug, Deserialize)]
+#[serde(rename_all = "PascalCase")]
+struct PlexMediaResponse<T> {
+    pub media_container: T,
+}
+
+pub async fn import(input: DeployUrlAndKeyImportInput) -> Result<ImportResult> {
+    let client = get_base_http_client(Some(vec![
+        (
+            HeaderName::from_static("x-plex-token"),
+            HeaderValue::from_str(&input.api_key).unwrap(),
+        ),
+        (ACCEPT, HeaderValue::from_static("application/json")),
+    ]));
+    let libraries = client
+        .get(format!("{}/library/sections", input.api_url))
+        .send()
+        .await?
+        .json::<PlexMediaResponse<PlexLibrary>>()
+        .await?;
+
+    let mut success_items = vec![];
+    let mut failed_items = vec![];
+    for dir in libraries.media_container.directory {
+        ryot_log!(debug, "Processing directory {:?}", dir.title);
+        let item_type = dir.item_type.as_str();
+        if !["movie", "show"].contains(&item_type) {
+            ryot_log!(debug, "Skipping directory {:?}", dir.title);
+            continue;
+        }
+        let lot = match item_type {
+            "movie" => MediaLot::Movie,
+            "show" => MediaLot::Show,
+            _ => unreachable!(),
+        };
+        let items = client
+            .get(format!(
+                "{}/library/sections/{}/all",
+                input.api_url, dir.key
+            ))
+            .query(&serde_json::json!({ "includeGuids": "1" }))
+            .send()
+            .await?
+            .json::<PlexMediaResponse<PlexMetadata>>()
+            .await?;
+        for item in items.media_container.metadata {
+            if item.last_viewed_at.is_some() {
+                let gu_ids = item.guid.unwrap_or_default();
+                let Some(tmdb_id) = gu_ids
+                    .iter()
+                    .find(|g| g.id.starts_with("tmdb://"))
+                    .map(|g| &g.id[7..])
+                else {
+                    failed_items.push(ImportFailedItem {
+                        lot: Some(lot),
+                        identifier: item.key.clone(),
+                        step: ImportFailStep::ItemDetailsFromSource,
+                        error: Some("No TMDb ID associated with this media".to_string()),
+                    });
+                    continue;
+                };
+                match lot {
+                    MediaLot::Movie => {
+                        success_items.push(ImportCompletedItem::Metadata(
+                            ImportOrExportMetadataItem {
+                                lot,
+                                reviews: vec![],
+                                source_id: item.key,
+                                collections: vec![],
+                                source: MediaSource::Tmdb,
+                                identifier: tmdb_id.to_string(),
+                                seen_history: vec![ImportOrExportMetadataItemSeen {
+                                    ended_on: item.last_viewed_at.map(|d| d.date_naive()),
+                                    provider_watched_on: Some(ImportSource::Plex.to_string()),
+                                    ..Default::default()
+                                }],
+                            },
+                        ));
+                    }
+                    MediaLot::Show => {
+                        let leaves = client
+                            .get(format!(
+                                "{}/library/metadata/{}/allLeaves",
+                                input.api_url,
+                                item.rating_key.unwrap()
+                            ))
+                            .send()
+                            .await?
+                            .json::<PlexMediaResponse<PlexMetadata>>()
+                            .await?;
+                        let mut item = ImportOrExportMetadataItem {
+                            lot,
+                            reviews: vec![],
+                            collections: vec![],
+                            seen_history: vec![],
+                            source: MediaSource::Tmdb,
+                            source_id: item.key.clone(),
+                            identifier: tmdb_id.to_string(),
+                        };
+                        for leaf in leaves.media_container.metadata {
+                            if leaf.last_viewed_at.is_some() {
+                                item.seen_history.push(ImportOrExportMetadataItemSeen {
+                                    show_episode_number: leaf.index,
+                                    show_season_number: leaf.parent_index,
+                                    ended_on: leaf.last_viewed_at.map(|d| d.date_naive()),
+                                    provider_watched_on: Some(ImportSource::Plex.to_string()),
+                                    ..Default::default()
+                                });
+                            }
+                        }
+                        if !item.seen_history.is_empty() {
+                            success_items.push(ImportCompletedItem::Metadata(item));
+                        }
+                    }
+                    _ => unreachable!(),
+                }
+            }
+        }
+    }
+
+    Ok(ImportResult {
+        completed: success_items,
+        failed: failed_items,
+    })
+}
diff --git a/crates/services/importer/src/story_graph.rs b/crates/services/importer/src/storygraph.rs
similarity index 88%
rename from crates/services/importer/src/story_graph.rs
rename to crates/services/importer/src/storygraph.rs
index 48d8628c18..0800b0dd21 100644
--- a/crates/services/importer/src/story_graph.rs
+++ b/crates/services/importer/src/storygraph.rs
@@ -3,12 +3,12 @@ use chrono::NaiveDate;
 use common_utils::ryot_log;
 use convert_case::{Case, Casing};
 use csv::Reader;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{ImportSource, MediaLot};
 use itertools::Itertools;
 use media_models::{
     DeployGenericCsvImportInput, ImportOrExportItemRating, ImportOrExportItemReview,
-    ImportOrExportMediaItemSeen,
+    ImportOrExportMetadataItemSeen,
 };
 use providers::{google_books::GoogleBooksService, openlibrary::OpenlibraryService};
 use rust_decimal::Decimal;
@@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize};
 
 use crate::utils;
 
-use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem};
+use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem};
 
 #[derive(Debug, Serialize, Deserialize)]
 #[serde(untagged)]
@@ -56,7 +56,7 @@ pub async fn import(
 ) -> Result<ImportResult> {
     let lot = MediaLot::Book;
     let mut media = vec![];
-    let mut failed_items = vec![];
+    let mut failed = vec![];
     let ratings_reader = Reader::from_path(input.csv_path)
         .unwrap()
         .deserialize()
@@ -66,7 +66,7 @@ pub async fn import(
         let record: History = match result {
             Ok(r) => r,
             Err(e) => {
-                failed_items.push(ImportFailedItem {
+                failed.push(ImportFailedItem {
                     lot: Some(lot),
                     step: ImportFailStep::InputTransformation,
                     identifier: idx.to_string(),
@@ -81,7 +81,7 @@ pub async fn import(
             title = record.title
         );
         let Some(isbn) = record.isbn else {
-            failed_items.push(ImportFailedItem {
+            failed.push(ImportFailedItem {
                 lot: Some(lot),
                 step: ImportFailStep::InputTransformation,
                 identifier: record.title,
@@ -93,7 +93,7 @@ pub async fn import(
             utils::get_identifier_from_book_isbn(&isbn, google_books_service, open_library_service)
                 .await
         else {
-            failed_items.push(ImportFailedItem {
+            failed.push(ImportFailedItem {
                 lot: Some(lot),
                 step: ImportFailStep::InputTransformation,
                 identifier: record.title,
@@ -109,10 +109,10 @@ pub async fn import(
             "Got identifier = {identifier:?} from source = {source:?}"
         );
         let mut seen_history = vec![
-            ImportOrExportMediaItemSeen {
+            ImportOrExportMetadataItemSeen {
                 started_on: None,
                 ended_on: None,
-                provider_watched_on: Some(ImportSource::StoryGraph.to_string()),
+                provider_watched_on: Some(ImportSource::Storygraph.to_string()),
                 ..Default::default()
             };
             record.read_count
@@ -130,7 +130,7 @@ pub async fn import(
         if let Some(t) = record.tags {
             collections.extend(t.split(", ").map(|d| d.to_case(Case::Title)))
         }
-        media.push(ImportOrExportMediaItem {
+        media.push(ImportOrExportMetadataItem {
             source_id: record.title.clone(),
             lot,
             source,
@@ -153,8 +153,10 @@ pub async fn import(
         })
     }
     Ok(ImportResult {
-        metadata: media,
-        failed_items,
-        ..Default::default()
+        failed,
+        completed: media
+            .into_iter()
+            .map(ImportCompletedItem::Metadata)
+            .collect(),
     })
 }
diff --git a/crates/services/importer/src/strong_app.rs b/crates/services/importer/src/strong_app.rs
index 07d6cccd0b..af2d1b984a 100644
--- a/crates/services/importer/src/strong_app.rs
+++ b/crates/services/importer/src/strong_app.rs
@@ -1,47 +1,76 @@
-use std::fs;
+use std::{collections::HashMap, fs, sync::Arc};
 
 use async_graphql::Result;
 use chrono::{Duration, NaiveDateTime};
+use common_utils::ryot_log;
 use csv::ReaderBuilder;
-use dependent_models::ImportResult;
+use database_models::{exercise, prelude::Exercise};
+use dependent_models::{ImportCompletedItem, ImportResult};
+use enums::ExerciseLot;
 use fitness_models::{
     SetLot, UserExerciseInput, UserWorkoutInput, UserWorkoutSetRecord, WorkoutSetStatistic,
 };
+use importer_models::{ImportFailStep, ImportFailedItem};
+use indexmap::IndexMap;
 use itertools::Itertools;
 use media_models::DeployStrongAppImportInput;
-use regex::Regex;
+use nanoid::nanoid;
 use rust_decimal::Decimal;
 use rust_decimal_macros::dec;
+use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
 use serde::{Deserialize, Serialize};
+use supporting_service::SupportingService;
 
 use super::utils;
 
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[serde(rename_all = "PascalCase")]
 struct Entry {
+    #[serde(alias = "Workout #")]
+    workout_number: String,
     date: String,
+    #[serde(alias = "Workout Name")]
+    workout_name: String,
+    #[serde(alias = "Duration (sec)", alias = "Duration")]
+    workout_duration: String,
+    #[serde(alias = "Exercise Name")]
+    exercise_name: String,
+    #[serde(alias = "Set Order")]
+    set_order: String,
+    #[serde(alias = "Weight (kg)")]
     weight: Option<Decimal>,
     reps: Option<Decimal>,
+    #[serde(alias = "Distance (m)")]
     distance: Option<Decimal>,
     seconds: Option<Decimal>,
     notes: Option<String>,
-    #[serde(alias = "Set Order")]
-    set_order: u8,
-    #[serde(alias = "Workout Duration", alias = "Duration")]
-    workout_duration: String,
-    #[serde(alias = "Workout Name")]
-    workout_name: String,
     #[serde(alias = "Workout Notes")]
     workout_notes: Option<String>,
-    #[serde(alias = "Exercise Name")]
-    exercise_name: String,
 }
 
 pub async fn import(
     input: DeployStrongAppImportInput,
-    timezone: &chrono_tz::Tz,
+    ss: &Arc<SupportingService>,
 ) -> Result<ImportResult> {
-    let file_string = fs::read_to_string(&input.export_path)?;
+    let mut completed = vec![];
+    let mut failed = vec![];
+    if let Some(csv_path) = input.data_export_path {
+        import_exercises(csv_path, ss, &mut failed, &mut completed).await?;
+    }
+    Ok(ImportResult {
+        failed,
+        completed,
+        ..Default::default()
+    })
+}
+
+async fn import_exercises(
+    csv_path: String,
+    ss: &Arc<SupportingService>,
+    failed: &mut Vec<ImportFailedItem>,
+    completed: &mut Vec<ImportCompletedItem>,
+) -> Result<()> {
+    let file_string = fs::read_to_string(&csv_path)?;
     // DEV: Delimiter is `;` on android and `,` on iOS, so we determine it by reading the first line
     let data = file_string.clone();
     let first_line = data.lines().next().unwrap();
@@ -52,93 +81,139 @@ pub async fn import(
     } else {
         return Err("Could not determine delimiter".into());
     };
-    let mut workouts = vec![];
-    let mut entries_reader = ReaderBuilder::new()
+
+    let mut unique_exercises: HashMap<String, exercise::Model> = HashMap::new();
+    let entries_reader = ReaderBuilder::new()
         .delimiter(delimiter)
         .from_reader(file_string.as_bytes())
         .deserialize::<Entry>()
         .map(|r| r.unwrap())
         .collect_vec();
-    // DEV: Without this, the last workout does not get appended
-    entries_reader.push(Entry {
-        date: "invalid".to_string(),
-        set_order: 0,
-        ..Default::default()
-    });
-    let mut exercises = vec![];
-    let mut sets = vec![];
-    let mut notes = vec![];
-    for (entry, next_entry) in entries_reader.into_iter().tuple_windows() {
-        let target_exercise = input
-            .mapping
-            .iter()
-            .find(|m| m.source_name == entry.exercise_name.trim())
-            .ok_or_else(|| format!("No mapping found for '{}'", entry.exercise_name))?;
-        let mut weight = entry.weight.map(|d| if d == dec!(0) { dec!(1) } else { d });
-        if let Some(mul) = target_exercise.multiplier {
-            weight = weight.map(|w| w.saturating_mul(mul));
-        }
-        sets.push(UserWorkoutSetRecord {
-            statistic: WorkoutSetStatistic {
-                weight,
-                reps: entry.reps,
-                distance: entry.distance,
-                duration: entry.seconds.and_then(|r| r.checked_div(dec!(60))),
-                ..Default::default()
-            },
-            note: None,
-            rest_time: None,
-            confirmed_at: None,
-            lot: SetLot::Normal,
-        });
-        if let Some(n) = entry.notes {
-            notes.push(n);
-        }
-        if next_entry.set_order <= entry.set_order {
-            exercises.push(UserExerciseInput {
-                sets,
-                notes,
-                assets: None,
-                exercise_id: target_exercise.target_name.clone(),
-            });
-            sets = vec![];
-            notes = vec![];
+
+    let mut workouts_to_entries = IndexMap::new();
+    for entry in entries_reader.clone() {
+        workouts_to_entries
+            .entry(entry.workout_number.clone())
+            .or_insert(vec![])
+            .push(entry);
+    }
+
+    let mut exercises_to_workouts = IndexMap::new();
+
+    for (workout_number, entries) in workouts_to_entries {
+        let mut exercises = IndexMap::new();
+        for entry in entries {
+            exercises
+                .entry(entry.exercise_name.clone())
+                .or_insert(vec![])
+                .push(entry);
         }
-        if next_entry.date != entry.date {
-            let ndt = NaiveDateTime::parse_from_str(&entry.date, "%Y-%m-%d %H:%M:%S")
-                .expect("Failed to parse input string");
-            let ndt = utils::get_date_time_with_offset(ndt, timezone);
-            let re = Regex::new(r"^(\d+h)?\s?(\d+m)?$").unwrap();
-            let workout_duration = if let Some(captures) = re.captures(&entry.workout_duration) {
-                let hours = captures.get(1).map_or(0, |m| {
-                    m.as_str().trim_end_matches('h').parse::<i64>().unwrap_or(0)
-                });
-                let minutes = captures.get(2).map_or(0, |m| {
-                    m.as_str().trim_end_matches('m').parse::<i64>().unwrap_or(0)
+        exercises_to_workouts.insert(workout_number, exercises);
+    }
+
+    for (_workout_number, workout) in exercises_to_workouts {
+        let first_exercise = workout.first().unwrap().1.first().unwrap();
+        let ndt = NaiveDateTime::parse_from_str(&first_exercise.date, "%Y-%m-%d %H:%M:%S")
+            .expect("Failed to parse input string");
+        let ndt = utils::get_date_time_with_offset(ndt, &ss.timezone);
+        let workout_duration =
+            Duration::try_seconds(first_exercise.workout_duration.parse().unwrap()).unwrap();
+        let mut collected_exercises = vec![];
+        for (exercise_name, exercises) in workout.clone() {
+            let mut collected_sets = vec![];
+            let mut notes = vec![];
+            let valid_ex = exercises.iter().find(|e| e.set_order != "Note").unwrap();
+            let exercise_lot = if valid_ex.seconds.is_some() && valid_ex.distance.is_some() {
+                ExerciseLot::DistanceAndDuration
+            } else if valid_ex.seconds.is_some() {
+                ExerciseLot::Duration
+            } else if valid_ex.reps.is_some() && valid_ex.weight.is_some() {
+                ExerciseLot::RepsAndWeight
+            } else if valid_ex.reps.is_some() {
+                ExerciseLot::Reps
+            } else {
+                failed.push(ImportFailedItem {
+                    lot: None,
+                    step: ImportFailStep::InputTransformation,
+                    identifier: format!(
+                        "Workout #{}, Set #{}",
+                        valid_ex.workout_number, valid_ex.set_order
+                    ),
+                    error: Some(format!(
+                        "Could not determine exercise lot: {}",
+                        serde_json::to_string(&valid_ex).unwrap()
+                    )),
                 });
-                Duration::try_hours(hours).unwrap() + Duration::try_minutes(minutes).unwrap()
+                continue;
+            };
+            let existing_exercise = Exercise::find()
+                .filter(exercise::Column::Id.eq(&exercise_name))
+                .filter(exercise::Column::Lot.eq(exercise_lot))
+                .one(&ss.db)
+                .await?;
+            let exercise_id = if let Some(db_ex) = existing_exercise {
+                db_ex.id
+            } else if let Some(mem_ex) = unique_exercises.get(&exercise_name) {
+                mem_ex.id.clone()
             } else {
-                Duration::try_seconds(0).unwrap()
+                let id = format!("{} [{}]", exercise_name, nanoid!(5));
+                unique_exercises.insert(
+                    exercise_name.clone(),
+                    exercise::Model {
+                        id: id.clone(),
+                        lot: exercise_lot,
+                        ..Default::default()
+                    },
+                );
+                id
             };
-            workouts.push(UserWorkoutInput {
-                exercises,
+            ryot_log!(debug, "Importing exercise with id = {}", exercise_id);
+            for sets in exercises {
+                if let Some(note) = sets.notes {
+                    notes.push(note);
+                }
+                let weight = sets.weight.map(|d| if d == dec!(0) { dec!(1) } else { d });
+                collected_sets.push(UserWorkoutSetRecord {
+                    statistic: WorkoutSetStatistic {
+                        weight,
+                        reps: sets.reps,
+                        duration: sets.seconds.and_then(|r| r.checked_div(dec!(60))),
+                        distance: sets.distance.and_then(|d| d.checked_div(dec!(1000))),
+                        ..Default::default()
+                    },
+                    note: None,
+                    rest_time: None,
+                    confirmed_at: None,
+                    lot: SetLot::Normal,
+                });
+            }
+            collected_exercises.push(UserExerciseInput {
+                notes,
+                exercise_id,
                 assets: None,
-                start_time: ndt,
-                supersets: vec![],
-                template_id: None,
-                repeated_from: None,
-                create_workout_id: None,
-                update_workout_id: None,
-                name: entry.workout_name,
-                comment: entry.workout_notes,
-                end_time: ndt + workout_duration,
-                update_workout_template_id: None,
+                sets: collected_sets,
             });
-            exercises = vec![];
         }
+        completed.push(ImportCompletedItem::Workout(UserWorkoutInput {
+            assets: None,
+            start_time: ndt,
+            supersets: vec![],
+            template_id: None,
+            repeated_from: None,
+            create_workout_id: None,
+            update_workout_id: None,
+            exercises: collected_exercises,
+            end_time: ndt + workout_duration,
+            update_workout_template_id: None,
+            name: first_exercise.workout_name.clone(),
+            comment: first_exercise.workout_notes.clone(),
+        }));
     }
-    Ok(ImportResult {
-        workouts,
-        ..Default::default()
-    })
+    completed.extend(
+        unique_exercises
+            .values()
+            .cloned()
+            .map(ImportCompletedItem::Exercise),
+    );
+    Ok(())
 }
diff --git a/crates/services/importer/src/trakt.rs b/crates/services/importer/src/trakt.rs
index b33f4e2279..5cb3ce4dc7 100644
--- a/crates/services/importer/src/trakt.rs
+++ b/crates/services/importer/src/trakt.rs
@@ -2,13 +2,13 @@ use application_utils::get_base_http_client;
 use async_graphql::Result;
 use common_utils::{ryot_log, APPLICATION_JSON_HEADER};
 use convert_case::{Case, Casing};
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{ImportSource, MediaLot, MediaSource};
 use env_utils::TRAKT_CLIENT_ID;
 use itertools::Itertools;
 use media_models::{
     CreateOrUpdateCollectionInput, DeployTraktImportInput, ImportOrExportItemRating,
-    ImportOrExportItemReview, ImportOrExportMediaItemSeen,
+    ImportOrExportItemReview, ImportOrExportMetadataItemSeen,
 };
 use reqwest::header::{HeaderName, HeaderValue, CONTENT_TYPE};
 use rust_decimal::Decimal;
@@ -16,7 +16,7 @@ use rust_decimal_macros::dec;
 use sea_orm::prelude::DateTimeUtc;
 use serde::{Deserialize, Serialize};
 
-use super::{ImportFailStep, ImportFailedItem, ImportOrExportMediaItem};
+use super::{ImportFailStep, ImportFailedItem, ImportOrExportMetadataItem};
 
 const API_URL: &str = "https://api.trakt.tv";
 const API_VERSION: &str = "2";
@@ -55,8 +55,8 @@ struct ListResponse {
 }
 
 pub async fn import(input: DeployTraktImportInput) -> Result<ImportResult> {
-    let mut media = vec![];
-    let mut failed_items = vec![];
+    let mut completed = vec![];
+    let mut failed = vec![];
 
     let url = format!("{}/users/{}", API_URL, input.username);
     let client = get_base_http_client(Some(vec![
@@ -105,28 +105,13 @@ pub async fn import(input: DeployTraktImportInput) -> Result<ImportResult> {
             match process_item(i) {
                 Ok(mut d) => {
                     d.collections.push(l.name.to_case(Case::Title));
-                    media.push(d)
+                    completed.push(d)
                 }
-                Err(d) => failed_items.push(d),
+                Err(d) => failed.push(d),
             }
         }
     }
 
-    let collections = lists
-        .iter()
-        .map(|l| CreateOrUpdateCollectionInput {
-            name: l.name.to_case(Case::Title),
-            description: l.description.as_ref().and_then(|s| {
-                if s.is_empty() {
-                    None
-                } else {
-                    Some(s.to_owned())
-                }
-            }),
-            ..Default::default()
-        })
-        .collect_vec();
-
     for type_ in ["movies", "shows"] {
         let rsp = client
             .get(format!("{}/ratings/{}", url, type_))
@@ -150,13 +135,13 @@ pub async fn import(input: DeployTraktImportInput) -> Result<ImportResult> {
                         }),
                         ..Default::default()
                     });
-                    if let Some(a) = media.iter_mut().find(|i| i.source_id == d.source_id) {
+                    if let Some(a) = completed.iter_mut().find(|i| i.source_id == d.source_id) {
                         a.reviews = d.reviews;
                     } else {
-                        media.push(d)
+                        completed.push(d)
                     }
                 }
-                Err(d) => failed_items.push(d),
+                Err(d) => failed.push(d),
             }
         }
     }
@@ -200,7 +185,7 @@ pub async fn import(input: DeployTraktImportInput) -> Result<ImportResult> {
                 if d.lot == MediaLot::Show
                     && (show_season_number.is_none() || show_episode_number.is_none())
                 {
-                    failed_items.push(ImportFailedItem {
+                    failed.push(ImportFailedItem {
                         lot: Some(d.lot),
                         step: ImportFailStep::ItemDetailsFromSource,
                         identifier: "".to_owned(),
@@ -211,34 +196,47 @@ pub async fn import(input: DeployTraktImportInput) -> Result<ImportResult> {
                     });
                     continue;
                 }
-                d.seen_history.push(ImportOrExportMediaItemSeen {
+                d.seen_history.push(ImportOrExportMetadataItemSeen {
                     ended_on: item.watched_at.map(|d| d.date_naive()),
                     show_season_number,
                     provider_watched_on: Some(ImportSource::Trakt.to_string()),
                     show_episode_number,
                     ..Default::default()
                 });
-                if let Some(a) = media
+                if let Some(a) = completed
                     .iter_mut()
                     .find(|i| i.identifier == d.identifier && i.lot == d.lot)
                 {
                     a.seen_history.extend(d.seen_history);
                 } else {
-                    media.push(d)
+                    completed.push(d)
                 }
             }
-            Err(d) => failed_items.push(d),
+            Err(d) => failed.push(d),
         }
     }
-    Ok(ImportResult {
-        collections,
-        metadata: media,
-        failed_items,
-        ..Default::default()
-    })
+
+    let mut completed = completed
+        .into_iter()
+        .map(ImportCompletedItem::Metadata)
+        .collect_vec();
+    completed.extend(lists.iter().map(|l| {
+        ImportCompletedItem::Collection(CreateOrUpdateCollectionInput {
+            name: l.name.to_case(Case::Title),
+            description: l.description.as_ref().and_then(|s| {
+                if s.is_empty() {
+                    None
+                } else {
+                    Some(s.to_owned())
+                }
+            }),
+            ..Default::default()
+        })
+    }));
+    Ok(ImportResult { completed, failed })
 }
 
-fn process_item(i: &ListItemResponse) -> Result<ImportOrExportMediaItem, ImportFailedItem> {
+fn process_item(i: &ListItemResponse) -> Result<ImportOrExportMetadataItem, ImportFailedItem> {
     let (source_id, identifier, lot) = if let Some(d) = i.movie.as_ref() {
         (d.ids.trakt, d.ids.tmdb, MediaLot::Movie)
     } else if let Some(d) = i.show.as_ref() {
@@ -252,7 +250,7 @@ fn process_item(i: &ListItemResponse) -> Result<ImportOrExportMediaItem, ImportF
         });
     };
     match identifier {
-        Some(identifier) => Ok(ImportOrExportMediaItem {
+        Some(identifier) => Ok(ImportOrExportMetadataItem {
             lot,
             source: MediaSource::Tmdb,
             source_id: source_id.to_string(),
diff --git a/crates/services/integration/Cargo.toml b/crates/services/integration/Cargo.toml
index 664d0a35ea..996a58f121 100644
--- a/crates/services/integration/Cargo.toml
+++ b/crates/services/integration/Cargo.toml
@@ -15,12 +15,12 @@ database-utils = { path = "../../utils/database" }
 dependent-models = { path = "../../models/dependent" }
 dependent-utils = { path = "../../utils/dependent" }
 enums = { path = "../../enums" }
-eventsource-stream = "=0.2.3"
+eventsource-stream = { workspace = true }
 external-utils = { path = "../../utils/external" }
 itertools = { workspace = true }
 media-models = { path = "../../models/media" }
 providers = { path = "../../providers" }
-radarr-api-rs = "=3.0.1"
+radarr-api-rs = { workspace = true }
 regex = { workspace = true }
 reqwest = { workspace = true }
 rust_decimal = { workspace = true }
@@ -29,7 +29,7 @@ sea-orm = { workspace = true }
 sea-query = { workspace = true }
 serde = { workspace = true }
 serde_json = { workspace = true }
-sonarr-api-rs = "=3.0.0"
+sonarr-api-rs = { workspace = true }
 specific-models = { path = "../../models/specific" }
 supporting-service = { path = "../supporting" }
 tokio = { workspace = true }
diff --git a/crates/services/integration/src/lib.rs b/crates/services/integration/src/lib.rs
index b486c9a7a7..cf10e1ddbd 100644
--- a/crates/services/integration/src/lib.rs
+++ b/crates/services/integration/src/lib.rs
@@ -9,7 +9,7 @@ use database_models::{
     seen, user_to_entity,
 };
 use database_utils::user_by_id;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use dependent_utils::{commit_metadata, process_import};
 use enums::{EntityLot, IntegrationLot, IntegrationProvider, MediaLot};
 use media_models::SeenShowExtraInformation;
@@ -45,34 +45,42 @@ impl IntegrationService {
         updates: ImportResult,
     ) -> GqlResult<()> {
         let mut import = updates;
-        import.metadata.iter_mut().for_each(|media| {
-            media.seen_history.retain(|update| match update.progress {
-                Some(progress) if progress < integration.minimum_progress.unwrap() => {
-                    ryot_log!(
-                        debug,
-                        "Progress update for integration {} is below minimum threshold",
-                        integration.id
-                    );
-                    false
-                }
-                Some(_) => true,
-                None => false,
-            });
-            media.seen_history.iter_mut().for_each(|update| {
-                update.ended_on = Some(Utc::now().date_naive());
-                if let Some(progress) = update.progress {
-                    if progress > integration.maximum_progress.unwrap() {
-                        ryot_log!(
-                            debug,
-                            "Changing progress to 100 for integration {}",
-                            integration.id
-                        );
-                        update.progress = Some(dec!(100));
+        import.completed.iter_mut().for_each(|item| {
+            if let ImportCompletedItem::Metadata(metadata) = item {
+                metadata
+                    .seen_history
+                    .retain(|update| match update.progress {
+                        Some(progress) if progress < integration.minimum_progress.unwrap() => {
+                            ryot_log!(
+                                debug,
+                                "Progress update for integration {} is below minimum threshold",
+                                integration.id
+                            );
+                            false
+                        }
+                        Some(_) => true,
+                        None => false,
+                    });
+                metadata.seen_history.iter_mut().for_each(|update| {
+                    update.ended_on = Some(Utc::now().date_naive());
+                    if let Some(progress) = update.progress {
+                        if progress > integration.maximum_progress.unwrap() {
+                            ryot_log!(
+                                debug,
+                                "Changing progress to 100 for integration {}",
+                                integration.id
+                            );
+                            update.progress = Some(dec!(100));
+                        }
                     }
-                }
-            });
+                });
+            }
         });
-        match process_import(&integration.user_id, true, import, &self.0).await {
+        match process_import(&integration.user_id, true, import, &self.0, |_| async {
+            Ok(())
+        })
+        .await
+        {
             Ok(_) => {
                 let mut to_update: integration::ActiveModel = integration.into();
                 to_update.last_triggered_on = ActiveValue::Set(Some(Utc::now()));
diff --git a/crates/services/integration/src/push/jellyfin.rs b/crates/services/integration/src/push/jellyfin.rs
index 6eb0a31c5a..14b800b9c6 100644
--- a/crates/services/integration/src/push/jellyfin.rs
+++ b/crates/services/integration/src/push/jellyfin.rs
@@ -1,3 +1,4 @@
+use anyhow::Result;
 use common_utils::ryot_log;
 use enums::MediaLot;
 use external_utils::jellyfin::{get_authenticated_client, ItemsResponse};
@@ -33,7 +34,7 @@ impl<'a> JellyfinPushIntegration<'a> {
         }
     }
 
-    pub async fn push_progress(&self) -> anyhow::Result<()> {
+    pub async fn push_progress(&self) -> Result<()> {
         match *self.metadata_lot {
             MediaLot::Movie | MediaLot::Show => {}
             _ => {
diff --git a/crates/services/integration/src/push/radarr.rs b/crates/services/integration/src/push/radarr.rs
index 58b5907050..f6d30982b3 100644
--- a/crates/services/integration/src/push/radarr.rs
+++ b/crates/services/integration/src/push/radarr.rs
@@ -1,3 +1,4 @@
+use anyhow::Result;
 use common_utils::ryot_log;
 use enums::MediaLot;
 use radarr_api_rs::{
@@ -40,7 +41,7 @@ impl RadarrPushIntegration {
         }
     }
 
-    pub async fn push_progress(&self) -> anyhow::Result<()> {
+    pub async fn push_progress(&self) -> Result<()> {
         if self.metadata_lot != MediaLot::Movie {
             ryot_log!(debug, "Not a movie, skipping {:#?}", self.metadata_title);
             return Ok(());
diff --git a/crates/services/integration/src/push/sonarr.rs b/crates/services/integration/src/push/sonarr.rs
index 72db381d8f..626cbad63d 100644
--- a/crates/services/integration/src/push/sonarr.rs
+++ b/crates/services/integration/src/push/sonarr.rs
@@ -1,3 +1,4 @@
+use anyhow::Result;
 use common_utils::ryot_log;
 use enums::MediaLot;
 use sonarr_api_rs::{
@@ -40,7 +41,7 @@ impl SonarrPushIntegration {
         }
     }
 
-    pub async fn push_progress(&self) -> anyhow::Result<()> {
+    pub async fn push_progress(&self) -> Result<()> {
         if self.metadata_lot != MediaLot::Show {
             ryot_log!(debug, "Not a show, skipping {:#?}", self.metadata_title);
             return Ok(());
diff --git a/crates/services/integration/src/sink/emby.rs b/crates/services/integration/src/sink/emby.rs
index 93c266549f..006c78bd35 100644
--- a/crates/services/integration/src/sink/emby.rs
+++ b/crates/services/integration/src/sink/emby.rs
@@ -1,7 +1,7 @@
 use anyhow::{bail, Result};
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
-use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen};
+use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen};
 use rust_decimal::Decimal;
 use rust_decimal_macros::dec;
 use sea_orm::DatabaseConnection;
@@ -90,11 +90,11 @@ impl EmbySinkIntegration {
                 _ => bail!("Only movies and shows supported"),
             };
         Ok(ImportResult {
-            metadata: vec![ImportOrExportMediaItem {
+            completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
                 lot,
                 identifier,
                 source: MediaSource::Tmdb,
-                seen_history: vec![ImportOrExportMediaItemSeen {
+                seen_history: vec![ImportOrExportMetadataItemSeen {
                     provider_watched_on: Some("Emby".to_string()),
                     progress: Some(position / runtime * dec!(100)),
                     show_season_number: payload.item.season_number,
@@ -102,7 +102,7 @@ impl EmbySinkIntegration {
                     ..Default::default()
                 }],
                 ..Default::default()
-            }],
+            })],
             ..Default::default()
         })
     }
diff --git a/crates/services/integration/src/sink/generic_json.rs b/crates/services/integration/src/sink/generic_json.rs
index ffb9fa3179..f73274e3fd 100644
--- a/crates/services/integration/src/sink/generic_json.rs
+++ b/crates/services/integration/src/sink/generic_json.rs
@@ -1,5 +1,5 @@
 use anyhow::{bail, Result};
-use dependent_models::{CompleteExport, ImportResult};
+use dependent_models::{CompleteExport, ImportCompletedItem, ImportResult};
 
 pub(crate) struct GenericJsonSinkIntegration {
     payload: String,
@@ -14,12 +14,24 @@ impl GenericJsonSinkIntegration {
             Ok(val) => val,
             Err(err) => bail!(err),
         };
+        let mut completed = vec![];
+        for media in payload.media.unwrap_or_default() {
+            completed.push(ImportCompletedItem::Metadata(media));
+        }
+        for people in payload.people.unwrap_or_default() {
+            completed.push(ImportCompletedItem::Person(people));
+        }
+        for measurement in payload.measurements.unwrap_or_default() {
+            completed.push(ImportCompletedItem::Measurement(measurement));
+        }
+        for workout in payload.workouts.unwrap_or_default() {
+            completed.push(ImportCompletedItem::ApplicationWorkout(workout));
+        }
+        for media_group in payload.media_groups.unwrap_or_default() {
+            completed.push(ImportCompletedItem::MetadataGroup(media_group));
+        }
         Ok(ImportResult {
-            metadata: payload.media.unwrap_or_default(),
-            people: payload.people.unwrap_or_default(),
-            measurements: payload.measurements.unwrap_or_default(),
-            metadata_groups: payload.media_groups.unwrap_or_default(),
-            application_workouts: payload.workouts.unwrap_or_default(),
+            completed,
             ..Default::default()
         })
     }
diff --git a/crates/services/integration/src/sink/jellyfin.rs b/crates/services/integration/src/sink/jellyfin.rs
index 5e76411bfb..fef7743c7f 100644
--- a/crates/services/integration/src/sink/jellyfin.rs
+++ b/crates/services/integration/src/sink/jellyfin.rs
@@ -1,7 +1,7 @@
 use anyhow::{bail, Result};
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
-use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen};
+use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen};
 use rust_decimal::Decimal;
 use rust_decimal_macros::dec;
 use serde::{Deserialize, Serialize};
@@ -89,11 +89,11 @@ impl JellyfinSinkIntegration {
         };
 
         Ok(ImportResult {
-            metadata: vec![ImportOrExportMediaItem {
+            completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
                 lot,
                 identifier,
                 source: MediaSource::Tmdb,
-                seen_history: vec![ImportOrExportMediaItemSeen {
+                seen_history: vec![ImportOrExportMetadataItemSeen {
                     progress: Some(position / runtime * dec!(100)),
                     show_season_number: payload.item.season_number,
                     show_episode_number: payload.item.episode_number,
@@ -101,7 +101,7 @@ impl JellyfinSinkIntegration {
                     ..Default::default()
                 }],
                 ..Default::default()
-            }],
+            })],
             ..Default::default()
         })
     }
diff --git a/crates/services/integration/src/sink/kodi.rs b/crates/services/integration/src/sink/kodi.rs
index 73001ce310..ffc3afb33f 100644
--- a/crates/services/integration/src/sink/kodi.rs
+++ b/crates/services/integration/src/sink/kodi.rs
@@ -1,7 +1,7 @@
 use anyhow::{bail, Result};
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
-use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen};
+use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen};
 use rust_decimal::Decimal;
 use serde::{Deserialize, Serialize};
 
@@ -29,11 +29,11 @@ impl KodiSinkIntegration {
         };
 
         Ok(ImportResult {
-            metadata: vec![ImportOrExportMediaItem {
+            completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
                 lot: payload.lot,
                 source: MediaSource::Tmdb,
                 identifier: payload.identifier,
-                seen_history: vec![ImportOrExportMediaItemSeen {
+                seen_history: vec![ImportOrExportMetadataItemSeen {
                     progress: Some(payload.progress),
                     provider_watched_on: Some("Kodi".to_string()),
                     show_season_number: payload.show_season_number,
@@ -41,7 +41,7 @@ impl KodiSinkIntegration {
                     ..Default::default()
                 }],
                 ..Default::default()
-            }],
+            })],
             ..Default::default()
         })
     }
diff --git a/crates/services/integration/src/sink/plex.rs b/crates/services/integration/src/sink/plex.rs
index a638e60853..1eba48b6af 100644
--- a/crates/services/integration/src/sink/plex.rs
+++ b/crates/services/integration/src/sink/plex.rs
@@ -1,7 +1,8 @@
 use anyhow::{bail, Context, Result};
-use dependent_models::ImportResult;
+use common_models::StringIdObject;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
-use media_models::{ImportOrExportMediaItem, ImportOrExportMediaItemSeen};
+use media_models::{ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen};
 use regex::Regex;
 use rust_decimal::Decimal;
 use rust_decimal_macros::dec;
@@ -13,10 +14,6 @@ use crate::utils::get_show_by_episode_identifier;
 mod models {
     use super::*;
 
-    #[derive(Serialize, Deserialize, Debug, Clone)]
-    pub struct PlexWebhookMetadataGuid {
-        pub id: String,
-    }
     #[derive(Serialize, Deserialize, Debug, Clone)]
     pub struct PlexWebhookMetadataPayload {
         #[serde(rename = "type")]
@@ -31,7 +28,7 @@ mod models {
         #[serde(rename = "index")]
         pub episode_number: Option<i32>,
         #[serde(rename = "Guid")]
-        pub guids: Vec<PlexWebhookMetadataGuid>,
+        pub guids: Vec<StringIdObject>,
     }
     #[derive(Serialize, Deserialize, Debug, Clone)]
     pub struct PlexWebhookAccount {
@@ -75,10 +72,7 @@ impl PlexSinkIntegration {
         serde_json::from_str(json_payload).context("Error during JSON payload deserialization")
     }
 
-    fn get_tmdb_identifier<'a>(
-        &self,
-        guids: &'a [models::PlexWebhookMetadataGuid],
-    ) -> Result<&'a str> {
+    fn get_tmdb_identifier<'a>(&self, guids: &'a [StringIdObject]) -> Result<&'a str> {
         guids
             .iter()
             .find(|g| g.id.starts_with("tmdb://"))
@@ -133,11 +127,11 @@ impl PlexSinkIntegration {
         let progress = self.calculate_progress(&payload)?;
 
         Ok(ImportResult {
-            metadata: vec![ImportOrExportMediaItem {
+            completed: vec![ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
                 lot,
                 identifier,
                 source: MediaSource::Tmdb,
-                seen_history: vec![ImportOrExportMediaItemSeen {
+                seen_history: vec![ImportOrExportMetadataItemSeen {
                     progress: Some(progress),
                     provider_watched_on: Some("Plex".to_string()),
                     show_season_number: payload.metadata.season_number,
@@ -145,7 +139,7 @@ impl PlexSinkIntegration {
                     ..Default::default()
                 }],
                 ..Default::default()
-            }],
+            })],
             ..Default::default()
         })
     }
diff --git a/crates/services/integration/src/yank/audiobookshelf.rs b/crates/services/integration/src/yank/audiobookshelf.rs
index 7d17c4a602..fa82f0ae9b 100644
--- a/crates/services/integration/src/yank/audiobookshelf.rs
+++ b/crates/services/integration/src/yank/audiobookshelf.rs
@@ -6,9 +6,9 @@ use async_graphql::Result as GqlResult;
 use common_models::DefaultCollection;
 use common_utils::ryot_log;
 use database_models::metadata;
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
-use media_models::{CommitMediaInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen};
+use media_models::{CommitMediaInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen};
 use providers::google_books::GoogleBooksService;
 use reqwest::header::{HeaderValue, AUTHORIZATION};
 use rust_decimal_macros::dec;
@@ -161,18 +161,20 @@ impl AudiobookshelfYankIntegration {
                     } else {
                         resp.progress
                     };
-                    result.metadata.push(ImportOrExportMediaItem {
-                        lot,
-                        source,
-                        identifier,
-                        seen_history: vec![ImportOrExportMediaItemSeen {
-                            podcast_episode_number,
-                            progress: Some(progress * dec!(100)),
-                            provider_watched_on: Some("Audiobookshelf".to_string()),
+                    result.completed.push(ImportCompletedItem::Metadata(
+                        ImportOrExportMetadataItem {
+                            lot,
+                            source,
+                            identifier,
+                            seen_history: vec![ImportOrExportMetadataItemSeen {
+                                podcast_episode_number,
+                                progress: Some(progress * dec!(100)),
+                                provider_watched_on: Some("Audiobookshelf".to_string()),
+                                ..Default::default()
+                            }],
                             ..Default::default()
-                        }],
-                        ..Default::default()
-                    });
+                        },
+                    ));
                 }
                 Err(e) => {
                     ryot_log!(debug, "Error getting progress for item {:?}: {:?}", item, e);
@@ -216,13 +218,15 @@ impl AudiobookshelfYankIntegration {
                         } else {
                             continue;
                         };
-                    result.metadata.push(ImportOrExportMediaItem {
-                        identifier,
-                        lot,
-                        source,
-                        collections: vec![DefaultCollection::Owned.to_string()],
-                        ..Default::default()
-                    });
+                    result.completed.push(ImportCompletedItem::Metadata(
+                        ImportOrExportMetadataItem {
+                            lot,
+                            source,
+                            identifier,
+                            collections: vec![DefaultCollection::Owned.to_string()],
+                            ..Default::default()
+                        },
+                    ));
                 }
             }
         }
diff --git a/crates/services/integration/src/yank/komga.rs b/crates/services/integration/src/yank/komga.rs
index 32cefd4562..43442266d3 100644
--- a/crates/services/integration/src/yank/komga.rs
+++ b/crates/services/integration/src/yank/komga.rs
@@ -9,11 +9,11 @@ use async_graphql::futures_util::{stream, StreamExt};
 use common_models::DefaultCollection;
 use common_utils::ryot_log;
 use database_models::{metadata, prelude::Metadata};
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{MediaLot, MediaSource};
 use eventsource_stream::Eventsource;
 use itertools::Itertools;
-use media_models::{CommitMediaInput, ImportOrExportMediaItem, ImportOrExportMediaItemSeen};
+use media_models::{CommitMediaInput, ImportOrExportMetadataItem, ImportOrExportMetadataItemSeen};
 use reqwest::Url;
 use rust_decimal::{prelude::FromPrimitive, Decimal};
 use rust_decimal_macros::dec;
@@ -189,7 +189,7 @@ pub(crate) struct KomgaYankIntegration {
     sync_to_owned_collection: Option<bool>,
 }
 
-type ProcessEventReturn = (CommitMediaInput, ImportOrExportMediaItemSeen);
+type ProcessEventReturn = (CommitMediaInput, ImportOrExportMetadataItemSeen);
 
 impl KomgaYankIntegration {
     pub fn new(
@@ -372,7 +372,7 @@ impl KomgaYankIntegration {
                 lot: MediaLot::Manga,
                 force_update: None,
             },
-            ImportOrExportMediaItemSeen {
+            ImportOrExportMetadataItemSeen {
                 progress: Some(
                     self.calculate_percentage(book.read_progress.page, book.media.pages_count),
                 ),
@@ -403,13 +403,13 @@ impl KomgaYankIntegration {
                 match self.find_provider_and_id(&book).await {
                     Ok((source, Some(id))) => Some((
                         id.clone(),
-                        ImportOrExportMediaItem {
+                        ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
                             identifier: id,
                             lot: MediaLot::Manga,
                             source,
                             collections: vec![DefaultCollection::Owned.to_string()],
                             ..Default::default()
-                        },
+                        }),
                     )),
                     _ => {
                         tracing::debug!("No URL or database entry found for manga: {}", book.name);
@@ -420,7 +420,7 @@ impl KomgaYankIntegration {
             .collect()
             .await;
         result
-            .metadata
+            .completed
             .extend(unique_collection_updates.into_values());
         Ok(())
     }
@@ -496,13 +496,15 @@ impl KomgaYankIntegration {
         let media_items = unique_media_items.into_values().collect_vec();
         ryot_log!(debug, "Media Items: {:?}", media_items);
         media_items.into_iter().for_each(|(commit, hist)| {
-            result.metadata.push(ImportOrExportMediaItem {
-                lot: commit.lot,
-                source: commit.source,
-                seen_history: vec![hist],
-                identifier: commit.identifier,
-                ..Default::default()
-            });
+            result
+                .completed
+                .push(ImportCompletedItem::Metadata(ImportOrExportMetadataItem {
+                    lot: commit.lot,
+                    source: commit.source,
+                    seen_history: vec![hist],
+                    identifier: commit.identifier,
+                    ..Default::default()
+                }));
         });
 
         if let Some(true) = self.sync_to_owned_collection {
diff --git a/crates/services/jwt/Cargo.toml b/crates/services/jwt/Cargo.toml
index 3b2508e7c4..b26d719609 100644
--- a/crates/services/jwt/Cargo.toml
+++ b/crates/services/jwt/Cargo.toml
@@ -8,5 +8,5 @@ anyhow = { workspace = true }
 chrono = { workspace = true }
 serde = { workspace = true }
 serde_with = { workspace = true }
-jsonwebtoken = { version = "=9.3.0", default-features = false }
+jsonwebtoken = { workspace = true }
 uuid = { workspace = true }
diff --git a/crates/services/miscellaneous/src/lib.rs b/crates/services/miscellaneous/src/lib.rs
index 21749f1609..036d9e9646 100644
--- a/crates/services/miscellaneous/src/lib.rs
+++ b/crates/services/miscellaneous/src/lib.rs
@@ -17,8 +17,8 @@ use common_models::{
     StringIdObject,
 };
 use common_utils::{
-    get_first_and_last_day_of_month, ryot_log, IsFeatureEnabled, PAGE_SIZE,
-    SHOW_SPECIAL_SEASON_NAMES,
+    get_first_and_last_day_of_month, ryot_log, IsFeatureEnabled, EXERCISE_LOT_MAPPINGS,
+    MEDIA_LOT_MAPPINGS, PAGE_SIZE, SHOW_SPECIAL_SEASON_NAMES,
 };
 use database_models::{
     access_link, application_cache, calendar_event, collection, collection_to_entity,
@@ -27,8 +27,8 @@ use database_models::{
     metadata_to_metadata_group, metadata_to_person, monitored_entity, notification_platform,
     person,
     prelude::{
-        AccessLink, ApplicationCache, CalendarEvent, Collection, CollectionToEntity, Genre,
-        ImportReport, Metadata, MetadataGroup, MetadataToGenre, MetadataToMetadata,
+        AccessLink, ApplicationCache, CalendarEvent, Collection, CollectionToEntity, Exercise,
+        Genre, ImportReport, Metadata, MetadataGroup, MetadataToGenre, MetadataToMetadata,
         MetadataToMetadataGroup, MetadataToPerson, MonitoredEntity, NotificationPlatform, Person,
         QueuedNotification, Review, Seen, User, UserToEntity,
     },
@@ -40,8 +40,10 @@ use database_utils::{
     item_reviews, remove_entity_from_collection, revoke_access_link, user_by_id,
 };
 use dependent_models::{
-    CoreDetails, GenreDetails, MetadataBaseData, MetadataGroupDetails, PersonDetails,
-    SearchResults, UserMetadataDetails, UserMetadataGroupDetails, UserPersonDetails,
+    CoreDetails, ExerciseFilters, ExerciseParameters, ExerciseParametersLotMapping, GenreDetails,
+    MetadataBaseData, MetadataGroupDetails, MetadataLotSourceMappings, PersonDetails,
+    ProviderLanguageInformation, SearchResults, UserMetadataDetails, UserMetadataGroupDetails,
+    UserPersonDetails,
 };
 use dependent_utils::{
     commit_metadata, commit_metadata_group_internal, commit_metadata_internal, commit_person,
@@ -54,7 +56,9 @@ use dependent_utils::{
     refresh_collection_to_entity_association, update_metadata_and_notify_users,
 };
 use enums::{
-    EntityLot, MediaLot, MediaSource, MetadataToMetadataRelation, SeenState, UserToMediaReason,
+    EntityLot, ExerciseEquipment, ExerciseForce, ExerciseLevel, ExerciseLot, ExerciseMechanic,
+    ExerciseMuscle, MediaLot, MediaSource, MetadataToMetadataRelation, SeenState,
+    UserToMediaReason,
 };
 use env_utils::APP_VERSION;
 use futures::TryStreamExt;
@@ -71,11 +75,11 @@ use media_models::{
     MetadataPartialDetails, MetadataSearchInput, MetadataSearchItemResponse, MetadataVideo,
     MetadataVideoSource, PartialMetadata, PartialMetadataWithoutId, PeopleListInput,
     PeopleSearchInput, PeopleSearchItem, PersonAndMetadataGroupsSortBy, PersonDetailsGroupedByRole,
-    PersonDetailsItemWithCharacter, PodcastSpecifics, ProgressUpdateInput,
-    ProviderLanguageInformation, ReviewPostedEvent, SeenAnimeExtraInformation,
-    SeenPodcastExtraInformation, SeenShowExtraInformation, ShowSpecifics, UpdateSeenItemInput,
-    UserCalendarEventInput, UserMediaNextEntry, UserMetadataDetailsEpisodeProgress,
-    UserMetadataDetailsShowSeasonProgress, UserUpcomingCalendarEventInput,
+    PersonDetailsItemWithCharacter, PodcastSpecifics, ProgressUpdateInput, ReviewPostedEvent,
+    SeenAnimeExtraInformation, SeenPodcastExtraInformation, SeenShowExtraInformation,
+    ShowSpecifics, UpdateSeenItemInput, UserCalendarEventInput, UserMediaNextEntry,
+    UserMetadataDetailsEpisodeProgress, UserMetadataDetailsShowSeasonProgress,
+    UserUpcomingCalendarEventInput,
 };
 use migrations::{
     AliasedCalendarEvent, AliasedMetadata, AliasedMetadataToGenre, AliasedReview, AliasedSeen,
@@ -241,12 +245,13 @@ ORDER BY RANDOM() LIMIT 10;
         Ok(())
     }
 
-    pub async fn core_details(&self) -> CoreDetails {
+    pub async fn core_details(&self) -> Result<CoreDetails> {
         let mut files_enabled = self.0.config.file_storage.is_enabled();
         if files_enabled && !self.0.file_storage_service.is_enabled().await {
             files_enabled = false;
         }
-        CoreDetails {
+        let download_required = Exercise::find().count(&self.0.db).await? == 0;
+        Ok(CoreDetails {
             page_size: PAGE_SIZE,
             is_pro: self.0.is_pro,
             version: APP_VERSION.to_owned(),
@@ -262,7 +267,91 @@ ORDER BY RANDOM() LIMIT 10;
             local_auth_disabled: self.0.config.users.disable_local_auth,
             repository_link: "https://github.com/ignisda/ryot".to_owned(),
             token_valid_for_days: self.0.config.users.token_valid_for_days,
-        }
+            metadata_lot_source_mappings: MEDIA_LOT_MAPPINGS
+                .iter()
+                .map(|(lot, sources)| MetadataLotSourceMappings {
+                    lot: *lot,
+                    sources: sources.to_vec(),
+                })
+                .collect(),
+            exercise_parameters: ExerciseParameters {
+                filters: ExerciseFilters {
+                    lot: ExerciseLot::iter().collect_vec(),
+                    level: ExerciseLevel::iter().collect_vec(),
+                    force: ExerciseForce::iter().collect_vec(),
+                    mechanic: ExerciseMechanic::iter().collect_vec(),
+                    equipment: ExerciseEquipment::iter().collect_vec(),
+                    muscle: ExerciseMuscle::iter().collect_vec(),
+                },
+                download_required,
+                lot_mapping: EXERCISE_LOT_MAPPINGS
+                    .iter()
+                    .map(|(lot, pbs)| ExerciseParametersLotMapping {
+                        lot: *lot,
+                        bests: pbs.to_vec(),
+                    })
+                    .collect(),
+            },
+            metadata_provider_languages: MediaSource::iter()
+                .map(|source| {
+                    let (supported, default) = match source {
+                        MediaSource::Itunes => (
+                            ITunesService::supported_languages(),
+                            ITunesService::default_language(),
+                        ),
+                        MediaSource::Audible => (
+                            AudibleService::supported_languages(),
+                            AudibleService::default_language(),
+                        ),
+                        MediaSource::Openlibrary => (
+                            OpenlibraryService::supported_languages(),
+                            OpenlibraryService::default_language(),
+                        ),
+                        MediaSource::Tmdb => (
+                            TmdbService::supported_languages(),
+                            TmdbService::default_language(),
+                        ),
+                        MediaSource::Listennotes => (
+                            ListennotesService::supported_languages(),
+                            ListennotesService::default_language(),
+                        ),
+                        MediaSource::GoogleBooks => (
+                            GoogleBooksService::supported_languages(),
+                            GoogleBooksService::default_language(),
+                        ),
+                        MediaSource::Igdb => (
+                            IgdbService::supported_languages(),
+                            IgdbService::default_language(),
+                        ),
+                        MediaSource::MangaUpdates => (
+                            MangaUpdatesService::supported_languages(),
+                            MangaUpdatesService::default_language(),
+                        ),
+                        MediaSource::Anilist => (
+                            AnilistService::supported_languages(),
+                            AnilistService::default_language(),
+                        ),
+                        MediaSource::Mal => (
+                            MalService::supported_languages(),
+                            MalService::default_language(),
+                        ),
+                        MediaSource::Custom => (
+                            CustomService::supported_languages(),
+                            CustomService::default_language(),
+                        ),
+                        MediaSource::Vndb => (
+                            VndbService::supported_languages(),
+                            VndbService::default_language(),
+                        ),
+                    };
+                    ProviderLanguageInformation {
+                        source,
+                        default,
+                        supported,
+                    }
+                })
+                .collect(),
+        })
     }
 
     async fn metadata_assets(&self, meta: &metadata::Model) -> Result<GraphqlMediaAssets> {
@@ -1910,68 +1999,6 @@ ORDER BY RANDOM() LIMIT 10;
         Statement::from_sql_and_values(DatabaseBackend::Postgres, sql, values)
     }
 
-    pub fn providers_language_information(&self) -> Vec<ProviderLanguageInformation> {
-        MediaSource::iter()
-            .map(|source| {
-                let (supported, default) = match source {
-                    MediaSource::Itunes => (
-                        ITunesService::supported_languages(),
-                        ITunesService::default_language(),
-                    ),
-                    MediaSource::Audible => (
-                        AudibleService::supported_languages(),
-                        AudibleService::default_language(),
-                    ),
-                    MediaSource::Openlibrary => (
-                        OpenlibraryService::supported_languages(),
-                        OpenlibraryService::default_language(),
-                    ),
-                    MediaSource::Tmdb => (
-                        TmdbService::supported_languages(),
-                        TmdbService::default_language(),
-                    ),
-                    MediaSource::Listennotes => (
-                        ListennotesService::supported_languages(),
-                        ListennotesService::default_language(),
-                    ),
-                    MediaSource::GoogleBooks => (
-                        GoogleBooksService::supported_languages(),
-                        GoogleBooksService::default_language(),
-                    ),
-                    MediaSource::Igdb => (
-                        IgdbService::supported_languages(),
-                        IgdbService::default_language(),
-                    ),
-                    MediaSource::MangaUpdates => (
-                        MangaUpdatesService::supported_languages(),
-                        MangaUpdatesService::default_language(),
-                    ),
-                    MediaSource::Anilist => (
-                        AnilistService::supported_languages(),
-                        AnilistService::default_language(),
-                    ),
-                    MediaSource::Mal => (
-                        MalService::supported_languages(),
-                        MalService::default_language(),
-                    ),
-                    MediaSource::Custom => (
-                        CustomService::supported_languages(),
-                        CustomService::default_language(),
-                    ),
-                    MediaSource::Vndb => (
-                        VndbService::supported_languages(),
-                        VndbService::default_language(),
-                    ),
-                };
-                ProviderLanguageInformation {
-                    supported,
-                    default,
-                    source,
-                }
-            })
-            .collect()
-    }
-
     async fn get_monitored_entities(
         &self,
         entity_lot: EntityLot,
diff --git a/crates/services/notification/Cargo.toml b/crates/services/notification/Cargo.toml
index 88a86a63c1..55dff6c95f 100644
--- a/crates/services/notification/Cargo.toml
+++ b/crates/services/notification/Cargo.toml
@@ -5,11 +5,11 @@ edition = "2021"
 
 [dependencies]
 anyhow = { workspace = true }
-askama = "0.12.1"
+askama = { workspace = true }
 common-utils = { path = "../../utils/common" }
 config = { path = "../../config" }
 convert_case = { workspace = true }
-lettre = "=0.11.10"
+lettre = { workspace = true }
 reqwest = { workspace = true }
 serde = { workspace = true }
 serde_json = { workspace = true }
diff --git a/crates/utils/common/Cargo.toml b/crates/utils/common/Cargo.toml
index 610aa84607..91a75e98dd 100644
--- a/crates/utils/common/Cargo.toml
+++ b/crates/utils/common/Cargo.toml
@@ -5,8 +5,9 @@ edition = "2021"
 
 [dependencies]
 chrono = { workspace = true }
-compile-time = "=0.2.0"
+compile-time = { workspace = true }
 const-str = { workspace = true }
+enums = { path = "../../enums" }
 env-utils = { path = "../env" }
 reqwest = { workspace = true }
 serde = { workspace = true }
diff --git a/crates/utils/common/src/lib.rs b/crates/utils/common/src/lib.rs
index 36658e9bde..95f7d0dd52 100644
--- a/crates/utils/common/src/lib.rs
+++ b/crates/utils/common/src/lib.rs
@@ -1,6 +1,7 @@
 use std::{convert::TryInto, fmt};
 
 use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc};
+use enums::{ExerciseLot, MediaLot, MediaSource, WorkoutSetPersonalBest};
 use env_utils::APP_VERSION;
 use reqwest::header::HeaderValue;
 use serde::de;
@@ -26,6 +27,47 @@ pub const SHOW_SPECIAL_SEASON_NAMES: [&str; 2] = ["Specials", "Extras"];
 pub static APPLICATION_JSON_HEADER: HeaderValue = HeaderValue::from_static("application/json");
 pub const FRONTEND_OAUTH_ENDPOINT: &str = "/api/auth";
 pub const PAGE_SIZE: i32 = 20;
+pub const EXERCISE_LOT_MAPPINGS: &[(ExerciseLot, &[WorkoutSetPersonalBest])] = &[
+    (ExerciseLot::Duration, &[WorkoutSetPersonalBest::Time]),
+    (
+        ExerciseLot::DistanceAndDuration,
+        &[WorkoutSetPersonalBest::Pace, WorkoutSetPersonalBest::Time],
+    ),
+    (
+        ExerciseLot::RepsAndWeight,
+        &[
+            WorkoutSetPersonalBest::Weight,
+            WorkoutSetPersonalBest::OneRm,
+            WorkoutSetPersonalBest::Volume,
+            WorkoutSetPersonalBest::Reps,
+        ],
+    ),
+    (ExerciseLot::Reps, &[WorkoutSetPersonalBest::Reps]),
+];
+pub const MEDIA_LOT_MAPPINGS: &[(MediaLot, &[MediaSource])] = &[
+    (MediaLot::AudioBook, &[MediaSource::Audible]),
+    (
+        MediaLot::Book,
+        &[MediaSource::Openlibrary, MediaSource::GoogleBooks],
+    ),
+    (
+        MediaLot::Podcast,
+        &[MediaSource::Itunes, MediaSource::Listennotes],
+    ),
+    (MediaLot::VideoGame, &[MediaSource::Igdb]),
+    (MediaLot::Anime, &[MediaSource::Anilist, MediaSource::Mal]),
+    (
+        MediaLot::Manga,
+        &[
+            MediaSource::Anilist,
+            MediaSource::MangaUpdates,
+            MediaSource::Mal,
+        ],
+    ),
+    (MediaLot::Movie, &[MediaSource::Tmdb]),
+    (MediaLot::Show, &[MediaSource::Tmdb]),
+    (MediaLot::VisualNovel, &[MediaSource::Vndb]),
+];
 
 #[macro_export]
 macro_rules! ryot_log {
diff --git a/crates/utils/dependent/src/lib.rs b/crates/utils/dependent/src/lib.rs
index d1721c0c8d..a7a8e3b08a 100644
--- a/crates/utils/dependent/src/lib.rs
+++ b/crates/utils/dependent/src/lib.rs
@@ -1,4 +1,4 @@
-use std::{cmp::Reverse, collections::HashMap, iter::zip, sync::Arc};
+use std::{cmp::Reverse, collections::HashMap, future::Future, iter::zip, sync::Arc};
 
 use anyhow::{bail, Result as AnyhowResult};
 use application_utils::get_current_date;
@@ -9,7 +9,7 @@ use common_models::{
     ApplicationCacheKey, BackgroundJob, ChangeCollectionToEntityInput, DefaultCollection,
     MediaStateChanged, StoredUrl, StringIdObject,
 };
-use common_utils::{ryot_log, SHOW_SPECIAL_SEASON_NAMES};
+use common_utils::{ryot_log, EXERCISE_LOT_MAPPINGS, SHOW_SPECIAL_SEASON_NAMES};
 use database_models::{
     collection_to_entity, exercise, genre, metadata, metadata_group, metadata_to_genre,
     metadata_to_metadata, metadata_to_person, monitored_entity, person,
@@ -23,10 +23,10 @@ use database_utils::{
     add_entity_to_collection, admin_account_guard, create_or_update_collection,
     deploy_job_to_re_evaluate_user_workouts, remove_entity_from_collection, user_by_id,
 };
-use dependent_models::ImportResult;
+use dependent_models::{ImportCompletedItem, ImportResult};
 use enums::{
-    EntityLot, ExerciseLot, MediaLot, MediaSource, MetadataToMetadataRelation, SeenState,
-    Visibility,
+    EntityLot, ExerciseLot, ExerciseSource, MediaLot, MediaSource, MetadataToMetadataRelation,
+    SeenState, Visibility, WorkoutSetPersonalBest,
 };
 use file_storage_service::FileStorageService;
 use fitness_models::{
@@ -35,8 +35,8 @@ use fitness_models::{
     UserToExerciseHistoryExtraInformation, UserWorkoutInput, UserWorkoutSetRecord,
     WorkoutEquipmentFocusedSummary, WorkoutFocusedSummary, WorkoutForceFocusedSummary,
     WorkoutInformation, WorkoutLevelFocusedSummary, WorkoutLotFocusedSummary,
-    WorkoutMuscleFocusedSummary, WorkoutOrExerciseTotals, WorkoutSetPersonalBest, WorkoutSetRecord,
-    WorkoutSetStatistic, WorkoutSetTotals, WorkoutSummary, WorkoutSummaryExercise, LOT_MAPPINGS,
+    WorkoutMuscleFocusedSummary, WorkoutOrExerciseTotals, WorkoutSetRecord, WorkoutSetStatistic,
+    WorkoutSetTotals, WorkoutSummary, WorkoutSummaryExercise,
 };
 use importer_models::{ImportDetails, ImportFailStep, ImportFailedItem, ImportResultResponse};
 use itertools::Itertools;
@@ -64,7 +64,7 @@ use providers::{
     vndb::VndbService,
 };
 use rust_decimal::{
-    prelude::{One, ToPrimitive},
+    prelude::{FromPrimitive, One, ToPrimitive},
     Decimal,
 };
 use rust_decimal_macros::dec;
@@ -1827,7 +1827,7 @@ pub async fn create_or_update_workout(
             .clone()
             .unwrap_or_default()
             .personal_bests;
-        let types_of_prs = LOT_MAPPINGS
+        let types_of_prs = EXERCISE_LOT_MAPPINGS
             .iter()
             .find(|lm| lm.0 == db_ex.lot)
             .map(|lm| lm.1)
@@ -1999,296 +1999,328 @@ async fn create_collection_and_add_entity_to_it(
     Ok(())
 }
 
-pub async fn process_import(
+pub async fn create_custom_exercise(
+    user_id: &String,
+    input: exercise::Model,
+    ss: &Arc<SupportingService>,
+) -> Result<String> {
+    let exercise_id = input.id.clone();
+    let mut input = input;
+    input.created_by_user_id = Some(user_id.clone());
+    input.source = ExerciseSource::Custom;
+    input.attributes.internal_images = input
+        .attributes
+        .images
+        .clone()
+        .into_iter()
+        .map(StoredUrl::S3)
+        .collect();
+    input.attributes.images = vec![];
+    let input: exercise::ActiveModel = input.into();
+    let exercise = match Exercise::find_by_id(exercise_id)
+        .filter(exercise::Column::Source.eq(ExerciseSource::Custom))
+        .one(&ss.db)
+        .await?
+    {
+        None => input.insert(&ss.db).await?,
+        Some(_) => {
+            let input = input.reset_all();
+            input.update(&ss.db).await?
+        }
+    };
+    ryot_log!(debug, "Created custom exercise with id = {}", exercise.id);
+    add_entity_to_collection(
+        &user_id.clone(),
+        ChangeCollectionToEntityInput {
+            entity_id: exercise.id.clone(),
+            entity_lot: EntityLot::Exercise,
+            creator_user_id: user_id.to_owned(),
+            collection_name: DefaultCollection::Custom.to_string(),
+            ..Default::default()
+        },
+        ss,
+    )
+    .await?;
+    Ok(exercise.id)
+}
+
+pub async fn process_import<F>(
     user_id: &String,
     respect_cache: bool,
     import: ImportResult,
     ss: &Arc<SupportingService>,
-) -> Result<ImportResultResponse> {
-    let mut import = import;
+    on_item_processed: impl Fn(Decimal) -> F,
+) -> Result<(ImportResult, ImportResultResponse)>
+where
+    F: Future<Output = Result<()>>,
+{
     let preferences = user_by_id(user_id, ss).await?.preferences;
-    for m in import.metadata.iter_mut() {
-        m.seen_history.sort_by(|a, b| {
-            a.ended_on
-                .unwrap_or_default()
-                .cmp(&b.ended_on.unwrap_or_default())
-        });
-    }
-
-    let total = import.collections.len()
-        + import.metadata.len()
-        + import.metadata_groups.len()
-        + import.people.len()
-        + import.workouts.len()
-        + import.measurements.len();
-
-    for (idx, col_details) in import.collections.into_iter().enumerate() {
-        create_or_update_collection(&ss.db, user_id, col_details).await?;
-        ryot_log!(debug, "Collection {} created", idx);
-    }
+    let mut import = import;
+    // DEV: We need to sort the exercises to make sure they are created before the workouts
+    // DEV: because the workouts depend on the exercises.
+    import.completed.sort_by_key(|i| match i {
+        ImportCompletedItem::Exercise(_) => 0,
+        _ => 1,
+    });
+    let source_result = import.clone();
+    let total = import.completed.len();
 
-    for (idx, item) in import.metadata.into_iter().enumerate() {
-        let source_id = if item.source_id.is_empty() {
-            item.identifier.clone()
-        } else {
-            item.source_id.clone()
-        };
-        ryot_log!(debug, "Importing media with identifier = {:#?}", source_id);
-        let rev_length = item.reviews.len();
-        let identifier = item.identifier.clone();
-        let data = commit_metadata(
-            CommitMediaInput {
-                identifier,
-                lot: item.lot,
-                source: item.source,
-                force_update: None,
-            },
-            ss,
-        )
-        .await;
-        let metadata = match data {
-            Ok(r) => r,
-            Err(e) => {
-                ryot_log!(error, "{e:?}");
-                import.failed_items.push(ImportFailedItem {
-                    lot: Some(item.lot),
-                    step: ImportFailStep::MediaDetailsFromProvider,
-                    identifier: item.source_id.to_owned(),
-                    error: Some(e.message),
-                });
-                continue;
-            }
-        };
-        for seen in item.seen_history.iter() {
-            let progress = if seen.progress.is_some() {
-                seen.progress
-            } else {
-                Some(dec!(100))
-            };
-            if let Err(e) = progress_update(
-                user_id,
-                respect_cache,
-                ProgressUpdateInput {
-                    progress,
-                    change_state: None,
-                    date: seen.ended_on,
-                    start_date: seen.started_on,
-                    metadata_id: metadata.id.clone(),
-                    show_season_number: seen.show_season_number,
-                    show_episode_number: seen.show_episode_number,
-                    manga_volume_number: seen.manga_volume_number,
-                    anime_episode_number: seen.anime_episode_number,
-                    manga_chapter_number: seen.manga_chapter_number,
-                    podcast_episode_number: seen.podcast_episode_number,
-                    provider_watched_on: seen.provider_watched_on.clone(),
-                },
-                ss,
-            )
-            .await
-            {
-                import.failed_items.push(ImportFailedItem {
-                    lot: Some(item.lot),
-                    step: ImportFailStep::SeenHistoryConversion,
-                    identifier: item.source_id.to_owned(),
-                    error: Some(e.message),
-                });
-            };
-        }
-        for review in item.reviews.iter() {
-            if let Some(input) = convert_review_into_input(
-                review,
-                &preferences,
-                metadata.id.clone(),
-                EntityLot::Metadata,
-            ) {
-                if let Err(e) = post_review(user_id, input, ss).await {
-                    import.failed_items.push(ImportFailedItem {
-                        lot: Some(item.lot),
-                        step: ImportFailStep::ReviewConversion,
-                        identifier: item.source_id.to_owned(),
-                        error: Some(e.message),
-                    });
-                };
-            }
-        }
-        for col in item.collections.into_iter() {
-            create_collection_and_add_entity_to_it(
-                ss,
-                user_id,
-                col,
-                metadata.id.clone(),
-                EntityLot::Metadata,
-            )
-            .await?;
-        }
-        ryot_log!(
-            debug,
-            "Imported item: {idx}, lot: {lot}, history count: {hist}, review count: {rev}",
-            idx = idx + 1,
-            lot = item.lot,
-            hist = item.seen_history.len(),
-            rev = rev_length,
-        );
-    }
-    for (idx, item) in import.metadata_groups.into_iter().enumerate() {
+    for (idx, item) in import.completed.into_iter().enumerate() {
         ryot_log!(
             debug,
-            "Importing media group with identifier = {identifier}",
-            identifier = &item.title
+            "Processing item ({}) {}/{}",
+            item.to_string(),
+            idx + 1,
+            total,
         );
-        let rev_length = item.reviews.len();
-        let data =
-            commit_metadata_group_internal(&item.identifier, item.lot, item.source, ss).await;
-        let metadata_group_id = match data {
-            Ok(r) => r.0,
-            Err(e) => {
-                ryot_log!(error, "{e:?}");
-                import.failed_items.push(ImportFailedItem {
-                    lot: Some(item.lot),
-                    step: ImportFailStep::MediaDetailsFromProvider,
-                    identifier: item.title.to_owned(),
-                    error: Some(e.message),
-                });
-                continue;
+        match item {
+            ImportCompletedItem::Empty => {}
+            ImportCompletedItem::Exercise(exercise) => {
+                create_custom_exercise(user_id, exercise, ss).await?;
             }
-        };
-        for review in item.reviews.iter() {
-            if let Some(input) = convert_review_into_input(
-                review,
-                &preferences,
-                metadata_group_id.clone(),
-                EntityLot::MetadataGroup,
-            ) {
-                if let Err(e) = post_review(user_id, input, ss).await {
-                    import.failed_items.push(ImportFailedItem {
-                        lot: Some(item.lot),
-                        step: ImportFailStep::ReviewConversion,
-                        identifier: item.title.to_owned(),
-                        error: Some(e.message),
-                    });
-                };
+            ImportCompletedItem::Collection(col_details) => {
+                create_or_update_collection(&ss.db, user_id, col_details).await?;
             }
-        }
-        for col in item.collections.into_iter() {
-            create_collection_and_add_entity_to_it(
-                ss,
-                user_id,
-                col,
-                metadata_group_id.clone(),
-                EntityLot::MetadataGroup,
-            )
-            .await?;
-        }
-        ryot_log!(
-            debug,
-            "Imported item: {idx}, lot: {lot}, review count: {rev}",
-            idx = idx + 1,
-            lot = item.lot,
-            rev = rev_length,
-        );
-    }
-    for (idx, item) in import.people.into_iter().enumerate() {
-        let person = commit_person(
-            CommitPersonInput {
-                identifier: item.identifier.clone(),
-                name: item.name.clone(),
-                source: item.source,
-                source_specifics: item.source_specifics.clone(),
-            },
-            &ss.db,
-        )
-        .await?;
-        for review in item.reviews.iter() {
-            if let Some(input) = convert_review_into_input(
-                review,
-                &preferences,
-                person.id.clone(),
-                EntityLot::Person,
-            ) {
-                if let Err(e) = post_review(user_id, input, ss).await {
-                    import.failed_items.push(ImportFailedItem {
-                        lot: None,
-                        step: ImportFailStep::ReviewConversion,
-                        identifier: item.name.to_owned(),
-                        error: Some(e.message),
-                    });
+            ImportCompletedItem::Metadata(metadata) => {
+                let source_id = if metadata.source_id.is_empty() {
+                    metadata.identifier.clone()
+                } else {
+                    metadata.source_id.clone()
+                };
+                ryot_log!(debug, "Importing media with identifier = {:#?}", source_id);
+                let identifier = metadata.identifier.clone();
+                let db_metadata = match commit_metadata(
+                    CommitMediaInput {
+                        identifier,
+                        lot: metadata.lot,
+                        force_update: None,
+                        source: metadata.source,
+                    },
+                    ss,
+                )
+                .await
+                {
+                    Ok(r) => r,
+                    Err(e) => {
+                        ryot_log!(error, "{e:?}");
+                        import.failed.push(ImportFailedItem {
+                            lot: Some(metadata.lot),
+                            step: ImportFailStep::MediaDetailsFromProvider,
+                            identifier: metadata.source_id.to_owned(),
+                            error: Some(e.message),
+                        });
+                        continue;
+                    }
                 };
+                for seen in metadata.seen_history.iter() {
+                    let progress = if seen.progress.is_some() {
+                        seen.progress
+                    } else {
+                        Some(dec!(100))
+                    };
+                    if let Err(e) = progress_update(
+                        user_id,
+                        respect_cache,
+                        ProgressUpdateInput {
+                            progress,
+                            change_state: None,
+                            date: seen.ended_on,
+                            start_date: seen.started_on,
+                            metadata_id: db_metadata.id.clone(),
+                            show_season_number: seen.show_season_number,
+                            show_episode_number: seen.show_episode_number,
+                            manga_volume_number: seen.manga_volume_number,
+                            anime_episode_number: seen.anime_episode_number,
+                            manga_chapter_number: seen.manga_chapter_number,
+                            podcast_episode_number: seen.podcast_episode_number,
+                            provider_watched_on: seen.provider_watched_on.clone(),
+                        },
+                        ss,
+                    )
+                    .await
+                    {
+                        import.failed.push(ImportFailedItem {
+                            lot: Some(metadata.lot),
+                            step: ImportFailStep::SeenHistoryConversion,
+                            identifier: metadata.source_id.to_owned(),
+                            error: Some(e.message),
+                        });
+                    };
+                }
+                for review in metadata.reviews.iter() {
+                    if let Some(input) = convert_review_into_input(
+                        review,
+                        &preferences,
+                        db_metadata.id.clone(),
+                        EntityLot::Metadata,
+                    ) {
+                        if let Err(e) = post_review(user_id, input, ss).await {
+                            import.failed.push(ImportFailedItem {
+                                lot: Some(metadata.lot),
+                                step: ImportFailStep::ReviewConversion,
+                                identifier: metadata.source_id.to_owned(),
+                                error: Some(e.message),
+                            });
+                        };
+                    }
+                }
+                for col in metadata.collections.into_iter() {
+                    create_collection_and_add_entity_to_it(
+                        ss,
+                        user_id,
+                        col,
+                        db_metadata.id.clone(),
+                        EntityLot::Metadata,
+                    )
+                    .await?;
+                }
             }
-        }
-        for col in item.collections.into_iter() {
-            create_collection_and_add_entity_to_it(
-                ss,
-                user_id,
-                col,
-                person.id.clone(),
-                EntityLot::Person,
-            )
-            .await?;
-        }
-        ryot_log!(
-            debug,
-            "Imported person: {idx}, name: {name}",
-            idx = idx + 1,
-            name = item.name,
-        );
-    }
-    for (idx, workout) in import.workouts.into_iter().enumerate() {
-        if let Err(err) = create_or_update_workout(workout, user_id, ss).await {
-            import.failed_items.push(ImportFailedItem {
-                lot: None,
-                step: ImportFailStep::InputTransformation,
-                identifier: "Exercise".to_string(),
-                error: Some(err.to_string()),
-            });
-        }
-        ryot_log!(debug, "Workout {} created", idx);
-    }
-    for (idx, workout) in import.application_workouts.into_iter().enumerate() {
-        let workout_input = db_workout_to_workout_input(workout.details);
-        match create_or_update_workout(workout_input, user_id, ss).await {
-            Err(err) => {
-                import.failed_items.push(ImportFailedItem {
-                    lot: None,
-                    step: ImportFailStep::InputTransformation,
-                    identifier: "Exercise".to_string(),
-                    error: Some(err.to_string()),
-                });
+            ImportCompletedItem::MetadataGroup(metadata_group) => {
+                let metadata_group_id = match commit_metadata_group_internal(
+                    &metadata_group.identifier,
+                    metadata_group.lot,
+                    metadata_group.source,
+                    ss,
+                )
+                .await
+                {
+                    Ok(r) => r.0,
+                    Err(e) => {
+                        ryot_log!(error, "{e:?}");
+                        import.failed.push(ImportFailedItem {
+                            lot: Some(metadata_group.lot),
+                            step: ImportFailStep::MediaDetailsFromProvider,
+                            identifier: metadata_group.title.to_owned(),
+                            error: Some(e.message),
+                        });
+                        continue;
+                    }
+                };
+                for review in metadata_group.reviews.iter() {
+                    if let Some(input) = convert_review_into_input(
+                        review,
+                        &preferences,
+                        metadata_group_id.clone(),
+                        EntityLot::MetadataGroup,
+                    ) {
+                        if let Err(e) = post_review(user_id, input, ss).await {
+                            import.failed.push(ImportFailedItem {
+                                lot: Some(metadata_group.lot),
+                                step: ImportFailStep::ReviewConversion,
+                                identifier: metadata_group.title.to_owned(),
+                                error: Some(e.message),
+                            });
+                        };
+                    }
+                }
+                for col in metadata_group.collections.into_iter() {
+                    create_collection_and_add_entity_to_it(
+                        ss,
+                        user_id,
+                        col,
+                        metadata_group_id.clone(),
+                        EntityLot::MetadataGroup,
+                    )
+                    .await?;
+                }
             }
-            Ok(workout_id) => {
-                for col in workout.collections.into_iter() {
+            ImportCompletedItem::Person(person) => {
+                let db_person = commit_person(
+                    CommitPersonInput {
+                        identifier: person.identifier.clone(),
+                        name: person.name.clone(),
+                        source: person.source,
+                        source_specifics: person.source_specifics.clone(),
+                    },
+                    &ss.db,
+                )
+                .await?;
+                for review in person.reviews.iter() {
+                    if let Some(input) = convert_review_into_input(
+                        review,
+                        &preferences,
+                        db_person.id.clone(),
+                        EntityLot::Person,
+                    ) {
+                        if let Err(e) = post_review(user_id, input, ss).await {
+                            import.failed.push(ImportFailedItem {
+                                lot: None,
+                                step: ImportFailStep::ReviewConversion,
+                                identifier: person.name.to_owned(),
+                                error: Some(e.message),
+                            });
+                        };
+                    }
+                }
+                for col in person.collections.into_iter() {
                     create_collection_and_add_entity_to_it(
                         ss,
                         user_id,
                         col,
-                        workout_id.clone(),
-                        EntityLot::Workout,
+                        db_person.id.clone(),
+                        EntityLot::Person,
                     )
                     .await?;
                 }
             }
+            ImportCompletedItem::Workout(workout) => {
+                if let Err(err) = create_or_update_workout(workout, user_id, ss).await {
+                    import.failed.push(ImportFailedItem {
+                        lot: None,
+                        step: ImportFailStep::InputTransformation,
+                        identifier: "Exercise".to_string(),
+                        error: Some(err.to_string()),
+                    });
+                }
+            }
+            ImportCompletedItem::ApplicationWorkout(workout) => {
+                let workout_input = db_workout_to_workout_input(workout.details);
+                match create_or_update_workout(workout_input, user_id, ss).await {
+                    Err(err) => {
+                        import.failed.push(ImportFailedItem {
+                            lot: None,
+                            step: ImportFailStep::InputTransformation,
+                            identifier: "Exercise".to_string(),
+                            error: Some(err.to_string()),
+                        });
+                    }
+                    Ok(workout_id) => {
+                        for col in workout.collections.into_iter() {
+                            create_collection_and_add_entity_to_it(
+                                ss,
+                                user_id,
+                                col,
+                                workout_id.clone(),
+                                EntityLot::Workout,
+                            )
+                            .await?;
+                        }
+                    }
+                }
+            }
+            ImportCompletedItem::Measurement(measurement) => {
+                if let Err(err) = create_user_measurement(user_id, measurement, &ss.db).await {
+                    import.failed.push(ImportFailedItem {
+                        lot: None,
+                        error: Some(err.message),
+                        identifier: "Measurement".to_string(),
+                        step: ImportFailStep::InputTransformation,
+                    });
+                }
+            }
         }
-        ryot_log!(debug, "Workout {} created", idx);
-    }
-    for (idx, measurement) in import.measurements.into_iter().enumerate() {
-        if let Err(err) = create_user_measurement(user_id, measurement, &ss.db).await {
-            import.failed_items.push(ImportFailedItem {
-                lot: None,
-                step: ImportFailStep::InputTransformation,
-                identifier: "Measurement".to_string(),
-                error: Some(err.message),
-            });
-        }
-        ryot_log!(debug, "Measurement {} created", idx);
+        on_item_processed(
+            Decimal::from_usize(idx + 1).unwrap() / Decimal::from_usize(total).unwrap() * dec!(100),
+        )
+        .await?;
     }
 
-    // TODO: Allow importing exercises
-
     let details = ImportResultResponse {
+        failed_items: import.failed,
         import: ImportDetails { total },
-        failed_items: import.failed_items,
     };
 
-    Ok(details)
+    Ok((source_result, details))
 }
 
 pub fn db_workout_to_workout_input(user_workout: workout::Model) -> UserWorkoutInput {
diff --git a/crates/utils/env/Cargo.toml b/crates/utils/env/Cargo.toml
index 63cac6e8d6..c2ec07bcbe 100644
--- a/crates/utils/env/Cargo.toml
+++ b/crates/utils/env/Cargo.toml
@@ -4,4 +4,7 @@ version = "0.1.0"
 edition = "2021"
 
 [build-dependencies]
-dotenv-build = "0.1.1"
+dotenv-build = { workspace = true }
+
+[package.metadata.cargo-machete]
+ignored = ["dotenv-build"]
diff --git a/docs/content/importing.md b/docs/content/importing.md
index ab92f78de6..e85193134c 100644
--- a/docs/content/importing.md
+++ b/docs/content/importing.md
@@ -15,6 +15,71 @@ You can see the reports under "Import History" of the imports page.
   `RUST_LOG=ryot=debug` environment variable. This will help you help you see import
   progress in the docker logs.
 
+## Jellyfin
+
+You can import your watched movies and shows from [Jellyfin](https://jellyfin.org).
+
+!!! warning
+
+      This will only import media that are already finished. Setup an
+      [integration](./integrations.md#jellyfin) if you want to import media in progress.
+
+Enter the correct details in the input. The username you enter should be of the account
+whose data you want to import.
+
+## Plex
+
+You can import your watched movies and shows from [Plex](https://plex.tv).
+
+!!! warning
+
+      This will only import media that are already finished. Setup an
+      [integration](./integrations.md#plex) if you want to import media in progress.
+
+### Steps
+
+- Obtain a `Plex-Token` as described [here](https://www.plexopedia.com/plex-media-server/general/plex-token/#getcurrentusertoken).
+- Enter the correct details in the inputs.
+
+## Trakt
+
+All movies and shows can be imported from [Trakt](https://trakt.tv) along with
+their ratings, history, comments and lists. A few points to note.
+
+- It is necessary to set your account's privacy to public during the
+  duration of the import. The Trakt authentication flow is pretty complicated
+  and I don't think it would be worth implementing.
+- Items that have been "check(ed) in" will not be imported.
+
+### Steps
+
+- Login to your Trakt account and go to the settings page.
+- If your account is set to private, uncheck the box next to it. You can revert
+  this change once the import is complete.
+- If you have any lists that are private, you need to change them to public.
+  Otherwise they will not be imported.
+- Find your profile slug. This is usually your username. You can find it by
+  going to your profile page, and checking the URL.
+- Enter this username in the input.
+
+## Audiobookshelf
+
+The Audiobookshelf importer supports importing all media that have a valid Audible ID or
+ITunes ID or ISBN.
+
+!!! warning
+
+    - This will only import media that are already finished. Setup an
+      [integration](./integrations.md#audiobookshelf) if you want to import media in progress.
+    - If you have enabled the option to auto delete podcast episodes, you'll have to
+      manually mark them as completed.
+
+### Steps
+
+- Obtain an API token as described in the Audiobookshelf
+  [authentication](https://api.audiobookshelf.org/#authentication) docs.
+- Enter the correct details in the input.
+
 ## Goodreads
 
 Ryot translates [Goodreads](https://www.goodreads.com/) shelves in the
@@ -46,6 +111,15 @@ the following caveats:
 - Copy the token that was just generated.
 - Enter the details in the inputs.
 
+## Generic Json
+
+The "Generic Json" can be used to import all possible data from a generic JSON file. The
+format of the JSON file should be `CompleteExport` as described in the
+[exporting](guides/exporting.md#type-definitions) documentation.
+
+You can use this to export all your data from one Ryot instance and import it into another,
+or from a source that is not supported by Ryot.
+
 ## Movary
 
 The Watchlist and all movies can be imported from [Movary](https://movary.org)
@@ -91,44 +165,16 @@ translates "Read Status" in the following manner:
 
 ## Strong App
 
-You can import your completed workouts from [Strong](https://www.strong.app/) app. Make sure
-you do the import process on a desktop/laptop since the process needs to have multiple tabs
-open at once.
-
-There is also an automated script that will be able to migrate most of your data. Please
-follow [this](https://gist.github.com/IgnisDa/c21c28dd83571ca07f1a7a824b5e8139?permalink_comment_id=4725066#gistcomment-4725066)
-guide.
+You can import your completed workouts from [Strong](https://www.strong.app/) app. If an
+exercise does not exist in your instance, it will be created with a unique identifier. You
+can later use the "Edit Exercise" or "Merge Exercise" actions to map the exercise to an
+existing one.
 
 ### Steps
 
 - Login to your Strong account on the app and go to the "Settings" page.
 - Scroll down to the "General" section and click on "Export data".
-- Send the file to your desktop/laptop and upload it in the input.
-- The mapping section is used to map exercises from Strong to Ryot. Each exercise must be
-  mapped, otherwise the import will fail.
-- If an exercise does not exist in your instance, you need to create it before mapping it.
-- Once you have mapped all the exercises, click on "Import".
-
-## Trakt
-
-All movies and shows can be imported from [Trakt](https://trakt.tv) along with
-their ratings, history, comments and lists. A few points to note.
-
-- It is necessary to set your account's privacy to public during the
-  duration of the import. The Trakt authentication flow is pretty complicated
-  and I don't think it would be worth implementing.
-- Items that have been "check(ed) in" will not be imported.
-
-### Steps
-
-- Login to your Trakt account and go to the settings page.
-- If your account is set to private, uncheck the box next to it. You can revert
-  this change once the import is complete.
-- If you have any lists that are private, you need to change them to public.
-  Otherwise they will not be imported.
-- Find your profile slug. This is usually your username. You can find it by
-  going to your profile page, and checking the URL.
-- Enter this username in the input.
+- Upload the csv file in the input.
 
 ## IMDb
 
@@ -157,24 +203,6 @@ separately. A few points to note:
 - For your custom lists, please visit the "My Lists" page.
 - Upload the CSV file and choose the collection you want to import into.
 
-## Audiobookshelf
-
-The Audiobookshelf importer supports importing all media that have a valid Audible ID or
-ITunes ID or ISBN.
-
-!!! warning
-
-    - This will only import media that are already finished. Setup an
-      [integration](./integrations.md#audiobookshelf) if you want to import media in progress.
-    - If you have enabled the option to auto delete podcast episodes, you'll have to
-      manually mark them as completed.
-
-### Steps
-
-- Obtain an API token as described in the Audiobookshelf
-  [authentication](https://api.audiobookshelf.org/#authentication) docs.
-- Enter the correct details in the input.
-
 ## TV Time
 
 !!! warning
@@ -192,24 +220,3 @@ app.
 This can be done by clicking on the three dots on the top right corner of the app, and then
 clicking on "Export". This will save a CSV file to your file system. Upload this file in
 the input.
-
-## Jellyfin
-
-You can import your watched movies and shows from [Jellyfin](https://jellyfin.org).
-
-!!! warning
-
-      This will only import media that are already finished. Setup an
-      [integration](./integrations.md#jellyfin) if you want to import media in progress.
-
-Enter the correct details in the input. The username you enter should be of the account
-whose data you want to import.
-
-## Generic Json
-
-The "Generic Json" can be used to import all possible data from a generic JSON file. The
-format of the JSON file should be `CompleteExport` as described in the
-[exporting](guides/exporting.md#type-definitions) documentation.
-
-You can use this to export all your data from one Ryot instance and import it into another,
-or from a source that is not supported by Ryot.
diff --git a/docs/includes/export-schema.ts b/docs/includes/export-schema.ts
index fdec4bc277..4eb11449e0 100644
--- a/docs/includes/export-schema.ts
+++ b/docs/includes/export-schema.ts
@@ -109,7 +109,7 @@ export interface UserMeasurement {
 export type MediaLot = 'audio_book' | 'anime' | 'book' | 'podcast' | 'manga' | 'movie' | 'show' | 'video_game' | 'visual_novel';
 
 /** A specific instance when an entity was seen. */
-export interface ImportOrExportMediaItemSeen {
+export interface ImportOrExportMetadataItemSeen {
 	/** If for an anime, the episode which was seen. */
 	anime_episode_number: number | null;
 	/** The timestamp when finished watching. */
@@ -136,7 +136,7 @@ export interface ImportOrExportMediaItemSeen {
 export type MediaSource = 'anilist' | 'audible' | 'custom' | 'google_books' | 'igdb' | 'itunes' | 'listennotes' | 'manga_updates' | 'mal' | 'openlibrary' | 'tmdb' | 'vndb';
 
 /** Details about a specific media item that needs to be imported or exported. */
-export interface ImportOrExportMediaItem {
+export interface ImportOrExportMetadataItem {
 	/** The collections this entity was added to. */
 	collections: string[];
 	/** The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on. */
@@ -151,7 +151,7 @@ export interface ImportOrExportMediaItem {
 	/** The review history for the user. */
 	reviews: ImportOrExportItemRating[];
 	/** The seen history for the user. */
-	seen_history: ImportOrExportMediaItemSeen[];
+	seen_history: ImportOrExportMetadataItemSeen[];
 	/**
 	 * The source of media.
 	 *
@@ -164,7 +164,7 @@ export interface ImportOrExportMediaItem {
 }
 
 /** Details about a specific media group item that needs to be imported or exported. */
-export interface ImportOrExportMediaGroupItem {
+export interface ImportOrExportMetadataGroupItem {
 	/** The collections this entity was added to. */
 	collections: string[];
 	/** The provider identifier. For eg: TMDB-ID, Openlibrary ID and so on. */
@@ -422,9 +422,9 @@ export interface CompleteExport {
 	/** Data about user's measurements. */
 	measurements: UserMeasurement[] | null;
 	/** Data about user's media. */
-	media: ImportOrExportMediaItem[] | null;
+	media: ImportOrExportMetadataItem[] | null;
 	/** Data about user's media groups. */
-	media_groups: ImportOrExportMediaGroupItem[] | null;
+	media_groups: ImportOrExportMetadataGroupItem[] | null;
 	/** Data about user's people. */
 	people: ImportOrExportPersonItem[] | null;
 	/** Data about user's workout templates. */
diff --git a/libs/generated/src/graphql/backend/gql.ts b/libs/generated/src/graphql/backend/gql.ts
index 72c0761b3f..e9ccbc693b 100644
--- a/libs/generated/src/graphql/backend/gql.ts
+++ b/libs/generated/src/graphql/backend/gql.ts
@@ -14,34 +14,15 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
  * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size
  */
 const documents = {
-    "mutation RegisterUser($input: RegisterUserInput!) {\n  registerUser(input: $input) {\n    __typename\n    ... on RegisterError {\n      error\n    }\n    ... on StringIdObject {\n      id\n    }\n  }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n  loginUser(input: $input) {\n    __typename\n    ... on LoginError {\n      error\n    }\n    ... on LoginResponse {\n      apiKey\n    }\n  }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n  addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n  commitMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n  commitMetadataGroup(input: $input) {\n    id\n  }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n  commitPerson(input: $input) {\n    id\n  }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n  createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n  updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n  updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n  createCustomMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n  createOrUpdateCollection(input: $input) {\n    id\n  }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n  createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n  createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n  createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n  createUserIntegration(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n  deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n  deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n  deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n  deleteSeenItem(seenId: $seenId) {\n    id\n  }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n  deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n  deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n  deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n  deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n  deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n  deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n  deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n  deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n  deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n  deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n  deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n  deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n  deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n  updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n  updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n  updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n  generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n  mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n  disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n  createOrUpdateReview(input: $input) {\n    id\n  }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n  presignedPutS3Url(input: $input) {\n    key\n    uploadUrl\n  }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n  removeEntityFromCollection(input: $input) {\n    id\n  }\n}\n\nmutation TestUserNotificationPlatforms {\n  testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n  updateUser(input: $input) {\n    id\n  }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n  updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n  createAccessLink(input: $input) {\n    id\n  }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n  processAccessLink(input: $input) {\n    __typename\n    ... on ProcessAccessLinkError {\n      error\n    }\n    ... on ProcessAccessLinkResponse {\n      apiKey\n      redirectTo\n      tokenValidForDays\n    }\n  }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n  revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n  updateUserExerciseSettings(input: $input)\n}": types.RegisterUserDocument,
-    "query CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    user {\n      id\n      name\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    results {\n      details {\n        total\n        nextPage\n      }\n      items {\n        entityId\n        entityLot\n      }\n    }\n    details {\n      name\n      description\n      createdOn\n    }\n  }\n}": types.CollectionContentsDocument,
-    "query CoreDetails {\n  coreDetails {\n    isPro\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n  }\n}": types.CoreDetailsDocument,
-    "query ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    source\n    level\n    force\n    mechanic\n    equipment\n    muscles\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}": types.ExerciseDetailsDocument,
-    "query ExerciseParameters {\n  exerciseParameters {\n    downloadRequired\n    filters {\n      type\n      level\n      force\n      mechanic\n      equipment\n      muscle\n    }\n    lotMapping {\n      lot\n      bests\n    }\n  }\n}": types.ExerciseParametersDocument,
-    "query ExercisesList($input: ExercisesListInput!) {\n  exercisesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      lot\n      image\n      muscle\n      numTimesInteracted\n      lastUpdatedOn\n    }\n  }\n}": types.ExercisesListDocument,
-    "query GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}": types.GenreDetailsDocument,
-    "query GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      numItems\n    }\n  }\n}": types.GenresListDocument,
-    "query ImportReports {\n  importReports {\n    id\n    source\n    startedOn\n    finishedOn\n    wasSuccess\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        identifier\n        error\n      }\n    }\n  }\n}": types.ImportReportsDocument,
+    "mutation RegisterUser($input: RegisterUserInput!) {\n  registerUser(input: $input) {\n    __typename\n    ... on RegisterError {\n      error\n    }\n    ... on StringIdObject {\n      id\n    }\n  }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n  loginUser(input: $input) {\n    __typename\n    ... on LoginError {\n      error\n    }\n    ... on LoginResponse {\n      apiKey\n    }\n  }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n  addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n  commitMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n  commitMetadataGroup(input: $input) {\n    id\n  }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n  commitPerson(input: $input) {\n    id\n  }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n  createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n  updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n  updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n  createCustomMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n  createOrUpdateCollection(input: $input) {\n    id\n  }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n  createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n  createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n  createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n  createUserIntegration(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n  deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n  deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n  deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n  deleteSeenItem(seenId: $seenId) {\n    id\n  }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n  deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n  deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n  deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n  deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n  deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n  deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n  deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n  deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n  deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n  deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n  deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n  deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n  deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n  updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n  updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n  updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n  generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n  mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n  disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n  createOrUpdateReview(input: $input) {\n    id\n  }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n  presignedPutS3Url(input: $input) {\n    key\n    uploadUrl\n  }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n  removeEntityFromCollection(input: $input) {\n    id\n  }\n}\n\nmutation TestUserNotificationPlatforms {\n  testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n  updateUser(input: $input) {\n    id\n  }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n  updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n  createAccessLink(input: $input) {\n    id\n  }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n  processAccessLink(input: $input) {\n    __typename\n    ... on ProcessAccessLinkError {\n      error\n    }\n    ... on ProcessAccessLinkResponse {\n      apiKey\n      redirectTo\n      tokenValidForDays\n    }\n  }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n  revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n  updateUserExerciseSettings(input: $input)\n}\n\nmutation MergeExercise($mergeFrom: String!, $mergeInto: String!) {\n  mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}": types.RegisterUserDocument,
     "query LatestUserSummary {\n  latestUserSummary {\n    totalMetadataReviewCount\n    totalCollectionReviewCount\n    totalMetadataGroupReviewCount\n    totalPersonReviewCount\n    measurementCount\n    workoutCount\n    totalWorkoutDuration\n    audioBookCount\n    totalAudioBookDuration\n    animeCount\n    bookCount\n    totalBookPages\n    podcastCount\n    totalPodcastDuration\n    mangaCount\n    movieCount\n    totalMovieDuration\n    showCount\n    totalShowDuration\n    videoGameCount\n    totalVideoGameDuration\n    visualNovelCount\n    totalVisualNovelDuration\n    totalWorkoutPersonalBests\n    totalWorkoutWeight\n    totalWorkoutReps\n    totalWorkoutDistance\n    totalWorkoutRestTime\n    totalMetadataCount\n    totalReviewCount\n    totalCount\n    totalDuration\n  }\n}": types.LatestUserSummaryDocument,
     "query MetadataDetails($metadataId: String!) {\n  metadataDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    source\n    isNsfw\n    isPartial\n    sourceUrl\n    identifier\n    description\n    suggestions\n    publishYear\n    publishDate\n    providerRating\n    productionStatus\n    originalLanguage\n    genres {\n      id\n      name\n    }\n    group {\n      id\n      name\n      part\n    }\n    assets {\n      images\n      videos {\n        videoId\n        source\n      }\n    }\n    creators {\n      name\n      items {\n        id\n        name\n        image\n        character\n      }\n    }\n    watchProviders {\n      name\n      image\n      languages\n    }\n    animeSpecifics {\n      episodes\n    }\n    audioBookSpecifics {\n      runtime\n    }\n    bookSpecifics {\n      pages\n    }\n    movieSpecifics {\n      runtime\n    }\n    mangaSpecifics {\n      volumes\n      chapters\n    }\n    podcastSpecifics {\n      episodes {\n        id\n        title\n        overview\n        thumbnail\n        number\n        runtime\n        publishDate\n      }\n      totalEpisodes\n    }\n    showSpecifics {\n      totalSeasons\n      totalEpisodes\n      runtime\n      seasons {\n        id\n        seasonNumber\n        name\n        overview\n        backdropImages\n        posterImages\n        episodes {\n          id\n          name\n          posterImages\n          episodeNumber\n          publishDate\n          name\n          overview\n          runtime\n        }\n      }\n    }\n    visualNovelSpecifics {\n      length\n    }\n    videoGameSpecifics {\n      platforms\n    }\n  }\n}": types.MetadataDetailsDocument,
-    "query MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    sourceUrl\n    details {\n      id\n      title\n      lot\n      source\n      displayImages\n      identifier\n      parts\n      isPartial\n    }\n  }\n}": types.MetadataGroupDetailsDocument,
-    "query MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}": types.MetadataGroupSearchDocument,
-    "query MetadataList($input: MetadataListInput!) {\n  metadataList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}": types.MetadataListDocument,
-    "query MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      databaseId\n      hasInteracted\n      item {\n        identifier\n        title\n        image\n        publishYear\n      }\n    }\n  }\n}": types.MetadataSearchDocument,
-    "query PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}": types.PeopleSearchDocument,
     "query PersonDetails($personId: String!) {\n  personDetails(personId: $personId) {\n    sourceUrl\n    details {\n      id\n      name\n      source\n      identifier\n      isPartial\n      description\n      birthDate\n      deathDate\n      place\n      website\n      gender\n      displayImages\n    }\n    contents {\n      name\n      count\n      items {\n        character\n        metadataId\n      }\n    }\n  }\n}": types.PersonDetailsDocument,
     "query UserDetails {\n  userDetails {\n    __typename\n    ... on User {\n      id\n      lot\n      name\n      isDisabled\n      oidcIssuerId\n      preferences {\n        general {\n          reviewScale\n          gridPacking\n          displayNsfw\n          disableVideos\n          persistQueries\n          disableReviews\n          disableIntegrations\n          disableWatchProviders\n          disableNavigationAnimation\n          dashboard {\n            hidden\n            section\n            numElements\n            deduplicateMedia\n          }\n          watchProviders {\n            lot\n            values\n          }\n        }\n        fitness {\n          logging {\n            muteSounds\n            showDetailsWhileEditing\n          }\n          exercises {\n            unitSystem\n            setRestTimers {\n              ...SetRestTimersPart\n            }\n          }\n          measurements {\n            custom {\n              name\n              dataType\n            }\n            inbuilt {\n              weight\n              bodyMassIndex\n              totalBodyWater\n              muscle\n              leanBodyMass\n              bodyFat\n              boneMass\n              visceralFat\n              waistCircumference\n              waistToHeightRatio\n              hipCircumference\n              waistToHipRatio\n              chestCircumference\n              thighCircumference\n              bicepsCircumference\n              neckCircumference\n              bodyFatCaliper\n              chestSkinfold\n              abdominalSkinfold\n              thighSkinfold\n              basalMetabolicRate\n              totalDailyEnergyExpenditure\n              calories\n            }\n          }\n        }\n        notifications {\n          toSend\n          enabled\n        }\n        featuresEnabled {\n          others {\n            calendar\n            collections\n          }\n          fitness {\n            enabled\n            workouts\n            templates\n            measurements\n          }\n          media {\n            enabled\n            anime\n            audioBook\n            book\n            manga\n            movie\n            podcast\n            show\n            videoGame\n            visualNovel\n            people\n            groups\n            genres\n          }\n        }\n      }\n    }\n  }\n}": types.UserDetailsDocument,
     "query UserExerciseDetails($exerciseId: String!) {\n  userExerciseDetails(exerciseId: $exerciseId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    history {\n      idx\n      workoutId\n      workoutEndOn\n      bestSet {\n        ...WorkoutSetRecordPart\n      }\n    }\n    details {\n      exerciseId\n      createdOn\n      lastUpdatedOn\n      exerciseNumTimesInteracted\n      exerciseExtraInformation {\n        settings {\n          setRestTimers {\n            ...SetRestTimersPart\n          }\n        }\n        lifetimeStats {\n          weight\n          reps\n          distance\n          duration\n          personalBestsAchieved\n        }\n        personalBests {\n          lot\n          sets {\n            workoutId\n            exerciseIdx\n            setIdx\n          }\n        }\n      }\n    }\n  }\n}": types.UserExerciseDetailsDocument,
     "query UserMeasurementsList($input: UserMeasurementsListInput!) {\n  userMeasurementsList(input: $input) {\n    timestamp\n    name\n    comment\n    stats {\n      weight\n      bodyMassIndex\n      totalBodyWater\n      muscle\n      leanBodyMass\n      bodyFat\n      boneMass\n      visceralFat\n      waistCircumference\n      waistToHeightRatio\n      hipCircumference\n      waistToHipRatio\n      chestCircumference\n      thighCircumference\n      bicepsCircumference\n      neckCircumference\n      bodyFatCaliper\n      chestSkinfold\n      abdominalSkinfold\n      thighSkinfold\n      basalMetabolicRate\n      totalDailyEnergyExpenditure\n      calories\n      custom\n    }\n  }\n}": types.UserMeasurementsListDocument,
     "query UserMetadataDetails($metadataId: String!) {\n  userMetadataDetails(metadataId: $metadataId) {\n    mediaReason\n    hasInteracted\n    collections {\n      ...CollectionPart\n    }\n    inProgress {\n      ...SeenPart\n    }\n    history {\n      ...SeenPart\n    }\n    averageRating\n    reviews {\n      ...ReviewItemPart\n    }\n    seenByAllCount\n    seenByUserCount\n    nextEntry {\n      season\n      volume\n      episode\n      chapter\n    }\n    showProgress {\n      timesSeen\n      seasonNumber\n      episodes {\n        episodeNumber\n        timesSeen\n      }\n    }\n    podcastProgress {\n      episodeNumber\n      timesSeen\n    }\n  }\n}": types.UserMetadataDetailsDocument,
-    "query UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}": types.UserMetadataGroupDetailsDocument,
-    "query UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}": types.UserPersonDetailsDocument,
-    "query UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}": types.UserWorkoutDetailsDocument,
-    "query UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}": types.UserWorkoutTemplateDetailsDocument,
-    "query UserWorkoutTemplatesList($input: SearchInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}": types.UserWorkoutTemplatesListDocument,
-    "query UserWorkoutsList($input: SearchInput!) {\n  userWorkoutsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      endTime\n      duration\n      startTime\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}": types.UserWorkoutsListDocument,
-    "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery ProvidersLanguageInformation {\n  providersLanguageInformation {\n    supported\n    default\n    source\n  }\n}\n\nquery UserExports {\n  userExports {\n    url\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    id\n    name\n    count\n    isDefault\n    description\n    creator {\n      id\n      name\n    }\n    collaborators {\n      id\n      name\n    }\n    informationTemplate {\n      lot\n      name\n      required\n      description\n      defaultValue\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserRecommendations {\n  userRecommendations\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery MetadataGroupsList($input: MetadataGroupsListInput!) {\n  metadataGroupsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n  peopleList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery DailyUserActivities($input: DailyUserActivitiesInput!) {\n  dailyUserActivities(input: $input) {\n    groupedBy\n    totalCount\n    totalDuration\n    items {\n      day\n      totalReviewCount\n      workoutCount\n      measurementCount\n      audioBookCount\n      animeCount\n      bookCount\n      podcastCount\n      mangaCount\n      showCount\n      movieCount\n      videoGameCount\n      visualNovelCount\n    }\n  }\n}": types.GetOidcRedirectUrlDocument,
+    "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    id\n    name\n    count\n    isDefault\n    description\n    creator {\n      id\n      name\n    }\n    collaborators {\n      id\n      name\n    }\n    informationTemplate {\n      lot\n      name\n      required\n      description\n      defaultValue\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserRecommendations {\n  userRecommendations\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery MetadataGroupsList($input: MetadataGroupsListInput!) {\n  metadataGroupsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n  peopleList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery DailyUserActivities($input: DailyUserActivitiesInput!) {\n  dailyUserActivities(input: $input) {\n    groupedBy\n    totalCount\n    totalDuration\n    items {\n      day\n      totalReviewCount\n      workoutCount\n      measurementCount\n      audioBookCount\n      animeCount\n      bookCount\n      podcastCount\n      mangaCount\n      showCount\n      movieCount\n      videoGameCount\n      visualNovelCount\n    }\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    source\n    level\n    force\n    mechanic\n    equipment\n    muscles\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery ExercisesList($input: ExercisesListInput!) {\n  exercisesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      lot\n      image\n      muscle\n      numTimesInteracted\n      lastUpdatedOn\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      numItems\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    user {\n      id\n      name\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    results {\n      details {\n        total\n        nextPage\n      }\n      items {\n        entityId\n        entityLot\n      }\n    }\n    details {\n      name\n      description\n      createdOn\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    isPro\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      downloadRequired\n      filters {\n        type\n        level\n        force\n        mechanic\n        equipment\n        muscle\n      }\n      lotMapping {\n        lot\n        bests\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    sourceUrl\n    details {\n      id\n      title\n      lot\n      source\n      displayImages\n      identifier\n      parts\n      isPartial\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery MetadataList($input: MetadataListInput!) {\n  metadataList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      databaseId\n      hasInteracted\n      item {\n        identifier\n        title\n        image\n        publishYear\n      }\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: SearchInput!) {\n  userWorkoutsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      endTime\n      duration\n      startTime\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: SearchInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}": types.GetOidcRedirectUrlDocument,
     "fragment SeenPodcastExtraInformationPart on SeenPodcastExtraInformation {\n  episode\n}\n\nfragment SeenShowExtraInformationPart on SeenShowExtraInformation {\n  episode\n  season\n}\n\nfragment SeenAnimeExtraInformationPart on SeenAnimeExtraInformation {\n  episode\n}\n\nfragment SeenMangaExtraInformationPart on SeenMangaExtraInformation {\n  volume\n  chapter\n}\n\nfragment CalendarEventPart on GraphqlCalendarEvent {\n  date\n  metadataId\n  metadataLot\n  episodeName\n  metadataTitle\n  metadataImage\n  calendarEventId\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n}\n\nfragment SeenPart on Seen {\n  id\n  state\n  progress\n  reviewId\n  startedOn\n  finishedOn\n  lastUpdatedOn\n  manualTimeSpent\n  numTimesUpdated\n  providerWatchedOn\n  showExtraInformation {\n    ...SeenShowExtraInformationPart\n  }\n  podcastExtraInformation {\n    ...SeenPodcastExtraInformationPart\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n  mangaExtraInformation {\n    ...SeenMangaExtraInformationPart\n  }\n}\n\nfragment MetadataSearchItemPart on MetadataSearchItem {\n  title\n  image\n  identifier\n  publishYear\n}\n\nfragment WorkoutOrExerciseTotalsPart on WorkoutOrExerciseTotals {\n  reps\n  weight\n  distance\n  duration\n  restTime\n  personalBestsAchieved\n}\n\nfragment EntityAssetsPart on EntityAssets {\n  images\n  videos\n}\n\nfragment WorkoutSetStatisticPart on WorkoutSetStatistic {\n  reps\n  pace\n  oneRm\n  weight\n  volume\n  duration\n  distance\n}\n\nfragment WorkoutSetRecordPart on WorkoutSetRecord {\n  lot\n  personalBests\n  statistic {\n    ...WorkoutSetStatisticPart\n  }\n}\n\nfragment WorkoutSummaryPart on WorkoutSummary {\n  total {\n    ...WorkoutOrExerciseTotalsPart\n  }\n  exercises {\n    lot\n    name\n    numSets\n    bestSet {\n      ...WorkoutSetRecordPart\n    }\n  }\n  focused {\n    lots {\n      lot\n      exercises\n    }\n    levels {\n      level\n      exercises\n    }\n    forces {\n      force\n      exercises\n    }\n    muscles {\n      muscle\n      exercises\n    }\n    equipments {\n      equipment\n      exercises\n    }\n  }\n}\n\nfragment CollectionPart on Collection {\n  id\n  name\n  userId\n}\n\nfragment ReviewItemPart on ReviewItem {\n  id\n  rating\n  postedOn\n  isSpoiler\n  visibility\n  textOriginal\n  textRendered\n  seenItemsAssociatedWith\n  postedBy {\n    id\n    name\n  }\n  comments {\n    id\n    text\n    likedBy\n    createdOn\n    user {\n      id\n      name\n    }\n  }\n  showExtraInformation {\n    season\n    episode\n  }\n  podcastExtraInformation {\n    episode\n  }\n  animeExtraInformation {\n    ...SeenAnimeExtraInformationPart\n  }\n  mangaExtraInformation {\n    ...SeenMangaExtraInformationPart\n  }\n}\n\nfragment WorkoutInformationPart on WorkoutInformation {\n  comment\n  assets {\n    ...EntityAssetsPart\n  }\n  supersets {\n    color\n    exercises\n  }\n  exercises {\n    lot\n    name\n    notes\n    total {\n      ...WorkoutOrExerciseTotalsPart\n    }\n    assets {\n      ...EntityAssetsPart\n    }\n    sets {\n      lot\n      note\n      restTime\n      confirmedAt\n      personalBests\n      statistic {\n        ...WorkoutSetStatisticPart\n      }\n    }\n  }\n}\n\nfragment SetRestTimersPart on SetRestTimersSettings {\n  drop\n  warmup\n  normal\n  failure\n}": types.SeenPodcastExtraInformationPartFragmentDoc,
 };
 
@@ -62,39 +43,7 @@ export function graphql(source: string): unknown;
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
-export function graphql(source: "mutation RegisterUser($input: RegisterUserInput!) {\n  registerUser(input: $input) {\n    __typename\n    ... on RegisterError {\n      error\n    }\n    ... on StringIdObject {\n      id\n    }\n  }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n  loginUser(input: $input) {\n    __typename\n    ... on LoginError {\n      error\n    }\n    ... on LoginResponse {\n      apiKey\n    }\n  }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n  addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n  commitMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n  commitMetadataGroup(input: $input) {\n    id\n  }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n  commitPerson(input: $input) {\n    id\n  }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n  createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n  updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n  updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n  createCustomMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n  createOrUpdateCollection(input: $input) {\n    id\n  }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n  createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n  createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n  createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n  createUserIntegration(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n  deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n  deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n  deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n  deleteSeenItem(seenId: $seenId) {\n    id\n  }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n  deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n  deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n  deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n  deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n  deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n  deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n  deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n  deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n  deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n  deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n  deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n  deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n  deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n  updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n  updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n  updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n  generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n  mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n  disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n  createOrUpdateReview(input: $input) {\n    id\n  }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n  presignedPutS3Url(input: $input) {\n    key\n    uploadUrl\n  }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n  removeEntityFromCollection(input: $input) {\n    id\n  }\n}\n\nmutation TestUserNotificationPlatforms {\n  testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n  updateUser(input: $input) {\n    id\n  }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n  updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n  createAccessLink(input: $input) {\n    id\n  }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n  processAccessLink(input: $input) {\n    __typename\n    ... on ProcessAccessLinkError {\n      error\n    }\n    ... on ProcessAccessLinkResponse {\n      apiKey\n      redirectTo\n      tokenValidForDays\n    }\n  }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n  revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n  updateUserExerciseSettings(input: $input)\n}"): (typeof documents)["mutation RegisterUser($input: RegisterUserInput!) {\n  registerUser(input: $input) {\n    __typename\n    ... on RegisterError {\n      error\n    }\n    ... on StringIdObject {\n      id\n    }\n  }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n  loginUser(input: $input) {\n    __typename\n    ... on LoginError {\n      error\n    }\n    ... on LoginResponse {\n      apiKey\n    }\n  }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n  addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n  commitMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n  commitMetadataGroup(input: $input) {\n    id\n  }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n  commitPerson(input: $input) {\n    id\n  }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n  createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n  updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n  updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n  createCustomMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n  createOrUpdateCollection(input: $input) {\n    id\n  }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n  createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n  createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n  createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n  createUserIntegration(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n  deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n  deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n  deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n  deleteSeenItem(seenId: $seenId) {\n    id\n  }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n  deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n  deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n  deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n  deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n  deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n  deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n  deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n  deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n  deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n  deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n  deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n  deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n  deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n  updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n  updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n  updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n  generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n  mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n  disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n  createOrUpdateReview(input: $input) {\n    id\n  }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n  presignedPutS3Url(input: $input) {\n    key\n    uploadUrl\n  }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n  removeEntityFromCollection(input: $input) {\n    id\n  }\n}\n\nmutation TestUserNotificationPlatforms {\n  testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n  updateUser(input: $input) {\n    id\n  }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n  updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n  createAccessLink(input: $input) {\n    id\n  }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n  processAccessLink(input: $input) {\n    __typename\n    ... on ProcessAccessLinkError {\n      error\n    }\n    ... on ProcessAccessLinkResponse {\n      apiKey\n      redirectTo\n      tokenValidForDays\n    }\n  }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n  revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n  updateUserExerciseSettings(input: $input)\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    user {\n      id\n      name\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    results {\n      details {\n        total\n        nextPage\n      }\n      items {\n        entityId\n        entityLot\n      }\n    }\n    details {\n      name\n      description\n      createdOn\n    }\n  }\n}"): (typeof documents)["query CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    user {\n      id\n      name\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    results {\n      details {\n        total\n        nextPage\n      }\n      items {\n        entityId\n        entityLot\n      }\n    }\n    details {\n      name\n      description\n      createdOn\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query CoreDetails {\n  coreDetails {\n    isPro\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n  }\n}"): (typeof documents)["query CoreDetails {\n  coreDetails {\n    isPro\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    source\n    level\n    force\n    mechanic\n    equipment\n    muscles\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}"): (typeof documents)["query ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    source\n    level\n    force\n    mechanic\n    equipment\n    muscles\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query ExerciseParameters {\n  exerciseParameters {\n    downloadRequired\n    filters {\n      type\n      level\n      force\n      mechanic\n      equipment\n      muscle\n    }\n    lotMapping {\n      lot\n      bests\n    }\n  }\n}"): (typeof documents)["query ExerciseParameters {\n  exerciseParameters {\n    downloadRequired\n    filters {\n      type\n      level\n      force\n      mechanic\n      equipment\n      muscle\n    }\n    lotMapping {\n      lot\n      bests\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query ExercisesList($input: ExercisesListInput!) {\n  exercisesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      lot\n      image\n      muscle\n      numTimesInteracted\n      lastUpdatedOn\n    }\n  }\n}"): (typeof documents)["query ExercisesList($input: ExercisesListInput!) {\n  exercisesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      lot\n      image\n      muscle\n      numTimesInteracted\n      lastUpdatedOn\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}"): (typeof documents)["query GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      numItems\n    }\n  }\n}"): (typeof documents)["query GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      numItems\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query ImportReports {\n  importReports {\n    id\n    source\n    startedOn\n    finishedOn\n    wasSuccess\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        identifier\n        error\n      }\n    }\n  }\n}"): (typeof documents)["query ImportReports {\n  importReports {\n    id\n    source\n    startedOn\n    finishedOn\n    wasSuccess\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        identifier\n        error\n      }\n    }\n  }\n}"];
+export function graphql(source: "mutation RegisterUser($input: RegisterUserInput!) {\n  registerUser(input: $input) {\n    __typename\n    ... on RegisterError {\n      error\n    }\n    ... on StringIdObject {\n      id\n    }\n  }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n  loginUser(input: $input) {\n    __typename\n    ... on LoginError {\n      error\n    }\n    ... on LoginResponse {\n      apiKey\n    }\n  }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n  addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n  commitMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n  commitMetadataGroup(input: $input) {\n    id\n  }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n  commitPerson(input: $input) {\n    id\n  }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n  createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n  updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n  updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n  createCustomMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n  createOrUpdateCollection(input: $input) {\n    id\n  }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n  createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n  createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n  createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n  createUserIntegration(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n  deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n  deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n  deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n  deleteSeenItem(seenId: $seenId) {\n    id\n  }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n  deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n  deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n  deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n  deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n  deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n  deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n  deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n  deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n  deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n  deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n  deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n  deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n  deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n  updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n  updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n  updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n  generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n  mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n  disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n  createOrUpdateReview(input: $input) {\n    id\n  }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n  presignedPutS3Url(input: $input) {\n    key\n    uploadUrl\n  }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n  removeEntityFromCollection(input: $input) {\n    id\n  }\n}\n\nmutation TestUserNotificationPlatforms {\n  testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n  updateUser(input: $input) {\n    id\n  }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n  updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n  createAccessLink(input: $input) {\n    id\n  }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n  processAccessLink(input: $input) {\n    __typename\n    ... on ProcessAccessLinkError {\n      error\n    }\n    ... on ProcessAccessLinkResponse {\n      apiKey\n      redirectTo\n      tokenValidForDays\n    }\n  }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n  revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n  updateUserExerciseSettings(input: $input)\n}\n\nmutation MergeExercise($mergeFrom: String!, $mergeInto: String!) {\n  mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}"): (typeof documents)["mutation RegisterUser($input: RegisterUserInput!) {\n  registerUser(input: $input) {\n    __typename\n    ... on RegisterError {\n      error\n    }\n    ... on StringIdObject {\n      id\n    }\n  }\n}\n\nmutation LoginUser($input: AuthUserInput!) {\n  loginUser(input: $input) {\n    __typename\n    ... on LoginError {\n      error\n    }\n    ... on LoginResponse {\n      apiKey\n    }\n  }\n}\n\nmutation AddEntityToCollection($input: ChangeCollectionToEntityInput!) {\n  addEntityToCollection(input: $input)\n}\n\nmutation CommitMetadata($input: CommitMediaInput!) {\n  commitMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CommitMetadataGroup($input: CommitMediaInput!) {\n  commitMetadataGroup(input: $input) {\n    id\n  }\n}\n\nmutation CommitPerson($input: CommitPersonInput!) {\n  commitPerson(input: $input) {\n    id\n  }\n}\n\nmutation CreateCustomExercise($input: ExerciseInput!) {\n  createCustomExercise(input: $input)\n}\n\nmutation UpdateCustomExercise($input: UpdateCustomExerciseInput!) {\n  updateCustomExercise(input: $input)\n}\n\nmutation UpdateUserIntegration($input: UpdateUserIntegrationInput!) {\n  updateUserIntegration(input: $input)\n}\n\nmutation CreateCustomMetadata($input: CreateCustomMetadataInput!) {\n  createCustomMetadata(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateCollection($input: CreateOrUpdateCollectionInput!) {\n  createOrUpdateCollection(input: $input) {\n    id\n  }\n}\n\nmutation CreateReviewComment($input: CreateReviewCommentInput!) {\n  createReviewComment(input: $input)\n}\n\nmutation CreateUserMeasurement($input: UserMeasurementInput!) {\n  createUserMeasurement(input: $input)\n}\n\nmutation CreateUserNotificationPlatform($input: CreateUserNotificationPlatformInput!) {\n  createUserNotificationPlatform(input: $input)\n}\n\nmutation CreateUserIntegration($input: CreateUserIntegrationInput!) {\n  createUserIntegration(input: $input) {\n    id\n  }\n}\n\nmutation CreateOrUpdateUserWorkout($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkout(input: $input)\n}\n\nmutation CreateOrUpdateUserWorkoutTemplate($input: UserWorkoutInput!) {\n  createOrUpdateUserWorkoutTemplate(input: $input)\n}\n\nmutation DeleteCollection($collectionName: String!) {\n  deleteCollection(collectionName: $collectionName)\n}\n\nmutation DeleteReview($reviewId: String!) {\n  deleteReview(reviewId: $reviewId)\n}\n\nmutation DeleteS3Object($key: String!) {\n  deleteS3Object(key: $key)\n}\n\nmutation DeleteSeenItem($seenId: String!) {\n  deleteSeenItem(seenId: $seenId) {\n    id\n  }\n}\n\nmutation DeleteUser($toDeleteUserId: String!) {\n  deleteUser(toDeleteUserId: $toDeleteUserId)\n}\n\nmutation DeleteUserIntegration($integrationId: String!) {\n  deleteUserIntegration(integrationId: $integrationId)\n}\n\nmutation DeleteUserMeasurement($timestamp: DateTime!) {\n  deleteUserMeasurement(timestamp: $timestamp)\n}\n\nmutation DeleteUserNotificationPlatform($notificationId: String!) {\n  deleteUserNotificationPlatform(notificationId: $notificationId)\n}\n\nmutation DeleteUserWorkout($workoutId: String!) {\n  deleteUserWorkout(workoutId: $workoutId)\n}\n\nmutation DeleteUserWorkoutTemplate($workoutTemplateId: String!) {\n  deleteUserWorkoutTemplate(workoutTemplateId: $workoutTemplateId)\n}\n\nmutation DeployBackgroundJob($jobName: BackgroundJob!) {\n  deployBackgroundJob(jobName: $jobName)\n}\n\nmutation DeployBulkProgressUpdate($input: [ProgressUpdateInput!]!) {\n  deployBulkProgressUpdate(input: $input)\n}\n\nmutation DeployExportJob {\n  deployExportJob\n}\n\nmutation DeployImportJob($input: DeployImportJobInput!) {\n  deployImportJob(input: $input)\n}\n\nmutation DeployUpdateMetadataJob($metadataId: String!) {\n  deployUpdateMetadataJob(metadataId: $metadataId)\n}\n\nmutation DeployUpdatePersonJob($personId: String!) {\n  deployUpdatePersonJob(personId: $personId)\n}\n\nmutation DeployUpdateMetadataGroupJob($metadataGroupId: String!) {\n  deployUpdateMetadataGroupJob(metadataGroupId: $metadataGroupId)\n}\n\nmutation UpdateSeenItem($input: UpdateSeenItemInput!) {\n  updateSeenItem(input: $input)\n}\n\nmutation UpdateUserNotificationPlatform($input: UpdateUserNotificationPlatformInput!) {\n  updateUserNotificationPlatform(input: $input)\n}\n\nmutation UpdateUserWorkoutAttributes($input: UpdateUserWorkoutAttributesInput!) {\n  updateUserWorkoutAttributes(input: $input)\n}\n\nmutation GenerateAuthToken {\n  generateAuthToken\n}\n\nmutation MergeMetadata($mergeFrom: String!, $mergeInto: String!) {\n  mergeMetadata(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}\n\nmutation DisassociateMetadata($metadataId: String!) {\n  disassociateMetadata(metadataId: $metadataId)\n}\n\nmutation CreateOrUpdateReview($input: CreateOrUpdateReviewInput!) {\n  createOrUpdateReview(input: $input) {\n    id\n  }\n}\n\nmutation PresignedPutS3Url($input: PresignedPutUrlInput!) {\n  presignedPutS3Url(input: $input) {\n    key\n    uploadUrl\n  }\n}\n\nmutation RemoveEntityFromCollection($input: ChangeCollectionToEntityInput!) {\n  removeEntityFromCollection(input: $input) {\n    id\n  }\n}\n\nmutation TestUserNotificationPlatforms {\n  testUserNotificationPlatforms\n}\n\nmutation UpdateUser($input: UpdateUserInput!) {\n  updateUser(input: $input) {\n    id\n  }\n}\n\nmutation UpdateUserPreference($input: UpdateComplexJsonInput!) {\n  updateUserPreference(input: $input)\n}\n\nmutation CreateAccessLink($input: CreateAccessLinkInput!) {\n  createAccessLink(input: $input) {\n    id\n  }\n}\n\nmutation ProcessAccessLink($input: ProcessAccessLinkInput!) {\n  processAccessLink(input: $input) {\n    __typename\n    ... on ProcessAccessLinkError {\n      error\n    }\n    ... on ProcessAccessLinkResponse {\n      apiKey\n      redirectTo\n      tokenValidForDays\n    }\n  }\n}\n\nmutation RevokeAccessLink($accessLinkId: String!) {\n  revokeAccessLink(accessLinkId: $accessLinkId)\n}\n\nmutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {\n  updateUserExerciseSettings(input: $input)\n}\n\nmutation MergeExercise($mergeFrom: String!, $mergeInto: String!) {\n  mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto)\n}"];
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
@@ -103,26 +52,6 @@ export function graphql(source: "query LatestUserSummary {\n  latestUserSummary
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
 export function graphql(source: "query MetadataDetails($metadataId: String!) {\n  metadataDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    source\n    isNsfw\n    isPartial\n    sourceUrl\n    identifier\n    description\n    suggestions\n    publishYear\n    publishDate\n    providerRating\n    productionStatus\n    originalLanguage\n    genres {\n      id\n      name\n    }\n    group {\n      id\n      name\n      part\n    }\n    assets {\n      images\n      videos {\n        videoId\n        source\n      }\n    }\n    creators {\n      name\n      items {\n        id\n        name\n        image\n        character\n      }\n    }\n    watchProviders {\n      name\n      image\n      languages\n    }\n    animeSpecifics {\n      episodes\n    }\n    audioBookSpecifics {\n      runtime\n    }\n    bookSpecifics {\n      pages\n    }\n    movieSpecifics {\n      runtime\n    }\n    mangaSpecifics {\n      volumes\n      chapters\n    }\n    podcastSpecifics {\n      episodes {\n        id\n        title\n        overview\n        thumbnail\n        number\n        runtime\n        publishDate\n      }\n      totalEpisodes\n    }\n    showSpecifics {\n      totalSeasons\n      totalEpisodes\n      runtime\n      seasons {\n        id\n        seasonNumber\n        name\n        overview\n        backdropImages\n        posterImages\n        episodes {\n          id\n          name\n          posterImages\n          episodeNumber\n          publishDate\n          name\n          overview\n          runtime\n        }\n      }\n    }\n    visualNovelSpecifics {\n      length\n    }\n    videoGameSpecifics {\n      platforms\n    }\n  }\n}"): (typeof documents)["query MetadataDetails($metadataId: String!) {\n  metadataDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    source\n    isNsfw\n    isPartial\n    sourceUrl\n    identifier\n    description\n    suggestions\n    publishYear\n    publishDate\n    providerRating\n    productionStatus\n    originalLanguage\n    genres {\n      id\n      name\n    }\n    group {\n      id\n      name\n      part\n    }\n    assets {\n      images\n      videos {\n        videoId\n        source\n      }\n    }\n    creators {\n      name\n      items {\n        id\n        name\n        image\n        character\n      }\n    }\n    watchProviders {\n      name\n      image\n      languages\n    }\n    animeSpecifics {\n      episodes\n    }\n    audioBookSpecifics {\n      runtime\n    }\n    bookSpecifics {\n      pages\n    }\n    movieSpecifics {\n      runtime\n    }\n    mangaSpecifics {\n      volumes\n      chapters\n    }\n    podcastSpecifics {\n      episodes {\n        id\n        title\n        overview\n        thumbnail\n        number\n        runtime\n        publishDate\n      }\n      totalEpisodes\n    }\n    showSpecifics {\n      totalSeasons\n      totalEpisodes\n      runtime\n      seasons {\n        id\n        seasonNumber\n        name\n        overview\n        backdropImages\n        posterImages\n        episodes {\n          id\n          name\n          posterImages\n          episodeNumber\n          publishDate\n          name\n          overview\n          runtime\n        }\n      }\n    }\n    visualNovelSpecifics {\n      length\n    }\n    videoGameSpecifics {\n      platforms\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    sourceUrl\n    details {\n      id\n      title\n      lot\n      source\n      displayImages\n      identifier\n      parts\n      isPartial\n    }\n  }\n}"): (typeof documents)["query MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    sourceUrl\n    details {\n      id\n      title\n      lot\n      source\n      displayImages\n      identifier\n      parts\n      isPartial\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}"): (typeof documents)["query MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query MetadataList($input: MetadataListInput!) {\n  metadataList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}"): (typeof documents)["query MetadataList($input: MetadataListInput!) {\n  metadataList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      databaseId\n      hasInteracted\n      item {\n        identifier\n        title\n        image\n        publishYear\n      }\n    }\n  }\n}"): (typeof documents)["query MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      databaseId\n      hasInteracted\n      item {\n        identifier\n        title\n        image\n        publishYear\n      }\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}"): (typeof documents)["query PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}"];
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
@@ -146,31 +75,7 @@ export function graphql(source: "query UserMetadataDetails($metadataId: String!)
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
-export function graphql(source: "query UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}"): (typeof documents)["query UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}"): (typeof documents)["query UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}"): (typeof documents)["query UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}"): (typeof documents)["query UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query UserWorkoutTemplatesList($input: SearchInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}"): (typeof documents)["query UserWorkoutTemplatesList($input: SearchInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query UserWorkoutsList($input: SearchInput!) {\n  userWorkoutsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      endTime\n      duration\n      startTime\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}"): (typeof documents)["query UserWorkoutsList($input: SearchInput!) {\n  userWorkoutsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      endTime\n      duration\n      startTime\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}"];
-/**
- * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
- */
-export function graphql(source: "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery ProvidersLanguageInformation {\n  providersLanguageInformation {\n    supported\n    default\n    source\n  }\n}\n\nquery UserExports {\n  userExports {\n    url\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    id\n    name\n    count\n    isDefault\n    description\n    creator {\n      id\n      name\n    }\n    collaborators {\n      id\n      name\n    }\n    informationTemplate {\n      lot\n      name\n      required\n      description\n      defaultValue\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserRecommendations {\n  userRecommendations\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery MetadataGroupsList($input: MetadataGroupsListInput!) {\n  metadataGroupsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n  peopleList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery DailyUserActivities($input: DailyUserActivitiesInput!) {\n  dailyUserActivities(input: $input) {\n    groupedBy\n    totalCount\n    totalDuration\n    items {\n      day\n      totalReviewCount\n      workoutCount\n      measurementCount\n      audioBookCount\n      animeCount\n      bookCount\n      podcastCount\n      mangaCount\n      showCount\n      movieCount\n      videoGameCount\n      visualNovelCount\n    }\n  }\n}"): (typeof documents)["query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery ProvidersLanguageInformation {\n  providersLanguageInformation {\n    supported\n    default\n    source\n  }\n}\n\nquery UserExports {\n  userExports {\n    url\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    id\n    name\n    count\n    isDefault\n    description\n    creator {\n      id\n      name\n    }\n    collaborators {\n      id\n      name\n    }\n    informationTemplate {\n      lot\n      name\n      required\n      description\n      defaultValue\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserRecommendations {\n  userRecommendations\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery MetadataGroupsList($input: MetadataGroupsListInput!) {\n  metadataGroupsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n  peopleList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery DailyUserActivities($input: DailyUserActivitiesInput!) {\n  dailyUserActivities(input: $input) {\n    groupedBy\n    totalCount\n    totalDuration\n    items {\n      day\n      totalReviewCount\n      workoutCount\n      measurementCount\n      audioBookCount\n      animeCount\n      bookCount\n      podcastCount\n      mangaCount\n      showCount\n      movieCount\n      videoGameCount\n      visualNovelCount\n    }\n  }\n}"];
+export function graphql(source: "query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    id\n    name\n    count\n    isDefault\n    description\n    creator {\n      id\n      name\n    }\n    collaborators {\n      id\n      name\n    }\n    informationTemplate {\n      lot\n      name\n      required\n      description\n      defaultValue\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserRecommendations {\n  userRecommendations\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery MetadataGroupsList($input: MetadataGroupsListInput!) {\n  metadataGroupsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n  peopleList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery DailyUserActivities($input: DailyUserActivitiesInput!) {\n  dailyUserActivities(input: $input) {\n    groupedBy\n    totalCount\n    totalDuration\n    items {\n      day\n      totalReviewCount\n      workoutCount\n      measurementCount\n      audioBookCount\n      animeCount\n      bookCount\n      podcastCount\n      mangaCount\n      showCount\n      movieCount\n      videoGameCount\n      visualNovelCount\n    }\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    source\n    level\n    force\n    mechanic\n    equipment\n    muscles\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery ExercisesList($input: ExercisesListInput!) {\n  exercisesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      lot\n      image\n      muscle\n      numTimesInteracted\n      lastUpdatedOn\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      numItems\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    user {\n      id\n      name\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    results {\n      details {\n        total\n        nextPage\n      }\n      items {\n        entityId\n        entityLot\n      }\n    }\n    details {\n      name\n      description\n      createdOn\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    isPro\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      downloadRequired\n      filters {\n        type\n        level\n        force\n        mechanic\n        equipment\n        muscle\n      }\n      lotMapping {\n        lot\n        bests\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    sourceUrl\n    details {\n      id\n      title\n      lot\n      source\n      displayImages\n      identifier\n      parts\n      isPartial\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery MetadataList($input: MetadataListInput!) {\n  metadataList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      databaseId\n      hasInteracted\n      item {\n        identifier\n        title\n        image\n        publishYear\n      }\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: SearchInput!) {\n  userWorkoutsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      endTime\n      duration\n      startTime\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: SearchInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}"): (typeof documents)["query GetOidcRedirectUrl {\n  getOidcRedirectUrl\n}\n\nquery UserByOidcIssuerId($oidcIssuerId: String!) {\n  userByOidcIssuerId(oidcIssuerId: $oidcIssuerId)\n}\n\nquery GetOidcToken($code: String!) {\n  getOidcToken(code: $code) {\n    subject\n    email\n  }\n}\n\nquery GetPresignedS3Url($key: String!) {\n  getPresignedS3Url(key: $key)\n}\n\nquery UserExports {\n  userExports {\n    url\n    size\n    endedAt\n    startedAt\n  }\n}\n\nquery UserCollectionsList($name: String) {\n  userCollectionsList(name: $name) {\n    id\n    name\n    count\n    isDefault\n    description\n    creator {\n      id\n      name\n    }\n    collaborators {\n      id\n      name\n    }\n    informationTemplate {\n      lot\n      name\n      required\n      description\n      defaultValue\n    }\n  }\n}\n\nquery UserIntegrations {\n  userIntegrations {\n    id\n    lot\n    provider\n    createdOn\n    isDisabled\n    maximumProgress\n    minimumProgress\n    lastTriggeredOn\n    syncToOwnedCollection\n  }\n}\n\nquery UserNotificationPlatforms {\n  userNotificationPlatforms {\n    id\n    lot\n    createdOn\n    isDisabled\n    description\n  }\n}\n\nquery UsersList($query: String) {\n  usersList(query: $query) {\n    id\n    lot\n    name\n    isDisabled\n  }\n}\n\nquery UserRecommendations {\n  userRecommendations\n}\n\nquery UserUpcomingCalendarEvents($input: UserUpcomingCalendarEventInput!) {\n  userUpcomingCalendarEvents(input: $input) {\n    ...CalendarEventPart\n  }\n}\n\nquery UserCalendarEvents($input: UserCalendarEventInput!) {\n  userCalendarEvents(input: $input) {\n    date\n    events {\n      ...CalendarEventPart\n    }\n  }\n}\n\nquery MetadataPartialDetails($metadataId: String!) {\n  metadataPartialDetails(metadataId: $metadataId) {\n    id\n    lot\n    title\n    image\n    publishYear\n  }\n}\n\nquery MetadataGroupsList($input: MetadataGroupsListInput!) {\n  metadataGroupsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery PeopleList($input: PeopleListInput!) {\n  peopleList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery UserAccessLinks {\n  userAccessLinks {\n    id\n    name\n    isDemo\n    createdOn\n    expiresOn\n    timesUsed\n    isRevoked\n    maximumUses\n    isAccountDefault\n    isMutationAllowed\n  }\n}\n\nquery DailyUserActivities($input: DailyUserActivitiesInput!) {\n  dailyUserActivities(input: $input) {\n    groupedBy\n    totalCount\n    totalDuration\n    items {\n      day\n      totalReviewCount\n      workoutCount\n      measurementCount\n      audioBookCount\n      animeCount\n      bookCount\n      podcastCount\n      mangaCount\n      showCount\n      movieCount\n      videoGameCount\n      visualNovelCount\n    }\n  }\n}\n\nquery ExerciseDetails($exerciseId: String!) {\n  exerciseDetails(exerciseId: $exerciseId) {\n    id\n    lot\n    source\n    level\n    force\n    mechanic\n    equipment\n    muscles\n    createdByUserId\n    attributes {\n      instructions\n      images\n    }\n  }\n}\n\nquery ExercisesList($input: ExercisesListInput!) {\n  exercisesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      lot\n      image\n      muscle\n      numTimesInteracted\n      lastUpdatedOn\n    }\n  }\n}\n\nquery ImportReports {\n  importReports {\n    id\n    source\n    progress\n    startedOn\n    finishedOn\n    wasSuccess\n    details {\n      import {\n        total\n      }\n      failedItems {\n        lot\n        step\n        error\n        identifier\n      }\n    }\n  }\n}\n\nquery GenresList($input: SearchInput!) {\n  genresList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      numItems\n    }\n  }\n}\n\nquery GenreDetails($input: GenreDetailsInput!) {\n  genreDetails(input: $input) {\n    details {\n      id\n      name\n      numItems\n    }\n    contents {\n      details {\n        total\n        nextPage\n      }\n      items\n    }\n  }\n}\n\nquery CollectionContents($input: CollectionContentsInput!) {\n  collectionContents(input: $input) {\n    user {\n      id\n      name\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n    results {\n      details {\n        total\n        nextPage\n      }\n      items {\n        entityId\n        entityLot\n      }\n    }\n    details {\n      name\n      description\n      createdOn\n    }\n  }\n}\n\nquery CoreDetails {\n  coreDetails {\n    isPro\n    version\n    docsLink\n    pageSize\n    websiteUrl\n    smtpEnabled\n    oidcEnabled\n    signupAllowed\n    repositoryLink\n    disableTelemetry\n    tokenValidForDays\n    localAuthDisabled\n    fileStorageEnabled\n    metadataLotSourceMappings {\n      lot\n      sources\n    }\n    metadataProviderLanguages {\n      source\n      default\n      supported\n    }\n    frontend {\n      url\n      oidcButtonLabel\n      dashboardMessage\n      umami {\n        domains\n        scriptUrl\n        websiteId\n      }\n    }\n    exerciseParameters {\n      downloadRequired\n      filters {\n        type\n        level\n        force\n        mechanic\n        equipment\n        muscle\n      }\n      lotMapping {\n        lot\n        bests\n      }\n    }\n  }\n}\n\nquery MetadataGroupDetails($metadataGroupId: String!) {\n  metadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    contents\n    sourceUrl\n    details {\n      id\n      title\n      lot\n      source\n      displayImages\n      identifier\n      parts\n      isPartial\n    }\n  }\n}\n\nquery MetadataGroupSearch($input: MetadataGroupSearchInput!) {\n  metadataGroupSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      parts\n    }\n  }\n}\n\nquery MetadataList($input: MetadataListInput!) {\n  metadataList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items\n  }\n}\n\nquery MetadataSearch($input: MetadataSearchInput!) {\n  metadataSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      databaseId\n      hasInteracted\n      item {\n        identifier\n        title\n        image\n        publishYear\n      }\n    }\n  }\n}\n\nquery PeopleSearch($input: PeopleSearchInput!) {\n  peopleSearch(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      identifier\n      name\n      image\n      birthYear\n    }\n  }\n}\n\nquery UserMetadataGroupDetails($metadataGroupId: String!) {\n  userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {\n    reviews {\n      ...ReviewItemPart\n    }\n    collections {\n      ...CollectionPart\n    }\n  }\n}\n\nquery UserPersonDetails($personId: String!) {\n  userPersonDetails(personId: $personId) {\n    collections {\n      ...CollectionPart\n    }\n    reviews {\n      ...ReviewItemPart\n    }\n  }\n}\n\nquery UserWorkoutDetails($workoutId: String!) {\n  userWorkoutDetails(workoutId: $workoutId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      endTime\n      duration\n      startTime\n      templateId\n      repeatedFrom\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutsList($input: SearchInput!) {\n  userWorkoutsList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      endTime\n      duration\n      startTime\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplateDetails($workoutTemplateId: String!) {\n  userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {\n    collections {\n      ...CollectionPart\n    }\n    details {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n      information {\n        ...WorkoutInformationPart\n      }\n    }\n  }\n}\n\nquery UserWorkoutTemplatesList($input: SearchInput!) {\n  userWorkoutTemplatesList(input: $input) {\n    details {\n      total\n      nextPage\n    }\n    items {\n      id\n      name\n      createdOn\n      visibility\n      summary {\n        ...WorkoutSummaryPart\n      }\n    }\n  }\n}"];
 /**
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
  */
diff --git a/libs/generated/src/graphql/backend/graphql.ts b/libs/generated/src/graphql/backend/graphql.ts
index 2fc9182ff1..d91a1ec5c1 100644
--- a/libs/generated/src/graphql/backend/graphql.ts
+++ b/libs/generated/src/graphql/backend/graphql.ts
@@ -220,10 +220,13 @@ export type CoreDetails = {
   backendErrors: Array<BackendError>;
   disableTelemetry: Scalars['Boolean']['output'];
   docsLink: Scalars['String']['output'];
+  exerciseParameters: ExerciseParameters;
   fileStorageEnabled: Scalars['Boolean']['output'];
   frontend: FrontendConfig;
   isPro: Scalars['Boolean']['output'];
   localAuthDisabled: Scalars['Boolean']['output'];
+  metadataLotSourceMappings: Array<MetadataLotSourceMappings>;
+  metadataProviderLanguages: Array<ProviderLanguageInformation>;
   oidcEnabled: Scalars['Boolean']['output'];
   pageSize: Scalars['Int']['output'];
   repositoryLink: Scalars['String']['output'];
@@ -422,8 +425,8 @@ export type DeployMovaryImportInput = {
 };
 
 export type DeployStrongAppImportInput = {
-  exportPath: Scalars['String']['input'];
-  mapping: Array<StrongAppImportMapping>;
+  dataExportPath?: InputMaybe<Scalars['String']['input']>;
+  measurementsZipPath?: InputMaybe<Scalars['String']['input']>;
 };
 
 export type DeployTraktImportInput = {
@@ -817,6 +820,7 @@ export type ImportReport = {
   details?: Maybe<ImportResultResponse>;
   finishedOn?: Maybe<Scalars['DateTime']['output']>;
   id: Scalars['String']['output'];
+  progress?: Maybe<Scalars['Decimal']['output']>;
   source: ImportSource;
   startedOn: Scalars['DateTime']['output'];
   userId: Scalars['String']['output'];
@@ -835,11 +839,12 @@ export enum ImportSource {
   Igdb = 'IGDB',
   Imdb = 'IMDB',
   Jellyfin = 'JELLYFIN',
-  Mal = 'MAL',
-  MediaTracker = 'MEDIA_TRACKER',
+  Mediatracker = 'MEDIATRACKER',
   Movary = 'MOVARY',
+  Myanimelist = 'MYANIMELIST',
   OpenScale = 'OPEN_SCALE',
-  StoryGraph = 'STORY_GRAPH',
+  Plex = 'PLEX',
+  Storygraph = 'STORYGRAPH',
   StrongApp = 'STRONG_APP',
   Trakt = 'TRAKT'
 }
@@ -1067,6 +1072,11 @@ export type MetadataListInput = {
   take?: InputMaybe<Scalars['Int']['input']>;
 };
 
+export type MetadataLotSourceMappings = {
+  lot: MediaLot;
+  sources: Array<MediaSource>;
+};
+
 export type MetadataPartialDetails = {
   id: Scalars['String']['output'];
   image?: Maybe<Scalars['String']['output']>;
@@ -1196,6 +1206,8 @@ export type MutationRoot = {
   generateAuthToken: Scalars['String']['output'];
   /** Login a user using their username and password and return an auth token. */
   loginUser: LoginResult;
+  /** Merge an exercise into another. */
+  mergeExercise: Scalars['Boolean']['output'];
   /**
    * Merge a media item into another. This will move all `seen`, `collection`
    * and `review` associations with to the metadata.
@@ -1400,6 +1412,12 @@ export type MutationRootLoginUserArgs = {
 };
 
 
+export type MutationRootMergeExerciseArgs = {
+  mergeFrom: Scalars['String']['input'];
+  mergeInto: Scalars['String']['input'];
+};
+
+
 export type MutationRootMergeMetadataArgs = {
   mergeFrom: Scalars['String']['input'];
   mergeInto: Scalars['String']['input'];
@@ -1686,8 +1704,6 @@ export type QueryRoot = {
   dailyUserActivities: DailyUserActivitiesResponse;
   /** Get details about an exercise. */
   exerciseDetails: Exercise;
-  /** Get all the parameters related to exercises. */
-  exerciseParameters: ExerciseParameters;
   /** Get a paginated list of exercises in the database. */
   exercisesList: ExerciseListResults;
   /** Get details about a genre present in the database. */
@@ -1724,8 +1740,6 @@ export type QueryRoot = {
   peopleSearch: PeopleSearchResults;
   /** Get details about a creator present in the database. */
   personDetails: PersonDetails;
-  /** Get all languages supported by all the providers. */
-  providersLanguageInformation: Array<ProviderLanguageInformation>;
   /** Get all access links generated by the currently logged in user. */
   userAccessLinks: Array<AccessLink>;
   /** Get user by OIDC issuer ID. */
@@ -2111,12 +2125,6 @@ export type StringIdObject = {
   id: Scalars['String']['output'];
 };
 
-export type StrongAppImportMapping = {
-  multiplier?: InputMaybe<Scalars['Decimal']['input']>;
-  sourceName: Scalars['String']['input'];
-  targetName: Scalars['String']['input'];
-};
-
 export type UpdateComplexJsonInput = {
   /** Dot delimited path to the property that needs to be changed. */
   property: Scalars['String']['input'];
@@ -3110,55 +3118,13 @@ export type UpdateUserExerciseSettingsMutationVariables = Exact<{
 
 export type UpdateUserExerciseSettingsMutation = { updateUserExerciseSettings: boolean };
 
-export type CollectionContentsQueryVariables = Exact<{
-  input: CollectionContentsInput;
-}>;
-
-
-export type CollectionContentsQuery = { collectionContents: { user: { id: string, name: string }, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array<string>, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array<string>, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, results: { details: { total: number, nextPage?: number | null }, items: Array<{ entityId: string, entityLot: EntityLot }> }, details: { name: string, description?: string | null, createdOn: string } } };
-
-export type CoreDetailsQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type CoreDetailsQuery = { coreDetails: { isPro: boolean, version: string, docsLink: string, pageSize: number, websiteUrl: string, smtpEnabled: boolean, oidcEnabled: boolean, signupAllowed: boolean, repositoryLink: string, disableTelemetry: boolean, tokenValidForDays: number, localAuthDisabled: boolean, fileStorageEnabled: boolean, frontend: { url: string, oidcButtonLabel: string, dashboardMessage: string, umami: { domains: string, scriptUrl: string, websiteId: string } } } };
-
-export type ExerciseDetailsQueryVariables = Exact<{
-  exerciseId: Scalars['String']['input'];
-}>;
-
-
-export type ExerciseDetailsQuery = { exerciseDetails: { id: string, lot: ExerciseLot, source: ExerciseSource, level: ExerciseLevel, force?: ExerciseForce | null, mechanic?: ExerciseMechanic | null, equipment?: ExerciseEquipment | null, muscles: Array<ExerciseMuscle>, createdByUserId?: string | null, attributes: { instructions: Array<string>, images: Array<string> } } };
-
-export type ExerciseParametersQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type ExerciseParametersQuery = { exerciseParameters: { downloadRequired: boolean, filters: { type: Array<ExerciseLot>, level: Array<ExerciseLevel>, force: Array<ExerciseForce>, mechanic: Array<ExerciseMechanic>, equipment: Array<ExerciseEquipment>, muscle: Array<ExerciseMuscle> }, lotMapping: Array<{ lot: ExerciseLot, bests: Array<WorkoutSetPersonalBest> }> } };
-
-export type ExercisesListQueryVariables = Exact<{
-  input: ExercisesListInput;
-}>;
-
-
-export type ExercisesListQuery = { exercisesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, lot: ExerciseLot, image?: string | null, muscle?: ExerciseMuscle | null, numTimesInteracted?: number | null, lastUpdatedOn?: string | null }> } };
-
-export type GenreDetailsQueryVariables = Exact<{
-  input: GenreDetailsInput;
-}>;
-
-
-export type GenreDetailsQuery = { genreDetails: { details: { id: string, name: string, numItems?: number | null }, contents: { items: Array<string>, details: { total: number, nextPage?: number | null } } } };
-
-export type GenresListQueryVariables = Exact<{
-  input: SearchInput;
+export type MergeExerciseMutationVariables = Exact<{
+  mergeFrom: Scalars['String']['input'];
+  mergeInto: Scalars['String']['input'];
 }>;
 
 
-export type GenresListQuery = { genresList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, numItems?: number | null }> } };
-
-export type ImportReportsQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type ImportReportsQuery = { importReports: Array<{ id: string, source: ImportSource, startedOn: string, finishedOn?: string | null, wasSuccess?: boolean | null, details?: { import: { total: number }, failedItems: Array<{ lot?: MediaLot | null, step: ImportFailStep, identifier: string, error?: string | null }> } | null }> };
+export type MergeExerciseMutation = { mergeExercise: boolean };
 
 export type LatestUserSummaryQueryVariables = Exact<{ [key: string]: never; }>;
 
@@ -3172,41 +3138,6 @@ export type MetadataDetailsQueryVariables = Exact<{
 
 export type MetadataDetailsQuery = { metadataDetails: { id: string, lot: MediaLot, title: string, source: MediaSource, isNsfw?: boolean | null, isPartial?: boolean | null, sourceUrl?: string | null, identifier: string, description?: string | null, suggestions: Array<string>, publishYear?: number | null, publishDate?: string | null, providerRating?: string | null, productionStatus?: string | null, originalLanguage?: string | null, genres: Array<{ id: string, name: string }>, group?: { id: string, name: string, part: number } | null, assets: { images: Array<string>, videos: Array<{ videoId: string, source: MetadataVideoSource }> }, creators: Array<{ name: string, items: Array<{ id?: string | null, name: string, image?: string | null, character?: string | null }> }>, watchProviders: Array<{ name: string, image?: string | null, languages: Array<string> }>, animeSpecifics?: { episodes?: number | null } | null, audioBookSpecifics?: { runtime?: number | null } | null, bookSpecifics?: { pages?: number | null } | null, movieSpecifics?: { runtime?: number | null } | null, mangaSpecifics?: { volumes?: number | null, chapters?: string | null } | null, podcastSpecifics?: { totalEpisodes: number, episodes: Array<{ id: string, title: string, overview?: string | null, thumbnail?: string | null, number: number, runtime?: number | null, publishDate: string }> } | null, showSpecifics?: { totalSeasons?: number | null, totalEpisodes?: number | null, runtime?: number | null, seasons: Array<{ id: number, seasonNumber: number, name: string, overview?: string | null, backdropImages: Array<string>, posterImages: Array<string>, episodes: Array<{ id: number, name: string, posterImages: Array<string>, episodeNumber: number, publishDate?: string | null, overview?: string | null, runtime?: number | null }> }> } | null, visualNovelSpecifics?: { length?: number | null } | null, videoGameSpecifics?: { platforms: Array<string> } | null } };
 
-export type MetadataGroupDetailsQueryVariables = Exact<{
-  metadataGroupId: Scalars['String']['input'];
-}>;
-
-
-export type MetadataGroupDetailsQuery = { metadataGroupDetails: { contents: Array<string>, sourceUrl?: string | null, details: { id: string, title: string, lot: MediaLot, source: MediaSource, displayImages: Array<string>, identifier: string, parts: number, isPartial?: boolean | null } } };
-
-export type MetadataGroupSearchQueryVariables = Exact<{
-  input: MetadataGroupSearchInput;
-}>;
-
-
-export type MetadataGroupSearchQuery = { metadataGroupSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, parts?: number | null }> } };
-
-export type MetadataListQueryVariables = Exact<{
-  input: MetadataListInput;
-}>;
-
-
-export type MetadataListQuery = { metadataList: { items: Array<string>, details: { total: number, nextPage?: number | null } } };
-
-export type MetadataSearchQueryVariables = Exact<{
-  input: MetadataSearchInput;
-}>;
-
-
-export type MetadataSearchQuery = { metadataSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ databaseId?: string | null, hasInteracted: boolean, item: { identifier: string, title: string, image?: string | null, publishYear?: number | null } }> } };
-
-export type PeopleSearchQueryVariables = Exact<{
-  input: PeopleSearchInput;
-}>;
-
-
-export type PeopleSearchQuery = { peopleSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, birthYear?: number | null }> } };
-
 export type PersonDetailsQueryVariables = Exact<{
   personId: Scalars['String']['input'];
 }>;
@@ -3240,48 +3171,6 @@ export type UserMetadataDetailsQueryVariables = Exact<{
 
 export type UserMetadataDetailsQuery = { userMetadataDetails: { mediaReason?: Array<UserToMediaReason> | null, hasInteracted: boolean, averageRating?: string | null, seenByAllCount: number, seenByUserCount: number, collections: Array<{ id: string, name: string, userId: string }>, inProgress?: { id: string, state: SeenState, progress: string, reviewId?: string | null, startedOn?: string | null, finishedOn?: string | null, lastUpdatedOn: string, manualTimeSpent?: string | null, numTimesUpdated: number, providerWatchedOn?: string | null, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null } | null, history: Array<{ id: string, state: SeenState, progress: string, reviewId?: string | null, startedOn?: string | null, finishedOn?: string | null, lastUpdatedOn: string, manualTimeSpent?: string | null, numTimesUpdated: number, providerWatchedOn?: string | null, showExtraInformation?: { episode: number, season: number } | null, podcastExtraInformation?: { episode: number } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array<string>, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array<string>, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, nextEntry?: { season?: number | null, volume?: number | null, episode?: number | null, chapter?: string | null } | null, showProgress?: Array<{ timesSeen: number, seasonNumber: number, episodes: Array<{ episodeNumber: number, timesSeen: number }> }> | null, podcastProgress?: Array<{ episodeNumber: number, timesSeen: number }> | null } };
 
-export type UserMetadataGroupDetailsQueryVariables = Exact<{
-  metadataGroupId: Scalars['String']['input'];
-}>;
-
-
-export type UserMetadataGroupDetailsQuery = { userMetadataGroupDetails: { reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array<string>, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array<string>, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, collections: Array<{ id: string, name: string, userId: string }> } };
-
-export type UserPersonDetailsQueryVariables = Exact<{
-  personId: Scalars['String']['input'];
-}>;
-
-
-export type UserPersonDetailsQuery = { userPersonDetails: { collections: Array<{ id: string, name: string, userId: string }>, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array<string>, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array<string>, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }> } };
-
-export type UserWorkoutDetailsQueryVariables = Exact<{
-  workoutId: Scalars['String']['input'];
-}>;
-
-
-export type UserWorkoutDetailsQuery = { userWorkoutDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, endTime: string, duration: number, startTime: string, templateId?: string | null, repeatedFrom?: string | null, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } }, information: { comment?: string | null, assets?: { images: Array<string>, videos: Array<string> } | null, supersets: Array<{ color: string, exercises: Array<number> }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array<string>, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array<string>, videos: Array<string> } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } };
-
-export type UserWorkoutTemplateDetailsQueryVariables = Exact<{
-  workoutTemplateId: Scalars['String']['input'];
-}>;
-
-
-export type UserWorkoutTemplateDetailsQuery = { userWorkoutTemplateDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } }, information: { comment?: string | null, assets?: { images: Array<string>, videos: Array<string> } | null, supersets: Array<{ color: string, exercises: Array<number> }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array<string>, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array<string>, videos: Array<string> } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } };
-
-export type UserWorkoutTemplatesListQueryVariables = Exact<{
-  input: SearchInput;
-}>;
-
-
-export type UserWorkoutTemplatesListQuery = { userWorkoutTemplatesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } } }> } };
-
-export type UserWorkoutsListQueryVariables = Exact<{
-  input: SearchInput;
-}>;
-
-
-export type UserWorkoutsListQuery = { userWorkoutsList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, endTime: string, duration: number, startTime: string, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } } }> } };
-
 export type GetOidcRedirectUrlQueryVariables = Exact<{ [key: string]: never; }>;
 
 
@@ -3308,11 +3197,6 @@ export type GetPresignedS3UrlQueryVariables = Exact<{
 
 export type GetPresignedS3UrlQuery = { getPresignedS3Url: string };
 
-export type ProvidersLanguageInformationQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type ProvidersLanguageInformationQuery = { providersLanguageInformation: Array<{ supported: Array<string>, default: string, source: MediaSource }> };
-
 export type UserExportsQueryVariables = Exact<{ [key: string]: never; }>;
 
 
@@ -3394,6 +3278,128 @@ export type DailyUserActivitiesQueryVariables = Exact<{
 
 export type DailyUserActivitiesQuery = { dailyUserActivities: { groupedBy: DailyUserActivitiesResponseGroupedBy, totalCount: number, totalDuration: number, items: Array<{ day: string, totalReviewCount: number, workoutCount: number, measurementCount: number, audioBookCount: number, animeCount: number, bookCount: number, podcastCount: number, mangaCount: number, showCount: number, movieCount: number, videoGameCount: number, visualNovelCount: number }> } };
 
+export type ExerciseDetailsQueryVariables = Exact<{
+  exerciseId: Scalars['String']['input'];
+}>;
+
+
+export type ExerciseDetailsQuery = { exerciseDetails: { id: string, lot: ExerciseLot, source: ExerciseSource, level: ExerciseLevel, force?: ExerciseForce | null, mechanic?: ExerciseMechanic | null, equipment?: ExerciseEquipment | null, muscles: Array<ExerciseMuscle>, createdByUserId?: string | null, attributes: { instructions: Array<string>, images: Array<string> } } };
+
+export type ExercisesListQueryVariables = Exact<{
+  input: ExercisesListInput;
+}>;
+
+
+export type ExercisesListQuery = { exercisesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, lot: ExerciseLot, image?: string | null, muscle?: ExerciseMuscle | null, numTimesInteracted?: number | null, lastUpdatedOn?: string | null }> } };
+
+export type ImportReportsQueryVariables = Exact<{ [key: string]: never; }>;
+
+
+export type ImportReportsQuery = { importReports: Array<{ id: string, source: ImportSource, progress?: string | null, startedOn: string, finishedOn?: string | null, wasSuccess?: boolean | null, details?: { import: { total: number }, failedItems: Array<{ lot?: MediaLot | null, step: ImportFailStep, error?: string | null, identifier: string }> } | null }> };
+
+export type GenresListQueryVariables = Exact<{
+  input: SearchInput;
+}>;
+
+
+export type GenresListQuery = { genresList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, numItems?: number | null }> } };
+
+export type GenreDetailsQueryVariables = Exact<{
+  input: GenreDetailsInput;
+}>;
+
+
+export type GenreDetailsQuery = { genreDetails: { details: { id: string, name: string, numItems?: number | null }, contents: { items: Array<string>, details: { total: number, nextPage?: number | null } } } };
+
+export type CollectionContentsQueryVariables = Exact<{
+  input: CollectionContentsInput;
+}>;
+
+
+export type CollectionContentsQuery = { collectionContents: { user: { id: string, name: string }, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array<string>, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array<string>, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, results: { details: { total: number, nextPage?: number | null }, items: Array<{ entityId: string, entityLot: EntityLot }> }, details: { name: string, description?: string | null, createdOn: string } } };
+
+export type CoreDetailsQueryVariables = Exact<{ [key: string]: never; }>;
+
+
+export type CoreDetailsQuery = { coreDetails: { isPro: boolean, version: string, docsLink: string, pageSize: number, websiteUrl: string, smtpEnabled: boolean, oidcEnabled: boolean, signupAllowed: boolean, repositoryLink: string, disableTelemetry: boolean, tokenValidForDays: number, localAuthDisabled: boolean, fileStorageEnabled: boolean, metadataLotSourceMappings: Array<{ lot: MediaLot, sources: Array<MediaSource> }>, metadataProviderLanguages: Array<{ source: MediaSource, default: string, supported: Array<string> }>, frontend: { url: string, oidcButtonLabel: string, dashboardMessage: string, umami: { domains: string, scriptUrl: string, websiteId: string } }, exerciseParameters: { downloadRequired: boolean, filters: { type: Array<ExerciseLot>, level: Array<ExerciseLevel>, force: Array<ExerciseForce>, mechanic: Array<ExerciseMechanic>, equipment: Array<ExerciseEquipment>, muscle: Array<ExerciseMuscle> }, lotMapping: Array<{ lot: ExerciseLot, bests: Array<WorkoutSetPersonalBest> }> } } };
+
+export type MetadataGroupDetailsQueryVariables = Exact<{
+  metadataGroupId: Scalars['String']['input'];
+}>;
+
+
+export type MetadataGroupDetailsQuery = { metadataGroupDetails: { contents: Array<string>, sourceUrl?: string | null, details: { id: string, title: string, lot: MediaLot, source: MediaSource, displayImages: Array<string>, identifier: string, parts: number, isPartial?: boolean | null } } };
+
+export type MetadataGroupSearchQueryVariables = Exact<{
+  input: MetadataGroupSearchInput;
+}>;
+
+
+export type MetadataGroupSearchQuery = { metadataGroupSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, parts?: number | null }> } };
+
+export type MetadataListQueryVariables = Exact<{
+  input: MetadataListInput;
+}>;
+
+
+export type MetadataListQuery = { metadataList: { items: Array<string>, details: { total: number, nextPage?: number | null } } };
+
+export type MetadataSearchQueryVariables = Exact<{
+  input: MetadataSearchInput;
+}>;
+
+
+export type MetadataSearchQuery = { metadataSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ databaseId?: string | null, hasInteracted: boolean, item: { identifier: string, title: string, image?: string | null, publishYear?: number | null } }> } };
+
+export type PeopleSearchQueryVariables = Exact<{
+  input: PeopleSearchInput;
+}>;
+
+
+export type PeopleSearchQuery = { peopleSearch: { details: { total: number, nextPage?: number | null }, items: Array<{ identifier: string, name: string, image?: string | null, birthYear?: number | null }> } };
+
+export type UserMetadataGroupDetailsQueryVariables = Exact<{
+  metadataGroupId: Scalars['String']['input'];
+}>;
+
+
+export type UserMetadataGroupDetailsQuery = { userMetadataGroupDetails: { reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array<string>, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array<string>, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }>, collections: Array<{ id: string, name: string, userId: string }> } };
+
+export type UserPersonDetailsQueryVariables = Exact<{
+  personId: Scalars['String']['input'];
+}>;
+
+
+export type UserPersonDetailsQuery = { userPersonDetails: { collections: Array<{ id: string, name: string, userId: string }>, reviews: Array<{ id: string, rating?: string | null, postedOn: string, isSpoiler: boolean, visibility: Visibility, textOriginal?: string | null, textRendered?: string | null, seenItemsAssociatedWith: Array<string>, postedBy: { id: string, name: string }, comments: Array<{ id: string, text: string, likedBy: Array<string>, createdOn: string, user: { id: string, name: string } }>, showExtraInformation?: { season?: number | null, episode?: number | null } | null, podcastExtraInformation?: { episode?: number | null } | null, animeExtraInformation?: { episode?: number | null } | null, mangaExtraInformation?: { volume?: number | null, chapter?: string | null } | null }> } };
+
+export type UserWorkoutDetailsQueryVariables = Exact<{
+  workoutId: Scalars['String']['input'];
+}>;
+
+
+export type UserWorkoutDetailsQuery = { userWorkoutDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, endTime: string, duration: number, startTime: string, templateId?: string | null, repeatedFrom?: string | null, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } }, information: { comment?: string | null, assets?: { images: Array<string>, videos: Array<string> } | null, supersets: Array<{ color: string, exercises: Array<number> }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array<string>, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array<string>, videos: Array<string> } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } };
+
+export type UserWorkoutsListQueryVariables = Exact<{
+  input: SearchInput;
+}>;
+
+
+export type UserWorkoutsListQuery = { userWorkoutsList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, endTime: string, duration: number, startTime: string, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } } }> } };
+
+export type UserWorkoutTemplateDetailsQueryVariables = Exact<{
+  workoutTemplateId: Scalars['String']['input'];
+}>;
+
+
+export type UserWorkoutTemplateDetailsQuery = { userWorkoutTemplateDetails: { collections: Array<{ id: string, name: string, userId: string }>, details: { id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } }, information: { comment?: string | null, assets?: { images: Array<string>, videos: Array<string> } | null, supersets: Array<{ color: string, exercises: Array<number> }>, exercises: Array<{ lot: ExerciseLot, name: string, notes: Array<string>, total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, assets?: { images: Array<string>, videos: Array<string> } | null, sets: Array<{ lot: SetLot, note?: string | null, restTime?: number | null, confirmedAt?: string | null, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } }> }> } } } };
+
+export type UserWorkoutTemplatesListQueryVariables = Exact<{
+  input: SearchInput;
+}>;
+
+
+export type UserWorkoutTemplatesListQuery = { userWorkoutTemplatesList: { details: { total: number, nextPage?: number | null }, items: Array<{ id: string, name: string, createdOn: string, visibility: Visibility, summary: { total?: { reps: string, weight: string, distance: string, duration: string, restTime: number, personalBestsAchieved: number } | null, exercises: Array<{ lot?: ExerciseLot | null, name: string, numSets: number, bestSet?: { lot: SetLot, personalBests?: Array<WorkoutSetPersonalBest> | null, statistic: { reps?: string | null, pace?: string | null, oneRm?: string | null, weight?: string | null, volume?: string | null, duration?: string | null, distance?: string | null } } | null }>, focused: { lots: Array<{ lot: ExerciseLot, exercises: Array<number> }>, levels: Array<{ level: ExerciseLevel, exercises: Array<number> }>, forces: Array<{ force: ExerciseForce, exercises: Array<number> }>, muscles: Array<{ muscle: ExerciseMuscle, exercises: Array<number> }>, equipments: Array<{ equipment: ExerciseEquipment, exercises: Array<number> }> } } }> } };
+
 export type SeenPodcastExtraInformationPartFragment = { episode: number };
 
 export type SeenShowExtraInformationPartFragment = { episode: number, season: number };
@@ -3492,37 +3498,18 @@ export const CreateAccessLinkDocument = {"kind":"Document","definitions":[{"kind
 export const ProcessAccessLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ProcessAccessLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ProcessAccessLinkInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"processAccessLink"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ProcessAccessLinkError"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"error"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ProcessAccessLinkResponse"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"apiKey"}},{"kind":"Field","name":{"kind":"Name","value":"redirectTo"}},{"kind":"Field","name":{"kind":"Name","value":"tokenValidForDays"}}]}}]}}]}}]} as unknown as DocumentNode<ProcessAccessLinkMutation, ProcessAccessLinkMutationVariables>;
 export const RevokeAccessLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RevokeAccessLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"accessLinkId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"revokeAccessLink"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"accessLinkId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"accessLinkId"}}}]}]}}]} as unknown as DocumentNode<RevokeAccessLinkMutation, RevokeAccessLinkMutationVariables>;
 export const UpdateUserExerciseSettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateUserExerciseSettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateUserExerciseSettings"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateUserExerciseSettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode<UpdateUserExerciseSettingsMutation, UpdateUserExerciseSettingsMutationVariables>;
-export const CollectionContentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CollectionContents"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CollectionContentsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collectionContents"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"results"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"entityId"}},{"kind":"Field","name":{"kind":"Name","value":"entityLot"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode<CollectionContentsQuery, CollectionContentsQueryVariables>;
-export const CoreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CoreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"coreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"isPro"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"docsLink"}},{"kind":"Field","name":{"kind":"Name","value":"pageSize"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"smtpEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"oidcEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"signupAllowed"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryLink"}},{"kind":"Field","name":{"kind":"Name","value":"disableTelemetry"}},{"kind":"Field","name":{"kind":"Name","value":"tokenValidForDays"}},{"kind":"Field","name":{"kind":"Name","value":"localAuthDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"fileStorageEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"frontend"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"oidcButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"dashboardMessage"}},{"kind":"Field","name":{"kind":"Name","value":"umami"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"scriptUrl"}},{"kind":"Field","name":{"kind":"Name","value":"websiteId"}}]}}]}}]}}]}}]} as unknown as DocumentNode<CoreDetailsQuery, CoreDetailsQueryVariables>;
-export const ExerciseDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExerciseDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"exerciseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscles"}},{"kind":"Field","name":{"kind":"Name","value":"createdByUserId"}},{"kind":"Field","name":{"kind":"Name","value":"attributes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"instructions"}},{"kind":"Field","name":{"kind":"Name","value":"images"}}]}}]}}]}}]} as unknown as DocumentNode<ExerciseDetailsQuery, ExerciseDetailsQueryVariables>;
-export const ExerciseParametersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExerciseParameters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseParameters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"downloadRequired"}},{"kind":"Field","name":{"kind":"Name","value":"filters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lotMapping"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bests"}}]}}]}}]}}]} as unknown as DocumentNode<ExerciseParametersQuery, ExerciseParametersQueryVariables>;
-export const ExercisesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExercisesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ExercisesListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exercisesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"numTimesInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}}]}}]}}]}}]} as unknown as DocumentNode<ExercisesListQuery, ExercisesListQueryVariables>;
-export const GenreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenreDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GenreDetailsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genreDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}},{"kind":"Field","name":{"kind":"Name","value":"contents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]}}]} as unknown as DocumentNode<GenreDetailsQuery, GenreDetailsQueryVariables>;
-export const GenresListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenresList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genresList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}}]}}]}}]} as unknown as DocumentNode<GenresListQuery, GenresListQueryVariables>;
-export const ImportReportsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ImportReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"importReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"startedOn"}},{"kind":"Field","name":{"kind":"Name","value":"finishedOn"}},{"kind":"Field","name":{"kind":"Name","value":"wasSuccess"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"import"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}}]}},{"kind":"Field","name":{"kind":"Name","value":"failedItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"step"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"error"}}]}}]}}]}}]}}]} as unknown as DocumentNode<ImportReportsQuery, ImportReportsQueryVariables>;
+export const MergeExerciseDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"MergeExercise"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"mergeFrom"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"mergeInto"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"mergeExercise"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"mergeFrom"},"value":{"kind":"Variable","name":{"kind":"Name","value":"mergeFrom"}}},{"kind":"Argument","name":{"kind":"Name","value":"mergeInto"},"value":{"kind":"Variable","name":{"kind":"Name","value":"mergeInto"}}}]}]}}]} as unknown as DocumentNode<MergeExerciseMutation, MergeExerciseMutationVariables>;
 export const LatestUserSummaryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"LatestUserSummary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"latestUserSummary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalMetadataReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalCollectionReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalMetadataGroupReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalPersonReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"measurementCount"}},{"kind":"Field","name":{"kind":"Name","value":"workoutCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutDuration"}},{"kind":"Field","name":{"kind":"Name","value":"audioBookCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalAudioBookDuration"}},{"kind":"Field","name":{"kind":"Name","value":"animeCount"}},{"kind":"Field","name":{"kind":"Name","value":"bookCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalBookPages"}},{"kind":"Field","name":{"kind":"Name","value":"podcastCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalPodcastDuration"}},{"kind":"Field","name":{"kind":"Name","value":"mangaCount"}},{"kind":"Field","name":{"kind":"Name","value":"movieCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalMovieDuration"}},{"kind":"Field","name":{"kind":"Name","value":"showCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalShowDuration"}},{"kind":"Field","name":{"kind":"Name","value":"videoGameCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalVideoGameDuration"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalVisualNovelDuration"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutPersonalBests"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutWeight"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutReps"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutDistance"}},{"kind":"Field","name":{"kind":"Name","value":"totalWorkoutRestTime"}},{"kind":"Field","name":{"kind":"Name","value":"totalMetadataCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalDuration"}}]}}]}}]} as unknown as DocumentNode<LatestUserSummaryQuery, LatestUserSummaryQueryVariables>;
 export const MetadataDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"isNsfw"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"suggestions"}},{"kind":"Field","name":{"kind":"Name","value":"publishYear"}},{"kind":"Field","name":{"kind":"Name","value":"publishDate"}},{"kind":"Field","name":{"kind":"Name","value":"providerRating"}},{"kind":"Field","name":{"kind":"Name","value":"productionStatus"}},{"kind":"Field","name":{"kind":"Name","value":"originalLanguage"}},{"kind":"Field","name":{"kind":"Name","value":"genres"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"group"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"part"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"videoId"}},{"kind":"Field","name":{"kind":"Name","value":"source"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"creators"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"character"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"watchProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"languages"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodes"}}]}},{"kind":"Field","name":{"kind":"Name","value":"audioBookSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"runtime"}}]}},{"kind":"Field","name":{"kind":"Name","value":"bookSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"pages"}}]}},{"kind":"Field","name":{"kind":"Name","value":"movieSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"runtime"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volumes"}},{"kind":"Field","name":{"kind":"Name","value":"chapters"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"overview"}},{"kind":"Field","name":{"kind":"Name","value":"thumbnail"}},{"kind":"Field","name":{"kind":"Name","value":"number"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"publishDate"}}]}},{"kind":"Field","name":{"kind":"Name","value":"totalEpisodes"}}]}},{"kind":"Field","name":{"kind":"Name","value":"showSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"totalSeasons"}},{"kind":"Field","name":{"kind":"Name","value":"totalEpisodes"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"seasons"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"seasonNumber"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"overview"}},{"kind":"Field","name":{"kind":"Name","value":"backdropImages"}},{"kind":"Field","name":{"kind":"Name","value":"posterImages"}},{"kind":"Field","name":{"kind":"Name","value":"episodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"posterImages"}},{"kind":"Field","name":{"kind":"Name","value":"episodeNumber"}},{"kind":"Field","name":{"kind":"Name","value":"publishDate"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"overview"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"length"}}]}},{"kind":"Field","name":{"kind":"Name","value":"videoGameSpecifics"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"platforms"}}]}}]}}]}}]} as unknown as DocumentNode<MetadataDetailsQuery, MetadataDetailsQueryVariables>;
-export const MetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contents"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"displayImages"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}}]}}]}}]}}]} as unknown as DocumentNode<MetadataGroupDetailsQuery, MetadataGroupDetailsQueryVariables>;
-export const MetadataGroupSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataGroupSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}}]}}]}}]}}]} as unknown as DocumentNode<MetadataGroupSearchQuery, MetadataGroupSearchQueryVariables>;
-export const MetadataListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode<MetadataListQuery, MetadataListQueryVariables>;
-export const MetadataSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"databaseId"}},{"kind":"Field","name":{"kind":"Name","value":"hasInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"item"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"publishYear"}}]}}]}}]}}]}}]} as unknown as DocumentNode<MetadataSearchQuery, MetadataSearchQueryVariables>;
-export const PeopleSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PeopleSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PeopleSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"peopleSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"birthYear"}}]}}]}}]}}]} as unknown as DocumentNode<PeopleSearchQuery, PeopleSearchQueryVariables>;
 export const PersonDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PersonDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"personId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"personDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"personId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"personId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"birthDate"}},{"kind":"Field","name":{"kind":"Name","value":"deathDate"}},{"kind":"Field","name":{"kind":"Name","value":"place"}},{"kind":"Field","name":{"kind":"Name","value":"website"}},{"kind":"Field","name":{"kind":"Name","value":"gender"}},{"kind":"Field","name":{"kind":"Name","value":"displayImages"}}]}},{"kind":"Field","name":{"kind":"Name","value":"contents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"character"}},{"kind":"Field","name":{"kind":"Name","value":"metadataId"}}]}}]}}]}}]}}]} as unknown as DocumentNode<PersonDetailsQuery, PersonDetailsQueryVariables>;
 export const UserDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"User"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"oidcIssuerId"}},{"kind":"Field","name":{"kind":"Name","value":"preferences"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"general"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reviewScale"}},{"kind":"Field","name":{"kind":"Name","value":"gridPacking"}},{"kind":"Field","name":{"kind":"Name","value":"displayNsfw"}},{"kind":"Field","name":{"kind":"Name","value":"disableVideos"}},{"kind":"Field","name":{"kind":"Name","value":"persistQueries"}},{"kind":"Field","name":{"kind":"Name","value":"disableReviews"}},{"kind":"Field","name":{"kind":"Name","value":"disableIntegrations"}},{"kind":"Field","name":{"kind":"Name","value":"disableWatchProviders"}},{"kind":"Field","name":{"kind":"Name","value":"disableNavigationAnimation"}},{"kind":"Field","name":{"kind":"Name","value":"dashboard"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hidden"}},{"kind":"Field","name":{"kind":"Name","value":"section"}},{"kind":"Field","name":{"kind":"Name","value":"numElements"}},{"kind":"Field","name":{"kind":"Name","value":"deduplicateMedia"}}]}},{"kind":"Field","name":{"kind":"Name","value":"watchProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"values"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fitness"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"logging"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muteSounds"}},{"kind":"Field","name":{"kind":"Name","value":"showDetailsWhileEditing"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unitSystem"}},{"kind":"Field","name":{"kind":"Name","value":"setRestTimers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SetRestTimersPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"measurements"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"custom"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"dataType"}}]}},{"kind":"Field","name":{"kind":"Name","value":"inbuilt"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"bodyMassIndex"}},{"kind":"Field","name":{"kind":"Name","value":"totalBodyWater"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"leanBodyMass"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFat"}},{"kind":"Field","name":{"kind":"Name","value":"boneMass"}},{"kind":"Field","name":{"kind":"Name","value":"visceralFat"}},{"kind":"Field","name":{"kind":"Name","value":"waistCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHeightRatio"}},{"kind":"Field","name":{"kind":"Name","value":"hipCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHipRatio"}},{"kind":"Field","name":{"kind":"Name","value":"chestCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"thighCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bicepsCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"neckCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFatCaliper"}},{"kind":"Field","name":{"kind":"Name","value":"chestSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"abdominalSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"thighSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"basalMetabolicRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalDailyEnergyExpenditure"}},{"kind":"Field","name":{"kind":"Name","value":"calories"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"notifications"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"toSend"}},{"kind":"Field","name":{"kind":"Name","value":"enabled"}}]}},{"kind":"Field","name":{"kind":"Name","value":"featuresEnabled"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"others"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"calendar"}},{"kind":"Field","name":{"kind":"Name","value":"collections"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fitness"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"workouts"}},{"kind":"Field","name":{"kind":"Name","value":"templates"}},{"kind":"Field","name":{"kind":"Name","value":"measurements"}}]}},{"kind":"Field","name":{"kind":"Name","value":"media"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"enabled"}},{"kind":"Field","name":{"kind":"Name","value":"anime"}},{"kind":"Field","name":{"kind":"Name","value":"audioBook"}},{"kind":"Field","name":{"kind":"Name","value":"book"}},{"kind":"Field","name":{"kind":"Name","value":"manga"}},{"kind":"Field","name":{"kind":"Name","value":"movie"}},{"kind":"Field","name":{"kind":"Name","value":"podcast"}},{"kind":"Field","name":{"kind":"Name","value":"show"}},{"kind":"Field","name":{"kind":"Name","value":"videoGame"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovel"}},{"kind":"Field","name":{"kind":"Name","value":"people"}},{"kind":"Field","name":{"kind":"Name","value":"groups"}},{"kind":"Field","name":{"kind":"Name","value":"genres"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SetRestTimersPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SetRestTimersSettings"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"drop"}},{"kind":"Field","name":{"kind":"Name","value":"warmup"}},{"kind":"Field","name":{"kind":"Name","value":"normal"}},{"kind":"Field","name":{"kind":"Name","value":"failure"}}]}}]} as unknown as DocumentNode<UserDetailsQuery, UserDetailsQueryVariables>;
 export const UserExerciseDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserExerciseDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userExerciseDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"exerciseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"history"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"idx"}},{"kind":"Field","name":{"kind":"Name","value":"workoutId"}},{"kind":"Field","name":{"kind":"Name","value":"workoutEndOn"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseId"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}},{"kind":"Field","name":{"kind":"Name","value":"exerciseNumTimesInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"exerciseExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"settings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"setRestTimers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SetRestTimersPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"lifetimeStats"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"workoutId"}},{"kind":"Field","name":{"kind":"Name","value":"exerciseIdx"}},{"kind":"Field","name":{"kind":"Name","value":"setIdx"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SetRestTimersPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SetRestTimersSettings"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"drop"}},{"kind":"Field","name":{"kind":"Name","value":"warmup"}},{"kind":"Field","name":{"kind":"Name","value":"normal"}},{"kind":"Field","name":{"kind":"Name","value":"failure"}}]}}]} as unknown as DocumentNode<UserExerciseDetailsQuery, UserExerciseDetailsQueryVariables>;
 export const UserMeasurementsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMeasurementsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UserMeasurementsListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMeasurementsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"timestamp"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"stats"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"bodyMassIndex"}},{"kind":"Field","name":{"kind":"Name","value":"totalBodyWater"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"leanBodyMass"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFat"}},{"kind":"Field","name":{"kind":"Name","value":"boneMass"}},{"kind":"Field","name":{"kind":"Name","value":"visceralFat"}},{"kind":"Field","name":{"kind":"Name","value":"waistCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHeightRatio"}},{"kind":"Field","name":{"kind":"Name","value":"hipCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"waistToHipRatio"}},{"kind":"Field","name":{"kind":"Name","value":"chestCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"thighCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bicepsCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"neckCircumference"}},{"kind":"Field","name":{"kind":"Name","value":"bodyFatCaliper"}},{"kind":"Field","name":{"kind":"Name","value":"chestSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"abdominalSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"thighSkinfold"}},{"kind":"Field","name":{"kind":"Name","value":"basalMetabolicRate"}},{"kind":"Field","name":{"kind":"Name","value":"totalDailyEnergyExpenditure"}},{"kind":"Field","name":{"kind":"Name","value":"calories"}},{"kind":"Field","name":{"kind":"Name","value":"custom"}}]}}]}}]}}]} as unknown as DocumentNode<UserMeasurementsListQuery, UserMeasurementsListQueryVariables>;
 export const UserMetadataDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMetadataDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMetadataDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"mediaReason"}},{"kind":"Field","name":{"kind":"Name","value":"hasInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"inProgress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"history"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"averageRating"}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"seenByAllCount"}},{"kind":"Field","name":{"kind":"Name","value":"seenByUserCount"}},{"kind":"Field","name":{"kind":"Name","value":"nextEntry"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"Field","name":{"kind":"Name","value":"showProgress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"timesSeen"}},{"kind":"Field","name":{"kind":"Name","value":"seasonNumber"}},{"kind":"Field","name":{"kind":"Name","value":"episodes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodeNumber"}},{"kind":"Field","name":{"kind":"Name","value":"timesSeen"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastProgress"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episodeNumber"}},{"kind":"Field","name":{"kind":"Name","value":"timesSeen"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenShowExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenShowExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}},{"kind":"Field","name":{"kind":"Name","value":"season"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenPodcastExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenPodcastExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Seen"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"progress"}},{"kind":"Field","name":{"kind":"Name","value":"reviewId"}},{"kind":"Field","name":{"kind":"Name","value":"startedOn"}},{"kind":"Field","name":{"kind":"Name","value":"finishedOn"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}},{"kind":"Field","name":{"kind":"Name","value":"manualTimeSpent"}},{"kind":"Field","name":{"kind":"Name","value":"numTimesUpdated"}},{"kind":"Field","name":{"kind":"Name","value":"providerWatchedOn"}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenShowExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenPodcastExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode<UserMetadataDetailsQuery, UserMetadataDetailsQueryVariables>;
-export const UserMetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMetadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}}]} as unknown as DocumentNode<UserMetadataGroupDetailsQuery, UserMetadataGroupDetailsQueryVariables>;
-export const UserPersonDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserPersonDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"personId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userPersonDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"personId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"personId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode<UserPersonDetailsQuery, UserPersonDetailsQueryVariables>;
-export const UserWorkoutDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"templateId"}},{"kind":"Field","name":{"kind":"Name","value":"repeatedFrom"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutDetailsQuery, UserWorkoutDetailsQueryVariables>;
-export const UserWorkoutTemplateDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplateDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplateDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutTemplateId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutTemplateDetailsQuery, UserWorkoutTemplateDetailsQueryVariables>;
-export const UserWorkoutTemplatesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplatesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplatesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutTemplatesListQuery, UserWorkoutTemplatesListQueryVariables>;
-export const UserWorkoutsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutsListQuery, UserWorkoutsListQueryVariables>;
 export const GetOidcRedirectUrlDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOidcRedirectUrl"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getOidcRedirectUrl"}}]}}]} as unknown as DocumentNode<GetOidcRedirectUrlQuery, GetOidcRedirectUrlQueryVariables>;
 export const UserByOidcIssuerIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserByOidcIssuerId"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"oidcIssuerId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userByOidcIssuerId"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"oidcIssuerId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"oidcIssuerId"}}}]}]}}]} as unknown as DocumentNode<UserByOidcIssuerIdQuery, UserByOidcIssuerIdQueryVariables>;
 export const GetOidcTokenDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOidcToken"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"code"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getOidcToken"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"code"},"value":{"kind":"Variable","name":{"kind":"Name","value":"code"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"subject"}},{"kind":"Field","name":{"kind":"Name","value":"email"}}]}}]}}]} as unknown as DocumentNode<GetOidcTokenQuery, GetOidcTokenQueryVariables>;
 export const GetPresignedS3UrlDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetPresignedS3Url"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getPresignedS3Url"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}]}]}}]} as unknown as DocumentNode<GetPresignedS3UrlQuery, GetPresignedS3UrlQueryVariables>;
-export const ProvidersLanguageInformationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ProvidersLanguageInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"providersLanguageInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"supported"}},{"kind":"Field","name":{"kind":"Name","value":"default"}},{"kind":"Field","name":{"kind":"Name","value":"source"}}]}}]}}]} as unknown as DocumentNode<ProvidersLanguageInformationQuery, ProvidersLanguageInformationQueryVariables>;
 export const UserExportsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserExports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userExports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"size"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}}]}}]}}]} as unknown as DocumentNode<UserExportsQuery, UserExportsQueryVariables>;
 export const UserCollectionsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserCollectionsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userCollectionsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"count"}},{"kind":"Field","name":{"kind":"Name","value":"isDefault"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"creator"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collaborators"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"informationTemplate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"required"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}}]}}]}}]}}]} as unknown as DocumentNode<UserCollectionsListQuery, UserCollectionsListQueryVariables>;
 export const UserIntegrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserIntegrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userIntegrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"provider"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"isDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"maximumProgress"}},{"kind":"Field","name":{"kind":"Name","value":"minimumProgress"}},{"kind":"Field","name":{"kind":"Name","value":"lastTriggeredOn"}},{"kind":"Field","name":{"kind":"Name","value":"syncToOwnedCollection"}}]}}]}}]} as unknown as DocumentNode<UserIntegrationsQuery, UserIntegrationsQueryVariables>;
@@ -3535,4 +3522,22 @@ export const MetadataPartialDetailsDocument = {"kind":"Document","definitions":[
 export const MetadataGroupsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataGroupsListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode<MetadataGroupsListQuery, MetadataGroupsListQueryVariables>;
 export const PeopleListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PeopleList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PeopleListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"peopleList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode<PeopleListQuery, PeopleListQueryVariables>;
 export const UserAccessLinksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserAccessLinks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userAccessLinks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"isDemo"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"expiresOn"}},{"kind":"Field","name":{"kind":"Name","value":"timesUsed"}},{"kind":"Field","name":{"kind":"Name","value":"isRevoked"}},{"kind":"Field","name":{"kind":"Name","value":"maximumUses"}},{"kind":"Field","name":{"kind":"Name","value":"isAccountDefault"}},{"kind":"Field","name":{"kind":"Name","value":"isMutationAllowed"}}]}}]}}]} as unknown as DocumentNode<UserAccessLinksQuery, UserAccessLinksQueryVariables>;
-export const DailyUserActivitiesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DailyUserActivities"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"DailyUserActivitiesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"dailyUserActivities"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"groupedBy"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalDuration"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"day"}},{"kind":"Field","name":{"kind":"Name","value":"totalReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"workoutCount"}},{"kind":"Field","name":{"kind":"Name","value":"measurementCount"}},{"kind":"Field","name":{"kind":"Name","value":"audioBookCount"}},{"kind":"Field","name":{"kind":"Name","value":"animeCount"}},{"kind":"Field","name":{"kind":"Name","value":"bookCount"}},{"kind":"Field","name":{"kind":"Name","value":"podcastCount"}},{"kind":"Field","name":{"kind":"Name","value":"mangaCount"}},{"kind":"Field","name":{"kind":"Name","value":"showCount"}},{"kind":"Field","name":{"kind":"Name","value":"movieCount"}},{"kind":"Field","name":{"kind":"Name","value":"videoGameCount"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelCount"}}]}}]}}]}}]} as unknown as DocumentNode<DailyUserActivitiesQuery, DailyUserActivitiesQueryVariables>;
\ No newline at end of file
+export const DailyUserActivitiesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"DailyUserActivities"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"DailyUserActivitiesInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"dailyUserActivities"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"groupedBy"}},{"kind":"Field","name":{"kind":"Name","value":"totalCount"}},{"kind":"Field","name":{"kind":"Name","value":"totalDuration"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"day"}},{"kind":"Field","name":{"kind":"Name","value":"totalReviewCount"}},{"kind":"Field","name":{"kind":"Name","value":"workoutCount"}},{"kind":"Field","name":{"kind":"Name","value":"measurementCount"}},{"kind":"Field","name":{"kind":"Name","value":"audioBookCount"}},{"kind":"Field","name":{"kind":"Name","value":"animeCount"}},{"kind":"Field","name":{"kind":"Name","value":"bookCount"}},{"kind":"Field","name":{"kind":"Name","value":"podcastCount"}},{"kind":"Field","name":{"kind":"Name","value":"mangaCount"}},{"kind":"Field","name":{"kind":"Name","value":"showCount"}},{"kind":"Field","name":{"kind":"Name","value":"movieCount"}},{"kind":"Field","name":{"kind":"Name","value":"videoGameCount"}},{"kind":"Field","name":{"kind":"Name","value":"visualNovelCount"}}]}}]}}]}}]} as unknown as DocumentNode<DailyUserActivitiesQuery, DailyUserActivitiesQueryVariables>;
+export const ExerciseDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExerciseDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exerciseDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"exerciseId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"exerciseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscles"}},{"kind":"Field","name":{"kind":"Name","value":"createdByUserId"}},{"kind":"Field","name":{"kind":"Name","value":"attributes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"instructions"}},{"kind":"Field","name":{"kind":"Name","value":"images"}}]}}]}}]}}]} as unknown as DocumentNode<ExerciseDetailsQuery, ExerciseDetailsQueryVariables>;
+export const ExercisesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ExercisesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ExercisesListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"exercisesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"numTimesInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"lastUpdatedOn"}}]}}]}}]}}]} as unknown as DocumentNode<ExercisesListQuery, ExercisesListQueryVariables>;
+export const ImportReportsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ImportReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"importReports"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"progress"}},{"kind":"Field","name":{"kind":"Name","value":"startedOn"}},{"kind":"Field","name":{"kind":"Name","value":"finishedOn"}},{"kind":"Field","name":{"kind":"Name","value":"wasSuccess"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"import"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}}]}},{"kind":"Field","name":{"kind":"Name","value":"failedItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"step"}},{"kind":"Field","name":{"kind":"Name","value":"error"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}}]}}]}}]}}]}}]} as unknown as DocumentNode<ImportReportsQuery, ImportReportsQueryVariables>;
+export const GenresListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenresList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genresList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}}]}}]}}]} as unknown as DocumentNode<GenresListQuery, GenresListQueryVariables>;
+export const GenreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GenreDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GenreDetailsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"genreDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numItems"}}]}},{"kind":"Field","name":{"kind":"Name","value":"contents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]}}]} as unknown as DocumentNode<GenreDetailsQuery, GenreDetailsQueryVariables>;
+export const CollectionContentsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CollectionContents"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CollectionContentsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collectionContents"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"results"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"entityId"}},{"kind":"Field","name":{"kind":"Name","value":"entityLot"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode<CollectionContentsQuery, CollectionContentsQueryVariables>;
+export const CoreDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CoreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"coreDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"isPro"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"docsLink"}},{"kind":"Field","name":{"kind":"Name","value":"pageSize"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"smtpEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"oidcEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"signupAllowed"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryLink"}},{"kind":"Field","name":{"kind":"Name","value":"disableTelemetry"}},{"kind":"Field","name":{"kind":"Name","value":"tokenValidForDays"}},{"kind":"Field","name":{"kind":"Name","value":"localAuthDisabled"}},{"kind":"Field","name":{"kind":"Name","value":"fileStorageEnabled"}},{"kind":"Field","name":{"kind":"Name","value":"metadataLotSourceMappings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"sources"}}]}},{"kind":"Field","name":{"kind":"Name","value":"metadataProviderLanguages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"default"}},{"kind":"Field","name":{"kind":"Name","value":"supported"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontend"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"oidcButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"dashboardMessage"}},{"kind":"Field","name":{"kind":"Name","value":"umami"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"scriptUrl"}},{"kind":"Field","name":{"kind":"Name","value":"websiteId"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"exerciseParameters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"downloadRequired"}},{"kind":"Field","name":{"kind":"Name","value":"filters"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"mechanic"}},{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"muscle"}}]}},{"kind":"Field","name":{"kind":"Name","value":"lotMapping"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"bests"}}]}}]}}]}}]}}]} as unknown as DocumentNode<CoreDetailsQuery, CoreDetailsQueryVariables>;
+export const MetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contents"}},{"kind":"Field","name":{"kind":"Name","value":"sourceUrl"}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"source"}},{"kind":"Field","name":{"kind":"Name","value":"displayImages"}},{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}},{"kind":"Field","name":{"kind":"Name","value":"isPartial"}}]}}]}}]}}]} as unknown as DocumentNode<MetadataGroupDetailsQuery, MetadataGroupDetailsQueryVariables>;
+export const MetadataGroupSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataGroupSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataGroupSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataGroupSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"parts"}}]}}]}}]}}]} as unknown as DocumentNode<MetadataGroupSearchQuery, MetadataGroupSearchQueryVariables>;
+export const MetadataListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataListInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"}}]}}]}}]} as unknown as DocumentNode<MetadataListQuery, MetadataListQueryVariables>;
+export const MetadataSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"MetadataSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"MetadataSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"metadataSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"databaseId"}},{"kind":"Field","name":{"kind":"Name","value":"hasInteracted"}},{"kind":"Field","name":{"kind":"Name","value":"item"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"publishYear"}}]}}]}}]}}]}}]} as unknown as DocumentNode<MetadataSearchQuery, MetadataSearchQueryVariables>;
+export const PeopleSearchDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"PeopleSearch"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PeopleSearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"peopleSearch"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"identifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"image"}},{"kind":"Field","name":{"kind":"Name","value":"birthYear"}}]}}]}}]}}]} as unknown as DocumentNode<PeopleSearchQuery, PeopleSearchQueryVariables>;
+export const UserMetadataGroupDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserMetadataGroupDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userMetadataGroupDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"metadataGroupId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"metadataGroupId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}}]} as unknown as DocumentNode<UserMetadataGroupDetailsQuery, UserMetadataGroupDetailsQueryVariables>;
+export const UserPersonDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserPersonDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"personId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userPersonDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"personId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"personId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"reviews"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ReviewItemPart"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenAnimeExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SeenMangaExtraInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"chapter"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ReviewItemPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ReviewItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"rating"}},{"kind":"Field","name":{"kind":"Name","value":"postedOn"}},{"kind":"Field","name":{"kind":"Name","value":"isSpoiler"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"textOriginal"}},{"kind":"Field","name":{"kind":"Name","value":"textRendered"}},{"kind":"Field","name":{"kind":"Name","value":"seenItemsAssociatedWith"}},{"kind":"Field","name":{"kind":"Name","value":"postedBy"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"comments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"text"}},{"kind":"Field","name":{"kind":"Name","value":"likedBy"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"showExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"season"}},{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"podcastExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"episode"}}]}},{"kind":"Field","name":{"kind":"Name","value":"animeExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenAnimeExtraInformationPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mangaExtraInformation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SeenMangaExtraInformationPart"}}]}}]}}]} as unknown as DocumentNode<UserPersonDetailsQuery, UserPersonDetailsQueryVariables>;
+export const UserWorkoutDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"templateId"}},{"kind":"Field","name":{"kind":"Name","value":"repeatedFrom"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutDetailsQuery, UserWorkoutDetailsQueryVariables>;
+export const UserWorkoutsListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutsList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"endTime"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"startTime"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutsListQuery, UserWorkoutsListQueryVariables>;
+export const UserWorkoutTemplateDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplateDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplateDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workoutTemplateId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workoutTemplateId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"information"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutInformationPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EntityAssetsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EntityAssets"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"videos"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Collection"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"userId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutInformationPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutInformation"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"comment"}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"supersets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"notes"}},{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EntityAssetsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"note"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"confirmedAt"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutTemplateDetailsQuery, UserWorkoutTemplateDetailsQueryVariables>;
+export const UserWorkoutTemplatesListDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"UserWorkoutTemplatesList"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SearchInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"userWorkoutTemplatesList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"details"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"}},{"kind":"Field","name":{"kind":"Name","value":"nextPage"}}]}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"createdOn"}},{"kind":"Field","name":{"kind":"Name","value":"visibility"}},{"kind":"Field","name":{"kind":"Name","value":"summary"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSummaryPart"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutOrExerciseTotals"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"restTime"}},{"kind":"Field","name":{"kind":"Name","value":"personalBestsAchieved"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetStatisticPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetStatistic"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reps"}},{"kind":"Field","name":{"kind":"Name","value":"pace"}},{"kind":"Field","name":{"kind":"Name","value":"oneRm"}},{"kind":"Field","name":{"kind":"Name","value":"weight"}},{"kind":"Field","name":{"kind":"Name","value":"volume"}},{"kind":"Field","name":{"kind":"Name","value":"duration"}},{"kind":"Field","name":{"kind":"Name","value":"distance"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSetRecordPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSetRecord"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"personalBests"}},{"kind":"Field","name":{"kind":"Name","value":"statistic"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetStatisticPart"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"WorkoutSummaryPart"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkoutSummary"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutOrExerciseTotalsPart"}}]}},{"kind":"Field","name":{"kind":"Name","value":"exercises"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"numSets"}},{"kind":"Field","name":{"kind":"Name","value":"bestSet"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"WorkoutSetRecordPart"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"focused"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lots"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lot"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"levels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"forces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"force"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"muscles"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"muscle"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}},{"kind":"Field","name":{"kind":"Name","value":"equipments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"equipment"}},{"kind":"Field","name":{"kind":"Name","value":"exercises"}}]}}]}}]}}]} as unknown as DocumentNode<UserWorkoutTemplatesListQuery, UserWorkoutTemplatesListQueryVariables>;
\ No newline at end of file
diff --git a/libs/generated/src/graphql/backend/types.generated.ts b/libs/generated/src/graphql/backend/types.generated.ts
index f2754d2128..0e241c8917 100644
--- a/libs/generated/src/graphql/backend/types.generated.ts
+++ b/libs/generated/src/graphql/backend/types.generated.ts
@@ -205,10 +205,13 @@ export type CoreDetails = {
   backendErrors: Array<BackendError>;
   disableTelemetry: Scalars['Boolean']['output'];
   docsLink: Scalars['String']['output'];
+  exerciseParameters: ExerciseParameters;
   fileStorageEnabled: Scalars['Boolean']['output'];
   frontend: FrontendConfig;
   isPro: Scalars['Boolean']['output'];
   localAuthDisabled: Scalars['Boolean']['output'];
+  metadataLotSourceMappings: Array<MetadataLotSourceMappings>;
+  metadataProviderLanguages: Array<ProviderLanguageInformation>;
   oidcEnabled: Scalars['Boolean']['output'];
   pageSize: Scalars['Int']['output'];
   repositoryLink: Scalars['String']['output'];
@@ -409,8 +412,8 @@ export type DeployMovaryImportInput = {
 };
 
 export type DeployStrongAppImportInput = {
-  exportPath: Scalars['String']['input'];
-  mapping: Array<StrongAppImportMapping>;
+  dataExportPath?: InputMaybe<Scalars['String']['input']>;
+  measurementsZipPath?: InputMaybe<Scalars['String']['input']>;
 };
 
 export type DeployTraktImportInput = {
@@ -833,6 +836,7 @@ export type ImportReport = {
   details?: Maybe<ImportResultResponse>;
   finishedOn?: Maybe<Scalars['DateTime']['output']>;
   id: Scalars['String']['output'];
+  progress?: Maybe<Scalars['Decimal']['output']>;
   source: ImportSource;
   startedOn: Scalars['DateTime']['output'];
   userId: Scalars['String']['output'];
@@ -852,11 +856,12 @@ export enum ImportSource {
   Igdb = 'IGDB',
   Imdb = 'IMDB',
   Jellyfin = 'JELLYFIN',
-  Mal = 'MAL',
-  MediaTracker = 'MEDIA_TRACKER',
+  Mediatracker = 'MEDIATRACKER',
   Movary = 'MOVARY',
+  Myanimelist = 'MYANIMELIST',
   OpenScale = 'OPEN_SCALE',
-  StoryGraph = 'STORY_GRAPH',
+  Plex = 'PLEX',
+  Storygraph = 'STORYGRAPH',
   StrongApp = 'STRONG_APP',
   Trakt = 'TRAKT'
 }
@@ -1095,6 +1100,12 @@ export type MetadataListInput = {
   take?: InputMaybe<Scalars['Int']['input']>;
 };
 
+export type MetadataLotSourceMappings = {
+  __typename?: 'MetadataLotSourceMappings';
+  lot: MediaLot;
+  sources: Array<MediaSource>;
+};
+
 export type MetadataPartialDetails = {
   __typename?: 'MetadataPartialDetails';
   id: Scalars['String']['output'];
@@ -1230,6 +1241,8 @@ export type MutationRoot = {
   generateAuthToken: Scalars['String']['output'];
   /** Login a user using their username and password and return an auth token. */
   loginUser: LoginResult;
+  /** Merge an exercise into another. */
+  mergeExercise: Scalars['Boolean']['output'];
   /**
    * Merge a media item into another. This will move all `seen`, `collection`
    * and `review` associations with to the metadata.
@@ -1434,6 +1447,12 @@ export type MutationRootLoginUserArgs = {
 };
 
 
+export type MutationRootMergeExerciseArgs = {
+  mergeFrom: Scalars['String']['input'];
+  mergeInto: Scalars['String']['input'];
+};
+
+
 export type MutationRootMergeMetadataArgs = {
   mergeFrom: Scalars['String']['input'];
   mergeInto: Scalars['String']['input'];
@@ -1736,8 +1755,6 @@ export type QueryRoot = {
   dailyUserActivities: DailyUserActivitiesResponse;
   /** Get details about an exercise. */
   exerciseDetails: Exercise;
-  /** Get all the parameters related to exercises. */
-  exerciseParameters: ExerciseParameters;
   /** Get a paginated list of exercises in the database. */
   exercisesList: ExerciseListResults;
   /** Get details about a genre present in the database. */
@@ -1774,8 +1791,6 @@ export type QueryRoot = {
   peopleSearch: PeopleSearchResults;
   /** Get details about a creator present in the database. */
   personDetails: PersonDetails;
-  /** Get all languages supported by all the providers. */
-  providersLanguageInformation: Array<ProviderLanguageInformation>;
   /** Get all access links generated by the currently logged in user. */
   userAccessLinks: Array<AccessLink>;
   /** Get user by OIDC issuer ID. */
@@ -2176,12 +2191,6 @@ export type StringIdObject = {
   id: Scalars['String']['output'];
 };
 
-export type StrongAppImportMapping = {
-  multiplier?: InputMaybe<Scalars['Decimal']['input']>;
-  sourceName: Scalars['String']['input'];
-  targetName: Scalars['String']['input'];
-};
-
 export type UpdateComplexJsonInput = {
   /** Dot delimited path to the property that needs to be changed. */
   property: Scalars['String']['input'];
diff --git a/libs/graphql/src/backend/mutations/combined.gql b/libs/graphql/src/backend/mutations/combined.gql
index 50545a0d3e..1d7672d6be 100644
--- a/libs/graphql/src/backend/mutations/combined.gql
+++ b/libs/graphql/src/backend/mutations/combined.gql
@@ -254,3 +254,7 @@ mutation RevokeAccessLink($accessLinkId: String!) {
 mutation UpdateUserExerciseSettings($input: UpdateUserExerciseSettings!) {
 	updateUserExerciseSettings(input: $input)
 }
+
+mutation MergeExercise($mergeFrom: String!, $mergeInto: String!) {
+	mergeExercise(mergeFrom: $mergeFrom, mergeInto: $mergeInto)
+}
diff --git a/libs/graphql/src/backend/queries/CollectionContents.gql b/libs/graphql/src/backend/queries/CollectionContents.gql
deleted file mode 100644
index 8d3da84d59..0000000000
--- a/libs/graphql/src/backend/queries/CollectionContents.gql
+++ /dev/null
@@ -1,26 +0,0 @@
-query CollectionContents($input: CollectionContentsInput!) {
-	collectionContents(input: $input) {
-		user {
-			id
-			name
-		}
-		reviews {
-			...ReviewItemPart
-		}
-		results {
-			details {
-				total
-				nextPage
-			}
-			items {
-				entityId
-				entityLot
-			}
-		}
-		details {
-			name
-			description
-			createdOn
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/CoreDetails.gql b/libs/graphql/src/backend/queries/CoreDetails.gql
deleted file mode 100644
index a7d2a7dc39..0000000000
--- a/libs/graphql/src/backend/queries/CoreDetails.gql
+++ /dev/null
@@ -1,27 +0,0 @@
-query CoreDetails {
-	coreDetails {
-		isPro
-		version
-		docsLink
-		pageSize
-		websiteUrl
-		smtpEnabled
-		oidcEnabled
-		signupAllowed
-		repositoryLink
-		disableTelemetry
-		tokenValidForDays
-		localAuthDisabled
-		fileStorageEnabled
-		frontend {
-			url
-			oidcButtonLabel
-			dashboardMessage
-			umami {
-				domains
-				scriptUrl
-				websiteId
-			}
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/ExerciseDetails.gql b/libs/graphql/src/backend/queries/ExerciseDetails.gql
deleted file mode 100644
index b0aed0111b..0000000000
--- a/libs/graphql/src/backend/queries/ExerciseDetails.gql
+++ /dev/null
@@ -1,17 +0,0 @@
-query ExerciseDetails($exerciseId: String!) {
-	exerciseDetails(exerciseId: $exerciseId) {
-		id
-		lot
-		source
-		level
-		force
-		mechanic
-		equipment
-		muscles
-		createdByUserId
-		attributes {
-			instructions
-			images
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/ExerciseParameters.gql b/libs/graphql/src/backend/queries/ExerciseParameters.gql
deleted file mode 100644
index ff18e7a0a5..0000000000
--- a/libs/graphql/src/backend/queries/ExerciseParameters.gql
+++ /dev/null
@@ -1,17 +0,0 @@
-query ExerciseParameters {
-	exerciseParameters {
-		downloadRequired
-		filters {
-			type
-			level
-			force
-			mechanic
-			equipment
-			muscle
-		}
-		lotMapping {
-			lot
-			bests
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/ExercisesList.gql b/libs/graphql/src/backend/queries/ExercisesList.gql
deleted file mode 100644
index 071cb233df..0000000000
--- a/libs/graphql/src/backend/queries/ExercisesList.gql
+++ /dev/null
@@ -1,16 +0,0 @@
-query ExercisesList($input: ExercisesListInput!) {
-	exercisesList(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items {
-			id
-			lot
-			image
-			muscle
-			numTimesInteracted
-			lastUpdatedOn
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/GenreDetails.gql b/libs/graphql/src/backend/queries/GenreDetails.gql
deleted file mode 100644
index 2cf2db54be..0000000000
--- a/libs/graphql/src/backend/queries/GenreDetails.gql
+++ /dev/null
@@ -1,16 +0,0 @@
-query GenreDetails($input: GenreDetailsInput!) {
-	genreDetails(input: $input) {
-		details {
-			id
-			name
-			numItems
-		}
-		contents {
-			details {
-				total
-				nextPage
-			}
-			items
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/GenresList.gql b/libs/graphql/src/backend/queries/GenresList.gql
deleted file mode 100644
index 26192b446c..0000000000
--- a/libs/graphql/src/backend/queries/GenresList.gql
+++ /dev/null
@@ -1,13 +0,0 @@
-query GenresList($input: SearchInput!) {
-	genresList(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items {
-			id
-			name
-			numItems
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/ImportReports.gql b/libs/graphql/src/backend/queries/ImportReports.gql
deleted file mode 100644
index 8b20a9581a..0000000000
--- a/libs/graphql/src/backend/queries/ImportReports.gql
+++ /dev/null
@@ -1,20 +0,0 @@
-query ImportReports {
-	importReports {
-		id
-		source
-		startedOn
-		finishedOn
-		wasSuccess
-		details {
-			import {
-				total
-			}
-			failedItems {
-				lot
-				step
-				identifier
-				error
-			}
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/MetadataGroupDetails.gql b/libs/graphql/src/backend/queries/MetadataGroupDetails.gql
deleted file mode 100644
index e88e1f388c..0000000000
--- a/libs/graphql/src/backend/queries/MetadataGroupDetails.gql
+++ /dev/null
@@ -1,16 +0,0 @@
-query MetadataGroupDetails($metadataGroupId: String!) {
-	metadataGroupDetails(metadataGroupId: $metadataGroupId) {
-		contents
-		sourceUrl
-		details {
-			id
-			title
-			lot
-			source
-			displayImages
-			identifier
-			parts
-			isPartial
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/MetadataGroupSearch.gql b/libs/graphql/src/backend/queries/MetadataGroupSearch.gql
deleted file mode 100644
index 8f9b48fe4c..0000000000
--- a/libs/graphql/src/backend/queries/MetadataGroupSearch.gql
+++ /dev/null
@@ -1,14 +0,0 @@
-query MetadataGroupSearch($input: MetadataGroupSearchInput!) {
-	metadataGroupSearch(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items {
-			identifier
-			name
-			image
-			parts
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/MetadataList.gql b/libs/graphql/src/backend/queries/MetadataList.gql
deleted file mode 100644
index ef571424dd..0000000000
--- a/libs/graphql/src/backend/queries/MetadataList.gql
+++ /dev/null
@@ -1,9 +0,0 @@
-query MetadataList($input: MetadataListInput!) {
-	metadataList(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items
-	}
-}
diff --git a/libs/graphql/src/backend/queries/MetadataSearch.gql b/libs/graphql/src/backend/queries/MetadataSearch.gql
deleted file mode 100644
index cc777ab81f..0000000000
--- a/libs/graphql/src/backend/queries/MetadataSearch.gql
+++ /dev/null
@@ -1,18 +0,0 @@
-query MetadataSearch($input: MetadataSearchInput!) {
-	metadataSearch(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items {
-			databaseId
-			hasInteracted
-			item {
-				identifier
-				title
-				image
-				publishYear
-			}
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/PeopleSearch.gql b/libs/graphql/src/backend/queries/PeopleSearch.gql
deleted file mode 100644
index 06180cadbb..0000000000
--- a/libs/graphql/src/backend/queries/PeopleSearch.gql
+++ /dev/null
@@ -1,14 +0,0 @@
-query PeopleSearch($input: PeopleSearchInput!) {
-	peopleSearch(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items {
-			identifier
-			name
-			image
-			birthYear
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/UserMetadataGroupDetails.gql b/libs/graphql/src/backend/queries/UserMetadataGroupDetails.gql
deleted file mode 100644
index fcf020378f..0000000000
--- a/libs/graphql/src/backend/queries/UserMetadataGroupDetails.gql
+++ /dev/null
@@ -1,10 +0,0 @@
-query UserMetadataGroupDetails($metadataGroupId: String!) {
-	userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {
-		reviews {
-			...ReviewItemPart
-		}
-		collections {
-			...CollectionPart
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/UserPersonDetails.gql b/libs/graphql/src/backend/queries/UserPersonDetails.gql
deleted file mode 100644
index 4461438471..0000000000
--- a/libs/graphql/src/backend/queries/UserPersonDetails.gql
+++ /dev/null
@@ -1,10 +0,0 @@
-query UserPersonDetails($personId: String!) {
-	userPersonDetails(personId: $personId) {
-		collections {
-			...CollectionPart
-		}
-		reviews {
-			...ReviewItemPart
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/UserWorkoutDetails.gql b/libs/graphql/src/backend/queries/UserWorkoutDetails.gql
deleted file mode 100644
index bbd2a383aa..0000000000
--- a/libs/graphql/src/backend/queries/UserWorkoutDetails.gql
+++ /dev/null
@@ -1,22 +0,0 @@
-query UserWorkoutDetails($workoutId: String!) {
-	userWorkoutDetails(workoutId: $workoutId) {
-		collections {
-			...CollectionPart
-		}
-		details {
-			id
-			name
-			endTime
-			duration
-			startTime
-			templateId
-			repeatedFrom
-			summary {
-				...WorkoutSummaryPart
-			}
-			information {
-				...WorkoutInformationPart
-			}
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql b/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql
deleted file mode 100644
index 7b51652335..0000000000
--- a/libs/graphql/src/backend/queries/UserWorkoutTemplateDetails.gql
+++ /dev/null
@@ -1,19 +0,0 @@
-query UserWorkoutTemplateDetails($workoutTemplateId: String!) {
-	userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {
-		collections {
-			...CollectionPart
-		}
-		details {
-			id
-			name
-			createdOn
-			visibility
-			summary {
-				...WorkoutSummaryPart
-			}
-			information {
-				...WorkoutInformationPart
-			}
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/UserWorkoutTemplatesList.gql b/libs/graphql/src/backend/queries/UserWorkoutTemplatesList.gql
deleted file mode 100644
index 8185202772..0000000000
--- a/libs/graphql/src/backend/queries/UserWorkoutTemplatesList.gql
+++ /dev/null
@@ -1,17 +0,0 @@
-query UserWorkoutTemplatesList($input: SearchInput!) {
-	userWorkoutTemplatesList(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items {
-			id
-			name
-			createdOn
-			visibility
-			summary {
-				...WorkoutSummaryPart
-			}
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/UserWorkoutsList.gql b/libs/graphql/src/backend/queries/UserWorkoutsList.gql
deleted file mode 100644
index ccb4e1b1d3..0000000000
--- a/libs/graphql/src/backend/queries/UserWorkoutsList.gql
+++ /dev/null
@@ -1,18 +0,0 @@
-query UserWorkoutsList($input: SearchInput!) {
-	userWorkoutsList(input: $input) {
-		details {
-			total
-			nextPage
-		}
-		items {
-			id
-			name
-			endTime
-			duration
-			startTime
-			summary {
-				...WorkoutSummaryPart
-			}
-		}
-	}
-}
diff --git a/libs/graphql/src/backend/queries/combined.gql b/libs/graphql/src/backend/queries/combined.gql
index 79b55d6e35..d4a988d9f1 100644
--- a/libs/graphql/src/backend/queries/combined.gql
+++ b/libs/graphql/src/backend/queries/combined.gql
@@ -17,14 +17,6 @@ query GetPresignedS3Url($key: String!) {
 	getPresignedS3Url(key: $key)
 }
 
-query ProvidersLanguageInformation {
-	providersLanguageInformation {
-		supported
-		default
-		source
-	}
-}
-
 query UserExports {
 	userExports {
 		url
@@ -178,3 +170,348 @@ query DailyUserActivities($input: DailyUserActivitiesInput!) {
 		}
 	}
 }
+
+query ExerciseDetails($exerciseId: String!) {
+	exerciseDetails(exerciseId: $exerciseId) {
+		id
+		lot
+		source
+		level
+		force
+		mechanic
+		equipment
+		muscles
+		createdByUserId
+		attributes {
+			instructions
+			images
+		}
+	}
+}
+
+query ExercisesList($input: ExercisesListInput!) {
+	exercisesList(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items {
+			id
+			lot
+			image
+			muscle
+			numTimesInteracted
+			lastUpdatedOn
+		}
+	}
+}
+
+query ImportReports {
+	importReports {
+		id
+		source
+		progress
+		startedOn
+		finishedOn
+		wasSuccess
+		details {
+			import {
+				total
+			}
+			failedItems {
+				lot
+				step
+				error
+				identifier
+			}
+		}
+	}
+}
+
+query GenresList($input: SearchInput!) {
+	genresList(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items {
+			id
+			name
+			numItems
+		}
+	}
+}
+
+query GenreDetails($input: GenreDetailsInput!) {
+	genreDetails(input: $input) {
+		details {
+			id
+			name
+			numItems
+		}
+		contents {
+			details {
+				total
+				nextPage
+			}
+			items
+		}
+	}
+}
+
+query CollectionContents($input: CollectionContentsInput!) {
+	collectionContents(input: $input) {
+		user {
+			id
+			name
+		}
+		reviews {
+			...ReviewItemPart
+		}
+		results {
+			details {
+				total
+				nextPage
+			}
+			items {
+				entityId
+				entityLot
+			}
+		}
+		details {
+			name
+			description
+			createdOn
+		}
+	}
+}
+
+query CoreDetails {
+	coreDetails {
+		isPro
+		version
+		docsLink
+		pageSize
+		websiteUrl
+		smtpEnabled
+		oidcEnabled
+		signupAllowed
+		repositoryLink
+		disableTelemetry
+		tokenValidForDays
+		localAuthDisabled
+		fileStorageEnabled
+		metadataLotSourceMappings {
+			lot
+			sources
+		}
+		metadataProviderLanguages {
+			source
+			default
+			supported
+		}
+		frontend {
+			url
+			oidcButtonLabel
+			dashboardMessage
+			umami {
+				domains
+				scriptUrl
+				websiteId
+			}
+		}
+		exerciseParameters {
+			downloadRequired
+			filters {
+				type
+				level
+				force
+				mechanic
+				equipment
+				muscle
+			}
+			lotMapping {
+				lot
+				bests
+			}
+		}
+	}
+}
+
+query MetadataGroupDetails($metadataGroupId: String!) {
+	metadataGroupDetails(metadataGroupId: $metadataGroupId) {
+		contents
+		sourceUrl
+		details {
+			id
+			title
+			lot
+			source
+			displayImages
+			identifier
+			parts
+			isPartial
+		}
+	}
+}
+
+query MetadataGroupSearch($input: MetadataGroupSearchInput!) {
+	metadataGroupSearch(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items {
+			identifier
+			name
+			image
+			parts
+		}
+	}
+}
+
+query MetadataList($input: MetadataListInput!) {
+	metadataList(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items
+	}
+}
+
+query MetadataSearch($input: MetadataSearchInput!) {
+	metadataSearch(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items {
+			databaseId
+			hasInteracted
+			item {
+				identifier
+				title
+				image
+				publishYear
+			}
+		}
+	}
+}
+
+query PeopleSearch($input: PeopleSearchInput!) {
+	peopleSearch(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items {
+			identifier
+			name
+			image
+			birthYear
+		}
+	}
+}
+
+query UserMetadataGroupDetails($metadataGroupId: String!) {
+	userMetadataGroupDetails(metadataGroupId: $metadataGroupId) {
+		reviews {
+			...ReviewItemPart
+		}
+		collections {
+			...CollectionPart
+		}
+	}
+}
+
+query UserPersonDetails($personId: String!) {
+	userPersonDetails(personId: $personId) {
+		collections {
+			...CollectionPart
+		}
+		reviews {
+			...ReviewItemPart
+		}
+	}
+}
+
+query UserWorkoutDetails($workoutId: String!) {
+	userWorkoutDetails(workoutId: $workoutId) {
+		collections {
+			...CollectionPart
+		}
+		details {
+			id
+			name
+			endTime
+			duration
+			startTime
+			templateId
+			repeatedFrom
+			summary {
+				...WorkoutSummaryPart
+			}
+			information {
+				...WorkoutInformationPart
+			}
+		}
+	}
+}
+
+query UserWorkoutsList($input: SearchInput!) {
+	userWorkoutsList(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items {
+			id
+			name
+			endTime
+			duration
+			startTime
+			summary {
+				...WorkoutSummaryPart
+			}
+		}
+	}
+}
+
+query UserWorkoutTemplateDetails($workoutTemplateId: String!) {
+	userWorkoutTemplateDetails(workoutTemplateId: $workoutTemplateId) {
+		collections {
+			...CollectionPart
+		}
+		details {
+			id
+			name
+			createdOn
+			visibility
+			summary {
+				...WorkoutSummaryPart
+			}
+			information {
+				...WorkoutInformationPart
+			}
+		}
+	}
+}
+
+query UserWorkoutTemplatesList($input: SearchInput!) {
+	userWorkoutTemplatesList(input: $input) {
+		details {
+			total
+			nextPage
+		}
+		items {
+			id
+			name
+			createdOn
+			visibility
+			summary {
+				...WorkoutSummaryPart
+			}
+		}
+	}
+}
diff --git a/libs/ts-utils/src/index.ts b/libs/ts-utils/src/index.ts
index d0d0dc8a46..1109bb4406 100644
--- a/libs/ts-utils/src/index.ts
+++ b/libs/ts-utils/src/index.ts
@@ -16,6 +16,7 @@ import isEqual from "lodash/isEqual";
 import isInteger from "lodash/isInteger";
 import isNumber from "lodash/isNumber";
 import isString from "lodash/isString";
+import kebabCase from "lodash/kebabCase";
 import mapValues from "lodash/mapValues";
 import mergeWith from "lodash/mergeWith";
 import omitBy from "lodash/omitBy";
@@ -100,6 +101,7 @@ export {
 	isInteger,
 	isNumber,
 	isString,
+	kebabCase,
 	mapValues,
 	mergeWith,
 	omitBy,


Test patch: